diff --git a/dist/tangram.debug.js b/dist/tangram.debug.js index 5154c736a..5137c4f9b 100644 --- a/dist/tangram.debug.js +++ b/dist/tangram.debug.js @@ -23766,7 +23766,6 @@ function buildPolyline(line, context, extra_lines) { return; } - var coordCurr, coordNext, normPrev, normNext; var join_type = context.join_type, cap_type = context.cap_type, closed_polygon = context.closed_polygon, @@ -23775,9 +23774,8 @@ function buildPolyline(line, context, extra_lines) { v_scale = context.v_scale, miter_len_sq = context.miter_len_sq; - var v = 0; // Texture v-coordinate - // Loop backwards through line to a tile boundary if found + if (closed_polygon && join_type === JOIN_TYPE.miter) { var boundaryIndex = getTileBoundaryIndex(line); if (boundaryIndex !== 0) { @@ -23788,15 +23786,37 @@ function buildPolyline(line, context, extra_lines) { } } + var coordCurr, coordNext, normPrev, normNext; + var v = 0; // Texture v-coordinate + + var index_start = 0; + var index_end = line.length - 1; + var ignored_indices_count = 0; + // FIRST POINT - coordCurr = line[0]; - coordNext = line[1]; + // loop through beginning points if duplicates + coordCurr = line[index_start]; + coordNext = line[index_start + 1]; + while (_vector2.default.isEqual(coordCurr, coordNext)) { + index_start++; + coordCurr = coordNext; + coordNext = line[index_start + 1]; + ignored_indices_count++; + if (index_start === line.length - 1) { + return; + } + } - // If first pair of points is redundant, slice and push to the lines array - if (_vector2.default.isEqual(coordCurr, coordNext)) { - if (line.length > 2) { - extra_lines.push(line.slice(1)); + // loop through ending points to check for duplicates + while (_vector2.default.isEqual(line[index_end], line[index_end - 1])) { + index_end--; + ignored_indices_count++; + if (index_end === 0) { + return; } + } + + if (line.length < 2 + ignored_indices_count) { return; } @@ -23804,7 +23824,7 @@ function buildPolyline(line, context, extra_lines) { // Skip tile boundary lines and append a new line if needed if (remove_tile_edges && (0, _common.outsideTile)(coordCurr, coordNext, tile_edge_tolerance)) { - var nonBoundarySegment = getNextNonBoundarySegment(line, 0, tile_edge_tolerance); + var nonBoundarySegment = getNextNonBoundarySegment(line, index_start, tile_edge_tolerance); if (nonBoundarySegment) { extra_lines.push(nonBoundarySegment); } @@ -23813,7 +23833,7 @@ function buildPolyline(line, context, extra_lines) { if (closed_polygon) { // Begin the polygon with a join (connecting the first and last segments) - normPrev = _vector2.default.normalize(_vector2.default.perp(line[line.length - 2], coordCurr)); + normPrev = _vector2.default.normalize(_vector2.default.perp(line[index_end - 1], coordCurr)); startPolygon(coordCurr, normPrev, normNext, join_type, context); } else { // If line begins at edge, don't add a cap @@ -23831,7 +23851,7 @@ function buildPolyline(line, context, extra_lines) { // INTERMEDIARY POINTS v += v_scale * _vector2.default.length(_vector2.default.sub(coordNext, coordCurr)); - for (var i = 1; i < line.length - 1; i++) { + for (var i = index_start + 1; i < index_end; i++) { var currIndex = i; var nextIndex = i + 1; coordCurr = line[currIndex]; @@ -25452,7 +25472,6 @@ var ShaderProgram = function () { this.fragment_source = fragment_source; this.id = ShaderProgram.id++; - ShaderProgram.programs[this.id] = this; this.name = options.name; // can provide a program name (useful for debugging) } @@ -25464,7 +25483,6 @@ var ShaderProgram = function () { this.program = null; this.uniforms = {}; this.attribs = {}; - delete ShaderProgram.programs[this.id]; this.compiled = false; } @@ -25561,8 +25579,6 @@ var ShaderProgram = function () { // Build & inject extensions & defines // This is done *after* code injection so that we can add defines for which code points were injected - var info = this.name ? this.name + ' / id ' + this.id : 'id ' + this.id; - var header = '// Program: ' + info + '\n'; var precision = ''; var high = this.gl.getShaderPrecisionFormat(this.gl.FRAGMENT_SHADER, this.gl.HIGH_FLOAT); if (high && high.precision > 0) { @@ -25573,14 +25589,14 @@ var ShaderProgram = function () { defines['TANGRAM_VERTEX_SHADER'] = true; defines['TANGRAM_FRAGMENT_SHADER'] = false; - this.computed_vertex_source = header + precision + ShaderProgram.buildDefineString(defines) + this.computed_vertex_source; + this.computed_vertex_source = precision + ShaderProgram.buildDefineString(defines) + this.computed_vertex_source; // Precision qualifier only valid in fragment shader // NB: '#extension' statements added to fragment shader only, as IE11 throws error when they appear in // vertex shader (even when guarded by #ifdef), and no WebGL extensions require '#extension' in vertex shaders defines['TANGRAM_VERTEX_SHADER'] = false; defines['TANGRAM_FRAGMENT_SHADER'] = true; - this.computed_fragment_source = ShaderProgram.buildExtensionString(extensions) + header + precision + ShaderProgram.buildDefineString(defines) + this.computed_fragment_source; + this.computed_fragment_source = ShaderProgram.buildExtensionString(extensions) + precision + ShaderProgram.buildDefineString(defines) + this.computed_fragment_source; // Replace multi-line backslashes this.computed_vertex_source = this.computed_vertex_source.replace(re_continue_line, ''); @@ -26067,15 +26083,22 @@ var ShaderProgram = function () { // Static methods and state + exports.default = ShaderProgram; ShaderProgram.id = 0; // assign each program a unique id -ShaderProgram.programs = {}; // programs, by id ShaderProgram.current = null; // currently bound program // Global config applied to all programs (duplicate properties for a specific program will take precedence) ShaderProgram.defines = {}; ShaderProgram.blocks = {}; +// Reset program and shader caches +ShaderProgram.reset = function () { + ShaderProgram.programs_by_source = {}; // GL program objects by exact vertex + fragment shader source + ShaderProgram.shaders_by_source = {}; // GL shader objects by exact source +}; +ShaderProgram.reset(); + // Turn an object of key/value pairs into single string of #define statements ShaderProgram.buildDefineString = function (defines) { var define_str = ""; @@ -26136,6 +26159,13 @@ ShaderProgram.replaceBlock = function (key) { // Compile & link a WebGL program from provided vertex and fragment shader sources // update a program if one is passed in. Create one if not. Alert and don't update anything if the shaders don't compile. ShaderProgram.updateProgram = function (gl, program, vertex_shader_source, fragment_shader_source) { + // Program with this exact vertex and fragment shader sources already cached? + var key = vertex_shader_source + '::' + fragment_shader_source; + if (ShaderProgram.programs_by_source[key]) { + (0, _log2.default)('trace', 'Reusing identical source GL program object'); + return ShaderProgram.programs_by_source[key]; + } + try { var vertex_shader = ShaderProgram.createShader(gl, vertex_shader_source, gl.VERTEX_SHADER); var fragment_shader = ShaderProgram.createShader(gl, fragment_shader_source, gl.FRAGMENT_SHADER); @@ -26161,11 +26191,11 @@ ShaderProgram.updateProgram = function (gl, program, vertex_shader_source, fragm gl.attachShader(program, vertex_shader); gl.attachShader(program, fragment_shader); - gl.deleteShader(vertex_shader); - gl.deleteShader(fragment_shader); - gl.linkProgram(program); + gl.detachShader(program, vertex_shader); + gl.detachShader(program, fragment_shader); + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { var message = new Error('WebGL program error:\n VALIDATE_STATUS: ' + gl.getProgramParameter(program, gl.VALIDATE_STATUS) + '\n ERROR: ' + gl.getError() + '\n --- Vertex Shader ---\n ' + vertex_shader_source + '\n --- Fragment Shader ---\n ' + fragment_shader_source); @@ -26174,11 +26204,19 @@ ShaderProgram.updateProgram = function (gl, program, vertex_shader_source, fragm throw error; } + ShaderProgram.programs_by_source[key] = program; // cache by exact source return program; }; // Compile a vertex or fragment shader from provided source ShaderProgram.createShader = function (gl, source, stype) { + // Program with identical vertex and fragment shader sources already cached? + var key = source; + if (ShaderProgram.shaders_by_source[key]) { + (0, _log2.default)('trace', 'Reusing identical source GL shader object'); + return ShaderProgram.shaders_by_source[key]; + } + var shader = gl.createShader(stype); gl.shaderSource(shader, source); @@ -26191,6 +26229,7 @@ ShaderProgram.createShader = function (gl, source, stype) { throw { type: type, message: message, errors: errors }; } + ShaderProgram.shaders_by_source[key] = shader; // cache by exact source return shader; }; @@ -28719,12 +28758,12 @@ function interpolateLine(line, distance, min_length, options) { var q = line[i + 1]; var length = norm(p, q); - sum += length; - if (length <= min_length) { continue; } + sum += length; + if (sum > distance) { position = interpolateSegment(p, q, sum - distance); angle = getAngle(p, q, options.angle); @@ -28932,7 +28971,6 @@ function extendLeaflet(options) { // Define custom layer methods Object.assign(layerClassConfig, { - initialize: function initialize(options) { // Defaults options.showDebug = !options.showDebug ? false : true; @@ -28945,7 +28983,6 @@ function extendLeaflet(options) { // Force leaflet zoom animations off this._zoomAnimated = false; }, - createScene: function createScene() { this.scene = _scene2.default.create(this.options.scene, { numWorkers: this.options.numWorkers, @@ -28962,6 +28999,7 @@ function extendLeaflet(options) { }); }, + // Finish initializing scene and setup events when layer is added to map onAdd: function onAdd(map) { var _this = this; @@ -29007,14 +29045,15 @@ function extendLeaflet(options) { map.on('zoomstart', this.hooks.zoomstart); this.hooks.dragstart = function () { - _this.scene.view.panning = true; + _this.scene.view.setPanning(true); }; map.on('dragstart', this.hooks.dragstart); - this.hooks.dragend = function () { - _this.scene.view.panning = false; + this.hooks.moveend = function () { + _this.scene.view.setPanning(false); + _this.scene.requestRedraw(); }; - map.on('dragend', this.hooks.dragend); + map.on('moveend', this.hooks.moveend); // Force leaflet zoom animations off map._zoomAnimated = false; @@ -29033,6 +29072,7 @@ function extendLeaflet(options) { // Initial view this.updateView(); + this.resizeOnFirstVisible(); // Subscribe to tangram events this.scene.subscribe({ @@ -29055,7 +29095,6 @@ function extendLeaflet(options) { _this.fire('error', error); }); }, - onRemove: function onRemove(map) { layerBaseClass.prototype.onRemove.apply(this, arguments); @@ -29063,10 +29102,11 @@ function extendLeaflet(options) { map.off('move', this.hooks.move); map.off('zoomstart', this.hooks.zoomstart); map.off('dragstart', this.hooks.dragstart); - map.off('dragend', this.hooks.dragend); + map.off('moveend', this.hooks.moveend); map.off('click', this.hooks.click); map.off('mousemove', this.hooks.mousemove); map.off('mouseout', this.hooks.mouseout); + document.removeEventListener('visibilitychange', this.hooks.visibilitychange); this.hooks = {}; if (this.scene) { @@ -29074,7 +29114,6 @@ function extendLeaflet(options) { this.scene = null; } }, - createTile: function createTile(coords) { var key = coords.x + '/' + coords.y + '/' + coords.z; var div = document.createElement('div'); @@ -29102,6 +29141,7 @@ function extendLeaflet(options) { return div; }, + // Modify leaflet's default scroll wheel behavior to render frames more frequently // (should generally lead to smoother scroll with Tangram frame re-render) modifyScrollWheelBehavior: function modifyScrollWheelBehavior(map) { @@ -29149,6 +29189,7 @@ function extendLeaflet(options) { } }, + // Modify leaflet's default double-click zoom behavior, to match typical vector basemap products modifyDoubleClickZoom: function modifyDoubleClickZoom(map) { if (this.scene.view.continuous_zoom && map.doubleClickZoom && this.options.modifyDoubleClickZoom !== false) { @@ -29231,18 +29272,28 @@ function extendLeaflet(options) { })(); } }, - updateView: function updateView() { var view = this._map.getCenter(); view.zoom = Math.min(this._map.getZoom(), this._map.getMaxZoom() || _geo2.default.default_view_max_zoom); this.scene.view.setView(view); }, - updateSize: function updateSize() { var size = this._map.getSize(); this.scene.resizeMap(size.x, size.y); }, + resizeOnFirstVisible: function resizeOnFirstVisible() { + var _this2 = this; + var first_visibility = true; + this.hooks.visibilitychange = function () { + if (first_visibility) { + first_visibility = false; + _this2.updateSize(); + } + }; + + document.addEventListener('visibilitychange', this.hooks.visibilitychange); + }, onTangramViewUpdate: function onTangramViewUpdate() { if (!this._map || this._updating_tangram) { return; @@ -29252,7 +29303,6 @@ function extendLeaflet(options) { this.reverseTransform(); this._updating_tangram = false; }, - render: function render() { if (!this.scene) { return; @@ -29260,6 +29310,7 @@ function extendLeaflet(options) { this.scene.update(); }, + // Reverse the CSS positioning Leaflet applies to the layer, since Tangram's WebGL canvas // is expected to be 'absolutely' positioned. reverseTransform: function reverseTransform() { @@ -29271,27 +29322,28 @@ function extendLeaflet(options) { L.DomUtil.setPosition(this.scene.container, top_left); }, + // Tie Leaflet event handlers to Tangram feature selection setupSelectionEventHandlers: function setupSelectionEventHandlers(map) { - var _this2 = this; + var _this3 = this; this._selection_events = {}; this.hooks.click = function (event) { - if (typeof _this2._selection_events.click === 'function') { - _this2.scene.getFeatureAt(event.containerPoint).then(function (selection) { + if (typeof _this3._selection_events.click === 'function') { + _this3.scene.getFeatureAt(event.containerPoint).then(function (selection) { var results = Object.assign({}, selection, { leaflet_event: event }); - _this2._selection_events.click(results); + _this3._selection_events.click(results); }); } }; map.on('click', this.hooks.click); this.hooks.mousemove = function (event) { - if (typeof _this2._selection_events.hover === 'function') { - _this2.scene.getFeatureAt(event.containerPoint).then(function (selection) { + if (typeof _this3._selection_events.hover === 'function') { + _this3.scene.getFeatureAt(event.containerPoint).then(function (selection) { var results = Object.assign({}, selection, { leaflet_event: event }); - _this2._selection_events.hover(results); + _this3._selection_events.hover(results); }); } }; @@ -29299,20 +29351,20 @@ function extendLeaflet(options) { this.hooks.mouseout = function (event) { // When mouse leaves map, send an additional selection event to indicate no feature is selected - if (typeof _this2._selection_events.hover === 'function') { - _this2._selection_events.hover({ changed: true, leaflet_event: event }); + if (typeof _this3._selection_events.hover === 'function') { + _this3._selection_events.hover({ changed: true, leaflet_event: event }); } }; map.on('mouseout', this.hooks.mouseout); }, + // Set user-defined handlers for feature selection events // Currently only one handler can be defined for each event type // Event types are: `click`, `hover` (leaflet `mousemove`) setSelectionEvents: function setSelectionEvents(events) { this._selection_events = Object.assign(this._selection_events, events); } - }); // Create the layer class @@ -29507,7 +29559,7 @@ var Light = function () { } // Glue together the final lighting function that sums all the lights - var calculateFunction = '\n vec4 calculateLighting(in vec3 _eyeToPoint, in vec3 _normal, in vec4 _color) {\n\n // Do initial material calculations over normal, emission, ambient, diffuse and specular values\n calculateMaterial(_eyeToPoint,_normal);\n\n // Un roll the loop of individual ligths to calculate\n ' + calculateLights + '\n\n // Final light intensity calculation\n vec4 color = vec4(0.0);\n\n // Keep material alpha channel when alpha blending is on\n #if !defined(TANGRAM_BLEND_OPAQUE)\n #ifdef TANGRAM_MATERIAL_EMISSION\n color = material.emission;\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT\n color += light_accumulator_ambient * _color * material.ambient;\n #else\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n color += light_accumulator_ambient * _color * material.diffuse;\n #endif\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n color += light_accumulator_diffuse * _color * material.diffuse;\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n color += light_accumulator_specular * material.specular;\n #endif\n // Multiply material alpha channel into material RGB when alpha blending is off\n #else\n color.a = _color.a; // use vertex color alpha\n\n #ifdef TANGRAM_MATERIAL_EMISSION\n color.rgb = material.emission.rgb * material.emission.a;\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT\n color.rgb += light_accumulator_ambient.rgb * _color.rgb * material.ambient.rgb * material.ambient.a;\n #else\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n color.rgb += light_accumulator_ambient.rgb * _color.rgb * material.diffuse.rgb * material.diffuse.a;\n #endif\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n color.rgb += light_accumulator_diffuse.rgb * _color.rgb * material.diffuse.rgb * material.diffuse.a;\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n color.rgb += light_accumulator_specular.rgb * material.specular.rgb * material.specular.a;\n #endif\n #endif\n\n // Clamp final color\n color = clamp(color, 0.0, 1.0);\n\n return color;\n }'; + var calculateFunction = '\n vec4 calculateLighting(in vec3 _eyeToPoint, in vec3 _normal, in vec4 _color) {\n\n // Do initial material calculations over normal, emission, ambient, diffuse and specular values\n calculateMaterial(_eyeToPoint,_normal);\n\n // Un roll the loop of individual ligths to calculate\n ' + calculateLights + '\n\n // Final light intensity calculation\n vec4 color = vec4(vec3(0.), _color.a); // start with vertex color alpha\n\n #ifdef TANGRAM_MATERIAL_EMISSION\n color.rgb = material.emission.rgb;\n color.a *= material.emission.a;\n #endif\n\n #ifdef TANGRAM_MATERIAL_AMBIENT\n color.rgb += light_accumulator_ambient.rgb * _color.rgb * material.ambient.rgb;\n color.a *= material.ambient.a;\n #else\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n color.rgb += light_accumulator_ambient.rgb * _color.rgb * material.diffuse.rgb;\n #endif\n #endif\n\n #ifdef TANGRAM_MATERIAL_DIFFUSE\n color.rgb += light_accumulator_diffuse.rgb * _color.rgb * material.diffuse.rgb;\n color.a *= material.diffuse.a;\n #endif\n\n #ifdef TANGRAM_MATERIAL_SPECULAR\n color.rgb += light_accumulator_specular.rgb * material.specular.rgb;\n color.a *= material.specular.a;\n #endif\n\n // Clamp final color\n color = clamp(color, 0.0, 1.0);\n\n return color;\n }'; _shader_program2.default.addBlock(Light.block, calculateFunction); } @@ -30135,6 +30187,10 @@ var _texture = _dereq_('./gl/texture'); var _texture2 = _interopRequireDefault(_texture); +var _shader_program = _dereq_('./gl/shader_program'); + +var _shader_program2 = _interopRequireDefault(_shader_program); + var _vao = _dereq_('./gl/vao'); var _vao2 = _interopRequireDefault(_vao); @@ -30219,7 +30275,6 @@ var Scene = function () { this.last_valid_config_source = null; this.styles = null; - this.active_styles = {}; this.style_manager = new _style_manager.StyleManager(); this.building = null; // tracks current scene building state (tiles being built, etc.) @@ -30371,6 +30426,8 @@ var Scene = function () { this.style_manager.destroy(this.gl); this.styles = {}; + _shader_program2.default.reset(); + // Force context loss var ext = this.gl.getExtension('WEBGL_lose_context'); if (ext) { @@ -30538,13 +30595,23 @@ var Scene = function () { } } - // Round robin selection of next worker + // Assign tile to worker thread based on data source }, { - key: 'nextWorker', - value: function nextWorker() { - var worker = this.workers[this.next_worker]; - this.next_worker = (this.next_worker + 1) % this.workers.length; + key: 'getWorkerForDataSource', + value: function getWorkerForDataSource(source) { + var worker = void 0; + + if (source.tiled) { + // Round robin tiled sources across all workers + worker = this.workers[this.next_worker]; + this.next_worker = (this.next_worker + 1) % this.workers.length; + } else { + // Pin all tiles from each non-tiled source to a single worker + // Prevents data for these sources from being loaded more than once + worker = this.workers[source.id % this.workers.length]; + } + return worker; } @@ -30667,7 +30734,7 @@ var Scene = function () { } // Redraw every frame if animating - if (this.animated === true) { + if (this.animated === true || this.view.isAnimating()) { this.dirty = true; } @@ -30684,17 +30751,10 @@ var Scene = function () { // Update styles, camera, lights this.view.update(); - Object.keys(this.active_styles).forEach(function (i) { - return _this6.styles[i].update(); - }); Object.keys(this.lights).forEach(function (i) { return _this6.lights[i].update(); }); - // Renderable tile list - this.renderable_tiles = this.tile_manager.getRenderableTiles(); - this.renderable_tiles_count = this.renderable_tiles.length; - // Render main pass this.render_count = this.renderPass(); @@ -30750,15 +30810,19 @@ var Scene = function () { this.clearFrame({ clear_color: true, clear_depth: true }); // Sort styles by blend order - var styles = Object.keys(this.active_styles).map(function (s) { + var styles = this.tile_manager.getActiveStyles().map(function (s) { return _this7.styles[s]; - }).sort(_style.Style.blendOrderSort); + }).filter(function (s) { + return s; + }). // guard against missing styles, such as while loading a new scene + sort(_style.Style.blendOrderSort); // Render styles var count = 0; // how many primitives were rendered var last_blend = void 0; for (var s = 0; s < styles.length; s++) { var style = styles[s]; + // Only update render state when blend mode changes if (style.blend !== last_blend) { var state = Object.assign({}, _style.Style.render_states[style.blend], // render state for blend mode @@ -30774,20 +30838,18 @@ var Scene = function () { } }, { key: 'renderStyle', - value: function renderStyle(style, program_key) { + value: function renderStyle(style_name, program_key) { + var style = this.styles[style_name]; var first_for_style = true; var render_count = 0; - - var program = this.styles[style][program_key]; - if (!program || !program.compiled) { - return 0; - } + var program = void 0; // Render tile GL geometries - for (var t = 0; t < this.renderable_tiles.length; t++) { - var tile = this.renderable_tiles[t]; + var renderable_tiles = this.tile_manager.getRenderableTiles(); + for (var t = 0; t < renderable_tiles.length; t++) { + var tile = renderable_tiles[t]; - if (tile.meshes[style] == null) { + if (tile.meshes[style_name] == null) { continue; } @@ -30796,20 +30858,15 @@ var Scene = function () { // (lazy init, not all styles will be used in all screen views; some styles might be defined but never used) if (first_for_style === true) { first_for_style = false; - - program.use(); - this.styles[style].setup(); - - program.uniform('1f', 'u_time', this.animated ? (+new Date() - this.start_time) / 1000 : 0); - this.view.setupProgram(program); - for (var i in this.lights) { - this.lights[i].setupProgram(program); + program = this.setupStyle(style, program_key); + if (!program) { + return 0; } } // Skip proxy tiles if new tiles have finished loading this style - if (!tile.shouldProxyForStyle(style)) { - // log('trace', `Scene.renderStyle(): Skip proxy tile for style '${style}' `, tile, tile.proxy_for); + if (!tile.shouldProxyForStyle(style_name)) { + // log('trace', `Scene.renderStyle(): Skip proxy tile for style '${style_name}' `, tile, tile.proxy_for); continue; } @@ -30817,17 +30874,49 @@ var Scene = function () { this.view.setupTile(tile, program); // Render tile - if (this.styles[style].render(tile.meshes[style])) { + var mesh = tile.meshes[style_name]; + if (style.render(mesh)) { // Don't incur additional renders while viewport is moving if (!(this.view.panning || this.view.zooming)) { this.requestRedraw(); } } - render_count += tile.meshes[style].geometry_count; + render_count += mesh.geometry_count; } return render_count; } + }, { + key: 'setupStyle', + value: function setupStyle(style, program_key) { + // Get shader program from style, lazily compiling if necessary + var program = void 0; + try { + program = style.getProgram(program_key); + if (!program) { + return; + } + } catch (error) { + this.trigger('warning', { + type: 'styles', + message: 'Error compiling style ' + style.name, + style: style, + shader_errors: style.program && style.program.shader_errors + }); + return; + } + + program.use(); + style.setup(); + + program.uniform('1f', 'u_time', this.animated ? (+new Date() - this.start_time) / 1000 : 0); + this.view.setupProgram(program); + for (var i in this.lights) { + this.lights[i].setupProgram(program); + } + + return program; + } }, { key: 'clearFrame', value: function clearFrame() { @@ -30887,8 +30976,7 @@ var Scene = function () { // Opaque: all source, no destination if (blend === 'opaque') { render_states.blending.set({ - blend: true, - src: gl.SRC_ALPHA, dst: gl.ZERO + blend: false }); } // Traditional alpha blending @@ -30903,16 +30991,14 @@ var Scene = function () { else if (blend === 'add') { render_states.blending.set({ blend: true, - src: gl.ONE, dst: gl.ONE, - src_alpha: gl.ONE, dst_alpha: gl.ONE_MINUS_SRC_ALPHA + src: gl.ONE, dst: gl.ONE }); } // Multiplicative blending else if (blend === 'multiply') { render_states.blending.set({ blend: true, - src: gl.ZERO, dst: gl.SRC_COLOR, - src_alpha: gl.ONE, dst_alpha: gl.ONE_MINUS_SRC_ALPHA + src: gl.ZERO, dst: gl.SRC_COLOR }); } } else { @@ -31000,7 +31086,6 @@ var Scene = function () { // Update config (in case JS objects were manipulated directly) if (sync) { _this8.syncConfigToWorker({ serialize_funcs: serialize_funcs }); - _this8.style_manager.compile(_this8.updateActiveStyles(), _this8); // only recompile newly active styles } _this8.resetFeatureSelection(); _this8.resetTime(); @@ -31181,6 +31266,8 @@ var Scene = function () { }, { key: 'updateStyles', value: function updateStyles() { + var _this12 = this; + if (!this.initialized && !this.initializing) { throw new Error('Scene.updateStyles() called before scene was initialized'); } @@ -31194,76 +31281,13 @@ var Scene = function () { this.styles[style].setGL(this.gl); } - // Find & compile active styles - this.updateActiveStyles(); - this.style_manager.compile(Object.keys(this.active_styles), this); + // Use explicitly set scene animation flag if defined, otherwise turn on animation if there are any animated styles + this.animated = this.config.scene.animated !== undefined ? this.config.scene.animated : Object.keys(this.styles).some(function (s) { + return _this12.styles[s].animated; + }); this.dirty = true; } - }, { - key: 'updateActiveStyles', - value: function updateActiveStyles() { - var _this12 = this; - - // Make a set of currently active styles (used in a layer) - // Note: doesn't actually check if any geometry matches the layer, just that the style is potentially renderable - var prev_styles = Object.keys(this.active_styles || {}); - this.active_styles = {}; - var animated = false; // is any active style animated? - - var parseLayers = function parseLayers(layer) { - if (!layer) { - return; - } - - // Traverse draw groups - if (layer.draw) { - for (var name in layer.draw) { - var group = layer.draw[name]; - - // TODO: warn on non-object draw group - if (group != null && (typeof group === 'undefined' ? 'undefined' : _typeof(group)) === 'object' && group.visible !== false) { - var style_name = group.style || name; - var styles = [style_name]; - - // optional additional outline style - if (group.outline && group.outline.style) { - styles.push(group.outline.style); - } - - styles = styles.filter(function (x) { - return _this12.styles[x]; - }).forEach(function (style_name) { - var style = _this12.styles[style_name]; - if (style) { - _this12.active_styles[style_name] = true; - if (style.animated) { - animated = true; - } - } - }); - } - } - } - - // Traverse sublayers - if ((typeof layer === 'undefined' ? 'undefined' : _typeof(layer)) === 'object' && !Array.isArray(layer)) { - for (var _name in layer) { - parseLayers(layer[_name]); - } - } - }; - parseLayers(this.config.layers); - - // Use explicitly set scene animation flag if defined, otherwise turn on animation - // if there are any animated styles - this.animated = this.config.scene.animated !== undefined ? this.config.scene.animated : animated; - - // Compile newly active styles - return Object.keys(this.active_styles).filter(function (s) { - return prev_styles.indexOf(s) === -1; - }); - } // Get active camera - for public API @@ -31334,8 +31358,13 @@ var Scene = function () { }, { key: 'setIntrospection', value: function setIntrospection(val) { + var _this13 = this; + this.introspection = val || false; - this.updateConfig(); + this.updating++; + return this.updateConfig().then(function () { + return _this13.updating--; + }); } // Update scene config, and optionally rebuild geometry @@ -31355,6 +31384,7 @@ var Scene = function () { this.updating++; this.config = _scene_loader2.default.applyGlobalProperties(this.config, this.config_globals_applied); + _scene_loader2.default.hoistTextures(this.config); // move inline textures into global texture set this.style_manager.init(); this.view.reset(); this.createLights(); @@ -31400,30 +31430,30 @@ var Scene = function () { }, { key: 'createListeners', value: function createListeners() { - var _this13 = this; + var _this14 = this; this.listeners = {}; this.listeners.view = { move: function move() { - return _this13.trigger('move'); + return _this14.trigger('move'); } }; this.view.subscribe(this.listeners.view); this.listeners.texture = { update: function update() { - return _this13.dirty = true; + return _this14.dirty = true; }, warning: function warning(data) { - return _this13.trigger('warning', Object.assign({ type: 'textures' }, data)); + return _this14.trigger('warning', Object.assign({ type: 'textures' }, data)); } }; _texture2.default.subscribe(this.listeners.texture); this.listeners.scene_loader = { error: function error(data) { - return _this13.trigger('error', Object.assign({ type: 'scene' }, data)); + return _this14.trigger('error', Object.assign({ type: 'scene' }, data)); } }; _scene_loader2.default.subscribe(this.listeners.scene_loader); @@ -31452,7 +31482,7 @@ var Scene = function () { }, { key: 'getFeatureSelectionMapSize', value: function getFeatureSelectionMapSize() { - var _this14 = this; + var _this15 = this; if (this.fetching_selection_map) { return Promise.resolve(); // return undefined if already pending @@ -31460,7 +31490,7 @@ var Scene = function () { this.fetching_selection_map = true; return _worker_broker2.default.postMessage(this.workers, 'self.getFeatureSelectionMapSize').then(function (sizes) { - _this14.fetching_selection_map = false; + _this15.fetching_selection_map = false; return sizes.reduce(function (a, b) { return a + b; }); @@ -31603,7 +31633,7 @@ exports.default = Scene; Scene.id = 0; // unique id for a scene instance Scene.generation = 0; // id that is incremented each time a scene config is re-parsed -},{"./gl/context":202,"./gl/render_state":205,"./gl/texture":207,"./gl/vao":208,"./light":222,"./scene_loader":227,"./selection":229,"./sources/data_source":230,"./styles/style":241,"./styles/style_manager":242,"./styles/style_parser":243,"./styles/text/font_manager":245,"./tile_manager":250,"./utils/log":255,"./utils/media_capture":256,"./utils/subscribe":260,"./utils/urls":262,"./utils/utils":263,"./utils/worker_broker":265,"./view":267}],226:[function(_dereq_,module,exports){ +},{"./gl/context":202,"./gl/render_state":205,"./gl/shader_program":206,"./gl/texture":207,"./gl/vao":208,"./light":222,"./scene_loader":227,"./selection":229,"./sources/data_source":230,"./styles/style":241,"./styles/style_manager":242,"./styles/style_parser":243,"./styles/text/font_manager":245,"./tile_manager":250,"./utils/log":255,"./utils/media_capture":256,"./utils/subscribe":260,"./utils/urls":262,"./utils/utils":263,"./utils/worker_broker":265,"./view":267}],226:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -31616,6 +31646,7 @@ var _get = function get(object, property, receiver) { if (object === null) objec var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); exports.createSceneBundle = createSceneBundle; +exports.isGlobal = isGlobal; var _utils = _dereq_('./utils/utils'); @@ -31694,6 +31725,10 @@ var SceneBundle = exports.SceneBundle = function () { }, { key: 'urlFor', value: function urlFor(url) { + if (isGlobal(url)) { + return url; + } + if (URLs.isRelativeURL(url) && this.container) { return this.parent.urlFor(this.path_for_parent + url); } @@ -31763,6 +31798,10 @@ var ZipSceneBundle = exports.ZipSceneBundle = function (_SceneBundle) { }, { key: 'urlFor', value: function urlFor(url) { + if (isGlobal(url)) { + return url; + } + if (URLs.isRelativeURL(url)) { return this.urlForZipFile(URLs.flattenRelativeURL(url)); } @@ -31872,6 +31911,14 @@ function createSceneBundle(url, path, parent) { return new SceneBundle(url, path, parent); } +// References a global property? +function isGlobal(val) { + if (val && val.slice(0, 7) === 'global.') { + return true; + } + return false; +} + },{"./utils/urls":262,"./utils/utils":263,"jszip":131}],227:[function(_dereq_,module,exports){ 'use strict'; @@ -32059,24 +32106,15 @@ exports.default = SceneLoader = { } } - // Move "URL shortcut" textures, e.g. those specified as inline URL strings, to the scene's top-level - // set of textures (config.textures). There are 3 such cases of textures: - // - in a style's `texture` property - // - in a style's `material` properties - // - in a style's custom uniforms (`shaders.uniforms`) - // - // We first check to see if there is a texture already defined with that string name. The texture's URL - // is expanded to include the current scene's base path. + // Resolve URLs for inline textures if (config.styles) { var _loop = function _loop(sn) { var style = config.styles[sn]; // Style `texture` var tex = style.texture; - if (typeof tex === 'string' && !config.textures[tex]) { - tex = bundle.urlFor(tex); - config.textures[tex] = { url: tex }; - style.texture = tex; + if (typeof tex === 'string' && !config.textures[tex] && !(0, _scene_bundle.isGlobal)(tex)) { + style.texture = bundle.urlFor(tex); } // Material @@ -32084,10 +32122,8 @@ exports.default = SceneLoader = { ['emission', 'ambient', 'diffuse', 'specular', 'normal'].forEach(function (prop) { // Material property has a texture var tex = style.material[prop] != null && style.material[prop].texture; - if (typeof tex === 'string' && !config.textures[tex]) { - tex = bundle.urlFor(tex); - config.textures[tex] = { url: tex }; - style.material[prop].texture = tex; + if (typeof tex === 'string' && !config.textures[tex] && !(0, _scene_bundle.isGlobal)(tex)) { + style.material[prop].texture = bundle.urlFor(tex); } }); } @@ -32101,10 +32137,8 @@ exports.default = SceneLoader = { uniforms = _ref2.uniforms; // Texture by URL (string-named texture not referencing existing texture definition) - if (type === 'sampler2D' && typeof value === 'string' && !config.textures[value]) { - var _tex = bundle.urlFor(value); - config.textures[_tex] = { url: _tex }; - uniforms[key] = _tex; + if (type === 'sampler2D' && typeof value === 'string' && !config.textures[value] && !(0, _scene_bundle.isGlobal)(value)) { + uniforms[key] = bundle.urlFor(value); } }); } @@ -32173,6 +32207,65 @@ exports.default = SceneLoader = { }, + // Move inline (URL string) textures to the scene's top-level set of textures (config.textures). + // There are 3 such cases of textures: + // - in a style's `texture` property + // - in a style's `material` properties + // - in a style's custom uniforms (`shaders.uniforms`) + hoistTextures: function hoistTextures(config) { + if (config.styles) { + var _loop2 = function _loop2(sn) { + var style = config.styles[sn]; + + // Style `texture` + var tex = style.texture; + if (typeof tex === 'string' && !config.textures[tex]) { + var url = tex; + var name = (0, _scene_bundle.isGlobal)(url) ? 'texture-' + url : url; + config.textures[name] = { url: url }; + style.texture = name; + } + + // Material + if (style.material) { + ['emission', 'ambient', 'diffuse', 'specular', 'normal'].forEach(function (prop) { + // Material property has a texture + var tex = style.material[prop] != null && style.material[prop].texture; + if (typeof tex === 'string' && !config.textures[tex]) { + var _url = tex; + var _name = (0, _scene_bundle.isGlobal)(_url) ? 'texture-' + _url : _url; + config.textures[_name] = { url: _url }; + style.material[prop].texture = _name; + } + }); + } + + // Shader uniforms + if (style.shaders && style.shaders.uniforms) { + _glsl2.default.parseUniforms(style.shaders.uniforms).forEach(function (_ref4) { + var type = _ref4.type, + value = _ref4.value, + key = _ref4.key, + uniforms = _ref4.uniforms; + + // Texture by URL (string-named texture not referencing existing texture definition) + if (type === 'sampler2D' && typeof value === 'string' && !config.textures[value]) { + var _url2 = value; + var _name2 = (0, _scene_bundle.isGlobal)(_url2) ? 'texture-' + _url2 : _url2; + config.textures[_name2] = { url: _url2 }; + uniforms[key] = _name2; + } + }); + } + }; + + for (var sn in config.styles) { + _loop2(sn); + } + } + }, + + // Normalize some scene-wide settings that apply to the final, merged scene finalize: function finalize(config) { if (!config) { @@ -32304,10 +32397,7 @@ if (_thread2.default.is_worker) { FeatureSelection: _selection2.default, - sources: { - tiles: {}, - objects: {} - }, + sources: {}, styles: {}, layers: {}, tiles: {}, @@ -32360,7 +32450,7 @@ if (_thread2.default.is_worker) { self.style_manager.initStyles({ generation: self.generation, styles: self.styles, - sources: self.sources.tiles, + sources: self.sources, introspection: self.introspection }); @@ -32380,11 +32470,11 @@ if (_thread2.default.is_worker) { // Create data sources and clear tile cache if necessary createDataSources: function createDataSources(config) { config.sources = _utils2.default.stringsToFunctions(config.sources); // parse new sources - self.sources.tiles = {}; // clear previous sources + self.sources = {}; // clear previous sources for (var name in config.sources) { var source = void 0; try { - source = _data_source2.default.create(Object.assign({}, config.sources[name], { name: name }), self.sources.tiles); + source = _data_source2.default.create(Object.assign({}, config.sources[name], { name: name }), self.sources); } catch (e) { continue; } @@ -32392,20 +32482,7 @@ if (_thread2.default.is_worker) { if (!source) { continue; } - - if (source.tiled) { - self.sources.tiles[name] = source; - } else { - // Distribute object sources across workers - if (source.id % self.num_workers === self._worker_id) { - // Load source if not cached - self.sources.objects[name] = source; - if (!self.objects[source.name]) { - self.objects[source.name] = {}; - source.load(self.objects[source.name]); - } - } - } + self.sources[name] = source; } // Clear tile cache if data source config changed @@ -32455,7 +32532,7 @@ if (_thread2.default.is_worker) { // Warn and continue on data source error if (tile.source_data.error) { - (0, _log2.default)('warn', 'tile load error(s) for ' + tile.key + ': ' + tile.source_data.error.stack); + (0, _log2.default)('warn', 'tile load error(s) for ' + tile.key + ': ' + tile.source_data.error); } tile.loading = false; @@ -32490,10 +32567,10 @@ if (_thread2.default.is_worker) { // Load this tile's data source loadTileSourceData: function loadTileSourceData(tile) { - if (self.sources.tiles[tile.source]) { - return self.sources.tiles[tile.source].load(tile); + if (self.sources[tile.source]) { + return self.sources[tile.source].load(tile); } else { - tile.source_data = { error: 'Data source \'' + tile.source + '\' not found' }; + tile.source_data = {}; return Promise.resolve(tile); } }, @@ -32693,7 +32770,7 @@ var FeatureSelection = function () { }, { key: 'pendingRequests', value: function pendingRequests() { - return this.requests; + return Object.keys(this.requests).length && this.requests; } }, { key: 'clearPendingRequests', @@ -33411,7 +33488,6 @@ var GeoJSONSource = exports.GeoJSONSource = function (_NetworkSource) { var _this = _possibleConstructorReturn(this, (GeoJSONSource.__proto__ || Object.getPrototypeOf(GeoJSONSource)).call(this, source, sources)); - _this.tiled = true; _this.load_data = null; _this.tile_indexes = {}; // geojson-vt tile indices, by layer name _this.max_zoom = Math.max(_this.max_zoom || 0, 15); // TODO: max zoom < 15 causes artifacts/no-draw at 20, investigate @@ -34803,9 +34879,11 @@ Object.assign(Lines, { // Override - compile: function compile() { - this.parseLineTexture(); - return _style.Style.compile.apply(this, arguments); + compileSetup: function compileSetup() { + if (!this.compile_setup) { + this.parseLineTexture(); + } + return _style.Style.compileSetup.apply(this, arguments); }, @@ -35119,6 +35197,8 @@ var _point_placement2 = _interopRequireDefault(_point_placement); var _text_labels = _dereq_('../text/text_labels'); +var _view = _dereq_('../../view'); + var _debug_settings = _dereq_('../../utils/debug_settings'); var _debug_settings2 = _interopRequireDefault(_debug_settings); @@ -35126,8 +35206,8 @@ var _debug_settings2 = _interopRequireDefault(_debug_settings); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var shaderSrc_pointsVertex = "uniform vec2 u_resolution;\nuniform float u_time;\nuniform vec3 u_map_position;\nuniform vec4 u_tile_origin;\nuniform float u_tile_proxy_depth;\nuniform float u_meters_per_pixel;\nuniform float u_device_pixel_ratio;\nuniform float u_visible_time;\nuniform bool u_fade_in;\n\nuniform mat4 u_model;\nuniform mat4 u_modelView;\nuniform mat3 u_normalMatrix;\nuniform mat3 u_inverseNormalMatrix;\n\nattribute vec4 a_position;\nattribute vec4 a_shape;\nattribute vec4 a_color;\nattribute vec2 a_texcoord;\nattribute vec2 a_offset;\n\n#define TANGRAM_NORMAL vec3(0., 0., 1.)\n\nvarying vec4 v_color;\nvarying vec2 v_texcoord;\nvarying vec4 v_world_position;\n\n#ifdef TANGRAM_MULTI_SAMPLER\nvarying float v_sampler;\n#endif\n\n#pragma tangram: camera\n#pragma tangram: material\n#pragma tangram: lighting\n#pragma tangram: raster\n#pragma tangram: global\n\nvec2 rotate2D(vec2 _st, float _angle) {\n return mat2(cos(_angle),-sin(_angle),\n sin(_angle),cos(_angle)) * _st;\n}\n\nvoid main() {\n // Initialize globals\n #pragma tangram: setup\n\n v_color = a_color;\n v_texcoord = a_texcoord;\n\n // Position\n vec4 position = u_modelView * vec4(a_position.xyz, 1.);\n\n // Apply positioning and scaling in screen space\n vec2 shape = a_shape.xy / 256.; // values have an 8-bit fraction\n vec2 offset = vec2(a_offset.x, -a_offset.y); // flip y to make it point down\n float theta = a_shape.z / 4096.; // values have a 12-bit fraction\n\n #ifdef TANGRAM_MULTI_SAMPLER\n v_sampler = a_shape.w; // texture sampler\n #endif\n\n shape = rotate2D(shape, theta); // apply rotation to vertex\n shape += rotate2D(offset, theta); // apply offset on rotated axis (e.g. so line labels follow text axis)\n\n // World coordinates for 3d procedural textures\n v_world_position = u_model * position;\n v_world_position.xy += shape * u_meters_per_pixel;\n v_world_position = wrapWorldPosition(v_world_position);\n\n // Modify position before camera projection\n #pragma tangram: position\n\n cameraProjection(position);\n\n #ifdef TANGRAM_LAYER_ORDER\n // +1 is to keep all layers including proxies > 0\n applyLayerOrder(a_position.w + u_tile_proxy_depth + 1., position);\n #endif\n\n // Apply pixel offset in screen-space\n // Multiply by 2 is because screen is 2 units wide Normalized Device Coords (and u_resolution device pixels wide)\n // Device pixel ratio adjustment is because shape is in logical pixels\n position.xy += shape * position.w * 2. * u_device_pixel_ratio / u_resolution;\n\n gl_Position = position;\n}\n"; -var shaderSrc_pointsFragment = "uniform vec2 u_resolution;\nuniform float u_time;\nuniform vec3 u_map_position;\nuniform vec4 u_tile_origin;\nuniform float u_meters_per_pixel;\nuniform float u_device_pixel_ratio;\nuniform float u_visible_time;\nuniform bool u_fade_in;\n\nuniform mat3 u_normalMatrix;\nuniform mat3 u_inverseNormalMatrix;\n\nuniform sampler2D u_texture;\n\n#ifdef TANGRAM_MULTI_SAMPLER\nuniform sampler2D u_label_texture;\nvarying float v_sampler;\n#endif\n\nvarying vec4 v_color;\nvarying vec2 v_texcoord;\nvarying vec4 v_world_position;\n\n#define TANGRAM_NORMAL vec3(0., 0., 1.)\n\n// Alpha discard threshold (substitute for alpha blending)\n#ifndef TANGRAM_ALPHA_TEST\n#define TANGRAM_ALPHA_TEST 0.5\n#endif\n\n// Alpha fade range for edges of points\n#ifndef TANGRAM_FADE_RANGE\n#define TANGRAM_FADE_RANGE .15\n#endif\n#define TANGRAM_FADE_START (1. - TANGRAM_FADE_RANGE)\n\n#pragma tangram: camera\n#pragma tangram: material\n#pragma tangram: lighting\n#pragma tangram: raster\n#pragma tangram: global\n\nvoid main (void) {\n // Initialize globals\n #pragma tangram: setup\n\n vec4 color = v_color;\n\n #ifdef TANGRAM_MULTI_SAMPLER\n if (v_sampler == 0.) { // sprite sampler\n #endif\n #ifdef TANGRAM_POINT_TEXTURE\n // Draw sprite\n color *= texture2D(u_texture, v_texcoord);\n #else\n // Draw a point\n vec2 uv = v_texcoord * 2. - 1.; // fade alpha near circle edge\n float point_dist = length(uv);\n color.a = clamp(color.a - (smoothstep(0., TANGRAM_FADE_RANGE, (point_dist - TANGRAM_FADE_START)) / TANGRAM_FADE_RANGE), 0., color.a);\n #endif\n #ifdef TANGRAM_MULTI_SAMPLER\n }\n else { // label sampler\n color = texture2D(u_label_texture, v_texcoord);\n color.rgb /= max(color.a, 0.001); // un-multiply canvas texture\n }\n #endif\n\n // Manually un-multiply alpha, for cases where texture has pre-multiplied alpha\n #ifdef TANGRAM_UNMULTIPLY_ALPHA\n color.rgb /= max(color.a, 0.001);\n #endif\n\n // If blending is off, use alpha discard as a lower-quality substitute\n #if !defined(TANGRAM_BLEND_OVERLAY) && !defined(TANGRAM_BLEND_INLAY)\n if (color.a < TANGRAM_ALPHA_TEST) {\n discard;\n }\n #endif\n\n #pragma tangram: color\n\n // Fade in (if requested) based on time mesh has been visible\n #ifdef TANGRAM_FADE_IN_RATE\n if (u_fade_in) {\n color.a *= clamp(u_visible_time * TANGRAM_FADE_IN_RATE, 0., 1.);\n }\n #endif\n\n // Fade out when tile is zooming out, e.g. acting as proxy tiles\n // NB: this is mostly done to compensate for text label collision happening at the label's 1x zoom. As labels\n // in proxy tiles are scaled down, they begin to overlap, and the fade is a simple way to ease the transition.\n #ifdef TANGRAM_FADE_ON_ZOOM_OUT\n color.a *= clamp(1. - TANGRAM_FADE_ON_ZOOM_OUT_RATE * (u_tile_origin.z - u_map_position.z), 0., 1.);\n #endif\n\n #pragma tangram: filter\n\n gl_FragColor = color;\n}\n"; +var shaderSrc_pointsVertex = "uniform vec2 u_resolution;\nuniform float u_time;\nuniform vec3 u_map_position;\nuniform vec4 u_tile_origin;\nuniform float u_tile_proxy_depth;\nuniform float u_meters_per_pixel;\nuniform float u_device_pixel_ratio;\nuniform float u_visible_time;\nuniform bool u_view_panning;\nuniform float u_view_pan_snap_timer;\n\nuniform mat4 u_model;\nuniform mat4 u_modelView;\nuniform mat3 u_normalMatrix;\nuniform mat3 u_inverseNormalMatrix;\n\nattribute vec4 a_position;\nattribute vec4 a_shape;\nattribute vec4 a_color;\nattribute vec2 a_texcoord;\nattribute vec2 a_offset;\n\n#define TANGRAM_NORMAL vec3(0., 0., 1.)\n\nvarying vec4 v_color;\nvarying vec2 v_texcoord;\nvarying vec4 v_world_position;\n\n#ifdef TANGRAM_MULTI_SAMPLER\nvarying float v_sampler;\n#endif\n\n#pragma tangram: camera\n#pragma tangram: material\n#pragma tangram: lighting\n#pragma tangram: raster\n#pragma tangram: global\n\nvec2 rotate2D(vec2 _st, float _angle) {\n return mat2(cos(_angle),-sin(_angle),\n sin(_angle),cos(_angle)) * _st;\n}\n\nvoid main() {\n // Initialize globals\n #pragma tangram: setup\n\n v_color = a_color;\n v_texcoord = a_texcoord;\n\n // Position\n vec4 position = u_modelView * vec4(a_position.xyz, 1.);\n\n // Apply positioning and scaling in screen space\n vec2 shape = a_shape.xy / 256.; // values have an 8-bit fraction\n vec2 offset = vec2(a_offset.x, -a_offset.y); // flip y to make it point down\n float theta = a_shape.z / 4096.; // values have a 12-bit fraction\n\n #ifdef TANGRAM_MULTI_SAMPLER\n v_sampler = a_shape.w; // texture sampler\n #endif\n\n shape = rotate2D(shape, theta); // apply rotation to vertex\n shape += rotate2D(offset, theta); // apply offset on rotated axis (e.g. so line labels follow text axis)\n\n // World coordinates for 3d procedural textures\n v_world_position = u_model * position;\n v_world_position.xy += shape * u_meters_per_pixel;\n v_world_position = wrapWorldPosition(v_world_position);\n\n // Modify position before camera projection\n #pragma tangram: position\n\n cameraProjection(position);\n\n #ifdef TANGRAM_LAYER_ORDER\n // +1 is to keep all layers including proxies > 0\n applyLayerOrder(a_position.w + u_tile_proxy_depth + 1., position);\n #endif\n\n // Apply pixel offset in screen-space\n // Multiply by 2 is because screen is 2 units wide Normalized Device Coords (and u_resolution device pixels wide)\n // Device pixel ratio adjustment is because shape is in logical pixels\n position.xy += shape * position.w * 2. * u_device_pixel_ratio / u_resolution;\n\n // Snap to pixel grid - only applied to fully upright sprites/labels, while panning is not active\n if (!u_view_panning && abs(theta) < TANGRAM_EPSILON) {\n vec2 position_fract = fract((((position.xy / position.w) + 1.) * .5) * u_resolution);\n vec2 position_snap = position.xy + ((step(0.5, position_fract) - position_fract) * position.w * 2. / u_resolution);\n\n // Animate the snapping to smooth the transition and make it less noticeable\n #ifdef TANGRAM_VIEW_PAN_SNAP_RATE\n position.xy = mix(position.xy, position_snap, clamp(u_view_pan_snap_timer * TANGRAM_VIEW_PAN_SNAP_RATE, 0., 1.));\n #else\n position.xy = position_snap;\n #endif\n }\n\n gl_Position = position;\n}\n"; +var shaderSrc_pointsFragment = "uniform vec2 u_resolution;\nuniform float u_time;\nuniform vec3 u_map_position;\nuniform vec4 u_tile_origin;\nuniform float u_meters_per_pixel;\nuniform float u_device_pixel_ratio;\nuniform float u_visible_time;\nuniform bool u_tile_fade_in;\n\nuniform mat3 u_normalMatrix;\nuniform mat3 u_inverseNormalMatrix;\n\nuniform sampler2D u_texture;\n\n#ifdef TANGRAM_MULTI_SAMPLER\nuniform sampler2D u_label_texture;\nvarying float v_sampler;\n#endif\n\nvarying vec4 v_color;\nvarying vec2 v_texcoord;\nvarying vec4 v_world_position;\n\n#define TANGRAM_NORMAL vec3(0., 0., 1.)\n\n// Alpha discard threshold (substitute for alpha blending)\n#ifndef TANGRAM_ALPHA_TEST\n#define TANGRAM_ALPHA_TEST 0.5\n#endif\n\n// Alpha fade range for edges of points\n#ifndef TANGRAM_FADE_RANGE\n#define TANGRAM_FADE_RANGE .15\n#endif\n#define TANGRAM_FADE_START (1. - TANGRAM_FADE_RANGE)\n\n#pragma tangram: camera\n#pragma tangram: material\n#pragma tangram: lighting\n#pragma tangram: raster\n#pragma tangram: global\n\nvoid main (void) {\n // Initialize globals\n #pragma tangram: setup\n\n vec4 color = v_color;\n\n #ifdef TANGRAM_MULTI_SAMPLER\n if (v_sampler == 0.) { // sprite sampler\n #endif\n #ifdef TANGRAM_POINT_TEXTURE\n // Draw sprite\n color *= texture2D(u_texture, v_texcoord);\n #else\n // Draw a point\n vec2 uv = v_texcoord * 2. - 1.; // fade alpha near circle edge\n float point_dist = length(uv);\n color.a = clamp(color.a - (smoothstep(0., TANGRAM_FADE_RANGE, (point_dist - TANGRAM_FADE_START)) / TANGRAM_FADE_RANGE), 0., color.a);\n #endif\n #ifdef TANGRAM_MULTI_SAMPLER\n }\n else { // label sampler\n color = texture2D(u_label_texture, v_texcoord);\n color.rgb /= max(color.a, 0.001); // un-multiply canvas texture\n }\n #endif\n\n // Manually un-multiply alpha, for cases where texture has pre-multiplied alpha\n #ifdef TANGRAM_UNMULTIPLY_ALPHA\n color.rgb /= max(color.a, 0.001);\n #endif\n\n // If blending is off, use alpha discard as a lower-quality substitute\n #if !defined(TANGRAM_BLEND_OVERLAY) && !defined(TANGRAM_BLEND_INLAY)\n if (color.a < TANGRAM_ALPHA_TEST) {\n discard;\n }\n #endif\n\n #pragma tangram: color\n\n // Fade in (if requested) based on time mesh has been visible\n #ifdef TANGRAM_FADE_IN_RATE\n if (u_tile_fade_in) {\n color.a *= clamp(u_visible_time * TANGRAM_FADE_IN_RATE, 0., 1.);\n }\n #endif\n\n // Fade out when tile is zooming out, e.g. acting as proxy tiles\n // NB: this is mostly done to compensate for text label collision happening at the label's 1x zoom. As labels\n // in proxy tiles are scaled down, they begin to overlap, and the fade is a simple way to ease the transition.\n #ifdef TANGRAM_FADE_ON_ZOOM_OUT\n color.a *= clamp(1. - TANGRAM_FADE_ON_ZOOM_OUT_RATE * (u_tile_origin.z - u_map_position.z), 0., 1.);\n #endif\n\n #pragma tangram: filter\n\n gl_FragColor = color;\n}\n"; var PLACEMENT = _label_point2.default.PLACEMENT; @@ -35139,7 +35219,6 @@ Object.assign(Points, _text_labels.TextLabels); Object.assign(Points, { name: 'points', built_in: true, - selection: true, // style enables feature selection collision: true, // style includes a collision pass blend: 'overlay', // overlays drawn on top of all other styles, with blending @@ -35154,10 +35233,9 @@ Object.assign(Points, { var attribs = [{ name: 'a_position', size: 4, type: _constants2.default.SHORT, normalized: false }, { name: 'a_shape', size: 4, type: _constants2.default.SHORT, normalized: false }, { name: 'a_texcoord', size: 2, type: _constants2.default.UNSIGNED_SHORT, normalized: true }, { name: 'a_offset', size: 2, type: _constants2.default.SHORT, normalized: false }, { name: 'a_color', size: 4, type: _constants2.default.UNSIGNED_BYTE, normalized: true }]; - // Optional feature selection - if (this.selection) { - attribs.push({ name: 'a_selection_color', size: 4, type: _constants2.default.UNSIGNED_BYTE, normalized: true }); - } + // Feature selection + this.selection = true; + attribs.push({ name: 'a_selection_color', size: 4, type: _constants2.default.UNSIGNED_BYTE, normalized: true }); this.vertex_layout = new _vertex_layout2.default(attribs); @@ -35191,6 +35269,11 @@ Object.assign(Points, { this.defines.TANGRAM_FADE_IN_RATE = 1 / this.fade_in_time; } + // Snap points to pixel grid after panning stop + if (_debug_settings2.default.suppress_label_snap_animation !== true) { + this.defines.TANGRAM_VIEW_PAN_SNAP_RATE = 1 / _view.VIEW_PAN_SNAP_TIME; // inverse time in seconds + } + this.collision_group_points = this.name + '-points'; this.collision_group_text = this.name + '-text'; @@ -35285,7 +35368,6 @@ Object.assign(Points, { // Placement strategy style.placement = draw.placement; - style.placement_must_fit = draw.placement_must_fit; style.placement_min_length_ratio = _style_parser.StyleParser.evalCachedProperty(draw.placement_min_length_ratio, context); // Spacing parameter (in pixels) to equally space points along a line @@ -35751,7 +35833,7 @@ Object.assign(Points, { } }); -},{"../../builders/points":196,"../../geo":200,"../../gl/constants":201,"../../gl/texture":207,"../../gl/vertex_layout":212,"../../labels/collision":213,"../../labels/label_point":217,"../../labels/point_placement":219,"../../utils/debug_settings":252,"../../utils/log":255,"../../vector":266,"../style":241,"../style_parser":243,"../text/text_labels":247}],239:[function(_dereq_,module,exports){ +},{"../../builders/points":196,"../../geo":200,"../../gl/constants":201,"../../gl/texture":207,"../../gl/vertex_layout":212,"../../labels/collision":213,"../../labels/label_point":217,"../../labels/point_placement":219,"../../utils/debug_settings":252,"../../utils/log":255,"../../vector":266,"../../view":267,"../style":241,"../style_parser":243,"../text/text_labels":247}],239:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -35783,8 +35865,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de // web workers don't have access to GL context, so import all GL constants -var shaderSrc_polygonsVertex = "uniform vec2 u_resolution;\nuniform float u_time;\nuniform vec3 u_map_position;\nuniform vec4 u_tile_origin;\nuniform float u_tile_proxy_depth;\nuniform float u_meters_per_pixel;\nuniform float u_device_pixel_ratio;\nuniform float u_visible_time;\nuniform bool u_fade_in;\n\nuniform mat4 u_model;\nuniform mat4 u_modelView;\nuniform mat3 u_normalMatrix;\nuniform mat3 u_inverseNormalMatrix;\n\nattribute vec4 a_position;\nattribute vec4 a_color;\n\n// Optional normal attribute, otherwise default to up\n#ifdef TANGRAM_NORMAL_ATTRIBUTE\n attribute vec3 a_normal;\n #define TANGRAM_NORMAL a_normal\n#else\n #define TANGRAM_NORMAL vec3(0., 0., 1.)\n#endif\n\n// Optional dynamic line extrusion\n#ifdef TANGRAM_EXTRUDE_LINES\n // xy: extrusion direction in xy plane\n // z: half-width of line (amount to extrude)\n // w: scaling factor for interpolating width between zooms\n attribute vec4 a_extrude;\n#endif\n\nvarying vec4 v_position;\nvarying vec3 v_normal;\nvarying vec4 v_color;\nvarying vec4 v_world_position;\n\n// Optional texture UVs\n#ifdef TANGRAM_TEXTURE_COORDS\n attribute vec2 a_texcoord;\n varying vec2 v_texcoord;\n#endif\n\n// Optional model position varying for tile coordinate zoom\n#ifdef TANGRAM_MODEL_POSITION_BASE_ZOOM_VARYING\n varying vec4 v_modelpos_base_zoom;\n#endif\n\n#if defined(TANGRAM_LIGHTING_VERTEX)\n varying vec4 v_lighting;\n#endif\n\n#pragma tangram: camera\n#pragma tangram: material\n#pragma tangram: lighting\n#pragma tangram: raster\n#pragma tangram: global\n\nvoid main() {\n // Initialize globals\n #pragma tangram: setup\n\n // Texture UVs\n #ifdef TANGRAM_TEXTURE_COORDS\n v_texcoord = a_texcoord;\n #ifdef TANGRAM_EXTRUDE_LINES\n v_texcoord.y *= TANGRAM_V_SCALE_ADJUST;\n #endif\n #endif\n\n // Pass model position to fragment shader\n #ifdef TANGRAM_MODEL_POSITION_BASE_ZOOM_VARYING\n v_modelpos_base_zoom = modelPositionBaseZoom();\n #endif\n\n // Position\n vec4 position = vec4(a_position.xy, a_position.z / TANGRAM_HEIGHT_SCALE, 1.); // convert height back to meters\n\n #ifdef TANGRAM_EXTRUDE_LINES\n vec2 extrude = a_extrude.xy / 256.; // values have an 8-bit fraction\n float width = a_extrude.z;\n float dwdz = a_extrude.w;\n\n // Adjust line width based on zoom level, to prevent proxied lines from being either too small or too big.\n // \"Flattens\" the zoom between 1-2 to peg it to 1 (keeps lines from prematurely shrinking), then interpolate\n // and clamp to 4 (keeps lines from becoming too small when far away).\n float dz = clamp(u_map_position.z - u_tile_origin.z, 0., 4.);\n dz += step(1., dz) * (1. - dz) + mix(0., 2., clamp((dz - 2.) / 2., 0., 1.));\n\n // Interpolate between zoom levels\n width += dwdz * dz;\n\n // Scale pixel dimensions to be consistent in screen space\n // Scale from style zoom units back to tile zoom\n width *= exp2(-dz - (u_tile_origin.z - u_tile_origin.w));\n\n // Modify line width before extrusion\n #pragma tangram: width\n\n position.xy += extrude * width;\n #endif\n\n // World coordinates for 3d procedural textures\n v_world_position = wrapWorldPosition(u_model * position);\n\n // Adjust for tile and view position\n position = u_modelView * position;\n\n // Modify position before camera projection\n #pragma tangram: position\n\n // Setup varyings\n v_position = position;\n v_normal = normalize(u_normalMatrix * TANGRAM_NORMAL);\n v_color = a_color;\n\n #if defined(TANGRAM_LIGHTING_VERTEX)\n // Vertex lighting\n vec3 normal = v_normal;\n\n // Modify normal before lighting\n #pragma tangram: normal\n\n // Pass lighting intensity to fragment shader\n v_lighting = calculateLighting(position.xyz - u_eye, normal, vec4(1.));\n #endif\n\n // Camera\n cameraProjection(position);\n\n // +1 is to keep all layers including proxies > 0\n applyLayerOrder(a_position.w + u_tile_proxy_depth + 1., position);\n\n gl_Position = position;\n}\n"; -var shaderSrc_polygonsFragment = "uniform vec2 u_resolution;\nuniform float u_time;\nuniform vec3 u_map_position;\nuniform vec4 u_tile_origin;\nuniform float u_meters_per_pixel;\nuniform float u_device_pixel_ratio;\nuniform float u_visible_time;\nuniform bool u_fade_in;\n\nuniform mat3 u_normalMatrix;\nuniform mat3 u_inverseNormalMatrix;\n\nvarying vec4 v_position;\nvarying vec3 v_normal;\nvarying vec4 v_color;\nvarying vec4 v_world_position;\n\n#define TANGRAM_NORMAL v_normal\n\n#ifdef TANGRAM_TEXTURE_COORDS\n varying vec2 v_texcoord;\n#endif\n\n#ifdef TANGRAM_MODEL_POSITION_BASE_ZOOM_VARYING\n varying vec4 v_modelpos_base_zoom;\n#endif\n\n#if defined(TANGRAM_LIGHTING_VERTEX)\n varying vec4 v_lighting;\n#endif\n\n#pragma tangram: camera\n#pragma tangram: material\n#pragma tangram: lighting\n#pragma tangram: raster\n#pragma tangram: global\n\nvoid main (void) {\n // Initialize globals\n #pragma tangram: setup\n\n vec4 color = v_color;\n vec3 normal = TANGRAM_NORMAL;\n\n // Apply raster to vertex color\n #ifdef TANGRAM_RASTER_TEXTURE_COLOR\n color *= sampleRaster(0); // multiplied to tint texture color\n #endif\n\n // Apply line texture\n #ifdef TANGRAM_LINE_TEXTURE\n vec2 _line_st = vec2(v_texcoord.x, fract(v_texcoord.y / u_texture_ratio));\n vec4 _line_color = texture2D(u_texture, _line_st);\n\n if (_line_color.a < TANGRAM_ALPHA_TEST) {\n #ifdef TANGRAM_LINE_BACKGROUND_COLOR\n color.rgb = TANGRAM_LINE_BACKGROUND_COLOR;\n #elif !defined(TANGRAM_BLEND_OVERLAY) && !defined(TANGRAM_BLEND_INLAY)\n discard; // use discard when alpha blending is unavailable\n #else\n color.a = 0.; // use alpha channel when blending is available\n #endif\n }\n else {\n color *= _line_color;\n }\n #endif\n\n // First, get normal from raster tile (if applicable)\n #ifdef TANGRAM_RASTER_TEXTURE_NORMAL\n normal = normalize(sampleRaster(0).rgb * 2. - 1.);\n #endif\n\n // Second, alter normal with normal map texture (if applicable)\n #if defined(TANGRAM_LIGHTING_FRAGMENT) && defined(TANGRAM_MATERIAL_NORMAL_TEXTURE)\n calculateNormal(normal);\n #endif\n\n // Normal modification applied here for fragment lighting or no lighting,\n // and in vertex shader for vertex lighting\n #if !defined(TANGRAM_LIGHTING_VERTEX)\n #pragma tangram: normal\n #endif\n\n // Color modification before lighting is applied\n #pragma tangram: color\n\n #if defined(TANGRAM_LIGHTING_FRAGMENT)\n // Calculate per-fragment lighting\n color = calculateLighting(v_position.xyz - u_eye, normal, color);\n #elif defined(TANGRAM_LIGHTING_VERTEX)\n // Apply lighting intensity interpolated from vertex shader\n color *= v_lighting;\n #endif\n\n // Post-processing effects (modify color after lighting)\n #pragma tangram: filter\n\n gl_FragColor = color;\n}\n"; +var shaderSrc_polygonsVertex = "uniform vec2 u_resolution;\nuniform float u_time;\nuniform vec3 u_map_position;\nuniform vec4 u_tile_origin;\nuniform float u_tile_proxy_depth;\nuniform float u_meters_per_pixel;\nuniform float u_device_pixel_ratio;\n\nuniform mat4 u_model;\nuniform mat4 u_modelView;\nuniform mat3 u_normalMatrix;\nuniform mat3 u_inverseNormalMatrix;\n\nattribute vec4 a_position;\nattribute vec4 a_color;\n\n// Optional normal attribute, otherwise default to up\n#ifdef TANGRAM_NORMAL_ATTRIBUTE\n attribute vec3 a_normal;\n #define TANGRAM_NORMAL a_normal\n#else\n #define TANGRAM_NORMAL vec3(0., 0., 1.)\n#endif\n\n// Optional dynamic line extrusion\n#ifdef TANGRAM_EXTRUDE_LINES\n // xy: extrusion direction in xy plane\n // z: half-width of line (amount to extrude)\n // w: scaling factor for interpolating width between zooms\n attribute vec4 a_extrude;\n#endif\n\nvarying vec4 v_position;\nvarying vec3 v_normal;\nvarying vec4 v_color;\nvarying vec4 v_world_position;\n\n// Optional texture UVs\n#ifdef TANGRAM_TEXTURE_COORDS\n attribute vec2 a_texcoord;\n varying vec2 v_texcoord;\n#endif\n\n// Optional model position varying for tile coordinate zoom\n#ifdef TANGRAM_MODEL_POSITION_BASE_ZOOM_VARYING\n varying vec4 v_modelpos_base_zoom;\n#endif\n\n#if defined(TANGRAM_LIGHTING_VERTEX)\n varying vec4 v_lighting;\n#endif\n\n#pragma tangram: camera\n#pragma tangram: material\n#pragma tangram: lighting\n#pragma tangram: raster\n#pragma tangram: global\n\nvoid main() {\n // Initialize globals\n #pragma tangram: setup\n\n // Texture UVs\n #ifdef TANGRAM_TEXTURE_COORDS\n v_texcoord = a_texcoord;\n #ifdef TANGRAM_EXTRUDE_LINES\n v_texcoord.y *= TANGRAM_V_SCALE_ADJUST;\n #endif\n #endif\n\n // Pass model position to fragment shader\n #ifdef TANGRAM_MODEL_POSITION_BASE_ZOOM_VARYING\n v_modelpos_base_zoom = modelPositionBaseZoom();\n #endif\n\n // Position\n vec4 position = vec4(a_position.xy, a_position.z / TANGRAM_HEIGHT_SCALE, 1.); // convert height back to meters\n\n #ifdef TANGRAM_EXTRUDE_LINES\n vec2 extrude = a_extrude.xy / 256.; // values have an 8-bit fraction\n float width = a_extrude.z;\n float dwdz = a_extrude.w;\n\n // Adjust line width based on zoom level, to prevent proxied lines from being either too small or too big.\n // \"Flattens\" the zoom between 1-2 to peg it to 1 (keeps lines from prematurely shrinking), then interpolate\n // and clamp to 4 (keeps lines from becoming too small when far away).\n float dz = clamp(u_map_position.z - u_tile_origin.z, 0., 4.);\n dz += step(1., dz) * (1. - dz) + mix(0., 2., clamp((dz - 2.) / 2., 0., 1.));\n\n // Interpolate between zoom levels\n width += dwdz * dz;\n\n // Scale pixel dimensions to be consistent in screen space\n // Scale from style zoom units back to tile zoom\n width *= exp2(-dz - (u_tile_origin.z - u_tile_origin.w));\n\n // Modify line width before extrusion\n #pragma tangram: width\n\n position.xy += extrude * width;\n #endif\n\n // World coordinates for 3d procedural textures\n v_world_position = wrapWorldPosition(u_model * position);\n\n // Adjust for tile and view position\n position = u_modelView * position;\n\n // Modify position before camera projection\n #pragma tangram: position\n\n // Setup varyings\n v_position = position;\n v_normal = normalize(u_normalMatrix * TANGRAM_NORMAL);\n v_color = a_color;\n\n #if defined(TANGRAM_LIGHTING_VERTEX)\n // Vertex lighting\n vec3 normal = v_normal;\n\n // Modify normal before lighting\n #pragma tangram: normal\n\n // Pass lighting intensity to fragment shader\n v_lighting = calculateLighting(position.xyz - u_eye, normal, vec4(1.));\n #endif\n\n // Camera\n cameraProjection(position);\n\n // +1 is to keep all layers including proxies > 0\n applyLayerOrder(a_position.w + u_tile_proxy_depth + 1., position);\n\n gl_Position = position;\n}\n"; +var shaderSrc_polygonsFragment = "uniform vec2 u_resolution;\nuniform float u_time;\nuniform vec3 u_map_position;\nuniform vec4 u_tile_origin;\nuniform float u_meters_per_pixel;\nuniform float u_device_pixel_ratio;\n\nuniform mat3 u_normalMatrix;\nuniform mat3 u_inverseNormalMatrix;\n\nvarying vec4 v_position;\nvarying vec3 v_normal;\nvarying vec4 v_color;\nvarying vec4 v_world_position;\n\n#define TANGRAM_NORMAL v_normal\n\n#ifdef TANGRAM_TEXTURE_COORDS\n varying vec2 v_texcoord;\n#endif\n\n#ifdef TANGRAM_MODEL_POSITION_BASE_ZOOM_VARYING\n varying vec4 v_modelpos_base_zoom;\n#endif\n\n#if defined(TANGRAM_LIGHTING_VERTEX)\n varying vec4 v_lighting;\n#endif\n\n#pragma tangram: camera\n#pragma tangram: material\n#pragma tangram: lighting\n#pragma tangram: raster\n#pragma tangram: global\n\nvoid main (void) {\n // Initialize globals\n #pragma tangram: setup\n\n vec4 color = v_color;\n vec3 normal = TANGRAM_NORMAL;\n\n // Apply raster to vertex color\n #ifdef TANGRAM_RASTER_TEXTURE_COLOR\n color *= sampleRaster(0); // multiplied to tint texture color\n #endif\n\n // Apply line texture\n #ifdef TANGRAM_LINE_TEXTURE\n vec2 _line_st = vec2(v_texcoord.x, fract(v_texcoord.y / u_texture_ratio));\n vec4 _line_color = texture2D(u_texture, _line_st);\n\n if (_line_color.a < TANGRAM_ALPHA_TEST) {\n #ifdef TANGRAM_LINE_BACKGROUND_COLOR\n color.rgb = TANGRAM_LINE_BACKGROUND_COLOR;\n #elif !defined(TANGRAM_BLEND_OVERLAY) && !defined(TANGRAM_BLEND_INLAY)\n discard; // use discard when alpha blending is unavailable\n #else\n color.a = 0.; // use alpha channel when blending is available\n #endif\n }\n else {\n color *= _line_color;\n }\n #endif\n\n // First, get normal from raster tile (if applicable)\n #ifdef TANGRAM_RASTER_TEXTURE_NORMAL\n normal = normalize(sampleRaster(0).rgb * 2. - 1.);\n #endif\n\n // Second, alter normal with normal map texture (if applicable)\n #if defined(TANGRAM_LIGHTING_FRAGMENT) && defined(TANGRAM_MATERIAL_NORMAL_TEXTURE)\n calculateNormal(normal);\n #endif\n\n // Normal modification applied here for fragment lighting or no lighting,\n // and in vertex shader for vertex lighting\n #if !defined(TANGRAM_LIGHTING_VERTEX)\n #pragma tangram: normal\n #endif\n\n // Color modification before lighting is applied\n #pragma tangram: color\n\n #if defined(TANGRAM_LIGHTING_FRAGMENT)\n // Calculate per-fragment lighting\n color = calculateLighting(v_position.xyz - u_eye, normal, color);\n #elif defined(TANGRAM_LIGHTING_VERTEX)\n // Apply lighting intensity interpolated from vertex shader\n color *= v_lighting;\n #endif\n\n // Post-processing effects (modify color after lighting)\n #pragma tangram: filter\n\n gl_FragColor = color;\n}\n"; var Polygons = exports.Polygons = Object.create(_style.Style); @@ -35798,7 +35880,6 @@ Object.assign(Polygons, { built_in: true, vertex_shader_src: shaderSrc_polygonsVertex, fragment_shader_src: shaderSrc_polygonsFragment, - selection: true, // turn feature selection on init: function init() { _style.Style.init.apply(this, arguments); @@ -35811,10 +35892,9 @@ Object.assign(Polygons, { this.defines.TANGRAM_NORMAL_ATTRIBUTE = true; this.defines.TANGRAM_LAYER_ORDER = true; - // Optional feature selection - if (this.selection) { - attribs.push({ name: 'a_selection_color', size: 4, type: _constants2.default.UNSIGNED_BYTE, normalized: true }); - } + // Feature selection + this.selection = true; + attribs.push({ name: 'a_selection_color', size: 4, type: _constants2.default.UNSIGNED_BYTE, normalized: true }); // Optional texture UVs if (this.texcoords) { @@ -35954,13 +36034,14 @@ Object.assign(RasterStyle, { name: 'raster', super: _polygons.Polygons, built_in: true, - selection: false, // no feature selection by default init: function init() { // Required for raster tiles this.raster = this.raster || 'color'; this.super.init.apply(this, arguments); + + this.selection = false; // raster styles can't support feature selection }, _preprocess: function _preprocess(draw) { // Raster tiles default to white vertex color, as this color will tint the underlying texture @@ -36043,8 +36124,7 @@ var Style = exports.Style = { this.shaders = this.hasOwnProperty('shaders') && this.shaders || {}; // shader customization (uniforms, defines, blocks, etc.) this.introspection = introspection || false; this.selection = this.selection || this.introspection || false; // flag indicating if this style supports feature selection - this.compiling = false; // programs are currently compiling - this.compiled = false; // programs are finished compiling + this.compile_setup = false; // one-time setup steps for program compilation this.program = null; // GL program reference (for main render pass) this.selection_program = null; // GL program reference for feature selection render pass this.feature_style = {}; // style for feature currently being parsed, shared to lessen GC/memory thrash @@ -36303,16 +36383,36 @@ var Style = exports.Style = { render: function render(mesh) { return mesh.render(); }, - compile: function compile() { - if (!this.gl) { - throw new Error('style.compile(): skipping for ' + this.name + ' because no GL context'); + + + // Get a specific program, compiling if necessary + getProgram: function getProgram() { + var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'program'; + + this.compileSetup(); + + var program = this[key]; + if (!program || program.error) { + return; } - if (this.compiling) { - throw new Error('style.compile(): skipping for ' + this.name + ' because style is already compiling'); + if (!program.compiled) { + (0, _log2.default)('debug', 'Compiling style \'' + this.name + '\', program key \'' + key + '\''); + program.compile(); + } + return program; + }, + + + // One-time setup for compiling style's programs + compileSetup: function compileSetup() { + if (this.compile_setup) { + return; + } + + if (!this.gl) { + throw new Error('style.compile(): skipping for ' + this.name + ' because no GL context'); } - this.compiling = true; - this.compiled = false; // Build defines & for selection (need to create a new object since the first is stored as a reference by the program) var defines = this.buildDefineList(); @@ -36333,38 +36433,29 @@ var Style = exports.Style = { } // Create shaders - try { - this.program = new _shader_program2.default(this.gl, this.vertex_shader_src, this.fragment_shader_src, { - name: this.name, - defines: defines, + this.program = new _shader_program2.default(this.gl, this.vertex_shader_src, this.fragment_shader_src, { + name: this.name, + defines: defines, + uniforms: uniforms, + blocks: blocks, + block_scopes: block_scopes, + extensions: extensions + }); + + if (this.selection) { + this.selection_program = new _shader_program2.default(this.gl, this.vertex_shader_src, shaderSrc_selectionFragment, { + name: this.name + ' (selection)', + defines: selection_defines, uniforms: uniforms, blocks: blocks, block_scopes: block_scopes, extensions: extensions }); - this.program.compile(); - - if (this.selection) { - this.selection_program = new _shader_program2.default(this.gl, this.vertex_shader_src, shaderSrc_selectionFragment, { - name: this.name + ' (selection)', - defines: selection_defines, - uniforms: uniforms, - blocks: blocks, - block_scopes: block_scopes, - extensions: extensions - }); - this.selection_program.compile(); - } else { - this.selection_program = null; - } - } catch (error) { - this.compiling = false; - this.compiled = false; - throw new Error('style.compile(): style ' + this.name + ' error:', error); + } else { + this.selection_program = null; } - this.compiling = false; - this.compiled = true; + this.compile_setup = true; }, @@ -36623,12 +36714,6 @@ var Style = exports.Style = { } return a.name < b.name ? -1 : 1; // use name as tie breaker - }, - update: function update() { - // Style-specific animation - // if (typeof this.animation === 'function') { - // this.animation(); - // } } }; @@ -37136,48 +37221,6 @@ var StyleManager = exports.StyleManager = function () { } return parents; } - - // Compile all styles - - }, { - key: 'compile', - value: function compile(keys, scene) { - var _this4 = this; - - keys = keys || Object.keys(this.styles); - keys.forEach(function (key) { - var style = _this4.styles[key]; - try { - style.compile(); - (0, _log2.default)('trace', 'StyleManager.compile(): compiled style ' + key); - } catch (error) { - (0, _log2.default)('error', 'StyleManager.compile(): error compiling style ' + key + ':', error); - - scene.trigger('warning', { - type: 'styles', - message: 'Error compiling style ' + key, - style: style, - shader_errors: style.program && style.program.shader_errors - }); - } - }); - - (0, _log2.default)('debug', 'StyleManager.compile(): compiled all styles'); - } - - // Get all styles with mesh data for a given tile - - }], [{ - key: 'stylesForTile', - value: function stylesForTile(tile_key, styles) { - var tile_styles = []; - for (var s in styles) { - if (styles[s].hasDataForTile(tile_key)) { - tile_styles.push(s); - } - } - return tile_styles; - } }]); return StyleManager; @@ -38132,7 +38175,7 @@ var MultiLine = function () { this.lines = []; this.ellipsis = '...'; - this.ellipsis_width = context.measureText(this.ellipsis).width; + this.ellipsis_width = Math.ceil(context.measureText(this.ellipsis).width); this.max_lines = max_lines; this.text_wrap = text_wrap; @@ -38283,7 +38326,7 @@ var Line = function () { this.chars = 0; this.text = ''; - this.height = height; + this.height = Math.ceil(height); this.text_wrap = text_wrap; } @@ -38511,7 +38554,6 @@ Object.assign(TextStyle, { name: 'text', super: _points.Points, built_in: true, - selection: false, // no feature selection for text by default init: function init() { this.super.init.apply(this, arguments); @@ -39238,8 +39280,6 @@ var _geo2 = _interopRequireDefault(_geo); var _style_parser = _dereq_('./styles/style_parser'); -var _style_manager = _dereq_('./styles/style_manager'); - var _collision = _dereq_('./labels/collision'); var _collision2 = _interopRequireDefault(_collision); @@ -39555,7 +39595,7 @@ var Tile = function () { // Fade in labels according to proxy status, avoiding "flickering" where // labels quickly go from invisible back to visible - program.uniform('1i', 'u_fade_in', this.fade_in && this.proxied_as !== 'child'); + program.uniform('1i', 'u_tile_fade_in', this.fade_in && this.proxied_as !== 'child'); } // Slice a subset of keys out of a tile @@ -39774,7 +39814,7 @@ var Tile = function () { tile.debug.rendering = +new Date() - tile.debug.rendering; // Send styles back to main thread as they finish building, in two groups: collision vs. non-collision - var tile_styles = _style_manager.StyleManager.stylesForTile(tile.key, styles).map(function (s) { + var tile_styles = this.stylesForTile(tile.key, styles).map(function (s) { return styles[s]; }); Tile.sendStyleGroups(tile, tile_styles, { scene_id: scene_id }, function (style) { @@ -39783,6 +39823,17 @@ var Tile = function () { // Tile.sendStyleGroups(tile, tile_styles, { scene_id }, style => style.name); // call for each style // Tile.sendStyleGroups(tile, tile_styles, { scene_id }, style => 'styles'); // all styles in single call (previous behavior) } + }, { + key: 'stylesForTile', + value: function stylesForTile(tile_key, styles) { + var tile_styles = []; + for (var s in styles) { + if (styles[s].hasDataForTile(tile_key)) { + tile_styles.push(s); + } + } + return tile_styles; + } // Send groups of styles back to main thread, asynchronously (as they finish building), // grouped by the provided function @@ -39948,7 +39999,7 @@ exports.default = Tile; Tile.coord_children = {}; // only allocate children coordinates once per coordinate -},{"./geo":200,"./gl/texture":207,"./labels/collision":213,"./styles/style_manager":242,"./styles/style_parser":243,"./utils/gl-matrix":254,"./utils/log":255,"./utils/worker_broker":265}],250:[function(_dereq_,module,exports){ +},{"./geo":200,"./gl/texture":207,"./labels/collision":213,"./styles/style_parser":243,"./utils/gl-matrix":254,"./utils/log":255,"./utils/worker_broker":265}],250:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -39991,6 +40042,8 @@ var TileManager = function () { this.visible_coords = {}; this.queued_coords = []; this.building_tiles = null; + this.renderable_tiles = []; + this.active_styles = []; // Provide a hook for this object to be called from worker threads this.main_thread_target = ['TileManager', this.scene.id].join('_'); @@ -40121,6 +40174,8 @@ var TileManager = function () { this.loadQueuedCoordinates(); this.updateProxyTiles(); this.view.pruneTilesForView(); + this.updateRenderableTiles(); + this.updateActiveStyles(); } }, { key: 'updateProxyTiles', @@ -40192,14 +40247,38 @@ var TileManager = function () { }, { key: 'getRenderableTiles', value: function getRenderableTiles() { - var tiles = []; + return this.renderable_tiles; + } + }, { + key: 'updateRenderableTiles', + value: function updateRenderableTiles() { + this.renderable_tiles = []; for (var t in this.tiles) { var tile = this.tiles[t]; if (tile.visible && tile.loaded) { - tiles.push(tile); + this.renderable_tiles.push(tile); } } - return tiles; + return this.renderable_tiles; + } + }, { + key: 'getActiveStyles', + value: function getActiveStyles() { + return this.active_styles; + } + }, { + key: 'updateActiveStyles', + value: function updateActiveStyles() { + var tiles = this.renderable_tiles; + var active = {}; + for (var t = 0; t < tiles.length; t++) { + var tile = tiles[t]; + Object.keys(tile.meshes).forEach(function (s) { + return active[s] = true; + }); + } + this.active_styles = Object.keys(active); + return this.active_styles; } }, { key: 'isLoadingVisibleTiles', @@ -40265,7 +40344,7 @@ var TileManager = function () { var tile = _tile2.default.create({ source: source, coords: coords, - worker: this.scene.nextWorker(), + worker: this.scene.getWorkerForDataSource(source), style_zoom: this.view.styleZoom(coords.z), view: this.view }); @@ -40599,7 +40678,9 @@ exports.default = { // draws a green rectangle border within the texture box of a label draw_label_texture_boxes: false, // suppreses fade-in of labels - suppress_label_fade_in: false + suppress_label_fade_in: false, + // suppress animaton of label snap to pixel grid + suppress_label_snap_animation: false }; },{}],253:[function(_dereq_,module,exports){ @@ -41445,10 +41526,18 @@ Object.defineProperty(exports, "__esModule", { var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; // Miscellaneous utilities /*jshint worker: true*/ +var _log = _dereq_('./log'); + +var _log2 = _interopRequireDefault(_log); + var _thread = _dereq_('./thread'); var _thread2 = _interopRequireDefault(_thread); +var _worker_broker = _dereq_('./worker_broker'); + +var _worker_broker2 = _interopRequireDefault(_worker_broker); + var _geo = _dereq_('../geo'); var _geo2 = _interopRequireDefault(_geo); @@ -41464,50 +41553,69 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr var Utils; exports.default = Utils = {}; + +_worker_broker2.default.addTarget('Utils', Utils); + // Basic Safari detection // http://stackoverflow.com/questions/7944460/detect-safari-browser - Utils.isSafari = function () { return (/^((?!chrome|android).)*safari/i.test(navigator.userAgent) ); }; +// Basic IE11 or Edge detection +Utils.isMicrosoft = function () { + return (/(Trident\/7.0|Edge[ /](\d+[\.\d]+))/i.test(navigator.userAgent) + ); +}; + Utils.io = function (url) { var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 60000; var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'text'; var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'GET'; var headers = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - - var request = new XMLHttpRequest(); - var promise = new Promise(function (resolve, reject) { - request.open(method, url, true); - request.timeout = timeout; - request.responseType = responseType; - request.onload = function () { - if (request.status === 200) { - if (['text', 'json'].indexOf(request.responseType) > -1) { - resolve(request.responseText); + var proxy = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; + + if (_thread2.default.is_worker && Utils.isMicrosoft()) { + // Some versions of IE11 and Edge will hang web workers when performing XHR requests + // These requests can be proxied through the main thread + // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/9545866/ + (0, _log2.default)('debug', 'Proxying request for URL to worker', url); + return _worker_broker2.default.postMessage('Utils.io', url, timeout, responseType, method, headers, true); + } else { + var request = new XMLHttpRequest(); + var promise = new Promise(function (resolve, reject) { + request.open(method, url, true); + request.timeout = timeout; + request.responseType = responseType; + request.onload = function () { + if (request.status === 200) { + if (['text', 'json'].indexOf(request.responseType) > -1) { + resolve(request.responseText); + } else { + resolve(request.response); + } } else { - resolve(request.response); + reject(Error('Request error with a status of ' + request.statusText)); } - } else { - reject(Error('Request error with a status of ' + request.statusText)); - } - }; - request.onerror = function (evt) { - reject(Error('There was a network error' + evt.toString())); - }; - request.ontimeout = function (evt) { - reject(Error('timeout ' + evt.toString())); - }; - request.send(); - }); + }; + request.onerror = function (evt) { + reject(Error('There was a network error' + evt.toString())); + }; + request.ontimeout = function (evt) { + reject(Error('timeout ' + evt.toString())); + }; + request.send(); + }); - Object.defineProperty(promise, 'request', { - value: request - }); + Object.defineProperty(promise, 'request', { + value: request + }); - return promise; + return promise.then(function (response) { + return proxy && _worker_broker2.default.withTransferables(response) || response; + }); + } }; Utils.parseResource = function (body) { @@ -41722,14 +41830,14 @@ Utils.pointInTile = function (point) { return point[0] >= 0 && point[1] > -_geo2.default.tile_scale && point[0] < _geo2.default.tile_scale && point[1] <= 0; }; -},{"../geo":200,"./thread":261,"js-yaml":95}],264:[function(_dereq_,module,exports){ +},{"../geo":200,"./log":255,"./thread":261,"./worker_broker":265,"js-yaml":95}],264:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -var pkg = JSON.parse("{\n \"name\": \"tangram\",\n \"version\": \"0.11.0\",\n \"description\": \"WebGL Maps for Vector Tiles\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/tangrams/tangram.git\"\n },\n \"main\": \"dist/tangram.min.js\",\n \"homepage\": \"https://github.com/tangrams/tangram\",\n \"keywords\": [\n \"maps\",\n \"graphics\",\n \"rendering\",\n \"visualization\",\n \"WebGL\",\n \"OpenStreetMap\"\n ],\n \"scripts\": {\n \"start\": \"npm run watch\",\n \"test\": \"npm run lint && npm run build-test && npm run test-local\",\n \"test-ci\": \"npm run lint && npm run build-test && npm run test-remote\",\n \"test-remote\": \"./node_modules/karma/bin/karma start --browsers SL_Firefox --single-run\",\n \"test-local\": \"./node_modules/karma/bin/karma start --browsers Chrome --single-run\",\n \"karma-start\": \"./node_modules/karma/bin/karma start --browsers Chrome --no-watch\",\n \"karma-run\": \"./node_modules/karma/bin/karma run --browsers Chrome\",\n \"lint\": \"$(npm bin)/jshint src/ && jshint test/\",\n \"build\": \"npm run build-bundle -- -o dist/tangram.debug.js && npm run build-minify\",\n \"build-test\": \"npm run build-bundle -- -o dist/tangram.test.js\",\n \"build-debug\": \"npm run build-bundle -- -o dist/tangram.debug.js\",\n \"build-bundle\": \"$(npm bin)/browserify src/module.js -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram -p browserify-derequire --debug\",\n \"build-minify\": \"$(npm bin)/uglifyjs dist/tangram.debug.js -c warnings=false -m -o dist/tangram.min.js && npm run build-size\",\n \"build-size\": \"gzip dist/tangram.min.js -c | wc -c | awk '{kb=$1/1024; print kb}' OFMT='%.0fk minified+gzipped'\",\n \"watch\": \"$(npm bin)/budo src/module.js:dist/tangram.debug.js --port 8000 --cors --live -- -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram\"\n },\n \"author\": {\n \"name\": \"Mapzen\",\n \"email\": \"tangram@mapzen.com\"\n },\n \"contributors\": [\n {\n \"name\": \"Brett Camper\"\n },\n {\n \"name\": \"Peter Richardson\"\n },\n {\n \"name\": \"Patricio Gonzalez Vivo\"\n },\n {\n \"name\": \"Karim Naaji\"\n },\n {\n \"name\": \"Ivan Willig\"\n },\n {\n \"name\": \"Lou Huang\"\n },\n {\n \"name\": \"David Valdman\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"brfs\": \"1.4.3\",\n \"csscolorparser\": \"1.0.3\",\n \"earcut\": \"2.1.1\",\n \"fontfaceobserver\": \"1.7.1\",\n \"geojson-vt\": \"2.1.6\",\n \"gl-mat3\": \"1.0.0\",\n \"gl-mat4\": \"1.1.4\",\n \"gl-shader-errors\": \"1.0.3\",\n \"js-yaml\": \"tangrams/js-yaml#read-only\",\n \"jszip\": \"tangrams/jszip#read-only\",\n \"match-feature\": \"tangrams/match-feature#v1.3.1\",\n \"pbf\": \"1.3.2\",\n \"strip-comments\": \"0.3.2\",\n \"topojson-client\": \"tangrams/topojson-client#read-only\",\n \"vector-tile\": \"1.1.2\"\n },\n \"devDependencies\": {\n \"babelify\": \"7.3.0\",\n \"babel-preset-es2015\": \"6.16.0\",\n \"browserify\": \"13.0.1\",\n \"browserify-derequire\": \"0.9.4\",\n \"budo\": \"8.2.1\",\n \"chai\": \"1.9.2\",\n \"chai-as-promised\": \"4.1.1\",\n \"core-js\": \"2.4.1\",\n \"glob\": \"4.0.6\",\n \"jshint\": \"jshint/jshint#3a8efa979dbb157bfb5c10b5826603a55a33b9ad\",\n \"karma\": \"0.12.23\",\n \"karma-browserify\": \"5.1.0\",\n \"karma-chrome-launcher\": \"0.1.4\",\n \"karma-mocha\": \"0.1.9\",\n \"karma-mocha-reporter\": \"1.0.0\",\n \"karma-sauce-launcher\": \"tangrams/karma-sauce-launcher#firefox-profiles\",\n \"karma-sinon\": \"1.0.4\",\n \"mocha\": \"1.21.4\",\n \"sinon\": \"1.10.3\",\n \"uglify-js\": \"2.4.14\",\n \"yargs\": \"1.3.2\"\n }\n}\n"); +var pkg = JSON.parse("{\n \"name\": \"tangram\",\n \"version\": \"0.11.1\",\n \"description\": \"WebGL Maps for Vector Tiles\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/tangrams/tangram.git\"\n },\n \"main\": \"dist/tangram.min.js\",\n \"homepage\": \"https://github.com/tangrams/tangram\",\n \"keywords\": [\n \"maps\",\n \"graphics\",\n \"rendering\",\n \"visualization\",\n \"WebGL\",\n \"OpenStreetMap\"\n ],\n \"scripts\": {\n \"start\": \"npm run watch\",\n \"test\": \"npm run lint && npm run build-test && npm run test-local\",\n \"test-ci\": \"npm run lint && npm run build-test && npm run test-remote\",\n \"test-remote\": \"./node_modules/karma/bin/karma start --browsers SL_Firefox --single-run\",\n \"test-local\": \"./node_modules/karma/bin/karma start --browsers Chrome --single-run\",\n \"karma-start\": \"./node_modules/karma/bin/karma start --browsers Chrome --no-watch\",\n \"karma-run\": \"./node_modules/karma/bin/karma run --browsers Chrome\",\n \"lint\": \"$(npm bin)/jshint src/ && jshint test/\",\n \"build\": \"npm run build-bundle -- -o dist/tangram.debug.js && npm run build-minify\",\n \"build-test\": \"npm run build-bundle -- -o dist/tangram.test.js\",\n \"build-debug\": \"npm run build-bundle -- -o dist/tangram.debug.js\",\n \"build-bundle\": \"$(npm bin)/browserify src/module.js -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram -p browserify-derequire --debug\",\n \"build-minify\": \"$(npm bin)/uglifyjs dist/tangram.debug.js -c warnings=false -m -o dist/tangram.min.js && npm run build-size\",\n \"build-size\": \"gzip dist/tangram.min.js -c | wc -c | awk '{kb=$1/1024; print kb}' OFMT='%.0fk minified+gzipped'\",\n \"watch\": \"$(npm bin)/budo src/module.js:dist/tangram.debug.js --port 8000 --cors --live -- -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram\"\n },\n \"author\": {\n \"name\": \"Mapzen\",\n \"email\": \"tangram@mapzen.com\"\n },\n \"contributors\": [\n {\n \"name\": \"Brett Camper\"\n },\n {\n \"name\": \"Peter Richardson\"\n },\n {\n \"name\": \"Patricio Gonzalez Vivo\"\n },\n {\n \"name\": \"Karim Naaji\"\n },\n {\n \"name\": \"Ivan Willig\"\n },\n {\n \"name\": \"Lou Huang\"\n },\n {\n \"name\": \"David Valdman\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"brfs\": \"1.4.3\",\n \"csscolorparser\": \"1.0.3\",\n \"earcut\": \"2.1.1\",\n \"fontfaceobserver\": \"1.7.1\",\n \"geojson-vt\": \"2.1.6\",\n \"gl-mat3\": \"1.0.0\",\n \"gl-mat4\": \"1.1.4\",\n \"gl-shader-errors\": \"1.0.3\",\n \"js-yaml\": \"tangrams/js-yaml#read-only\",\n \"jszip\": \"tangrams/jszip#read-only\",\n \"match-feature\": \"tangrams/match-feature#v1.3.1\",\n \"pbf\": \"1.3.2\",\n \"strip-comments\": \"0.3.2\",\n \"topojson-client\": \"tangrams/topojson-client#read-only\",\n \"vector-tile\": \"1.1.2\"\n },\n \"devDependencies\": {\n \"babelify\": \"7.3.0\",\n \"babel-preset-es2015\": \"6.16.0\",\n \"browserify\": \"13.0.1\",\n \"browserify-derequire\": \"0.9.4\",\n \"budo\": \"8.2.1\",\n \"chai\": \"1.9.2\",\n \"chai-as-promised\": \"4.1.1\",\n \"core-js\": \"2.4.1\",\n \"glob\": \"4.0.6\",\n \"jshint\": \"jshint/jshint#3a8efa979dbb157bfb5c10b5826603a55a33b9ad\",\n \"karma\": \"0.12.23\",\n \"karma-browserify\": \"5.1.0\",\n \"karma-chrome-launcher\": \"0.1.4\",\n \"karma-mocha\": \"0.1.9\",\n \"karma-mocha-reporter\": \"1.0.0\",\n \"karma-sauce-launcher\": \"tangrams/karma-sauce-launcher#firefox-profiles\",\n \"karma-sinon\": \"1.0.4\",\n \"mocha\": \"1.21.4\",\n \"sinon\": \"1.10.3\",\n \"uglify-js\": \"2.4.14\",\n \"yargs\": \"1.3.2\"\n }\n}\n"); var version = void 0; exports.default = version = 'v' + pkg.version; @@ -42004,7 +42112,7 @@ function setupMainThread() { result.then(function (value) { if (value instanceof WorkerBroker.withTransferables) { transferables = value.transferables; - value = value.value; + value = value.value[0]; } payload = { @@ -42032,7 +42140,7 @@ function setupMainThread() { else { if (result instanceof WorkerBroker.withTransferables) { transferables = result.transferables; - result = result.value; + result = result.value[0]; } payload = { @@ -42175,7 +42283,7 @@ function setupWorkerThread() { result.then(function (value) { if (value instanceof WorkerBroker.withTransferables) { transferables = value.transferables; - value = value.value; + value = value.value[0]; } payload = { @@ -42203,7 +42311,7 @@ function setupWorkerThread() { else { if (result instanceof WorkerBroker.withTransferables) { transferables = result.transferables; - result = result.value; + result = result.value[0]; } payload = { @@ -42510,6 +42618,7 @@ Vector.dot = function (v1, v2) { Object.defineProperty(exports, "__esModule", { value: true }); +exports.VIEW_PAN_SNAP_TIME = undefined; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); @@ -42543,6 +42652,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +var VIEW_PAN_SNAP_TIME = exports.VIEW_PAN_SNAP_TIME = 0.5; + var View = function () { function View(scene, options) { _classCallCheck(this, View); @@ -42558,6 +42669,8 @@ var View = function () { this.meters_per_pixel = null; this.panning = false; + this.panning_stop_at = 0; + this.pan_snap_timer = 0; this.zooming = false; this.zoom_direction = 0; @@ -42641,6 +42754,7 @@ var View = function () { key: 'update', value: function update() { this.camera.update(); + this.pan_snap_timer = (+new Date() - this.panning_stop_at) / 1000; } // Set logical pixel size of viewport @@ -42744,6 +42858,14 @@ var View = function () { value: function styleZoom(tile_zoom) { return this.baseZoom(tile_zoom) + this.tile_simplification_level; } + }, { + key: 'setPanning', + value: function setPanning(panning) { + this.panning = panning; + if (!this.panning) { + this.panning_stop_at = +new Date(); + } + } }, { key: 'ready', value: function ready() { @@ -42905,9 +43027,19 @@ var View = function () { program.uniform('3fv', 'u_map_position', [this.center.meters.x, this.center.meters.y, this.zoom]); program.uniform('1f', 'u_meters_per_pixel', this.meters_per_pixel); program.uniform('1f', 'u_device_pixel_ratio', _utils2.default.device_pixel_ratio); + program.uniform('1f', 'u_view_pan_snap_timer', this.pan_snap_timer); + program.uniform('1i', 'u_view_panning', this.panning); this.camera.setupProgram(program); } + + // View requires some animation, such as after panning stops + + }, { + key: 'isAnimating', + value: function isAnimating() { + return this.pan_snap_timer <= VIEW_PAN_SNAP_TIME; + } }]); return View; @@ -42917,4 +43049,4 @@ exports.default = View; },{"./camera":199,"./geo":200,"./tile":249,"./utils/log":255,"./utils/subscribe":260,"./utils/utils":263}]},{},[224])(224) }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLWFzYXAuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLXJhdy5qcyIsIm5vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3Nlci1yZXNvbHZlL2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2VzNi9wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2N0eC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oYXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyYXRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1hdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9jc3Njb2xvcnBhcnNlci9jc3Njb2xvcnBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIm5vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2ZvbnRmYWNlb2JzZXJ2ZXIvZm9udGZhY2VvYnNlcnZlci5zdGFuZGFsb25lLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NsaXAuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY29udmVydC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9zaW1wbGlmeS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy90aWxlLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3dyYXAuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0My9pbnZlcnQuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0My9ub3JtYWwtZnJvbS1tYXQ0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvY29weS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2lkZW50aXR5LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvbG9va0F0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvbXVsdGlwbHkuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9wZXJzcGVjdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L3NjYWxlLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvdHJhbnNsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2dsLXNoYWRlci1lcnJvcnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2lzLWJ1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2NvbW1vbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2V4Y2VwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2xvYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL21hcmsuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2pzb24uanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9iaW5hcnkuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Jvb2wuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Zsb2F0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9pbnQuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL2Z1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9yZWdleHAuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL3VuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWFwLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbnVsbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvb21hcC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NlcS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2V0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zdHIuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3RpbWVzdGFtcC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvYmFzZTY0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2VkT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2lvbnMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2NyYzMyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9kZWZhdWx0cy5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvZXh0ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2ZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbG9hZC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL25vZGVqc1V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9vYmplY3QuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9BcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL0RhdGFSZWFkZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9Ob2RlQnVmZmVyUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvU3RyaW5nUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvVWludDhBcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL3JlYWRlckZvci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc2lnbmF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vQ29udmVydFdvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL0NyYzMyUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhV29ya2VyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vR2VuZXJpY1dvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL1N0cmVhbUhlbHBlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3VwcG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRmOC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJpZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJ5LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi96aXBPYmplY3QuanMiLCJub2RlX21vZHVsZXMvbWF0Y2gtZmVhdHVyZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL2RlZmxhdGUuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvaW5mbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9jb21tb24uanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvc3RyaW5ncy5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jb25zdGFudHMuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jcmMzMi5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2RlZmxhdGUuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9nemhlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmZhc3QuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9tZXNzYWdlcy5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3RyZWVzLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvenN0cmVhbS5qcyIsIm5vZGVfbW9kdWxlcy9wYmYvYnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL3BiZi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wb2ludC1nZW9tZXRyeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9zdHJpbmdfZGVjb2Rlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zdHJpcC1jb21tZW50cy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy90b3BvanNvbi1jbGllbnQvZGlzdC90b3BvanNvbi1jbGllbnQuanMiLCJub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZS5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVsYXllci5qcyIsInNyYy9idWlsZGVycy9jb21tb24uanMiLCJzcmMvYnVpbGRlcnMvcG9pbnRzLmpzIiwic3JjL2J1aWxkZXJzL3BvbHlnb25zLmpzIiwic3JjL2J1aWxkZXJzL3BvbHlsaW5lcy5qcyIsInNyYy9jYW1lcmEuanMiLCJzcmMvZ2VvLmpzIiwic3JjL2dsL2NvbnN0YW50cy5qcyIsInNyYy9nbC9jb250ZXh0LmpzIiwic3JjL2dsL2V4dGVuc2lvbnMuanMiLCJzcmMvZ2wvZ2xzbC5qcyIsInNyYy9nbC9yZW5kZXJfc3RhdGUuanMiLCJzcmMvZ2wvc2hhZGVyX3Byb2dyYW0uanMiLCJzcmMvZ2wvdGV4dHVyZS5qcyIsInNyYy9nbC92YW8uanMiLCJzcmMvZ2wvdmJvX21lc2guanMiLCJzcmMvZ2wvdmVydGV4X2RhdGEuanMiLCJzcmMvZ2wvdmVydGV4X2VsZW1lbnRzLmpzIiwic3JjL2dsL3ZlcnRleF9sYXlvdXQuanMiLCJzcmMvbGFiZWxzL2NvbGxpc2lvbi5qcyIsInNyYy9sYWJlbHMvaW50ZXJzZWN0LmpzIiwic3JjL2xhYmVscy9sYWJlbC5qcyIsInNyYy9sYWJlbHMvbGFiZWxfbGluZS5qcyIsInNyYy9sYWJlbHMvbGFiZWxfcG9pbnQuanMiLCJzcmMvbGFiZWxzL3BvaW50X2FuY2hvci5qcyIsInNyYy9sYWJlbHMvcG9pbnRfcGxhY2VtZW50LmpzIiwic3JjL2xhYmVscy9yZXBlYXRfZ3JvdXAuanMiLCJzcmMvbGVhZmxldF9sYXllci5qcyIsInNyYy9saWdodC5qcyIsInNyYy9tYXRlcmlhbC5qcyIsInNyYy9tb2R1bGUuanMiLCJzcmMvc2NlbmUuanMiLCJzcmMvc2NlbmVfYnVuZGxlLmpzIiwic3JjL3NjZW5lX2xvYWRlci5qcyIsInNyYy9zY2VuZV93b3JrZXIuanMiLCJzcmMvc2VsZWN0aW9uLmpzIiwic3JjL3NvdXJjZXMvZGF0YV9zb3VyY2UuanMiLCJzcmMvc291cmNlcy9nZW9qc29uLmpzIiwic3JjL3NvdXJjZXMvbXZ0LmpzIiwic3JjL3NvdXJjZXMvcmFzdGVyLmpzIiwic3JjL3NvdXJjZXMvdG9wb2pzb24uanMiLCJzcmMvc3R5bGVzL2xheWVyLmpzIiwic3JjL3N0eWxlcy9saW5lcy9kYXNoYXJyYXkuanMiLCJzcmMvc3R5bGVzL2xpbmVzL2xpbmVzLmpzIiwic3JjL3N0eWxlcy9wb2ludHMvcG9pbnRzLmpzIiwic3JjL3N0eWxlcy9wb2x5Z29ucy9wb2x5Z29ucy5qcyIsInNyYy9zdHlsZXMvcmFzdGVyL3Jhc3Rlci5qcyIsInNyYy9zdHlsZXMvc3R5bGUuanMiLCJzcmMvc3R5bGVzL3N0eWxlX21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3N0eWxlX3BhcnNlci5qcyIsInNyYy9zdHlsZXMvdGV4dC9jYW52YXNfdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC9mb250X21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3RleHQvdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X2xhYmVscy5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X3NldHRpbmdzLmpzIiwic3JjL3RpbGUuanMiLCJzcmMvdGlsZV9tYW5hZ2VyLmpzIiwic3JjL3RpbGVfcHlyYW1pZC5qcyIsInNyYy91dGlscy9kZWJ1Z19zZXR0aW5ncy5qcyIsInNyYy91dGlscy9lcnJvcnMuanMiLCJzcmMvdXRpbHMvZ2wtbWF0cml4LmpzIiwic3JjL3V0aWxzL2xvZy5qcyIsInNyYy91dGlscy9tZWRpYV9jYXB0dXJlLmpzIiwic3JjL3V0aWxzL21lcmdlLmpzIiwic3JjL3V0aWxzL29iYi5qcyIsInNyYy91dGlscy9wb2x5ZmlsbHMuanMiLCJzcmMvdXRpbHMvc3Vic2NyaWJlLmpzIiwic3JjL3V0aWxzL3RocmVhZC5qcyIsInNyYy91dGlscy91cmxzLmpzIiwic3JjL3V0aWxzL3V0aWxzLmpzIiwic3JjL3V0aWxzL3ZlcnNpb24uanMiLCJzcmMvdXRpbHMvd29ya2VyX2Jyb2tlci5qcyIsInNyYy92ZWN0b3IuanMiLCJzcmMvdmlldy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM3dkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBOztBQ0FBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7O0FDRkE7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGpEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDN01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25SQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0VUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xnREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdmFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDLzJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25MQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMWtCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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SyxJQUFsRCxDQUF6QztBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0Isb0JBQXRCLEVBQTRDLEtBQUssZ0JBQWpEO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQixzQkFBdEIsRUFBOEMsZ0JBQU0sa0JBQXBEOztBQUVBLGlCQUFLLE1BQUwsQ0FBWSxZQUFaLENBQXlCLE9BQXpCO0FBQ0g7Ozs7OztrQkFyVGdCLEkiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIHJhd0FzYXAgcHJvdmlkZXMgZXZlcnl0aGluZyB3ZSBuZWVkIGV4Y2VwdCBleGNlcHRpb24gbWFuYWdlbWVudC5cbnZhciByYXdBc2FwID0gcmVxdWlyZShcIi4vcmF3XCIpO1xuLy8gUmF3VGFza3MgYXJlIHJlY3ljbGVkIHRvIHJlZHVjZSBHQyBjaHVybi5cbnZhciBmcmVlVGFza3MgPSBbXTtcbi8vIFdlIHF1ZXVlIGVycm9ycyB0byBlbnN1cmUgdGhleSBhcmUgdGhyb3duIGluIHJpZ2h0IG9yZGVyIChGSUZPKS5cbi8vIEFycmF5LWFzLXF1ZXVlIGlzIGdvb2QgZW5vdWdoIGhlcmUsIHNpbmNlIHdlIGFyZSBqdXN0IGRlYWxpbmcgd2l0aCBleGNlcHRpb25zLlxudmFyIHBlbmRpbmdFcnJvcnMgPSBbXTtcbnZhciByZXF1ZXN0RXJyb3JUaHJvdyA9IHJhd0FzYXAubWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKHRocm93Rmlyc3RFcnJvcik7XG5cbmZ1bmN0aW9uIHRocm93Rmlyc3RFcnJvcigpIHtcbiAgICBpZiAocGVuZGluZ0Vycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgcGVuZGluZ0Vycm9ycy5zaGlmdCgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDYWxscyBhIHRhc2sgYXMgc29vbiBhcyBwb3NzaWJsZSBhZnRlciByZXR1cm5pbmcsIGluIGl0cyBvd24gZXZlbnQsIHdpdGggcHJpb3JpdHlcbiAqIG92ZXIgb3RoZXIgZXZlbnRzIGxpa2UgYW5pbWF0aW9uLCByZWZsb3csIGFuZCByZXBhaW50LiBBbiBlcnJvciB0aHJvd24gZnJvbSBhblxuICogZXZlbnQgd2lsbCBub3QgaW50ZXJydXB0LCBub3IgZXZlbiBzdWJzdGFudGlhbGx5IHNsb3cgZG93biB0aGUgcHJvY2Vzc2luZyBvZlxuICogb3RoZXIgZXZlbnRzLCBidXQgd2lsbCBiZSByYXRoZXIgcG9zdHBvbmVkIHRvIGEgbG93ZXIgcHJpb3JpdHkgZXZlbnQuXG4gKiBAcGFyYW0ge3tjYWxsfX0gdGFzayBBIGNhbGxhYmxlIG9iamVjdCwgdHlwaWNhbGx5IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBub1xuICogYXJndW1lbnRzLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGFzYXA7XG5mdW5jdGlvbiBhc2FwKHRhc2spIHtcbiAgICB2YXIgcmF3VGFzaztcbiAgICBpZiAoZnJlZVRhc2tzLmxlbmd0aCkge1xuICAgICAgICByYXdUYXNrID0gZnJlZVRhc2tzLnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJhd1Rhc2sgPSBuZXcgUmF3VGFzaygpO1xuICAgIH1cbiAgICByYXdUYXNrLnRhc2sgPSB0YXNrO1xuICAgIHJhd0FzYXAocmF3VGFzayk7XG59XG5cbi8vIFdlIHdyYXAgdGFza3Mgd2l0aCByZWN5Y2xhYmxlIHRhc2sgb2JqZWN0cy4gIEEgdGFzayBvYmplY3QgaW1wbGVtZW50c1xuLy8gYGNhbGxgLCBqdXN0IGxpa2UgYSBmdW5jdGlvbi5cbmZ1bmN0aW9uIFJhd1Rhc2soKSB7XG4gICAgdGhpcy50YXNrID0gbnVsbDtcbn1cblxuLy8gVGhlIHNvbGUgcHVycG9zZSBvZiB3cmFwcGluZyB0aGUgdGFzayBpcyB0byBjYXRjaCB0aGUgZXhjZXB0aW9uIGFuZCByZWN5Y2xlXG4vLyB0aGUgdGFzayBvYmplY3QgYWZ0ZXIgaXRzIHNpbmdsZSB1c2UuXG5SYXdUYXNrLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIHRoaXMudGFzay5jYWxsKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGFzYXAub25lcnJvcikge1xuICAgICAgICAgICAgLy8gVGhpcyBob29rIGV4aXN0cyBwdXJlbHkgZm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gICAgICAgICAgICAvLyBJdHMgbmFtZSB3aWxsIGJlIHBlcmlvZGljYWxseSByYW5kb21pemVkIHRvIGJyZWFrIGFueSBjb2RlIHRoYXRcbiAgICAgICAgICAgIC8vIGRlcGVuZHMgb24gaXRzIGV4aXN0ZW5jZS5cbiAgICAgICAgICAgIGFzYXAub25lcnJvcihlcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJbiBhIHdlYiBicm93c2VyLCBleGNlcHRpb25zIGFyZSBub3QgZmF0YWwuIEhvd2V2ZXIsIHRvIGF2b2lkXG4gICAgICAgICAgICAvLyBzbG93aW5nIGRvd24gdGhlIHF1ZXVlIG9mIHBlbmRpbmcgdGFza3MsIHdlIHJldGhyb3cgdGhlIGVycm9yIGluIGFcbiAgICAgICAgICAgIC8vIGxvd2VyIHByaW9yaXR5IHR1cm4uXG4gICAgICAgICAgICBwZW5kaW5nRXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgICAgcmVxdWVzdEVycm9yVGhyb3coKTtcbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMudGFzayA9IG51bGw7XG4gICAgICAgIGZyZWVUYXNrc1tmcmVlVGFza3MubGVuZ3RoXSA9IHRoaXM7XG4gICAgfVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyBVc2UgdGhlIGZhc3Rlc3QgbWVhbnMgcG9zc2libGUgdG8gZXhlY3V0ZSBhIHRhc2sgaW4gaXRzIG93biB0dXJuLCB3aXRoXG4vLyBwcmlvcml0eSBvdmVyIG90aGVyIGV2ZW50cyBpbmNsdWRpbmcgSU8sIGFuaW1hdGlvbiwgcmVmbG93LCBhbmQgcmVkcmF3XG4vLyBldmVudHMgaW4gYnJvd3NlcnMuXG4vL1xuLy8gQW4gZXhjZXB0aW9uIHRocm93biBieSBhIHRhc2sgd2lsbCBwZXJtYW5lbnRseSBpbnRlcnJ1cHQgdGhlIHByb2Nlc3Npbmcgb2Zcbi8vIHN1YnNlcXVlbnQgdGFza3MuIFRoZSBoaWdoZXIgbGV2ZWwgYGFzYXBgIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCBpZiBhblxuLy8gZXhjZXB0aW9uIGlzIHRocm93biBieSBhIHRhc2ssIHRoYXQgdGhlIHRhc2sgcXVldWUgd2lsbCBjb250aW51ZSBmbHVzaGluZyBhc1xuLy8gc29vbiBhcyBwb3NzaWJsZSwgYnV0IGlmIHlvdSB1c2UgYHJhd0FzYXBgIGRpcmVjdGx5LCB5b3UgYXJlIHJlc3BvbnNpYmxlIHRvXG4vLyBlaXRoZXIgZW5zdXJlIHRoYXQgbm8gZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20geW91ciB0YXNrLCBvciB0byBtYW51YWxseVxuLy8gY2FsbCBgcmF3QXNhcC5yZXF1ZXN0Rmx1c2hgIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG5tb2R1bGUuZXhwb3J0cyA9IHJhd0FzYXA7XG5mdW5jdGlvbiByYXdBc2FwKHRhc2spIHtcbiAgICBpZiAoIXF1ZXVlLmxlbmd0aCkge1xuICAgICAgICByZXF1ZXN0Rmx1c2goKTtcbiAgICAgICAgZmx1c2hpbmcgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBFcXVpdmFsZW50IHRvIHB1c2gsIGJ1dCBhdm9pZHMgYSBmdW5jdGlvbiBjYWxsLlxuICAgIHF1ZXVlW3F1ZXVlLmxlbmd0aF0gPSB0YXNrO1xufVxuXG52YXIgcXVldWUgPSBbXTtcbi8vIE9uY2UgYSBmbHVzaCBoYXMgYmVlbiByZXF1ZXN0ZWQsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gYHJlcXVlc3RGbHVzaGAgYXJlXG4vLyBuZWNlc3NhcnkgdW50aWwgdGhlIG5leHQgYGZsdXNoYCBjb21wbGV0ZXMuXG52YXIgZmx1c2hpbmcgPSBmYWxzZTtcbi8vIGByZXF1ZXN0Rmx1c2hgIGlzIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIG1ldGhvZCB0aGF0IGF0dGVtcHRzIHRvIGtpY2tcbi8vIG9mZiBhIGBmbHVzaGAgZXZlbnQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4gYGZsdXNoYCB3aWxsIGF0dGVtcHQgdG8gZXhoYXVzdFxuLy8gdGhlIGV2ZW50IHF1ZXVlIGJlZm9yZSB5aWVsZGluZyB0byB0aGUgYnJvd3NlcidzIG93biBldmVudCBsb29wLlxudmFyIHJlcXVlc3RGbHVzaDtcbi8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCB0YXNrIHRvIGV4ZWN1dGUgaW4gdGhlIHRhc2sgcXVldWUuIFRoaXMgaXNcbi8vIHByZXNlcnZlZCBiZXR3ZWVuIGNhbGxzIHRvIGBmbHVzaGAgc28gdGhhdCBpdCBjYW4gYmUgcmVzdW1lZCBpZlxuLy8gYSB0YXNrIHRocm93cyBhbiBleGNlcHRpb24uXG52YXIgaW5kZXggPSAwO1xuLy8gSWYgYSB0YXNrIHNjaGVkdWxlcyBhZGRpdGlvbmFsIHRhc2tzIHJlY3Vyc2l2ZWx5LCB0aGUgdGFzayBxdWV1ZSBjYW4gZ3Jvd1xuLy8gdW5ib3VuZGVkLiBUbyBwcmV2ZW50IG1lbW9yeSBleGhhdXN0aW9uLCB0aGUgdGFzayBxdWV1ZSB3aWxsIHBlcmlvZGljYWxseVxuLy8gdHJ1bmNhdGUgYWxyZWFkeS1jb21wbGV0ZWQgdGFza3MuXG52YXIgY2FwYWNpdHkgPSAxMDI0O1xuXG4vLyBUaGUgZmx1c2ggZnVuY3Rpb24gcHJvY2Vzc2VzIGFsbCB0YXNrcyB0aGF0IGhhdmUgYmVlbiBzY2hlZHVsZWQgd2l0aFxuLy8gYHJhd0FzYXBgIHVubGVzcyBhbmQgdW50aWwgb25lIG9mIHRob3NlIHRhc2tzIHRocm93cyBhbiBleGNlcHRpb24uXG4vLyBJZiBhIHRhc2sgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgYGZsdXNoYCBlbnN1cmVzIHRoYXQgaXRzIHN0YXRlIHdpbGwgcmVtYWluXG4vLyBjb25zaXN0ZW50IGFuZCB3aWxsIHJlc3VtZSB3aGVyZSBpdCBsZWZ0IG9mZiB3aGVuIGNhbGxlZCBhZ2Fpbi5cbi8vIEhvd2V2ZXIsIGBmbHVzaGAgZG9lcyBub3QgbWFrZSBhbnkgYXJyYW5nZW1lbnRzIHRvIGJlIGNhbGxlZCBhZ2FpbiBpZiBhblxuLy8gZXhjZXB0aW9uIGlzIHRocm93bi5cbmZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHdoaWxlIChpbmRleCA8IHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gaW5kZXg7XG4gICAgICAgIC8vIEFkdmFuY2UgdGhlIGluZGV4IGJlZm9yZSBjYWxsaW5nIHRoZSB0YXNrLiBUaGlzIGVuc3VyZXMgdGhhdCB3ZSB3aWxsXG4gICAgICAgIC8vIGJlZ2luIGZsdXNoaW5nIG9uIHRoZSBuZXh0IHRhc2sgdGhlIHRhc2sgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICBpbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgcXVldWVbY3VycmVudEluZGV4XS5jYWxsKCk7XG4gICAgICAgIC8vIFByZXZlbnQgbGVha2luZyBtZW1vcnkgZm9yIGxvbmcgY2hhaW5zIG9mIHJlY3Vyc2l2ZSBjYWxscyB0byBgYXNhcGAuXG4gICAgICAgIC8vIElmIHdlIGNhbGwgYGFzYXBgIHdpdGhpbiB0YXNrcyBzY2hlZHVsZWQgYnkgYGFzYXBgLCB0aGUgcXVldWUgd2lsbFxuICAgICAgICAvLyBncm93LCBidXQgdG8gYXZvaWQgYW4gTyhuKSB3YWxrIGZvciBldmVyeSB0YXNrIHdlIGV4ZWN1dGUsIHdlIGRvbid0XG4gICAgICAgIC8vIHNoaWZ0IHRhc2tzIG9mZiB0aGUgcXVldWUgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZXhlY3V0ZWQuXG4gICAgICAgIC8vIEluc3RlYWQsIHdlIHBlcmlvZGljYWxseSBzaGlmdCAxMDI0IHRhc2tzIG9mZiB0aGUgcXVldWUuXG4gICAgICAgIGlmIChpbmRleCA+IGNhcGFjaXR5KSB7XG4gICAgICAgICAgICAvLyBNYW51YWxseSBzaGlmdCBhbGwgdmFsdWVzIHN0YXJ0aW5nIGF0IHRoZSBpbmRleCBiYWNrIHRvIHRoZVxuICAgICAgICAgICAgLy8gYmVnaW5uaW5nIG9mIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgIGZvciAodmFyIHNjYW4gPSAwLCBuZXdMZW5ndGggPSBxdWV1ZS5sZW5ndGggLSBpbmRleDsgc2NhbiA8IG5ld0xlbmd0aDsgc2NhbisrKSB7XG4gICAgICAgICAgICAgICAgcXVldWVbc2Nhbl0gPSBxdWV1ZVtzY2FuICsgaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVldWUubGVuZ3RoIC09IGluZGV4O1xuICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgaW5kZXggPSAwO1xuICAgIGZsdXNoaW5nID0gZmFsc2U7XG59XG5cbi8vIGByZXF1ZXN0Rmx1c2hgIGlzIGltcGxlbWVudGVkIHVzaW5nIGEgc3RyYXRlZ3kgYmFzZWQgb24gZGF0YSBjb2xsZWN0ZWQgZnJvbVxuLy8gZXZlcnkgYXZhaWxhYmxlIFNhdWNlTGFicyBTZWxlbml1bSB3ZWIgZHJpdmVyIHdvcmtlciBhdCB0aW1lIG9mIHdyaXRpbmcuXG4vLyBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xbUctNVVZR3VwNXF4R2RFTVdraFA2QldDejA1M05VYjJFMVFvVVRVMTZ1QS9lZGl0I2dpZD03ODM3MjQ1OTNcblxuLy8gU2FmYXJpIDYgYW5kIDYuMSBmb3IgZGVza3RvcCwgaVBhZCwgYW5kIGlQaG9uZSBhcmUgdGhlIG9ubHkgYnJvd3NlcnMgdGhhdFxuLy8gaGF2ZSBXZWJLaXRNdXRhdGlvbk9ic2VydmVyIGJ1dCBub3QgdW4tcHJlZml4ZWQgTXV0YXRpb25PYnNlcnZlci5cbi8vIE11c3QgdXNlIGBnbG9iYWxgIG9yIGBzZWxmYCBpbnN0ZWFkIG9mIGB3aW5kb3dgIHRvIHdvcmsgaW4gYm90aCBmcmFtZXMgYW5kIHdlYlxuLy8gd29ya2Vycy4gYGdsb2JhbGAgaXMgYSBwcm92aXNpb24gb2YgQnJvd3NlcmlmeSwgTXIsIE1ycywgb3IgTW9wLlxuXG4vKiBnbG9iYWxzIHNlbGYgKi9cbnZhciBzY29wZSA9IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiBzZWxmO1xudmFyIEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID0gc2NvcGUuTXV0YXRpb25PYnNlcnZlciB8fCBzY29wZS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuXG4vLyBNdXRhdGlvbk9ic2VydmVycyBhcmUgZGVzaXJhYmxlIGJlY2F1c2UgdGhleSBoYXZlIGhpZ2ggcHJpb3JpdHkgYW5kIHdvcmtcbi8vIHJlbGlhYmx5IGV2ZXJ5d2hlcmUgdGhleSBhcmUgaW1wbGVtZW50ZWQuXG4vLyBUaGV5IGFyZSBpbXBsZW1lbnRlZCBpbiBhbGwgbW9kZXJuIGJyb3dzZXJzLlxuLy9cbi8vIC0gQW5kcm9pZCA0LTQuM1xuLy8gLSBDaHJvbWUgMjYtMzRcbi8vIC0gRmlyZWZveCAxNC0yOVxuLy8gLSBJbnRlcm5ldCBFeHBsb3JlciAxMVxuLy8gLSBpUGFkIFNhZmFyaSA2LTcuMVxuLy8gLSBpUGhvbmUgU2FmYXJpIDctNy4xXG4vLyAtIFNhZmFyaSA2LTdcbmlmICh0eXBlb2YgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJlcXVlc3RGbHVzaCA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21NdXRhdGlvbk9ic2VydmVyKGZsdXNoKTtcblxuLy8gTWVzc2FnZUNoYW5uZWxzIGFyZSBkZXNpcmFibGUgYmVjYXVzZSB0aGV5IGdpdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUgSFRNTFxuLy8gdGFzayBxdWV1ZSwgYXJlIGltcGxlbWVudGVkIGluIEludGVybmV0IEV4cGxvcmVyIDEwLCBTYWZhcmkgNS4wLTEsIGFuZCBPcGVyYVxuLy8gMTEtMTIsIGFuZCBpbiB3ZWIgd29ya2VycyBpbiBtYW55IGVuZ2luZXMuXG4vLyBBbHRob3VnaCBtZXNzYWdlIGNoYW5uZWxzIHlpZWxkIHRvIGFueSBxdWV1ZWQgcmVuZGVyaW5nIGFuZCBJTyB0YXNrcywgdGhleVxuLy8gd291bGQgYmUgYmV0dGVyIHRoYW4gaW1wb3NpbmcgdGhlIDRtcyBkZWxheSBvZiB0aW1lcnMuXG4vLyBIb3dldmVyLCB0aGV5IGRvIG5vdCB3b3JrIHJlbGlhYmx5IGluIEludGVybmV0IEV4cGxvcmVyIG9yIFNhZmFyaS5cblxuLy8gSW50ZXJuZXQgRXhwbG9yZXIgMTAgaXMgdGhlIG9ubHkgYnJvd3NlciB0aGF0IGhhcyBzZXRJbW1lZGlhdGUgYnV0IGRvZXNcbi8vIG5vdCBoYXZlIE11dGF0aW9uT2JzZXJ2ZXJzLlxuLy8gQWx0aG91Z2ggc2V0SW1tZWRpYXRlIHlpZWxkcyB0byB0aGUgYnJvd3NlcidzIHJlbmRlcmVyLCBpdCB3b3VsZCBiZVxuLy8gcHJlZmVycmFibGUgdG8gZmFsbGluZyBiYWNrIHRvIHNldFRpbWVvdXQgc2luY2UgaXQgZG9lcyBub3QgaGF2ZVxuLy8gdGhlIG1pbmltdW0gNG1zIHBlbmFsdHkuXG4vLyBVbmZvcnR1bmF0ZWx5IHRoZXJlIGFwcGVhcnMgdG8gYmUgYSBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAgTW9iaWxlIChhbmRcbi8vIERlc2t0b3AgdG8gYSBsZXNzZXIgZXh0ZW50KSB0aGF0IHJlbmRlcnMgYm90aCBzZXRJbW1lZGlhdGUgYW5kXG4vLyBNZXNzYWdlQ2hhbm5lbCB1c2VsZXNzIGZvciB0aGUgcHVycG9zZXMgb2YgQVNBUC5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvcS9pc3N1ZXMvMzk2XG5cbi8vIFRpbWVycyBhcmUgaW1wbGVtZW50ZWQgdW5pdmVyc2FsbHkuXG4vLyBXZSBmYWxsIGJhY2sgdG8gdGltZXJzIGluIHdvcmtlcnMgaW4gbW9zdCBlbmdpbmVzLCBhbmQgaW4gZm9yZWdyb3VuZFxuLy8gY29udGV4dHMgaW4gdGhlIGZvbGxvd2luZyBicm93c2Vycy5cbi8vIEhvd2V2ZXIsIG5vdGUgdGhhdCBldmVuIHRoaXMgc2ltcGxlIGNhc2UgcmVxdWlyZXMgbnVhbmNlcyB0byBvcGVyYXRlIGluIGFcbi8vIGJyb2FkIHNwZWN0cnVtIG9mIGJyb3dzZXJzLlxuLy9cbi8vIC0gRmlyZWZveCAzLTEzXG4vLyAtIEludGVybmV0IEV4cGxvcmVyIDYtOVxuLy8gLSBpUGFkIFNhZmFyaSA0LjNcbi8vIC0gTHlueCAyLjguN1xufSBlbHNlIHtcbiAgICByZXF1ZXN0Rmx1c2ggPSBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXIoZmx1c2gpO1xufVxuXG4vLyBgcmVxdWVzdEZsdXNoYCByZXF1ZXN0cyB0aGF0IHRoZSBoaWdoIHByaW9yaXR5IGV2ZW50IHF1ZXVlIGJlIGZsdXNoZWQgYXNcbi8vIHNvb24gYXMgcG9zc2libGUuXG4vLyBUaGlzIGlzIHVzZWZ1bCB0byBwcmV2ZW50IGFuIGVycm9yIHRocm93biBpbiBhIHRhc2sgZnJvbSBzdGFsbGluZyB0aGUgZXZlbnRcbi8vIHF1ZXVlIGlmIHRoZSBleGNlcHRpb24gaGFuZGxlZCBieSBOb2RlLmpz4oCZc1xuLy8gYHByb2Nlc3Mub24oXCJ1bmNhdWdodEV4Y2VwdGlvblwiKWAgb3IgYnkgYSBkb21haW4uXG5yYXdBc2FwLnJlcXVlc3RGbHVzaCA9IHJlcXVlc3RGbHVzaDtcblxuLy8gVG8gcmVxdWVzdCBhIGhpZ2ggcHJpb3JpdHkgZXZlbnQsIHdlIGluZHVjZSBhIG11dGF0aW9uIG9ic2VydmVyIGJ5IHRvZ2dsaW5nXG4vLyB0aGUgdGV4dCBvZiBhIHRleHQgbm9kZSBiZXR3ZWVuIFwiMVwiIGFuZCBcIi0xXCIuXG5mdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaykge1xuICAgIHZhciB0b2dnbGUgPSAxO1xuICAgIHZhciBvYnNlcnZlciA9IG5ldyBCcm93c2VyTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKG5vZGUsIHtjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuICAgICAgICB0b2dnbGUgPSAtdG9nZ2xlO1xuICAgICAgICBub2RlLmRhdGEgPSB0b2dnbGU7XG4gICAgfTtcbn1cblxuLy8gVGhlIG1lc3NhZ2UgY2hhbm5lbCB0ZWNobmlxdWUgd2FzIGRpc2NvdmVyZWQgYnkgTWFsdGUgVWJsIGFuZCB3YXMgdGhlXG4vLyBvcmlnaW5hbCBmb3VuZGF0aW9uIGZvciB0aGlzIGxpYnJhcnkuXG4vLyBodHRwOi8vd3d3Lm5vbmJsb2NraW5nLmlvLzIwMTEvMDYvd2luZG93bmV4dHRpY2suaHRtbFxuXG4vLyBTYWZhcmkgNi4wLjUgKGF0IGxlYXN0KSBpbnRlcm1pdHRlbnRseSBmYWlscyB0byBjcmVhdGUgbWVzc2FnZSBwb3J0cyBvbiBhXG4vLyBwYWdlJ3MgZmlyc3QgbG9hZC4gVGhhbmtmdWxseSwgdGhpcyB2ZXJzaW9uIG9mIFNhZmFyaSBzdXBwb3J0c1xuLy8gTXV0YXRpb25PYnNlcnZlcnMsIHNvIHdlIGRvbid0IG5lZWQgdG8gZmFsbCBiYWNrIGluIHRoYXQgY2FzZS5cblxuLy8gZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbU1lc3NhZ2VDaGFubmVsKGNhbGxiYWNrKSB7XG4vLyAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbi8vICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuLy8gICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbi8vICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbi8vICAgICB9O1xuLy8gfVxuXG4vLyBGb3IgcmVhc29ucyBleHBsYWluZWQgYWJvdmUsIHdlIGFyZSBhbHNvIHVuYWJsZSB0byB1c2UgYHNldEltbWVkaWF0ZWBcbi8vIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLlxuLy8gRXZlbiBpZiB3ZSB3ZXJlLCB0aGVyZSBpcyBhbm90aGVyIGJ1ZyBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMC5cbi8vIEl0IGlzIG5vdCBzdWZmaWNpZW50IHRvIGFzc2lnbiBgc2V0SW1tZWRpYXRlYCB0byBgcmVxdWVzdEZsdXNoYCBiZWNhdXNlXG4vLyBgc2V0SW1tZWRpYXRlYCBtdXN0IGJlIGNhbGxlZCAqYnkgbmFtZSogYW5kIHRoZXJlZm9yZSBtdXN0IGJlIHdyYXBwZWQgaW4gYVxuLy8gY2xvc3VyZS5cbi8vIE5ldmVyIGZvcmdldC5cblxuLy8gZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbVNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuLy8gICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbi8vICAgICAgICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbi8vICAgICB9O1xuLy8gfVxuXG4vLyBTYWZhcmkgNi4wIGhhcyBhIHByb2JsZW0gd2hlcmUgdGltZXJzIHdpbGwgZ2V0IGxvc3Qgd2hpbGUgdGhlIHVzZXIgaXNcbi8vIHNjcm9sbGluZy4gVGhpcyBwcm9ibGVtIGRvZXMgbm90IGltcGFjdCBBU0FQIGJlY2F1c2UgU2FmYXJpIDYuMCBzdXBwb3J0c1xuLy8gbXV0YXRpb24gb2JzZXJ2ZXJzLCBzbyB0aGF0IGltcGxlbWVudGF0aW9uIGlzIHVzZWQgaW5zdGVhZC5cbi8vIEhvd2V2ZXIsIGlmIHdlIGV2ZXIgZWxlY3QgdG8gdXNlIHRpbWVycyBpbiBTYWZhcmksIHRoZSBwcmV2YWxlbnQgd29yay1hcm91bmRcbi8vIGlzIHRvIGFkZCBhIHNjcm9sbCBldmVudCBsaXN0ZW5lciB0aGF0IGNhbGxzIGZvciBhIGZsdXNoLlxuXG4vLyBgc2V0VGltZW91dGAgZG9lcyBub3QgY2FsbCB0aGUgcGFzc2VkIGNhbGxiYWNrIGlmIHRoZSBkZWxheSBpcyBsZXNzIHRoYW5cbi8vIGFwcHJveGltYXRlbHkgNyBpbiB3ZWIgd29ya2VycyBpbiBGaXJlZm94IDggdGhyb3VnaCAxOCwgYW5kIHNvbWV0aW1lcyBub3Rcbi8vIGV2ZW4gdGhlbi5cblxuZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuICAgICAgICAvLyBXZSBkaXNwYXRjaCBhIHRpbWVvdXQgd2l0aCBhIHNwZWNpZmllZCBkZWxheSBvZiAwIGZvciBlbmdpbmVzIHRoYXRcbiAgICAgICAgLy8gY2FuIHJlbGlhYmx5IGFjY29tbW9kYXRlIHRoYXQgcmVxdWVzdC4gVGhpcyB3aWxsIHVzdWFsbHkgYmUgc25hcHBlZFxuICAgICAgICAvLyB0byBhIDQgbWlsaXNlY29uZCBkZWxheSwgYnV0IG9uY2Ugd2UncmUgZmx1c2hpbmcsIHRoZXJlJ3Mgbm8gZGVsYXlcbiAgICAgICAgLy8gYmV0d2VlbiBldmVudHMuXG4gICAgICAgIHZhciB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChoYW5kbGVUaW1lciwgMCk7XG4gICAgICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHRoaXMgdGltZXIgZ2V0cyBmcmVxdWVudGx5IGRyb3BwZWQgaW4gRmlyZWZveFxuICAgICAgICAvLyB3b3JrZXJzLCB3ZSBlbmxpc3QgYW4gaW50ZXJ2YWwgaGFuZGxlIHRoYXQgd2lsbCB0cnkgdG8gZmlyZVxuICAgICAgICAvLyBhbiBldmVudCAyMCB0aW1lcyBwZXIgc2Vjb25kIHVudGlsIGl0IHN1Y2NlZWRzLlxuICAgICAgICB2YXIgaW50ZXJ2YWxIYW5kbGUgPSBzZXRJbnRlcnZhbChoYW5kbGVUaW1lciwgNTApO1xuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVRpbWVyKCkge1xuICAgICAgICAgICAgLy8gV2hpY2hldmVyIHRpbWVyIHN1Y2NlZWRzIHdpbGwgY2FuY2VsIGJvdGggdGltZXJzIGFuZFxuICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgY2FsbGJhY2suXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSGFuZGxlKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyBUaGlzIGlzIGZvciBgYXNhcC5qc2Agb25seS5cbi8vIEl0cyBuYW1lIHdpbGwgYmUgcGVyaW9kaWNhbGx5IHJhbmRvbWl6ZWQgdG8gYnJlYWsgYW55IGNvZGUgdGhhdCBkZXBlbmRzIG9uXG4vLyBpdHMgZXhpc3RlbmNlLlxucmF3QXNhcC5tYWtlUmVxdWVzdENhbGxGcm9tVGltZXIgPSBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXI7XG5cbi8vIEFTQVAgd2FzIG9yaWdpbmFsbHkgYSBuZXh0VGljayBzaGltIGluY2x1ZGVkIGluIFEuIFRoaXMgd2FzIGZhY3RvcmVkIG91dFxuLy8gaW50byB0aGlzIEFTQVAgcGFja2FnZS4gSXQgd2FzIGxhdGVyIGFkYXB0ZWQgdG8gUlNWUCB3aGljaCBtYWRlIGZ1cnRoZXJcbi8vIGFtZW5kbWVudHMuIFRoZXNlIGRlY2lzaW9ucywgcGFydGljdWxhcmx5IHRvIG1hcmdpbmFsaXplIE1lc3NhZ2VDaGFubmVsIGFuZFxuLy8gdG8gY2FwdHVyZSB0aGUgTXV0YXRpb25PYnNlcnZlciBpbXBsZW1lbnRhdGlvbiBpbiBhIGNsb3N1cmUsIHdlcmUgaW50ZWdyYXRlZFxuLy8gYmFjayBpbnRvIEFTQVAgcHJvcGVyLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vcnN2cC5qcy9ibG9iL2NkZGY3MjMyNTQ2YTljZjg1ODUyNGI3NWNkZTZmOWVkZjcyNjIwYTcvbGliL3JzdnAvYXNhcC5qc1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gcGxhY2VIb2xkZXJzQ291bnQgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcbiAgLy8gaWYgdGhlcmUgYXJlIHR3byBwbGFjZWhvbGRlcnMsIHRoYW4gdGhlIHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBpdFxuICAvLyByZXByZXNlbnQgb25lIGJ5dGVcbiAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG4gIC8vIHRoaXMgaXMganVzdCBhIGNoZWFwIGhhY2sgdG8gbm90IGRvIGluZGV4T2YgdHdpY2VcbiAgcmV0dXJuIGI2NFtsZW4gLSAyXSA9PT0gJz0nID8gMiA6IGI2NFtsZW4gLSAxXSA9PT0gJz0nID8gMSA6IDBcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICByZXR1cm4gYjY0Lmxlbmd0aCAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzQ291bnQoYjY0KVxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciBpLCBqLCBsLCB0bXAsIHBsYWNlSG9sZGVycywgYXJyXG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIHBsYWNlSG9sZGVycyA9IHBsYWNlSG9sZGVyc0NvdW50KGI2NClcblxuICBhcnIgPSBuZXcgQXJyKGxlbiAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgb3V0cHV0ID0gJydcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz09J1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMTBdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPSdcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnByb21pc2UnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9fY29yZScpLlByb21pc2U7IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07IiwiLy8gMjIuMS4zLjMxIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxudmFyIFVOU0NPUEFCTEVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3Vuc2NvcGFibGVzJylcbiAgLCBBcnJheVByb3RvICA9IEFycmF5LnByb3RvdHlwZTtcbmlmKEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZClyZXF1aXJlKCcuL19oaWRlJykoQXJyYXlQcm90bywgVU5TQ09QQUJMRVMsIHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgQXJyYXlQcm90b1tVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIENvbnN0cnVjdG9yLCBuYW1lLCBmb3JiaWRkZW5GaWVsZCl7XG4gIGlmKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKXtcbiAgICB0aHJvdyBUeXBlRXJyb3IobmFtZSArICc6IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICB9IHJldHVybiBpdDtcbn07IiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoIWlzT2JqZWN0KGl0KSl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07IiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIHRvSW5kZXggICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKCR0aGlzLCBlbCwgZnJvbUluZGV4KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gdG9JbmRleChmcm9tSW5kZXgsIGxlbmd0aClcbiAgICAgICwgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIGlmKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKXdoaWxlKGxlbmd0aCA+IGluZGV4KXtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I3RvSW5kZXggaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcbiAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59OyIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKVxuICAvLyBFUzMgd3JvbmcgaGVyZVxuICAsIEFSRyA9IGNvZihmdW5jdGlvbigpeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07IiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTsiLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0ge3ZlcnNpb246ICcyLjQuMCd9O1xuaWYodHlwZW9mIF9fZSA9PSAnbnVtYmVyJylfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgdGhhdCwgbGVuZ3RoKXtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYodGhhdCA9PT0gdW5kZWZpbmVkKXJldHVybiBmbjtcbiAgc3dpdGNoKGxlbmd0aCl7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYSl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbihhLCBiLCBjKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTsiLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ID09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07IiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xufSk7IiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50XG4gIC8vIGluIG9sZCBJRSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0J1xuICAsIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59OyIsIi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gKFxuICAnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJ1xuKS5zcGxpdCgnLCcpOyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGNvcmUgICAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxuICAsIGhpZGUgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIHJlZGVmaW5lICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBjdHggICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHNvdXJjZSl7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GXG4gICAgLCBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HXG4gICAgLCBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TXG4gICAgLCBJU19QUk9UTyAgPSB0eXBlICYgJGV4cG9ydC5QXG4gICAgLCBJU19CSU5EICAgPSB0eXBlICYgJGV4cG9ydC5CXG4gICAgLCB0YXJnZXQgICAgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gfHwgKGdsb2JhbFtuYW1lXSA9IHt9KSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV1cbiAgICAsIGV4cG9ydHMgICA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pXG4gICAgLCBleHBQcm90byAgPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KVxuICAgICwga2V5LCBvd24sIG91dCwgZXhwO1xuICBpZihJU19HTE9CQUwpc291cmNlID0gbmFtZTtcbiAgZm9yKGtleSBpbiBzb3VyY2Upe1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSAob3duID8gdGFyZ2V0IDogc291cmNlKVtrZXldO1xuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgZXhwID0gSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIGlmKHRhcmdldClyZWRlZmluZSh0YXJnZXQsIGtleSwgb3V0LCB0eXBlICYgJGV4cG9ydC5VKTtcbiAgICAvLyBleHBvcnRcbiAgICBpZihleHBvcnRzW2tleV0gIT0gb3V0KWhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmKElTX1BST1RPICYmIGV4cFByb3RvW2tleV0gIT0gb3V0KWV4cFByb3RvW2tleV0gPSBvdXQ7XG4gIH1cbn07XG5nbG9iYWwuY29yZSA9IGNvcmU7XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgIFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59OyIsInZhciBjdHggICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgY2FsbCAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpXG4gICwgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvTGVuZ3RoICAgID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBnZXRJdGVyRm4gICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJylcbiAgLCBCUkVBSyAgICAgICA9IHt9XG4gICwgUkVUVVJOICAgICAgPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVyYWJsZSwgZW50cmllcywgZm4sIHRoYXQsIElURVJBVE9SKXtcbiAgdmFyIGl0ZXJGbiA9IElURVJBVE9SID8gZnVuY3Rpb24oKXsgcmV0dXJuIGl0ZXJhYmxlOyB9IDogZ2V0SXRlckZuKGl0ZXJhYmxlKVxuICAgICwgZiAgICAgID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpXG4gICAgLCBpbmRleCAgPSAwXG4gICAgLCBsZW5ndGgsIHN0ZXAsIGl0ZXJhdG9yLCByZXN1bHQ7XG4gIGlmKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmKGlzQXJyYXlJdGVyKGl0ZXJGbikpZm9yKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXtcbiAgICByZXN1bHQgPSBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgaWYocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTilyZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7ICl7XG4gICAgcmVzdWx0ID0gY2FsbChpdGVyYXRvciwgZiwgc3RlcC52YWx1ZSwgZW50cmllcyk7XG4gICAgaWYocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTilyZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyAgPSBCUkVBSztcbmV4cG9ydHMuUkVUVVJOID0gUkVUVVJOOyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYodHlwZW9mIF9fZyA9PSAnbnVtYmVyJylfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTsiLCJ2YXIgZFAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7IiwibW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG59KTsiLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIGFyZ3MsIHRoYXQpe1xuICB2YXIgdW4gPSB0aGF0ID09PSB1bmRlZmluZWQ7XG4gIHN3aXRjaChhcmdzLmxlbmd0aCl7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07IiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBjb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07IiwiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIElURVJBVE9SICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07IiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIGVudHJpZXMpe1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2goZSl7XG4gICAgdmFyIHJldCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZihyZXQgIT09IHVuZGVmaW5lZClhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpXG4gICwgZGVzY3JpcHRvciAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KXtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7bmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KX0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHJlZGVmaW5lICAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIGhpZGUgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgaGFzICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIEl0ZXJhdG9ycyAgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCAkaXRlckNyZWF0ZSAgICA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxuICAsIElURVJBVE9SICAgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBCVUdHWSAgICAgICAgICA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKSAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gICwgRkZfSVRFUkFUT1IgICAgPSAnQEBpdGVyYXRvcidcbiAgLCBLRVlTICAgICAgICAgICA9ICdrZXlzJ1xuICAsIFZBTFVFUyAgICAgICAgID0gJ3ZhbHVlcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKXtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24oa2luZCl7XG4gICAgaWYoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaChraW5kKXtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHICAgICAgICA9IE5BTUUgKyAnIEl0ZXJhdG9yJ1xuICAgICwgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTXG4gICAgLCBWQUxVRVNfQlVHID0gZmFsc2VcbiAgICAsIHByb3RvICAgICAgPSBCYXNlLnByb3RvdHlwZVxuICAgICwgJG5hdGl2ZSAgICA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXVxuICAgICwgJGRlZmF1bHQgICA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpXG4gICAgLCAkZW50cmllcyAgID0gREVGQVVMVCA/ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKSA6IHVuZGVmaW5lZFxuICAgICwgJGFueU5hdGl2ZSA9IE5BTUUgPT0gJ0FycmF5JyA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmVcbiAgICAsIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYoJGFueU5hdGl2ZSl7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UpKTtcbiAgICBpZihJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSl7XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuICAgICAgaWYoIUxJQlJBUlkgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKWhpZGUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICB9XG4gIH1cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZihERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpe1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiAkbmF0aXZlLmNhbGwodGhpcyk7IH07XG4gIH1cbiAgLy8gRGVmaW5lIGl0ZXJhdG9yXG4gIGlmKCghTElCUkFSWSB8fCBGT1JDRUQpICYmIChCVUdHWSB8fCBWQUxVRVNfQlVHIHx8ICFwcm90b1tJVEVSQVRPUl0pKXtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddICA9IHJldHVyblRoaXM7XG4gIGlmKERFRkFVTFQpe1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6ICBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6ICAgIElTX1NFVCAgICAgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG4gICAgfTtcbiAgICBpZihGT1JDRUQpZm9yKGtleSBpbiBtZXRob2RzKXtcbiAgICAgIGlmKCEoa2V5IGluIHByb3RvKSlyZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZHM7XG59OyIsInZhciBJVEVSQVRPUiAgICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgcml0ZXIgPSBbN11bSVRFUkFUT1JdKCk7XG4gIHJpdGVyWydyZXR1cm4nXSA9IGZ1bmN0aW9uKCl7IFNBRkVfQ0xPU0lORyA9IHRydWU7IH07XG4gIEFycmF5LmZyb20ocml0ZXIsIGZ1bmN0aW9uKCl7IHRocm93IDI7IH0pO1xufSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGV4ZWMsIHNraXBDbG9zaW5nKXtcbiAgaWYoIXNraXBDbG9zaW5nICYmICFTQUZFX0NMT1NJTkcpcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgID0gWzddXG4gICAgICAsIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24oKXsgcmV0dXJuIHtkb25lOiBzYWZlID0gdHJ1ZX07IH07XG4gICAgYXJyW0lURVJBVE9SXSA9IGZ1bmN0aW9uKCl7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gc2FmZTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkb25lLCB2YWx1ZSl7XG4gIHJldHVybiB7dmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmV9O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHt9OyIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7IiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgbWFjcm90YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldFxuICAsIE9ic2VydmVyICA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyXG4gICwgcHJvY2VzcyAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBQcm9taXNlICAgPSBnbG9iYWwuUHJvbWlzZVxuICAsIGlzTm9kZSAgICA9IHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpe1xuICB2YXIgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYoaXNOb2RlICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZShoZWFkKXtcbiAgICAgIGZuICAgPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoKGUpe1xuICAgICAgICBpZihoZWFkKW5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmKHBhcmVudClwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmKGlzTm9kZSl7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlclxuICB9IGVsc2UgaWYoT2JzZXJ2ZXIpe1xuICAgIHZhciB0b2dnbGUgPSB0cnVlXG4gICAgICAsIG5vZGUgICA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpe1xuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgICBtYWNyb3Rhc2suY2FsbChnbG9iYWwsIGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGZuKXtcbiAgICB2YXIgdGFzayA9IHtmbjogZm4sIG5leHQ6IHVuZGVmaW5lZH07XG4gICAgaWYobGFzdClsYXN0Lm5leHQgPSB0YXNrO1xuICAgIGlmKCFoZWFkKXtcbiAgICAgIGhlYWQgPSB0YXNrO1xuICAgICAgbm90aWZ5KCk7XG4gICAgfSBsYXN0ID0gdGFzaztcbiAgfTtcbn07IiwiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGRQcyAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpXG4gICwgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJylcbiAgLCBJRV9QUk9UTyAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKVxuICAsIEVtcHR5ICAgICAgID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfVxuICAsIFBST1RPVFlQRSAgID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24oKXtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJylcbiAgICAsIGkgICAgICA9IGVudW1CdWdLZXlzLmxlbmd0aFxuICAgICwgbHQgICAgID0gJzwnXG4gICAgLCBndCAgICAgPSAnPidcbiAgICAsIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlKGktLSlkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcyl7XG4gIHZhciByZXN1bHQ7XG4gIGlmKE8gIT09IG51bGwpe1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIiwidmFyIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJylcbiAgLCB0b1ByaW1pdGl2ZSAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXG4gICwgZFAgICAgICAgICAgICAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKXtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmKElFOF9ET01fREVGSU5FKXRyeSB7XG4gICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gIGlmKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcyl0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZigndmFsdWUnIGluIEF0dHJpYnV0ZXMpT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTsiLCJ2YXIgZFAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBnZXRLZXlzICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKXtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzICAgPSBnZXRLZXlzKFByb3BlcnRpZXMpXG4gICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICwgaSA9IDBcbiAgICAsIFA7XG4gIHdoaWxlKGxlbmd0aCA+IGkpZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59OyIsIi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgaGFzICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIHRvT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcbiAgLCBJRV9QUk9UTyAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKVxuICAsIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24oTyl7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYoaGFzKE8sIElFX1BST1RPKSlyZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3Ipe1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07IiwidmFyIGhhcyAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgdG9JT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSlcbiAgLCBJRV9QUk9UTyAgICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBuYW1lcyl7XG4gIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuICAgICwgaSAgICAgID0gMFxuICAgICwgcmVzdWx0ID0gW11cbiAgICAsIGtleTtcbiAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpaWYoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKXtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyIsIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKVxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTyl7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSl7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZSAgOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZSAgICA6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWUgICAgICAgOiB2YWx1ZVxuICB9O1xufTsiLCJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih0YXJnZXQsIHNyYywgc2FmZSl7XG4gIGZvcih2YXIga2V5IGluIHNyYylyZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIHNhZmUpO1xuICByZXR1cm4gdGFyZ2V0O1xufTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBoYXMgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIFNSQyAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKVxuICAsIFRPX1NUUklORyA9ICd0b1N0cmluZydcbiAgLCAkdG9TdHJpbmcgPSBGdW5jdGlvbltUT19TVFJJTkddXG4gICwgVFBMICAgICAgID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuL19jb3JlJykuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuICR0b1N0cmluZy5jYWxsKGl0KTtcbn07XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE8sIGtleSwgdmFsLCBzYWZlKXtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgdmFsID09ICdmdW5jdGlvbic7XG4gIGlmKGlzRnVuY3Rpb24paGFzKHZhbCwgJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICBpZihPW2tleV0gPT09IHZhbClyZXR1cm47XG4gIGlmKGlzRnVuY3Rpb24paGFzKHZhbCwgU1JDKSB8fCBoaWRlKHZhbCwgU1JDLCBPW2tleV0gPyAnJyArIE9ba2V5XSA6IFRQTC5qb2luKFN0cmluZyhrZXkpKSk7XG4gIGlmKE8gPT09IGdsb2JhbCl7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2Uge1xuICAgIGlmKCFzYWZlKXtcbiAgICAgIGRlbGV0ZSBPW2tleV07XG4gICAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoT1trZXldKU9ba2V5XSA9IHZhbDtcbiAgICAgIGVsc2UgaGlkZShPLCBrZXksIHZhbCk7XG4gICAgfVxuICB9XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTsiLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGRQICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcbiAgLCBTUEVDSUVTICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oS0VZKXtcbiAgdmFyIEMgPSBnbG9iYWxbS0VZXTtcbiAgaWYoREVTQ1JJUFRPUlMgJiYgQyAmJiAhQ1tTUEVDSUVTXSlkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07IiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBoYXMgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuICBpZihpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKWRlZihpdCwgVEFHLCB7Y29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnfSk7XG59OyIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpXG4gICwgdWlkICAgID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59OyIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG4gICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcbn07IiwiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcbiAgLCBTUEVDSUVTICAgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBEKXtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvciwgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTsiLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgZGVmaW5lZCAgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVE9fU1RSSU5HKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKHRoYXQsIHBvcyl7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSlcbiAgICAgICwgaSA9IHRvSW50ZWdlcihwb3MpXG4gICAgICAsIGwgPSBzLmxlbmd0aFxuICAgICAgLCBhLCBiO1xuICAgIGlmKGkgPCAwIHx8IGkgPj0gbClyZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTsiLCJ2YXIgY3R4ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBpbnZva2UgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19pbnZva2UnKVxuICAsIGh0bWwgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2h0bWwnKVxuICAsIGNlbCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKVxuICAsIGdsb2JhbCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBzZXRUYXNrICAgICAgICAgICAgPSBnbG9iYWwuc2V0SW1tZWRpYXRlXG4gICwgY2xlYXJUYXNrICAgICAgICAgID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlXG4gICwgTWVzc2FnZUNoYW5uZWwgICAgID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsXG4gICwgY291bnRlciAgICAgICAgICAgID0gMFxuICAsIHF1ZXVlICAgICAgICAgICAgICA9IHt9XG4gICwgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSdcbiAgLCBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbigpe1xuICB2YXIgaWQgPSArdGhpcztcbiAgaWYocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKXtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQpe1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZighc2V0VGFzayB8fCAhY2xlYXJUYXNrKXtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbil7XG4gICAgdmFyIGFyZ3MgPSBbXSwgaSA9IDE7XG4gICAgd2hpbGUoYXJndW1lbnRzLmxlbmd0aCA+IGkpYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24oKXtcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCl7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYoTWVzc2FnZUNoYW5uZWwpe1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWw7XG4gICAgcG9ydCAgICA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGN0eChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZihnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIHNldFRpbWVvdXQoY3R4KHJ1biwgaWQsIDEpLCAwKTtcbiAgICB9O1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiAgIHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07IiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIG1heCAgICAgICA9IE1hdGgubWF4XG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGluZGV4LCBsZW5ndGgpe1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTsiLCIvLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsICA9IE1hdGguY2VpbFxuICAsIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07IiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKVxuICAsIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTsiLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTsiLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07IiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZih0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07IiwidmFyIGlkID0gMFxuICAsIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcbn07IiwidmFyIHN0b3JlICAgICAgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJylcbiAgLCB1aWQgICAgICAgID0gcmVxdWlyZSgnLi9fdWlkJylcbiAgLCBTeW1ib2wgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sXG4gICwgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lKXtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7IiwidmFyIGNsYXNzb2YgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIElURVJBVE9SICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgIT0gdW5kZWZpbmVkKXJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKVxuICAsIHN0ZXAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKVxuICAsIEl0ZXJhdG9ycyAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIHRvSU9iamVjdCAgICAgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG5cbi8vIDIyLjEuMy40IEFycmF5LnByb3RvdHlwZS5lbnRyaWVzKClcbi8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG4vLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG4vLyAyMi4xLjMuMzAgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24oaXRlcmF0ZWQsIGtpbmQpe1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uKCl7XG4gIHZhciBPICAgICA9IHRoaXMuX3RcbiAgICAsIGtpbmQgID0gdGhpcy5fa1xuICAgICwgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKXtcbiAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBzdGVwKDEpO1xuICB9XG4gIGlmKGtpbmQgPT0gJ2tleXMnICApcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuICBpZihraW5kID09ICd2YWx1ZXMnKXJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTsiLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgdGVzdCAgICA9IHt9O1xudGVzdFtyZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKV0gPSAneic7XG5pZih0ZXN0ICsgJycgIT0gJ1tvYmplY3Qgel0nKXtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICAgIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbiAgfSwgdHJ1ZSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsIGdsb2JhbCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY3R4ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBjbGFzc29mICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCAkZXhwb3J0ICAgICAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGlzT2JqZWN0ICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgYUZ1bmN0aW9uICAgICAgICAgID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXG4gICwgYW5JbnN0YW5jZSAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKVxuICAsIGZvck9mICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2Zvci1vZicpXG4gICwgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpXG4gICwgdGFzayAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldFxuICAsIG1pY3JvdGFzayAgICAgICAgICA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKClcbiAgLCBQUk9NSVNFICAgICAgICAgICAgPSAnUHJvbWlzZSdcbiAgLCBUeXBlRXJyb3IgICAgICAgICAgPSBnbG9iYWwuVHlwZUVycm9yXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCAkUHJvbWlzZSAgICAgICAgICAgPSBnbG9iYWxbUFJPTUlTRV1cbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIGlzTm9kZSAgICAgICAgICAgICA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnXG4gICwgZW1wdHkgICAgICAgICAgICAgID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfVxuICAsIEludGVybmFsLCBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG5cbnZhciBVU0VfTkFUSVZFID0gISFmdW5jdGlvbigpe1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlICAgICA9ICRQcm9taXNlLnJlc29sdmUoMSlcbiAgICAgICwgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uKGV4ZWMpeyBleGVjKGVtcHR5LCBlbXB0eSk7IH07XG4gICAgLy8gdW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICAgIHJldHVybiAoaXNOb2RlIHx8IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJykgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBzYW1lQ29uc3RydWN0b3IgPSBmdW5jdGlvbihhLCBiKXtcbiAgLy8gd2l0aCBsaWJyYXJ5IHdyYXBwZXIgc3BlY2lhbCBjYXNlXG4gIHJldHVybiBhID09PSBiIHx8IGEgPT09ICRQcm9taXNlICYmIGIgPT09IFdyYXBwZXI7XG59O1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbihpdCl7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oQyl7XG4gIHJldHVybiBzYW1lQ29uc3RydWN0b3IoJFByb21pc2UsIEMpXG4gICAgPyBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICA6IG5ldyBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oQyl7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uKCQkcmVzb2x2ZSwgJCRyZWplY3Qpe1xuICAgIGlmKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ICA9IGFGdW5jdGlvbihyZWplY3QpO1xufTtcbnZhciBwZXJmb3JtID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB7ZXJyb3I6IGV9O1xuICB9XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uKHByb21pc2UsIGlzUmVqZWN0KXtcbiAgaWYocHJvbWlzZS5fbilyZXR1cm47XG4gIHByb21pc2UuX24gPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9jO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24oKXtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92XG4gICAgICAsIG9rICAgID0gcHJvbWlzZS5fcyA9PSAxXG4gICAgICAsIGkgICAgID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24ocmVhY3Rpb24pe1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbFxuICAgICAgICAsIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlXG4gICAgICAgICwgcmVqZWN0ICA9IHJlYWN0aW9uLnJlamVjdFxuICAgICAgICAsIGRvbWFpbiAgPSByZWFjdGlvbi5kb21haW5cbiAgICAgICAgLCByZXN1bHQsIHRoZW47XG4gICAgICB0cnkge1xuICAgICAgICBpZihoYW5kbGVyKXtcbiAgICAgICAgICBpZighb2spe1xuICAgICAgICAgICAgaWYocHJvbWlzZS5faCA9PSAyKW9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5faCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGhhbmRsZXIgPT09IHRydWUpcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZihkb21haW4pZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgIGlmKGRvbWFpbilkb21haW4uZXhpdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2Upe1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSl7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUoY2hhaW4ubGVuZ3RoID4gaSlydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgcHJvbWlzZS5fYyA9IFtdO1xuICAgIHByb21pc2UuX24gPSBmYWxzZTtcbiAgICBpZihpc1JlamVjdCAmJiAhcHJvbWlzZS5faClvblVuaGFuZGxlZChwcm9taXNlKTtcbiAgfSk7XG59O1xudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdlxuICAgICAgLCBhYnJ1cHQsIGhhbmRsZXIsIGNvbnNvbGU7XG4gICAgaWYoaXNVbmhhbmRsZWQocHJvbWlzZSkpe1xuICAgICAgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgICBpZihpc05vZGUpe1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgaWYoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbil7XG4gICAgICAgICAgaGFuZGxlcih7cHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiB2YWx1ZX0pO1xuICAgICAgICB9IGVsc2UgaWYoKGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcil7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBwcm9taXNlLl9oID0gaXNOb2RlIHx8IGlzVW5oYW5kbGVkKHByb21pc2UpID8gMiA6IDE7XG4gICAgfSBwcm9taXNlLl9hID0gdW5kZWZpbmVkO1xuICAgIGlmKGFicnVwdCl0aHJvdyBhYnJ1cHQuZXJyb3I7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICBpZihwcm9taXNlLl9oID09IDEpcmV0dXJuIGZhbHNlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9hIHx8IHByb21pc2UuX2NcbiAgICAsIGkgICAgID0gMFxuICAgICwgcmVhY3Rpb247XG4gIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpe1xuICAgIHJlYWN0aW9uID0gY2hhaW5baSsrXTtcbiAgICBpZihyZWFjdGlvbi5mYWlsIHx8ICFpc1VuaGFuZGxlZChyZWFjdGlvbi5wcm9taXNlKSlyZXR1cm4gZmFsc2U7XG4gIH0gcmV0dXJuIHRydWU7XG59O1xudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYoaXNOb2RlKXtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBpZihoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCl7XG4gICAgICBoYW5kbGVyKHtwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHByb21pc2UuX3Z9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIGlmKHByb21pc2UuX2QpcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fcyA9IDI7XG4gIGlmKCFwcm9taXNlLl9hKXByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbih2YWx1ZSl7XG4gIHZhciBwcm9taXNlID0gdGhpc1xuICAgICwgdGhlbjtcbiAgaWYocHJvbWlzZS5fZClyZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZihwcm9taXNlID09PSB2YWx1ZSl0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICBpZih0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSkpe1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciB3cmFwcGVyID0ge193OiBwcm9taXNlLCBfZDogZmFsc2V9OyAvLyB3cmFwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBjdHgoJHJlc29sdmUsIHdyYXBwZXIsIDEpLCBjdHgoJHJlamVjdCwgd3JhcHBlciwgMSkpO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2goZSl7XG4gICAgJHJlamVjdC5jYWxsKHtfdzogcHJvbWlzZSwgX2Q6IGZhbHNlfSwgZSk7IC8vIHdyYXBcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmKCFVU0VfTkFUSVZFKXtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRQcm9taXNlLCBQUk9NSVNFLCAnX2gnKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGN0eCgkcmVzb2x2ZSwgdGhpcywgMSksIGN0eCgkcmVqZWN0LCB0aGlzLCAxKSk7XG4gICAgfSBjYXRjaChlcnIpe1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3Ipe1xuICAgIHRoaXMuX2MgPSBbXTsgICAgICAgICAgICAgLy8gPC0gYXdhaXRpbmcgcmVhY3Rpb25zXG4gICAgdGhpcy5fYSA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgIHRoaXMuX3MgPSAwOyAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICB0aGlzLl9kID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIGRvbmVcbiAgICB0aGlzLl92ID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIHZhbHVlXG4gICAgdGhpcy5faCA9IDA7ICAgICAgICAgICAgICAvLyA8LSByZWplY3Rpb24gc3RhdGUsIDAgLSBkZWZhdWx0LCAxIC0gaGFuZGxlZCwgMiAtIHVuaGFuZGxlZFxuICAgIHRoaXMuX24gPSBmYWxzZTsgICAgICAgICAgLy8gPC0gbm90aWZ5XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpKCRQcm9taXNlLnByb3RvdHlwZSwge1xuICAgIC8vIDI1LjQuNS4zIFByb21pc2UucHJvdG90eXBlLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCl7XG4gICAgICB2YXIgcmVhY3Rpb24gICAgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rICAgICA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCAgID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYodGhpcy5fYSl0aGlzLl9hLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYodGhpcy5fcylub3RpZnkodGhpcywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyAyNS40LjUuMSBQcm9taXNlLnByb3RvdHlwZS5jYXRjaChvblJlamVjdGVkKVxuICAgICdjYXRjaCc6IGZ1bmN0aW9uKG9uUmVqZWN0ZWQpe1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgcHJvbWlzZSAgPSBuZXcgSW50ZXJuYWw7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ICA9IGN0eCgkcmVqZWN0LCBwcm9taXNlLCAxKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1Byb21pc2U6ICRQcm9taXNlfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpe1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcylcbiAgICAgICwgJCRyZWplY3QgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCl7XG4gICAgLy8gaW5zdGFuY2VvZiBpbnN0ZWFkIG9mIGludGVybmFsIHNsb3QgY2hlY2sgYmVjYXVzZSB3ZSBzaG91bGQgZml4IGl0IHdpdGhvdXQgcmVwbGFjZW1lbnQgbmF0aXZlIFByb21pc2UgY29yZVxuICAgIGlmKHggaW5zdGFuY2VvZiAkUHJvbWlzZSAmJiBzYW1lQ29uc3RydWN0b3IoeC5jb25zdHJ1Y3RvciwgdGhpcykpcmV0dXJuIHg7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKVxuICAgICAgLCAkJHJlc29sdmUgID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgICQkcmVzb2x2ZSh4KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7XG4gICRQcm9taXNlLmFsbChpdGVyKVsnY2F0Y2gnXShlbXB0eSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgICAgICA9IHRoaXNcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlc29sdmUgICAgPSBjYXBhYmlsaXR5LnJlc29sdmVcbiAgICAgICwgcmVqZWN0ICAgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICB2YXIgdmFsdWVzICAgID0gW11cbiAgICAgICAgLCBpbmRleCAgICAgPSAwXG4gICAgICAgICwgcmVtYWluaW5nID0gMTtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24ocHJvbWlzZSl7XG4gICAgICAgIHZhciAkaW5kZXggICAgICAgID0gaW5kZXgrK1xuICAgICAgICAgICwgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgICAgICAgIGlmKGFscmVhZHlDYWxsZWQpcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbJGluZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmKGFicnVwdClyZWplY3QoYWJydXB0LmVycm9yKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyAyNS40LjQuNCBQcm9taXNlLnJhY2UoaXRlcmFibGUpXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpe1xuICAgIHZhciBDICAgICAgICAgID0gdGhpc1xuICAgICAgLCBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgICwgcmVqZWN0ICAgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uKHByb21pc2Upe1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZihhYnJ1cHQpcmVqZWN0KGFicnVwdC5lcnJvcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyICRhdCAgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuLy8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbihpdGVyYXRlZCl7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uKCl7XG4gIHZhciBPICAgICA9IHRoaXMuX3RcbiAgICAsIGluZGV4ID0gdGhpcy5faVxuICAgICwgcG9pbnQ7XG4gIGlmKGluZGV4ID49IE8ubGVuZ3RoKXJldHVybiB7dmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZX07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7dmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZX07XG59KTsiLCJ2YXIgJGl0ZXJhdG9ycyAgICA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJylcbiAgLCByZWRlZmluZSAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIGdsb2JhbCAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGhpZGUgICAgICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBJdGVyYXRvcnMgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCB3a3MgICAgICAgICAgID0gcmVxdWlyZSgnLi9fd2tzJylcbiAgLCBJVEVSQVRPUiAgICAgID0gd2tzKCdpdGVyYXRvcicpXG4gICwgVE9fU1RSSU5HX1RBRyA9IHdrcygndG9TdHJpbmdUYWcnKVxuICAsIEFycmF5VmFsdWVzICAgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmZvcih2YXIgY29sbGVjdGlvbnMgPSBbJ05vZGVMaXN0JywgJ0RPTVRva2VuTGlzdCcsICdNZWRpYUxpc3QnLCAnU3R5bGVTaGVldExpc3QnLCAnQ1NTUnVsZUxpc3QnXSwgaSA9IDA7IGkgPCA1OyBpKyspe1xuICB2YXIgTkFNRSAgICAgICA9IGNvbGxlY3Rpb25zW2ldXG4gICAgLCBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdXG4gICAgLCBwcm90byAgICAgID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZVxuICAgICwga2V5O1xuICBpZihwcm90byl7XG4gICAgaWYoIXByb3RvW0lURVJBVE9SXSloaWRlKHByb3RvLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuICAgIGlmKCFwcm90b1tUT19TVFJJTkdfVEFHXSloaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcbiAgICBJdGVyYXRvcnNbTkFNRV0gPSBBcnJheVZhbHVlcztcbiAgICBmb3Ioa2V5IGluICRpdGVyYXRvcnMpaWYoIXByb3RvW2tleV0pcmVkZWZpbmUocHJvdG8sIGtleSwgJGl0ZXJhdG9yc1trZXldLCB0cnVlKTtcbiAgfVxufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuXG5mdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSBCdWZmZXIuaXNCdWZmZXI7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cbiIsIi8vIChjKSBEZWFuIE1jTmFtZWUgPGRlYW5AZ21haWwuY29tPiwgMjAxMi5cbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGVhbm0vY3NzLWNvbG9yLXBhcnNlci1qc1xuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HXG4vLyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4vLyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvXG52YXIga0NTU0NvbG9yVGFibGUgPSB7XG4gIFwidHJhbnNwYXJlbnRcIjogWzAsMCwwLDBdLCBcImFsaWNlYmx1ZVwiOiBbMjQwLDI0OCwyNTUsMV0sXG4gIFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsMjM1LDIxNSwxXSwgXCJhcXVhXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiYXF1YW1hcmluZVwiOiBbMTI3LDI1NSwyMTIsMV0sIFwiYXp1cmVcIjogWzI0MCwyNTUsMjU1LDFdLFxuICBcImJlaWdlXCI6IFsyNDUsMjQ1LDIyMCwxXSwgXCJiaXNxdWVcIjogWzI1NSwyMjgsMTk2LDFdLFxuICBcImJsYWNrXCI6IFswLDAsMCwxXSwgXCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LDIzNSwyMDUsMV0sXG4gIFwiYmx1ZVwiOiBbMCwwLDI1NSwxXSwgXCJibHVldmlvbGV0XCI6IFsxMzgsNDMsMjI2LDFdLFxuICBcImJyb3duXCI6IFsxNjUsNDIsNDIsMV0sIFwiYnVybHl3b29kXCI6IFsyMjIsMTg0LDEzNSwxXSxcbiAgXCJjYWRldGJsdWVcIjogWzk1LDE1OCwxNjAsMV0sIFwiY2hhcnRyZXVzZVwiOiBbMTI3LDI1NSwwLDFdLFxuICBcImNob2NvbGF0ZVwiOiBbMjEwLDEwNSwzMCwxXSwgXCJjb3JhbFwiOiBbMjU1LDEyNyw4MCwxXSxcbiAgXCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLDE0OSwyMzcsMV0sIFwiY29ybnNpbGtcIjogWzI1NSwyNDgsMjIwLDFdLFxuICBcImNyaW1zb25cIjogWzIyMCwyMCw2MCwxXSwgXCJjeWFuXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiZGFya2JsdWVcIjogWzAsMCwxMzksMV0sIFwiZGFya2N5YW5cIjogWzAsMTM5LDEzOSwxXSxcbiAgXCJkYXJrZ29sZGVucm9kXCI6IFsxODQsMTM0LDExLDFdLCBcImRhcmtncmF5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJrZ3JlZW5cIjogWzAsMTAwLDAsMV0sIFwiZGFya2dyZXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtraGFraVwiOiBbMTg5LDE4MywxMDcsMV0sIFwiZGFya21hZ2VudGFcIjogWzEzOSwwLDEzOSwxXSxcbiAgXCJkYXJrb2xpdmVncmVlblwiOiBbODUsMTA3LDQ3LDFdLCBcImRhcmtvcmFuZ2VcIjogWzI1NSwxNDAsMCwxXSxcbiAgXCJkYXJrb3JjaGlkXCI6IFsxNTMsNTAsMjA0LDFdLCBcImRhcmtyZWRcIjogWzEzOSwwLDAsMV0sXG4gIFwiZGFya3NhbG1vblwiOiBbMjMzLDE1MCwxMjIsMV0sIFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsMTg4LDE0MywxXSxcbiAgXCJkYXJrc2xhdGVibHVlXCI6IFs3Miw2MSwxMzksMV0sIFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsNzksNzksMV0sXG4gIFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsNzksNzksMV0sIFwiZGFya3R1cnF1b2lzZVwiOiBbMCwyMDYsMjA5LDFdLFxuICBcImRhcmt2aW9sZXRcIjogWzE0OCwwLDIxMSwxXSwgXCJkZWVwcGlua1wiOiBbMjU1LDIwLDE0NywxXSxcbiAgXCJkZWVwc2t5Ymx1ZVwiOiBbMCwxOTEsMjU1LDFdLCBcImRpbWdyYXlcIjogWzEwNSwxMDUsMTA1LDFdLFxuICBcImRpbWdyZXlcIjogWzEwNSwxMDUsMTA1LDFdLCBcImRvZGdlcmJsdWVcIjogWzMwLDE0NCwyNTUsMV0sXG4gIFwiZmlyZWJyaWNrXCI6IFsxNzgsMzQsMzQsMV0sIFwiZmxvcmFsd2hpdGVcIjogWzI1NSwyNTAsMjQwLDFdLFxuICBcImZvcmVzdGdyZWVuXCI6IFszNCwxMzksMzQsMV0sIFwiZnVjaHNpYVwiOiBbMjU1LDAsMjU1LDFdLFxuICBcImdhaW5zYm9yb1wiOiBbMjIwLDIyMCwyMjAsMV0sIFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LDI0OCwyNTUsMV0sXG4gIFwiZ29sZFwiOiBbMjU1LDIxNSwwLDFdLCBcImdvbGRlbnJvZFwiOiBbMjE4LDE2NSwzMiwxXSxcbiAgXCJncmF5XCI6IFsxMjgsMTI4LDEyOCwxXSwgXCJncmVlblwiOiBbMCwxMjgsMCwxXSxcbiAgXCJncmVlbnllbGxvd1wiOiBbMTczLDI1NSw0NywxXSwgXCJncmV5XCI6IFsxMjgsMTI4LDEyOCwxXSxcbiAgXCJob25leWRld1wiOiBbMjQwLDI1NSwyNDAsMV0sIFwiaG90cGlua1wiOiBbMjU1LDEwNSwxODAsMV0sXG4gIFwiaW5kaWFucmVkXCI6IFsyMDUsOTIsOTIsMV0sIFwiaW5kaWdvXCI6IFs3NSwwLDEzMCwxXSxcbiAgXCJpdm9yeVwiOiBbMjU1LDI1NSwyNDAsMV0sIFwia2hha2lcIjogWzI0MCwyMzAsMTQwLDFdLFxuICBcImxhdmVuZGVyXCI6IFsyMzAsMjMwLDI1MCwxXSwgXCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsMjQwLDI0NSwxXSxcbiAgXCJsYXduZ3JlZW5cIjogWzEyNCwyNTIsMCwxXSwgXCJsZW1vbmNoaWZmb25cIjogWzI1NSwyNTAsMjA1LDFdLFxuICBcImxpZ2h0Ymx1ZVwiOiBbMTczLDIxNiwyMzAsMV0sIFwibGlnaHRjb3JhbFwiOiBbMjQwLDEyOCwxMjgsMV0sXG4gIFwibGlnaHRjeWFuXCI6IFsyMjQsMjU1LDI1NSwxXSwgXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLDI1MCwyMTAsMV0sXG4gIFwibGlnaHRncmF5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodGdyZWVuXCI6IFsxNDQsMjM4LDE0NCwxXSxcbiAgXCJsaWdodGdyZXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0cGlua1wiOiBbMjU1LDE4MiwxOTMsMV0sXG4gIFwibGlnaHRzYWxtb25cIjogWzI1NSwxNjAsMTIyLDFdLCBcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLDE3OCwxNzAsMV0sXG4gIFwibGlnaHRza3libHVlXCI6IFsxMzUsMjA2LDI1MCwxXSwgXCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LDEzNiwxNTMsMV0sXG4gIFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwxMzYsMTUzLDFdLCBcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsMTk2LDIyMiwxXSxcbiAgXCJsaWdodHllbGxvd1wiOiBbMjU1LDI1NSwyMjQsMV0sIFwibGltZVwiOiBbMCwyNTUsMCwxXSxcbiAgXCJsaW1lZ3JlZW5cIjogWzUwLDIwNSw1MCwxXSwgXCJsaW5lblwiOiBbMjUwLDI0MCwyMzAsMV0sXG4gIFwibWFnZW50YVwiOiBbMjU1LDAsMjU1LDFdLCBcIm1hcm9vblwiOiBbMTI4LDAsMCwxXSxcbiAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsMjA1LDE3MCwxXSwgXCJtZWRpdW1ibHVlXCI6IFswLDAsMjA1LDFdLFxuICBcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LDg1LDIxMSwxXSwgXCJtZWRpdW1wdXJwbGVcIjogWzE0NywxMTIsMjE5LDFdLFxuICBcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwxNzksMTEzLDFdLCBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLDEwNCwyMzgsMV0sXG4gIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsMjUwLDE1NCwxXSwgXCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLDIwOSwyMDQsMV0sXG4gIFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksMjEsMTMzLDFdLCBcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsMjUsMTEyLDFdLFxuICBcIm1pbnRjcmVhbVwiOiBbMjQ1LDI1NSwyNTAsMV0sIFwibWlzdHlyb3NlXCI6IFsyNTUsMjI4LDIyNSwxXSxcbiAgXCJtb2NjYXNpblwiOiBbMjU1LDIyOCwxODEsMV0sIFwibmF2YWpvd2hpdGVcIjogWzI1NSwyMjIsMTczLDFdLFxuICBcIm5hdnlcIjogWzAsMCwxMjgsMV0sIFwib2xkbGFjZVwiOiBbMjUzLDI0NSwyMzAsMV0sXG4gIFwib2xpdmVcIjogWzEyOCwxMjgsMCwxXSwgXCJvbGl2ZWRyYWJcIjogWzEwNywxNDIsMzUsMV0sXG4gIFwib3JhbmdlXCI6IFsyNTUsMTY1LDAsMV0sIFwib3JhbmdlcmVkXCI6IFsyNTUsNjksMCwxXSxcbiAgXCJvcmNoaWRcIjogWzIxOCwxMTIsMjE0LDFdLCBcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwyMzIsMTcwLDFdLFxuICBcInBhbGVncmVlblwiOiBbMTUyLDI1MSwxNTIsMV0sIFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LDIzOCwyMzgsMV0sXG4gIFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LDExMiwxNDcsMV0sIFwicGFwYXlhd2hpcFwiOiBbMjU1LDIzOSwyMTMsMV0sXG4gIFwicGVhY2hwdWZmXCI6IFsyNTUsMjE4LDE4NSwxXSwgXCJwZXJ1XCI6IFsyMDUsMTMzLDYzLDFdLFxuICBcInBpbmtcIjogWzI1NSwxOTIsMjAzLDFdLCBcInBsdW1cIjogWzIyMSwxNjAsMjIxLDFdLFxuICBcInBvd2RlcmJsdWVcIjogWzE3NiwyMjQsMjMwLDFdLCBcInB1cnBsZVwiOiBbMTI4LDAsMTI4LDFdLFxuICBcInJlYmVjY2FwdXJwbGVcIjogWzEwMiw1MSwxNTMsMV0sXG4gIFwicmVkXCI6IFsyNTUsMCwwLDFdLCBcInJvc3licm93blwiOiBbMTg4LDE0MywxNDMsMV0sXG4gIFwicm95YWxibHVlXCI6IFs2NSwxMDUsMjI1LDFdLCBcInNhZGRsZWJyb3duXCI6IFsxMzksNjksMTksMV0sXG4gIFwic2FsbW9uXCI6IFsyNTAsMTI4LDExNCwxXSwgXCJzYW5keWJyb3duXCI6IFsyNDQsMTY0LDk2LDFdLFxuICBcInNlYWdyZWVuXCI6IFs0NiwxMzksODcsMV0sIFwic2Vhc2hlbGxcIjogWzI1NSwyNDUsMjM4LDFdLFxuICBcInNpZW5uYVwiOiBbMTYwLDgyLDQ1LDFdLCBcInNpbHZlclwiOiBbMTkyLDE5MiwxOTIsMV0sXG4gIFwic2t5Ymx1ZVwiOiBbMTM1LDIwNiwyMzUsMV0sIFwic2xhdGVibHVlXCI6IFsxMDYsOTAsMjA1LDFdLFxuICBcInNsYXRlZ3JheVwiOiBbMTEyLDEyOCwxNDQsMV0sIFwic2xhdGVncmV5XCI6IFsxMTIsMTI4LDE0NCwxXSxcbiAgXCJzbm93XCI6IFsyNTUsMjUwLDI1MCwxXSwgXCJzcHJpbmdncmVlblwiOiBbMCwyNTUsMTI3LDFdLFxuICBcInN0ZWVsYmx1ZVwiOiBbNzAsMTMwLDE4MCwxXSwgXCJ0YW5cIjogWzIxMCwxODAsMTQwLDFdLFxuICBcInRlYWxcIjogWzAsMTI4LDEyOCwxXSwgXCJ0aGlzdGxlXCI6IFsyMTYsMTkxLDIxNiwxXSxcbiAgXCJ0b21hdG9cIjogWzI1NSw5OSw3MSwxXSwgXCJ0dXJxdW9pc2VcIjogWzY0LDIyNCwyMDgsMV0sXG4gIFwidmlvbGV0XCI6IFsyMzgsMTMwLDIzOCwxXSwgXCJ3aGVhdFwiOiBbMjQ1LDIyMiwxNzksMV0sXG4gIFwid2hpdGVcIjogWzI1NSwyNTUsMjU1LDFdLCBcIndoaXRlc21va2VcIjogWzI0NSwyNDUsMjQ1LDFdLFxuICBcInllbGxvd1wiOiBbMjU1LDI1NSwwLDFdLCBcInllbGxvd2dyZWVuXCI6IFsxNTQsMjA1LDUwLDFdfVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfYnl0ZShpKSB7ICAvLyBDbGFtcCB0byBpbnRlZ2VyIDAgLi4gMjU1LlxuICBpID0gTWF0aC5yb3VuZChpKTsgIC8vIFNlZW1zIHRvIGJlIHdoYXQgQ2hyb21lIGRvZXMgKHZzIHRydW5jYXRpb24pLlxuICByZXR1cm4gaSA8IDAgPyAwIDogaSA+IDI1NSA/IDI1NSA6IGk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wX2Nzc19mbG9hdChmKSB7ICAvLyBDbGFtcCB0byBmbG9hdCAwLjAgLi4gMS4wLlxuICByZXR1cm4gZiA8IDAgPyAwIDogZiA+IDEgPyAxIDogZjtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3NzX2ludChzdHIpIHsgIC8vIGludCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfYnl0ZShwYXJzZUZsb2F0KHN0cikgLyAxMDAgKiAyNTUpO1xuICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VJbnQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19mbG9hdChzdHIpIHsgIC8vIGZsb2F0IG9yIHBlcmNlbnRhZ2UuXG4gIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnJScpXG4gICAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikgLyAxMDApO1xuICByZXR1cm4gY2xhbXBfY3NzX2Zsb2F0KHBhcnNlRmxvYXQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCkge1xuICBpZiAoaCA8IDApIGggKz0gMTtcbiAgZWxzZSBpZiAoaCA+IDEpIGggLT0gMTtcblxuICBpZiAoaCAqIDYgPCAxKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiBoICogNjtcbiAgaWYgKGggKiAyIDwgMSkgcmV0dXJuIG0yO1xuICBpZiAoaCAqIDMgPCAyKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiAoMi8zIC0gaCkgKiA2O1xuICByZXR1cm4gbTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ1NTQ29sb3IoY3NzX3N0cikge1xuICAvLyBSZW1vdmUgYWxsIHdoaXRlc3BhY2UsIG5vdCBjb21wbGlhbnQsIGJ1dCBzaG91bGQganVzdCBiZSBtb3JlIGFjY2VwdGluZy5cbiAgdmFyIHN0ciA9IGNzc19zdHIucmVwbGFjZSgvIC9nLCAnJykudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDb2xvciBrZXl3b3JkcyAoYW5kIHRyYW5zcGFyZW50KSBsb29rdXAuXG4gIGlmIChzdHIgaW4ga0NTU0NvbG9yVGFibGUpIHJldHVybiBrQ1NTQ29sb3JUYWJsZVtzdHJdLnNsaWNlKCk7ICAvLyBkdXAuXG5cbiAgLy8gI2FiYyBhbmQgI2FiYzEyMyBzeW50YXguXG4gIGlmIChzdHJbMF0gPT09ICcjJykge1xuICAgIGlmIChzdHIubGVuZ3RoID09PSA0KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWygoaXYgJiAweGYwMCkgPj4gNCkgfCAoKGl2ICYgMHhmMDApID4+IDgpLFxuICAgICAgICAgICAgICAoaXYgJiAweGYwKSB8ICgoaXYgJiAweGYwKSA+PiA0KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmKSB8ICgoaXYgJiAweGYpIDw8IDQpLFxuICAgICAgICAgICAgICAxXTtcbiAgICB9IGVsc2UgaWYgKHN0ci5sZW5ndGggPT09IDcpIHtcbiAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZmZmZikpIHJldHVybiBudWxsOyAgLy8gQ292ZXJzIE5hTi5cbiAgICAgIHJldHVybiBbKGl2ICYgMHhmZjAwMDApID4+IDE2LFxuICAgICAgICAgICAgICAoaXYgJiAweGZmMDApID4+IDgsXG4gICAgICAgICAgICAgIGl2ICYgMHhmZixcbiAgICAgICAgICAgICAgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgb3AgPSBzdHIuaW5kZXhPZignKCcpLCBlcCA9IHN0ci5pbmRleE9mKCcpJyk7XG4gIGlmIChvcCAhPT0gLTEgJiYgZXAgKyAxID09PSBzdHIubGVuZ3RoKSB7XG4gICAgdmFyIGZuYW1lID0gc3RyLnN1YnN0cigwLCBvcCk7XG4gICAgdmFyIHBhcmFtcyA9IHN0ci5zdWJzdHIob3ArMSwgZXAtKG9wKzEpKS5zcGxpdCgnLCcpO1xuICAgIHZhciBhbHBoYSA9IDE7ICAvLyBUbyBhbGxvdyBjYXNlIGZhbGx0aHJvdWdoLlxuICAgIHN3aXRjaCAoZm5hbWUpIHtcbiAgICAgIGNhc2UgJ3JnYmEnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGFscGhhID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtcy5wb3AoKSk7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJ3JnYic6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIFtwYXJzZV9jc3NfaW50KHBhcmFtc1swXSksXG4gICAgICAgICAgICAgICAgcGFyc2VfY3NzX2ludChwYXJhbXNbMV0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzJdKSxcbiAgICAgICAgICAgICAgICBhbHBoYV07XG4gICAgICBjYXNlICdoc2xhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdoc2wnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBoID0gKCgocGFyc2VGbG9hdChwYXJhbXNbMF0pICUgMzYwKSArIDM2MCkgJSAzNjApIC8gMzYwOyAgLy8gMCAuLiAxXG4gICAgICAgIC8vIE5PVEUoZGVhbm0pOiBBY2NvcmRpbmcgdG8gdGhlIENTUyBzcGVjIHMvbCBzaG91bGQgb25seSBiZVxuICAgICAgICAvLyBwZXJjZW50YWdlcywgYnV0IHdlIGRvbid0IGJvdGhlciBhbmQgbGV0IGZsb2F0IG9yIHBlcmNlbnRhZ2UuXG4gICAgICAgIHZhciBzID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtc1sxXSk7XG4gICAgICAgIHZhciBsID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtc1syXSk7XG4gICAgICAgIHZhciBtMiA9IGwgPD0gMC41ID8gbCAqIChzICsgMSkgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgICB2YXIgbTEgPSBsICogMiAtIG0yO1xuICAgICAgICByZXR1cm4gW2NsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCsxLzMpICogMjU1KSxcbiAgICAgICAgICAgICAgICBjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpICogMjU1KSxcbiAgICAgICAgICAgICAgICBjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgtMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnRyeSB7IGV4cG9ydHMucGFyc2VDU1NDb2xvciA9IHBhcnNlQ1NTQ29sb3IgfSBjYXRjaChlKSB7IH1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBlYXJjdXQ7XG5cbmZ1bmN0aW9uIGVhcmN1dChkYXRhLCBob2xlSW5kaWNlcywgZGltKSB7XG5cbiAgICBkaW0gPSBkaW0gfHwgMjtcblxuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aCxcbiAgICAgICAgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGgsXG4gICAgICAgIG91dGVyTm9kZSA9IGxpbmtlZExpc3QoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSwgdHJ1ZSksXG4gICAgICAgIHRyaWFuZ2xlcyA9IFtdO1xuXG4gICAgaWYgKCFvdXRlck5vZGUpIHJldHVybiB0cmlhbmdsZXM7XG5cbiAgICB2YXIgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgeCwgeSwgc2l6ZTtcblxuICAgIGlmIChoYXNIb2xlcykgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZXMoZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltKTtcblxuICAgIC8vIGlmIHRoZSBzaGFwZSBpcyBub3QgdG9vIHNpbXBsZSwgd2UnbGwgdXNlIHotb3JkZXIgY3VydmUgaGFzaCBsYXRlcjsgY2FsY3VsYXRlIHBvbHlnb24gYmJveFxuICAgIGlmIChkYXRhLmxlbmd0aCA+IDgwICogZGltKSB7XG4gICAgICAgIG1pblggPSBtYXhYID0gZGF0YVswXTtcbiAgICAgICAgbWluWSA9IG1heFkgPSBkYXRhWzFdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBkaW07IGkgPCBvdXRlckxlbjsgaSArPSBkaW0pIHtcbiAgICAgICAgICAgIHggPSBkYXRhW2ldO1xuICAgICAgICAgICAgeSA9IGRhdGFbaSArIDFdO1xuICAgICAgICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geDtcbiAgICAgICAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7XG4gICAgICAgICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1pblgsIG1pblkgYW5kIHNpemUgYXJlIGxhdGVyIHVzZWQgdG8gdHJhbnNmb3JtIGNvb3JkcyBpbnRvIGludGVnZXJzIGZvciB6LW9yZGVyIGNhbGN1bGF0aW9uXG4gICAgICAgIHNpemUgPSBNYXRoLm1heChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpO1xuICAgIH1cblxuICAgIGVhcmN1dExpbmtlZChvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplKTtcblxuICAgIHJldHVybiB0cmlhbmdsZXM7XG59XG5cbi8vIGNyZWF0ZSBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBmcm9tIHBvbHlnb24gcG9pbnRzIGluIHRoZSBzcGVjaWZpZWQgd2luZGluZyBvcmRlclxuZnVuY3Rpb24gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSkge1xuICAgIHZhciBpLCBsYXN0O1xuXG4gICAgaWYgKGNsb2Nrd2lzZSA9PT0gKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSA+IDApKSB7XG4gICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcbiAgICB9XG5cbiAgICBpZiAobGFzdCAmJiBlcXVhbHMobGFzdCwgbGFzdC5uZXh0KSkge1xuICAgICAgICByZW1vdmVOb2RlKGxhc3QpO1xuICAgICAgICBsYXN0ID0gbGFzdC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBsYXN0O1xufVxuXG4vLyBlbGltaW5hdGUgY29saW5lYXIgb3IgZHVwbGljYXRlIHBvaW50c1xuZnVuY3Rpb24gZmlsdGVyUG9pbnRzKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gc3RhcnQ7XG4gICAgaWYgKCFlbmQpIGVuZCA9IHN0YXJ0O1xuXG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgYWdhaW47XG4gICAgZG8ge1xuICAgICAgICBhZ2FpbiA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghcC5zdGVpbmVyICYmIChlcXVhbHMocCwgcC5uZXh0KSB8fCBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICBwID0gZW5kID0gcC5wcmV2O1xuICAgICAgICAgICAgaWYgKHAgPT09IHAubmV4dCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBhZ2FpbiA9IHRydWU7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICAgIH1cbiAgICB9IHdoaWxlIChhZ2FpbiB8fCBwICE9PSBlbmQpO1xuXG4gICAgcmV0dXJuIGVuZDtcbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSwgcGFzcykge1xuICAgIGlmICghZWFyKSByZXR1cm47XG5cbiAgICAvLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG4gICAgaWYgKCFwYXNzICYmIHNpemUpIGluZGV4Q3VydmUoZWFyLCBtaW5YLCBtaW5ZLCBzaXplKTtcblxuICAgIHZhciBzdG9wID0gZWFyLFxuICAgICAgICBwcmV2LCBuZXh0O1xuXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG4gICAgd2hpbGUgKGVhci5wcmV2ICE9PSBlYXIubmV4dCkge1xuICAgICAgICBwcmV2ID0gZWFyLnByZXY7XG4gICAgICAgIG5leHQgPSBlYXIubmV4dDtcblxuICAgICAgICBpZiAoc2l6ZSA/IGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgc2l6ZSkgOiBpc0VhcihlYXIpKSB7XG4gICAgICAgICAgICAvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocHJldi5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGVhci5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKG5leHQuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIHJlbW92ZU5vZGUoZWFyKTtcblxuICAgICAgICAgICAgLy8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGljZSBsZWFkcyB0byBsZXNzIHNsaXZlciB0cmlhbmdsZXNcbiAgICAgICAgICAgIGVhciA9IG5leHQubmV4dDtcbiAgICAgICAgICAgIHN0b3AgPSBuZXh0Lm5leHQ7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZWFyID0gbmV4dDtcblxuICAgICAgICAvLyBpZiB3ZSBsb29wZWQgdGhyb3VnaCB0aGUgd2hvbGUgcmVtYWluaW5nIHBvbHlnb24gYW5kIGNhbid0IGZpbmQgYW55IG1vcmUgZWFyc1xuICAgICAgICBpZiAoZWFyID09PSBzdG9wKSB7XG4gICAgICAgICAgICAvLyB0cnkgZmlsdGVyaW5nIHBvaW50cyBhbmQgc2xpY2luZyBhZ2FpblxuICAgICAgICAgICAgaWYgKCFwYXNzKSB7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGZpbHRlclBvaW50cyhlYXIpLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSwgMSk7XG5cbiAgICAgICAgICAgIC8vIGlmIHRoaXMgZGlkbid0IHdvcmssIHRyeSBjdXJpbmcgYWxsIHNtYWxsIHNlbGYtaW50ZXJzZWN0aW9ucyBsb2NhbGx5XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBlYXIgPSBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKGVhciwgdHJpYW5nbGVzLCBkaW0pO1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCAyKTtcblxuICAgICAgICAgICAgLy8gYXMgYSBsYXN0IHJlc29ydCwgdHJ5IHNwbGl0dGluZyB0aGUgcmVtYWluaW5nIHBvbHlnb24gaW50byB0d29cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMikge1xuICAgICAgICAgICAgICAgIHNwbGl0RWFyY3V0KGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gY2hlY2sgd2hldGhlciBhIHBvbHlnb24gbm9kZSBmb3JtcyBhIHZhbGlkIGVhciB3aXRoIGFkamFjZW50IG5vZGVzXG5mdW5jdGlvbiBpc0VhcihlYXIpIHtcbiAgICB2YXIgYSA9IGVhci5wcmV2LFxuICAgICAgICBiID0gZWFyLFxuICAgICAgICBjID0gZWFyLm5leHQ7XG5cbiAgICBpZiAoYXJlYShhLCBiLCBjKSA+PSAwKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cbiAgICAvLyBub3cgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgb3RoZXIgcG9pbnRzIGluc2lkZSB0aGUgcG90ZW50aWFsIGVhclxuICAgIHZhciBwID0gZWFyLm5leHQubmV4dDtcblxuICAgIHdoaWxlIChwICE9PSBlYXIucHJldikge1xuICAgICAgICBpZiAocG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0Vhckhhc2hlZChlYXIsIG1pblgsIG1pblksIHNpemUpIHtcbiAgICB2YXIgYSA9IGVhci5wcmV2LFxuICAgICAgICBiID0gZWFyLFxuICAgICAgICBjID0gZWFyLm5leHQ7XG5cbiAgICBpZiAoYXJlYShhLCBiLCBjKSA+PSAwKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cbiAgICAvLyB0cmlhbmdsZSBiYm94OyBtaW4gJiBtYXggYXJlIGNhbGN1bGF0ZWQgbGlrZSB0aGlzIGZvciBzcGVlZFxuICAgIHZhciBtaW5UWCA9IGEueCA8IGIueCA/IChhLnggPCBjLnggPyBhLnggOiBjLngpIDogKGIueCA8IGMueCA/IGIueCA6IGMueCksXG4gICAgICAgIG1pblRZID0gYS55IDwgYi55ID8gKGEueSA8IGMueSA/IGEueSA6IGMueSkgOiAoYi55IDwgYy55ID8gYi55IDogYy55KSxcbiAgICAgICAgbWF4VFggPSBhLnggPiBiLnggPyAoYS54ID4gYy54ID8gYS54IDogYy54KSA6IChiLnggPiBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtYXhUWSA9IGEueSA+IGIueSA/IChhLnkgPiBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA+IGMueSA/IGIueSA6IGMueSk7XG5cbiAgICAvLyB6LW9yZGVyIHJhbmdlIGZvciB0aGUgY3VycmVudCB0cmlhbmdsZSBiYm94O1xuICAgIHZhciBtaW5aID0gek9yZGVyKG1pblRYLCBtaW5UWSwgbWluWCwgbWluWSwgc2l6ZSksXG4gICAgICAgIG1heFogPSB6T3JkZXIobWF4VFgsIG1heFRZLCBtaW5YLCBtaW5ZLCBzaXplKTtcblxuICAgIC8vIGZpcnN0IGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIGluIGluY3JlYXNpbmcgei1vcmRlclxuICAgIHZhciBwID0gZWFyLm5leHRaO1xuXG4gICAgd2hpbGUgKHAgJiYgcC56IDw9IG1heFopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLm5leHRaO1xuICAgIH1cblxuICAgIC8vIHRoZW4gbG9vayBmb3IgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuICAgIHAgPSBlYXIucHJldlo7XG5cbiAgICB3aGlsZSAocCAmJiBwLnogPj0gbWluWikge1xuICAgICAgICBpZiAocCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAucHJldlo7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIGdvIHRocm91Z2ggYWxsIHBvbHlnb24gbm9kZXMgYW5kIGN1cmUgc21hbGwgbG9jYWwgc2VsZi1pbnRlcnNlY3Rpb25zXG5mdW5jdGlvbiBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSkge1xuICAgIHZhciBwID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICB2YXIgYSA9IHAucHJldixcbiAgICAgICAgICAgIGIgPSBwLm5leHQubmV4dDtcblxuICAgICAgICBpZiAoIWVxdWFscyhhLCBiKSAmJiBpbnRlcnNlY3RzKGEsIHAsIHAubmV4dCwgYikgJiYgbG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpKSB7XG5cbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGEuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChwLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYi5pIC8gZGltKTtcblxuICAgICAgICAgICAgLy8gcmVtb3ZlIHR3byBub2RlcyBpbnZvbHZlZFxuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocC5uZXh0KTtcblxuICAgICAgICAgICAgcCA9IHN0YXJ0ID0gYjtcbiAgICAgICAgfVxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHJldHVybiBwO1xufVxuXG4vLyB0cnkgc3BsaXR0aW5nIHBvbHlnb24gaW50byB0d28gYW5kIHRyaWFuZ3VsYXRlIHRoZW0gaW5kZXBlbmRlbnRseVxuZnVuY3Rpb24gc3BsaXRFYXJjdXQoc3RhcnQsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplKSB7XG4gICAgLy8gbG9vayBmb3IgYSB2YWxpZCBkaWFnb25hbCB0aGF0IGRpdmlkZXMgdGhlIHBvbHlnb24gaW50byB0d29cbiAgICB2YXIgYSA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgdmFyIGIgPSBhLm5leHQubmV4dDtcbiAgICAgICAgd2hpbGUgKGIgIT09IGEucHJldikge1xuICAgICAgICAgICAgaWYgKGEuaSAhPT0gYi5pICYmIGlzVmFsaWREaWFnb25hbChhLCBiKSkge1xuICAgICAgICAgICAgICAgIC8vIHNwbGl0IHRoZSBwb2x5Z29uIGluIHR3byBieSB0aGUgZGlhZ29uYWxcbiAgICAgICAgICAgICAgICB2YXIgYyA9IHNwbGl0UG9seWdvbihhLCBiKTtcblxuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBjb2xpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXG4gICAgICAgICAgICAgICAgYSA9IGZpbHRlclBvaW50cyhhLCBhLm5leHQpO1xuICAgICAgICAgICAgICAgIGMgPSBmaWx0ZXJQb2ludHMoYywgYy5uZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIHJ1biBlYXJjdXQgb24gZWFjaCBoYWxmXG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGEsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYywgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGIgPSBiLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgYSA9IGEubmV4dDtcbiAgICB9IHdoaWxlIChhICE9PSBzdGFydCk7XG59XG5cbi8vIGxpbmsgZXZlcnkgaG9sZSBpbnRvIHRoZSBvdXRlciBsb29wLCBwcm9kdWNpbmcgYSBzaW5nbGUtcmluZyBwb2x5Z29uIHdpdGhvdXQgaG9sZXNcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSkge1xuICAgIHZhciBxdWV1ZSA9IFtdLFxuICAgICAgICBpLCBsZW4sIHN0YXJ0LCBlbmQsIGxpc3Q7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xuICAgICAgICBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICBsaXN0ID0gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlKTtcbiAgICAgICAgaWYgKGxpc3QgPT09IGxpc3QubmV4dCkgbGlzdC5zdGVpbmVyID0gdHJ1ZTtcbiAgICAgICAgcXVldWUucHVzaChnZXRMZWZ0bW9zdChsaXN0KSk7XG4gICAgfVxuXG4gICAgcXVldWUuc29ydChjb21wYXJlWCk7XG5cbiAgICAvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodFxuICAgIGZvciAoaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBlbGltaW5hdGVIb2xlKHF1ZXVlW2ldLCBvdXRlck5vZGUpO1xuICAgICAgICBvdXRlck5vZGUgPSBmaWx0ZXJQb2ludHMob3V0ZXJOb2RlLCBvdXRlck5vZGUubmV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dGVyTm9kZTtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVgoYSwgYikge1xuICAgIHJldHVybiBhLnggLSBiLng7XG59XG5cbi8vIGZpbmQgYSBicmlkZ2UgYmV0d2VlbiB2ZXJ0aWNlcyB0aGF0IGNvbm5lY3RzIGhvbGUgd2l0aCBhbiBvdXRlciByaW5nIGFuZCBhbmQgbGluayBpdFxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZShob2xlLCBvdXRlck5vZGUpIHtcbiAgICBvdXRlck5vZGUgPSBmaW5kSG9sZUJyaWRnZShob2xlLCBvdXRlck5vZGUpO1xuICAgIGlmIChvdXRlck5vZGUpIHtcbiAgICAgICAgdmFyIGIgPSBzcGxpdFBvbHlnb24ob3V0ZXJOb2RlLCBob2xlKTtcbiAgICAgICAgZmlsdGVyUG9pbnRzKGIsIGIubmV4dCk7XG4gICAgfVxufVxuXG4vLyBEYXZpZCBFYmVybHkncyBhbGdvcml0aG0gZm9yIGZpbmRpbmcgYSBicmlkZ2UgYmV0d2VlbiBob2xlIGFuZCBvdXRlciBwb2x5Z29uXG5mdW5jdGlvbiBmaW5kSG9sZUJyaWRnZShob2xlLCBvdXRlck5vZGUpIHtcbiAgICB2YXIgcCA9IG91dGVyTm9kZSxcbiAgICAgICAgaHggPSBob2xlLngsXG4gICAgICAgIGh5ID0gaG9sZS55LFxuICAgICAgICBxeCA9IC1JbmZpbml0eSxcbiAgICAgICAgbTtcblxuICAgIC8vIGZpbmQgYSBzZWdtZW50IGludGVyc2VjdGVkIGJ5IGEgcmF5IGZyb20gdGhlIGhvbGUncyBsZWZ0bW9zdCBwb2ludCB0byB0aGUgbGVmdDtcbiAgICAvLyBzZWdtZW50J3MgZW5kcG9pbnQgd2l0aCBsZXNzZXIgeCB3aWxsIGJlIHBvdGVudGlhbCBjb25uZWN0aW9uIHBvaW50XG4gICAgZG8ge1xuICAgICAgICBpZiAoaHkgPD0gcC55ICYmIGh5ID49IHAubmV4dC55KSB7XG4gICAgICAgICAgICB2YXIgeCA9IHAueCArIChoeSAtIHAueSkgKiAocC5uZXh0LnggLSBwLngpIC8gKHAubmV4dC55IC0gcC55KTtcbiAgICAgICAgICAgIGlmICh4IDw9IGh4ICYmIHggPiBxeCkge1xuICAgICAgICAgICAgICAgIHF4ID0geDtcbiAgICAgICAgICAgICAgICBpZiAoeCA9PT0gaHgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh5ID09PSBwLnkpIHJldHVybiBwO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAubmV4dC55KSByZXR1cm4gcC5uZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtID0gcC54IDwgcC5uZXh0LnggPyBwIDogcC5uZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gb3V0ZXJOb2RlKTtcblxuICAgIGlmICghbSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoaHggPT09IHF4KSByZXR1cm4gbS5wcmV2OyAvLyBob2xlIHRvdWNoZXMgb3V0ZXIgc2VnbWVudDsgcGljayBsb3dlciBlbmRwb2ludFxuXG4gICAgLy8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBwb2ludHMgZm91bmQsIHdlIGhhdmUgYSB2YWxpZCBjb25uZWN0aW9uO1xuICAgIC8vIG90aGVyd2lzZSBjaG9vc2UgdGhlIHBvaW50IG9mIHRoZSBtaW5pbXVtIGFuZ2xlIHdpdGggdGhlIHJheSBhcyBjb25uZWN0aW9uIHBvaW50XG5cbiAgICB2YXIgc3RvcCA9IG0sXG4gICAgICAgIG14ID0gbS54LFxuICAgICAgICBteSA9IG0ueSxcbiAgICAgICAgdGFuTWluID0gSW5maW5pdHksXG4gICAgICAgIHRhbjtcblxuICAgIHAgPSBtLm5leHQ7XG5cbiAgICB3aGlsZSAocCAhPT0gc3RvcCkge1xuICAgICAgICBpZiAoaHggPj0gcC54ICYmIHAueCA+PSBteCAmJlxuICAgICAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShoeSA8IG15ID8gaHggOiBxeCwgaHksIG14LCBteSwgaHkgPCBteSA/IHF4IDogaHgsIGh5LCBwLngsIHAueSkpIHtcblxuICAgICAgICAgICAgdGFuID0gTWF0aC5hYnMoaHkgLSBwLnkpIC8gKGh4IC0gcC54KTsgLy8gdGFuZ2VudGlhbFxuXG4gICAgICAgICAgICBpZiAoKHRhbiA8IHRhbk1pbiB8fCAodGFuID09PSB0YW5NaW4gJiYgcC54ID4gbS54KSkgJiYgbG9jYWxseUluc2lkZShwLCBob2xlKSkge1xuICAgICAgICAgICAgICAgIG0gPSBwO1xuICAgICAgICAgICAgICAgIHRhbk1pbiA9IHRhbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG07XG59XG5cbi8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbmZ1bmN0aW9uIGluZGV4Q3VydmUoc3RhcnQsIG1pblgsIG1pblksIHNpemUpIHtcbiAgICB2YXIgcCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAueiA9PT0gbnVsbCkgcC56ID0gek9yZGVyKHAueCwgcC55LCBtaW5YLCBtaW5ZLCBzaXplKTtcbiAgICAgICAgcC5wcmV2WiA9IHAucHJldjtcbiAgICAgICAgcC5uZXh0WiA9IHAubmV4dDtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICBwLnByZXZaLm5leHRaID0gbnVsbDtcbiAgICBwLnByZXZaID0gbnVsbDtcblxuICAgIHNvcnRMaW5rZWQocCk7XG59XG5cbi8vIFNpbW9uIFRhdGhhbSdzIGxpbmtlZCBsaXN0IG1lcmdlIHNvcnQgYWxnb3JpdGhtXG4vLyBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL2FsZ29yaXRobXMvbGlzdHNvcnQuaHRtbFxuZnVuY3Rpb24gc29ydExpbmtlZChsaXN0KSB7XG4gICAgdmFyIGksIHAsIHEsIGUsIHRhaWwsIG51bU1lcmdlcywgcFNpemUsIHFTaXplLFxuICAgICAgICBpblNpemUgPSAxO1xuXG4gICAgZG8ge1xuICAgICAgICBwID0gbGlzdDtcbiAgICAgICAgbGlzdCA9IG51bGw7XG4gICAgICAgIHRhaWwgPSBudWxsO1xuICAgICAgICBudW1NZXJnZXMgPSAwO1xuXG4gICAgICAgIHdoaWxlIChwKSB7XG4gICAgICAgICAgICBudW1NZXJnZXMrKztcbiAgICAgICAgICAgIHEgPSBwO1xuICAgICAgICAgICAgcFNpemUgPSAwO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGluU2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcFNpemUrKztcbiAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICBpZiAoIXEpIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBxU2l6ZSA9IGluU2l6ZTtcblxuICAgICAgICAgICAgd2hpbGUgKHBTaXplID4gMCB8fCAocVNpemUgPiAwICYmIHEpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAocFNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHE7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBxU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocVNpemUgPT09IDAgfHwgIXEpIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHA7XG4gICAgICAgICAgICAgICAgICAgIHAgPSBwLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBwU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocC56IDw9IHEueikge1xuICAgICAgICAgICAgICAgICAgICBlID0gcDtcbiAgICAgICAgICAgICAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHBTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHE7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBxU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0YWlsKSB0YWlsLm5leHRaID0gZTtcbiAgICAgICAgICAgICAgICBlbHNlIGxpc3QgPSBlO1xuXG4gICAgICAgICAgICAgICAgZS5wcmV2WiA9IHRhaWw7XG4gICAgICAgICAgICAgICAgdGFpbCA9IGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHAgPSBxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFpbC5uZXh0WiA9IG51bGw7XG4gICAgICAgIGluU2l6ZSAqPSAyO1xuXG4gICAgfSB3aGlsZSAobnVtTWVyZ2VzID4gMSk7XG5cbiAgICByZXR1cm4gbGlzdDtcbn1cblxuLy8gei1vcmRlciBvZiBhIHBvaW50IGdpdmVuIGNvb3JkcyBhbmQgc2l6ZSBvZiB0aGUgZGF0YSBib3VuZGluZyBib3hcbmZ1bmN0aW9uIHpPcmRlcih4LCB5LCBtaW5YLCBtaW5ZLCBzaXplKSB7XG4gICAgLy8gY29vcmRzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIG5vbi1uZWdhdGl2ZSAxNS1iaXQgaW50ZWdlciByYW5nZVxuICAgIHggPSAzMjc2NyAqICh4IC0gbWluWCkgLyBzaXplO1xuICAgIHkgPSAzMjc2NyAqICh5IC0gbWluWSkgLyBzaXplO1xuXG4gICAgeCA9ICh4IHwgKHggPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB4ID0gKHggfCAoeCA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHggPSAoeCB8ICh4IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeCA9ICh4IHwgKHggPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHkgPSAoeSB8ICh5IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gICAgeSA9ICh5IHwgKHkgPDwgNCkpICYgMHgwRjBGMEYwRjtcbiAgICB5ID0gKHkgfCAoeSA8PCAyKSkgJiAweDMzMzMzMzMzO1xuICAgIHkgPSAoeSB8ICh5IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgICByZXR1cm4geCB8ICh5IDw8IDEpO1xufVxuXG4vLyBmaW5kIHRoZSBsZWZ0bW9zdCBub2RlIG9mIGEgcG9seWdvbiByaW5nXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdChzdGFydCkge1xuICAgIHZhciBwID0gc3RhcnQsXG4gICAgICAgIGxlZnRtb3N0ID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC54IDwgbGVmdG1vc3QueCkgbGVmdG1vc3QgPSBwO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHJldHVybiBsZWZ0bW9zdDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZVxuZnVuY3Rpb24gcG9pbnRJblRyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSkge1xuICAgIHJldHVybiAoY3ggLSBweCkgKiAoYXkgLSBweSkgLSAoYXggLSBweCkgKiAoY3kgLSBweSkgPj0gMCAmJlxuICAgICAgICAgICAoYXggLSBweCkgKiAoYnkgLSBweSkgLSAoYnggLSBweCkgKiAoYXkgLSBweSkgPj0gMCAmJlxuICAgICAgICAgICAoYnggLSBweCkgKiAoY3kgLSBweSkgLSAoY3ggLSBweCkgKiAoYnkgLSBweSkgPj0gMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBkaWFnb25hbCBiZXR3ZWVuIHR3byBwb2x5Z29uIG5vZGVzIGlzIHZhbGlkIChsaWVzIGluIHBvbHlnb24gaW50ZXJpb3IpXG5mdW5jdGlvbiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikge1xuICAgIHJldHVybiBhLm5leHQuaSAhPT0gYi5pICYmIGEucHJldi5pICE9PSBiLmkgJiYgIWludGVyc2VjdHNQb2x5Z29uKGEsIGIpICYmXG4gICAgICAgICAgIGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSAmJiBtaWRkbGVJbnNpZGUoYSwgYik7XG59XG5cbi8vIHNpZ25lZCBhcmVhIG9mIGEgdHJpYW5nbGVcbmZ1bmN0aW9uIGFyZWEocCwgcSwgcikge1xuICAgIHJldHVybiAocS55IC0gcC55KSAqIChyLnggLSBxLngpIC0gKHEueCAtIHAueCkgKiAoci55IC0gcS55KTtcbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcbmZ1bmN0aW9uIGVxdWFscyhwMSwgcDIpIHtcbiAgICByZXR1cm4gcDEueCA9PT0gcDIueCAmJiBwMS55ID09PSBwMi55O1xufVxuXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XG5mdW5jdGlvbiBpbnRlcnNlY3RzKHAxLCBxMSwgcDIsIHEyKSB7XG4gICAgaWYgKChlcXVhbHMocDEsIHExKSAmJiBlcXVhbHMocDIsIHEyKSkgfHxcbiAgICAgICAgKGVxdWFscyhwMSwgcTIpICYmIGVxdWFscyhwMiwgcTEpKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGFyZWEocDEsIHExLCBwMikgPiAwICE9PSBhcmVhKHAxLCBxMSwgcTIpID4gMCAmJlxuICAgICAgICAgICBhcmVhKHAyLCBxMiwgcDEpID4gMCAhPT0gYXJlYShwMiwgcTIsIHExKSA+IDA7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzXG5mdW5jdGlvbiBpbnRlcnNlY3RzUG9seWdvbihhLCBiKSB7XG4gICAgdmFyIHAgPSBhO1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJlxuICAgICAgICAgICAgICAgIGludGVyc2VjdHMocCwgcC5uZXh0LCBhLCBiKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpcyBsb2NhbGx5IGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbG9jYWxseUluc2lkZShhLCBiKSB7XG4gICAgcmV0dXJuIGFyZWEoYS5wcmV2LCBhLCBhLm5leHQpIDwgMCA/XG4gICAgICAgIGFyZWEoYSwgYiwgYS5uZXh0KSA+PSAwICYmIGFyZWEoYSwgYS5wcmV2LCBiKSA+PSAwIDpcbiAgICAgICAgYXJlYShhLCBiLCBhLnByZXYpIDwgMCB8fCBhcmVhKGEsIGEubmV4dCwgYikgPCAwO1xufVxuXG4vLyBjaGVjayBpZiB0aGUgbWlkZGxlIHBvaW50IG9mIGEgcG9seWdvbiBkaWFnb25hbCBpcyBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIG1pZGRsZUluc2lkZShhLCBiKSB7XG4gICAgdmFyIHAgPSBhLFxuICAgICAgICBpbnNpZGUgPSBmYWxzZSxcbiAgICAgICAgcHggPSAoYS54ICsgYi54KSAvIDIsXG4gICAgICAgIHB5ID0gKGEueSArIGIueSkgLyAyO1xuICAgIGRvIHtcbiAgICAgICAgaWYgKCgocC55ID4gcHkpICE9PSAocC5uZXh0LnkgPiBweSkpICYmIChweCA8IChwLm5leHQueCAtIHAueCkgKiAocHkgLSBwLnkpIC8gKHAubmV4dC55IC0gcC55KSArIHAueCkpXG4gICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xuXG4gICAgcmV0dXJuIGluc2lkZTtcbn1cblxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXG5mdW5jdGlvbiBzcGxpdFBvbHlnb24oYSwgYikge1xuICAgIHZhciBhMiA9IG5ldyBOb2RlKGEuaSwgYS54LCBhLnkpLFxuICAgICAgICBiMiA9IG5ldyBOb2RlKGIuaSwgYi54LCBiLnkpLFxuICAgICAgICBhbiA9IGEubmV4dCxcbiAgICAgICAgYnAgPSBiLnByZXY7XG5cbiAgICBhLm5leHQgPSBiO1xuICAgIGIucHJldiA9IGE7XG5cbiAgICBhMi5uZXh0ID0gYW47XG4gICAgYW4ucHJldiA9IGEyO1xuXG4gICAgYjIubmV4dCA9IGEyO1xuICAgIGEyLnByZXYgPSBiMjtcblxuICAgIGJwLm5leHQgPSBiMjtcbiAgICBiMi5wcmV2ID0gYnA7XG5cbiAgICByZXR1cm4gYjI7XG59XG5cbi8vIGNyZWF0ZSBhIG5vZGUgYW5kIG9wdGlvbmFsbHkgbGluayBpdCB3aXRoIHByZXZpb3VzIG9uZSAoaW4gYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBpbnNlcnROb2RlKGksIHgsIHksIGxhc3QpIHtcbiAgICB2YXIgcCA9IG5ldyBOb2RlKGksIHgsIHkpO1xuXG4gICAgaWYgKCFsYXN0KSB7XG4gICAgICAgIHAucHJldiA9IHA7XG4gICAgICAgIHAubmV4dCA9IHA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBwLm5leHQgPSBsYXN0Lm5leHQ7XG4gICAgICAgIHAucHJldiA9IGxhc3Q7XG4gICAgICAgIGxhc3QubmV4dC5wcmV2ID0gcDtcbiAgICAgICAgbGFzdC5uZXh0ID0gcDtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUocCkge1xuICAgIHAubmV4dC5wcmV2ID0gcC5wcmV2O1xuICAgIHAucHJldi5uZXh0ID0gcC5uZXh0O1xuXG4gICAgaWYgKHAucHJldlopIHAucHJldloubmV4dFogPSBwLm5leHRaO1xuICAgIGlmIChwLm5leHRaKSBwLm5leHRaLnByZXZaID0gcC5wcmV2Wjtcbn1cblxuZnVuY3Rpb24gTm9kZShpLCB4LCB5KSB7XG4gICAgLy8gdmVydGljZSBpbmRleCBpbiBjb29yZGluYXRlcyBhcnJheVxuICAgIHRoaXMuaSA9IGk7XG5cbiAgICAvLyB2ZXJ0ZXggY29vcmRpbmF0ZXNcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG5cbiAgICAvLyBwcmV2aW91cyBhbmQgbmV4dCB2ZXJ0aWNlIG5vZGVzIGluIGEgcG9seWdvbiByaW5nXG4gICAgdGhpcy5wcmV2ID0gbnVsbDtcbiAgICB0aGlzLm5leHQgPSBudWxsO1xuXG4gICAgLy8gei1vcmRlciBjdXJ2ZSB2YWx1ZVxuICAgIHRoaXMueiA9IG51bGw7XG5cbiAgICAvLyBwcmV2aW91cyBhbmQgbmV4dCBub2RlcyBpbiB6LW9yZGVyXG4gICAgdGhpcy5wcmV2WiA9IG51bGw7XG4gICAgdGhpcy5uZXh0WiA9IG51bGw7XG5cbiAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgc3RlaW5lciBwb2ludFxuICAgIHRoaXMuc3RlaW5lciA9IGZhbHNlO1xufVxuXG4vLyByZXR1cm4gYSBwZXJjZW50YWdlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcG9seWdvbiBhcmVhIGFuZCBpdHMgdHJpYW5ndWxhdGlvbiBhcmVhO1xuLy8gdXNlZCB0byB2ZXJpZnkgY29ycmVjdG5lc3Mgb2YgdHJpYW5ndWxhdGlvblxuZWFyY3V0LmRldmlhdGlvbiA9IGZ1bmN0aW9uIChkYXRhLCBob2xlSW5kaWNlcywgZGltLCB0cmlhbmdsZXMpIHtcbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGg7XG4gICAgdmFyIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuXG4gICAgdmFyIHBvbHlnb25BcmVhID0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCAwLCBvdXRlckxlbiwgZGltKSk7XG4gICAgaWYgKGhhc0hvbGVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XG4gICAgICAgICAgICB2YXIgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHBvbHlnb25BcmVhIC09IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdHJpYW5nbGVzQXJlYSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB2YXIgYSA9IHRyaWFuZ2xlc1tpXSAqIGRpbTtcbiAgICAgICAgdmFyIGIgPSB0cmlhbmdsZXNbaSArIDFdICogZGltO1xuICAgICAgICB2YXIgYyA9IHRyaWFuZ2xlc1tpICsgMl0gKiBkaW07XG4gICAgICAgIHRyaWFuZ2xlc0FyZWEgKz0gTWF0aC5hYnMoXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbY10pICogKGRhdGFbYiArIDFdIC0gZGF0YVthICsgMV0pIC1cbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtiXSkgKiAoZGF0YVtjICsgMV0gLSBkYXRhW2EgKyAxXSkpO1xuICAgIH1cblxuICAgIHJldHVybiBwb2x5Z29uQXJlYSA9PT0gMCAmJiB0cmlhbmdsZXNBcmVhID09PSAwID8gMCA6XG4gICAgICAgIE1hdGguYWJzKCh0cmlhbmdsZXNBcmVhIC0gcG9seWdvbkFyZWEpIC8gcG9seWdvbkFyZWEpO1xufTtcblxuZnVuY3Rpb24gc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pIHtcbiAgICB2YXIgc3VtID0gMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQsIGogPSBlbmQgLSBkaW07IGkgPCBlbmQ7IGkgKz0gZGltKSB7XG4gICAgICAgIHN1bSArPSAoZGF0YVtqXSAtIGRhdGFbaV0pICogKGRhdGFbaSArIDFdICsgZGF0YVtqICsgMV0pO1xuICAgICAgICBqID0gaTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn1cblxuLy8gdHVybiBhIHBvbHlnb24gaW4gYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBmb3JtIChlLmcuIGFzIGluIEdlb0pTT04pIGludG8gYSBmb3JtIEVhcmN1dCBhY2NlcHRzXG5lYXJjdXQuZmxhdHRlbiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIGRpbSA9IGRhdGFbMF1bMF0ubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSB7dmVydGljZXM6IFtdLCBob2xlczogW10sIGRpbWVuc2lvbnM6IGRpbX0sXG4gICAgICAgIGhvbGVJbmRleCA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkYXRhW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8IGRpbTsgZCsrKSByZXN1bHQudmVydGljZXMucHVzaChkYXRhW2ldW2pdW2RdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGhvbGVJbmRleCArPSBkYXRhW2kgLSAxXS5sZW5ndGg7XG4gICAgICAgICAgICByZXN1bHQuaG9sZXMucHVzaChob2xlSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG5FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbihuKSB7XG4gIGlmICghaXNOdW1iZXIobikgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCduIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBlciwgaGFuZGxlciwgbGVuLCBhcmdzLCBpLCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAodHlwZSA9PT0gJ2Vycm9yJykge1xuICAgIGlmICghdGhpcy5fZXZlbnRzLmVycm9yIHx8XG4gICAgICAgIChpc09iamVjdCh0aGlzLl9ldmVudHMuZXJyb3IpICYmICF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSkge1xuICAgICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG4gICAgICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc1VuZGVmaW5lZChoYW5kbGVyKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIGZhc3QgY2FzZXNcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIHNsb3dlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGhhbmRsZXIpKSB7XG4gICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgbGlzdGVuZXJzID0gaGFuZGxlci5zbGljZSgpO1xuICAgIGxlbiA9IGxpc3RlbmVycy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG07XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgaWYgKHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lcilcbiAgICB0aGlzLmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbihsaXN0ZW5lci5saXN0ZW5lcikgP1xuICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgZWxzZSBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlXG4gICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gW3RoaXMuX2V2ZW50c1t0eXBlXSwgbGlzdGVuZXJdO1xuXG4gIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pICYmICF0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkKSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9tYXhMaXN0ZW5lcnMpKSB7XG4gICAgICBtID0gdGhpcy5fbWF4TGlzdGVuZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gICAgfVxuXG4gICAgaWYgKG0gJiYgbSA+IDAgJiYgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCA+IG0pIHtcbiAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgJyArXG4gICAgICAgICAgICAgICAgICAgICdsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUudHJhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBpbiBJRSAxMFxuICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIHZhciBmaXJlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGcoKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcblxuICAgIGlmICghZmlyZWQpIHtcbiAgICAgIGZpcmVkID0gdHJ1ZTtcbiAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgZy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB0aGlzLm9uKHR5cGUsIGcpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWRcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbGlzdCwgcG9zaXRpb24sIGxlbmd0aCwgaTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXR1cm4gdGhpcztcblxuICBsaXN0ID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuICBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgcG9zaXRpb24gPSAtMTtcblxuICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHxcbiAgICAgIChpc0Z1bmN0aW9uKGxpc3QubGlzdGVuZXIpICYmIGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgfSBlbHNlIGlmIChpc09iamVjdChsaXN0KSkge1xuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tID4gMDspIHtcbiAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fFxuICAgICAgICAgIChsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgbGlzdC5sZW5ndGggPSAwO1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdC5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGtleSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgaWYgKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIGVsc2UgaWYgKHRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGtleSBpbiB0aGlzLl9ldmVudHMpIHtcbiAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXJzKSkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAvLyBMSUZPIG9yZGVyXG4gICAgd2hpbGUgKGxpc3RlbmVycy5sZW5ndGgpXG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuICB9XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIHJldDtcbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXQgPSBbXTtcbiAgZWxzZSBpZiAoaXNGdW5jdGlvbih0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIHJldCA9IFt0aGlzLl9ldmVudHNbdHlwZV1dO1xuICBlbHNlXG4gICAgcmV0ID0gdGhpcy5fZXZlbnRzW3R5cGVdLnNsaWNlKCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIGlmICh0aGlzLl9ldmVudHMpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICAgIGlmIChpc0Z1bmN0aW9uKGV2bGlzdGVuZXIpKVxuICAgICAgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoZXZsaXN0ZW5lcilcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xufTtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuIiwiKGZ1bmN0aW9uKCl7dmFyIGs9ISFkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyO2Z1bmN0aW9uIGwoYSxiKXtrP2EuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLGIsITEpOmEuYXR0YWNoRXZlbnQoXCJzY3JvbGxcIixiKX1mdW5jdGlvbiB2KGEpe2RvY3VtZW50LmJvZHk/YSgpOms/ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIixhKTpkb2N1bWVudC5hdHRhY2hFdmVudChcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiLGZ1bmN0aW9uKCl7XCJpbnRlcmFjdGl2ZVwiIT1kb2N1bWVudC5yZWFkeVN0YXRlJiZcImNvbXBsZXRlXCIhPWRvY3VtZW50LnJlYWR5U3RhdGV8fGEoKX0pfTtmdW5jdGlvbiB3KGEpe3RoaXMuYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3RoaXMuYS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKTt0aGlzLmEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYSkpO3RoaXMuYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt0aGlzLmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7dGhpcy5oPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt0aGlzLmc9LTE7dGhpcy5iLnN0eWxlLmNzc1RleHQ9XCJtYXgtd2lkdGg6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO292ZXJmbG93OnNjcm9sbDtmb250LXNpemU6MTZweDtcIjt0aGlzLmMuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6c2Nyb2xsO2ZvbnQtc2l6ZToxNnB4O1wiO1xudGhpcy5mLnN0eWxlLmNzc1RleHQ9XCJtYXgtd2lkdGg6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO292ZXJmbG93OnNjcm9sbDtmb250LXNpemU6MTZweDtcIjt0aGlzLmguc3R5bGUuY3NzVGV4dD1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjIwMCU7aGVpZ2h0OjIwMCU7Zm9udC1zaXplOjE2cHg7bWF4LXdpZHRoOm5vbmU7XCI7dGhpcy5iLmFwcGVuZENoaWxkKHRoaXMuaCk7dGhpcy5jLmFwcGVuZENoaWxkKHRoaXMuZik7dGhpcy5hLmFwcGVuZENoaWxkKHRoaXMuYik7dGhpcy5hLmFwcGVuZENoaWxkKHRoaXMuYyl9XG5mdW5jdGlvbiB5KGEsYil7YS5hLnN0eWxlLmNzc1RleHQ9XCJtYXgtd2lkdGg6bm9uZTttaW4td2lkdGg6MjBweDttaW4taGVpZ2h0OjIwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOmF1dG87bWFyZ2luOjA7cGFkZGluZzowO3RvcDotOTk5cHg7bGVmdDotOTk5cHg7d2hpdGUtc3BhY2U6bm93cmFwO2ZvbnQ6XCIrYitcIjtcIn1mdW5jdGlvbiB6KGEpe3ZhciBiPWEuYS5vZmZzZXRXaWR0aCxjPWIrMTAwO2EuZi5zdHlsZS53aWR0aD1jK1wicHhcIjthLmMuc2Nyb2xsTGVmdD1jO2EuYi5zY3JvbGxMZWZ0PWEuYi5zY3JvbGxXaWR0aCsxMDA7cmV0dXJuIGEuZyE9PWI/KGEuZz1iLCEwKTohMX1mdW5jdGlvbiBBKGEsYil7ZnVuY3Rpb24gYygpe3ZhciBhPW07eihhKSYmbnVsbCE9PWEuYS5wYXJlbnROb2RlJiZiKGEuZyl9dmFyIG09YTtsKGEuYixjKTtsKGEuYyxjKTt6KGEpfTtmdW5jdGlvbiBCKGEsYil7dmFyIGM9Ynx8e307dGhpcy5mYW1pbHk9YTt0aGlzLnN0eWxlPWMuc3R5bGV8fFwibm9ybWFsXCI7dGhpcy53ZWlnaHQ9Yy53ZWlnaHR8fFwibm9ybWFsXCI7dGhpcy5zdHJldGNoPWMuc3RyZXRjaHx8XCJub3JtYWxcIn12YXIgQz1udWxsLEQ9bnVsbCxIPSEhd2luZG93LkZvbnRGYWNlO2Z1bmN0aW9uIEkoKXtpZihudWxsPT09RCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0cnl7YS5zdHlsZS5mb250PVwiY29uZGVuc2VkIDEwMHB4IHNhbnMtc2VyaWZcIn1jYXRjaChiKXt9RD1cIlwiIT09YS5zdHlsZS5mb250fXJldHVybiBEfWZ1bmN0aW9uIEooYSxiKXtyZXR1cm5bYS5zdHlsZSxhLndlaWdodCxJKCk/YS5zdHJldGNoOlwiXCIsXCIxMDBweFwiLGJdLmpvaW4oXCIgXCIpfVxuQi5wcm90b3R5cGUubG9hZD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsbT1hfHxcIkJFU2Jzd3lcIix4PWJ8fDNFMyxFPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihhLGIpe2lmKEgpe3ZhciBLPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZSgpeyhuZXcgRGF0ZSkuZ2V0VGltZSgpLUU+PXg/YigpOmRvY3VtZW50LmZvbnRzLmxvYWQoSihjLGMuZmFtaWx5KSxtKS50aGVuKGZ1bmN0aW9uKGMpezE8PWMubGVuZ3RoP2EoKTpzZXRUaW1lb3V0KGUsMjUpfSxmdW5jdGlvbigpe2IoKX0pfWUoKX0pLEw9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxjKXtzZXRUaW1lb3V0KGMseCl9KTtQcm9taXNlLnJhY2UoW0wsS10pLnRoZW4oZnVuY3Rpb24oKXthKGMpfSxmdW5jdGlvbigpe2IoYyl9KX1lbHNlIHYoZnVuY3Rpb24oKXtmdW5jdGlvbiBxKCl7dmFyIGI7aWYoYj0tMSE9ZiYmLTEhPWd8fC0xIT1mJiYtMSE9aHx8LTEhPWcmJi0xIT1cbmgpKGI9ZiE9ZyYmZiE9aCYmZyE9aCl8fChudWxsPT09QyYmKGI9L0FwcGxlV2ViS2l0XFwvKFswLTldKykoPzpcXC4oWzAtOV0rKSkvLmV4ZWMod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpLEM9ISFiJiYoNTM2PnBhcnNlSW50KGJbMV0sMTApfHw1MzY9PT1wYXJzZUludChiWzFdLDEwKSYmMTE+PXBhcnNlSW50KGJbMl0sMTApKSksYj1DJiYoZj09ciYmZz09ciYmaD09cnx8Zj09dCYmZz09dCYmaD09dHx8Zj09dSYmZz09dSYmaD09dSkpLGI9IWI7YiYmKG51bGwhPT1kLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSxjbGVhclRpbWVvdXQoRyksYShjKSl9ZnVuY3Rpb24gRigpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLUU+PXgpbnVsbCE9PWQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpLGIoYyk7ZWxzZXt2YXIgYT1kb2N1bWVudC5oaWRkZW47aWYoITA9PT1hfHx2b2lkIDA9PT1hKWY9ZS5hLm9mZnNldFdpZHRoLGc9bi5hLm9mZnNldFdpZHRoLFxuaD1wLmEub2Zmc2V0V2lkdGgscSgpO0c9c2V0VGltZW91dChGLDUwKX19dmFyIGU9bmV3IHcobSksbj1uZXcgdyhtKSxwPW5ldyB3KG0pLGY9LTEsZz0tMSxoPS0xLHI9LTEsdD0tMSx1PS0xLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxHPTA7ZC5kaXI9XCJsdHJcIjt5KGUsSihjLFwic2Fucy1zZXJpZlwiKSk7eShuLEooYyxcInNlcmlmXCIpKTt5KHAsSihjLFwibW9ub3NwYWNlXCIpKTtkLmFwcGVuZENoaWxkKGUuYSk7ZC5hcHBlbmRDaGlsZChuLmEpO2QuYXBwZW5kQ2hpbGQocC5hKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3I9ZS5hLm9mZnNldFdpZHRoO3Q9bi5hLm9mZnNldFdpZHRoO3U9cC5hLm9mZnNldFdpZHRoO0YoKTtBKGUsZnVuY3Rpb24oYSl7Zj1hO3EoKX0pO3koZSxKKGMsJ1wiJytjLmZhbWlseSsnXCIsc2Fucy1zZXJpZicpKTtBKG4sZnVuY3Rpb24oYSl7Zz1hO3EoKX0pO3kobixKKGMsJ1wiJytjLmZhbWlseSsnXCIsc2VyaWYnKSk7QShwLGZ1bmN0aW9uKGEpe2g9XG5hO3EoKX0pO3kocCxKKGMsJ1wiJytjLmZhbWlseSsnXCIsbW9ub3NwYWNlJykpfSl9KX07d2luZG93LkZvbnRGYWNlT2JzZXJ2ZXI9Qjt3aW5kb3cuRm9udEZhY2VPYnNlcnZlci5wcm90b3R5cGUuY2hlY2s9d2luZG93LkZvbnRGYWNlT2JzZXJ2ZXIucHJvdG90eXBlLmxvYWQ9Qi5wcm90b3R5cGUubG9hZDtcInVuZGVmaW5lZFwiIT09dHlwZW9mIG1vZHVsZSYmKG1vZHVsZS5leHBvcnRzPXdpbmRvdy5Gb250RmFjZU9ic2VydmVyKTt9KCkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsaXA7XG5cbi8qIGNsaXAgZmVhdHVyZXMgYmV0d2VlbiB0d28gYXhpcy1wYXJhbGxlbCBsaW5lczpcbiAqICAgICB8ICAgICAgICB8XG4gKiAgX19ffF9fXyAgICAgfCAgICAgL1xuICogLyAgIHwgICBcXF9fX198X19fXy9cbiAqICAgICB8ICAgICAgICB8XG4gKi9cblxuZnVuY3Rpb24gY2xpcChmZWF0dXJlcywgc2NhbGUsIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCBtaW5BbGwsIG1heEFsbCkge1xuXG4gICAgazEgLz0gc2NhbGU7XG4gICAgazIgLz0gc2NhbGU7XG5cbiAgICBpZiAobWluQWxsID49IGsxICYmIG1heEFsbCA8PSBrMikgcmV0dXJuIGZlYXR1cmVzOyAvLyB0cml2aWFsIGFjY2VwdFxuICAgIGVsc2UgaWYgKG1pbkFsbCA+IGsyIHx8IG1heEFsbCA8IGsxKSByZXR1cm4gbnVsbDsgLy8gdHJpdmlhbCByZWplY3RcblxuICAgIHZhciBjbGlwcGVkID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGUsXG4gICAgICAgICAgICBtaW4sIG1heDtcblxuICAgICAgICBtaW4gPSBmZWF0dXJlLm1pbltheGlzXTtcbiAgICAgICAgbWF4ID0gZmVhdHVyZS5tYXhbYXhpc107XG5cbiAgICAgICAgaWYgKG1pbiA+PSBrMSAmJiBtYXggPD0gazIpIHsgLy8gdHJpdmlhbCBhY2NlcHRcbiAgICAgICAgICAgIGNsaXBwZWQucHVzaChmZWF0dXJlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+IGsyIHx8IG1heCA8IGsxKSBjb250aW51ZTsgLy8gdHJpdmlhbCByZWplY3RcblxuICAgICAgICB2YXIgc2xpY2VzID0gdHlwZSA9PT0gMSA/XG4gICAgICAgICAgICAgICAgY2xpcFBvaW50cyhnZW9tZXRyeSwgazEsIGsyLCBheGlzKSA6XG4gICAgICAgICAgICAgICAgY2xpcEdlb21ldHJ5KGdlb21ldHJ5LCBrMSwgazIsIGF4aXMsIGludGVyc2VjdCwgdHlwZSA9PT0gMyk7XG5cbiAgICAgICAgaWYgKHNsaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGlmIGEgZmVhdHVyZSBnb3QgY2xpcHBlZCwgaXQgd2lsbCBsaWtlbHkgZ2V0IGNsaXBwZWQgb24gdGhlIG5leHQgem9vbSBsZXZlbCBhcyB3ZWxsLFxuICAgICAgICAgICAgLy8gc28gdGhlcmUncyBubyBuZWVkIHRvIHJlY2FsY3VsYXRlIGJib3hlc1xuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogc2xpY2VzLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgdGFnczogZmVhdHVyZXNbaV0udGFncyB8fCBudWxsLFxuICAgICAgICAgICAgICAgIG1pbjogZmVhdHVyZS5taW4sXG4gICAgICAgICAgICAgICAgbWF4OiBmZWF0dXJlLm1heFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xpcHBlZC5sZW5ndGggPyBjbGlwcGVkIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gY2xpcFBvaW50cyhnZW9tZXRyeSwgazEsIGsyLCBheGlzKSB7XG4gICAgdmFyIHNsaWNlID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBhID0gZ2VvbWV0cnlbaV0sXG4gICAgICAgICAgICBhayA9IGFbYXhpc107XG5cbiAgICAgICAgaWYgKGFrID49IGsxICYmIGFrIDw9IGsyKSBzbGljZS5wdXNoKGEpO1xuICAgIH1cbiAgICByZXR1cm4gc2xpY2U7XG59XG5cbmZ1bmN0aW9uIGNsaXBHZW9tZXRyeShnZW9tZXRyeSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIGNsb3NlZCkge1xuXG4gICAgdmFyIHNsaWNlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tZXRyeS5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIHZhciBhayA9IDAsXG4gICAgICAgICAgICBiayA9IDAsXG4gICAgICAgICAgICBiID0gbnVsbCxcbiAgICAgICAgICAgIHBvaW50cyA9IGdlb21ldHJ5W2ldLFxuICAgICAgICAgICAgYXJlYSA9IHBvaW50cy5hcmVhLFxuICAgICAgICAgICAgZGlzdCA9IHBvaW50cy5kaXN0LFxuICAgICAgICAgICAgbGVuID0gcG9pbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGEsIGosIGxhc3Q7XG5cbiAgICAgICAgdmFyIHNsaWNlID0gW107XG5cbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbiAtIDE7IGorKykge1xuICAgICAgICAgICAgYSA9IGIgfHwgcG9pbnRzW2pdO1xuICAgICAgICAgICAgYiA9IHBvaW50c1tqICsgMV07XG4gICAgICAgICAgICBhayA9IGJrIHx8IGFbYXhpc107XG4gICAgICAgICAgICBiayA9IGJbYXhpc107XG5cbiAgICAgICAgICAgIGlmIChhayA8IGsxKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGJrID4gazIpKSB7IC8vIC0tLXwtLS0tLXwtLT5cbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazEpLCBpbnRlcnNlY3QoYSwgYiwgazIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJrID49IGsxKSBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSkpOyAvLyAtLS18LS0+ICB8XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWsgPiBrMikge1xuXG4gICAgICAgICAgICAgICAgaWYgKChiayA8IGsxKSkgeyAvLyA8LS18LS0tLS18LS0tXG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSwgaW50ZXJzZWN0KGEsIGIsIGsxKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiayA8PSBrMikgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazIpKTsgLy8gfCAgPC0tfC0tLVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgc2xpY2UucHVzaChhKTtcblxuICAgICAgICAgICAgICAgIGlmIChiayA8IGsxKSB7IC8vIDwtLXwtLS0gIHxcbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazEpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJrID4gazIpIHsgLy8gfCAgLS0tfC0tPlxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gfCAtLT4gfFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIHRoZSBsYXN0IHBvaW50XG4gICAgICAgIGEgPSBwb2ludHNbbGVuIC0gMV07XG4gICAgICAgIGFrID0gYVtheGlzXTtcbiAgICAgICAgaWYgKGFrID49IGsxICYmIGFrIDw9IGsyKSBzbGljZS5wdXNoKGEpO1xuXG4gICAgICAgIC8vIGNsb3NlIHRoZSBwb2x5Z29uIGlmIGl0cyBlbmRwb2ludHMgYXJlIG5vdCB0aGUgc2FtZSBhZnRlciBjbGlwcGluZ1xuXG4gICAgICAgIGxhc3QgPSBzbGljZVtzbGljZS5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKGNsb3NlZCAmJiBsYXN0ICYmIChzbGljZVswXVswXSAhPT0gbGFzdFswXSB8fCBzbGljZVswXVsxXSAhPT0gbGFzdFsxXSkpIHNsaWNlLnB1c2goc2xpY2VbMF0pO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgZmluYWwgc2xpY2VcbiAgICAgICAgbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNsaWNlcztcbn1cblxuZnVuY3Rpb24gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCkge1xuICAgIGlmIChzbGljZS5sZW5ndGgpIHtcbiAgICAgICAgLy8gd2UgZG9uJ3QgcmVjYWxjdWxhdGUgdGhlIGFyZWEvbGVuZ3RoIG9mIHRoZSB1bmNsaXBwZWQgZ2VvbWV0cnkgYmVjYXVzZSB0aGUgY2FzZSB3aGVyZSBpdCBnb2VzXG4gICAgICAgIC8vIGJlbG93IHRoZSB2aXNpYmlsaXR5IHRocmVzaG9sZCBhcyBhIHJlc3VsdCBvZiBjbGlwcGluZyBpcyByYXJlLCBzbyB3ZSBhdm9pZCBkb2luZyB1bm5lY2Vzc2FyeSB3b3JrXG4gICAgICAgIHNsaWNlLmFyZWEgPSBhcmVhO1xuICAgICAgICBzbGljZS5kaXN0ID0gZGlzdDtcblxuICAgICAgICBzbGljZXMucHVzaChzbGljZSk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0O1xuXG52YXIgc2ltcGxpZnkgPSByZXF1aXJlKCcuL3NpbXBsaWZ5Jyk7XG5cbi8vIGNvbnZlcnRzIEdlb0pTT04gZmVhdHVyZSBpbnRvIGFuIGludGVybWVkaWF0ZSBwcm9qZWN0ZWQgSlNPTiB2ZWN0b3IgZm9ybWF0IHdpdGggc2ltcGxpZmljYXRpb24gZGF0YVxuXG5mdW5jdGlvbiBjb252ZXJ0KGRhdGEsIHRvbGVyYW5jZSkge1xuICAgIHZhciBmZWF0dXJlcyA9IFtdO1xuXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLmZlYXR1cmVzW2ldLCB0b2xlcmFuY2UpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YSwgdG9sZXJhbmNlKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNpbmdsZSBnZW9tZXRyeSBvciBhIGdlb21ldHJ5IGNvbGxlY3Rpb25cbiAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIHtnZW9tZXRyeTogZGF0YX0sIHRvbGVyYW5jZSk7XG4gICAgfVxuICAgIHJldHVybiBmZWF0dXJlcztcbn1cblxuZnVuY3Rpb24gY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGZlYXR1cmUsIHRvbGVyYW5jZSkge1xuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgdHlwZSA9IGdlb20udHlwZSxcbiAgICAgICAgY29vcmRzID0gZ2VvbS5jb29yZGluYXRlcyxcbiAgICAgICAgdGFncyA9IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgaSwgaiwgcmluZ3M7XG5cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAxLCBbcHJvamVjdFBvaW50KGNvb3JkcyldKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAxLCBwcm9qZWN0KGNvb3JkcykpKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDIsIFtwcm9qZWN0KGNvb3JkcywgdG9sZXJhbmNlKV0pKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIHJpbmdzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJpbmdzLnB1c2gocHJvamVjdChjb29yZHNbaV0sIHRvbGVyYW5jZSkpO1xuICAgICAgICB9XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIHR5cGUgPT09ICdQb2x5Z29uJyA/IDMgOiAyLCByaW5ncykpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICByaW5ncyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgcmluZ3MucHVzaChwcm9qZWN0KGNvb3Jkc1tpXVtqXSwgdG9sZXJhbmNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMywgcmluZ3MpKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0dlb21ldHJ5Q29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20uZ2VvbWV0cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogZ2VvbS5nZW9tZXRyaWVzW2ldLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHRhZ3NcbiAgICAgICAgICAgIH0sIHRvbGVyYW5jZSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC4nKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZSh0YWdzLCB0eXBlLCBnZW9tZXRyeSkge1xuICAgIHZhciBmZWF0dXJlID0ge1xuICAgICAgICBnZW9tZXRyeTogZ2VvbWV0cnksXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHRhZ3M6IHRhZ3MgfHwgbnVsbCxcbiAgICAgICAgbWluOiBbMiwgMV0sIC8vIGluaXRpYWwgYmJveCB2YWx1ZXM7XG4gICAgICAgIG1heDogWy0xLCAwXSAgLy8gbm90ZSB0aGF0IGNvb3JkcyBhcmUgdXN1YWxseSBpbiBbMC4uMV0gcmFuZ2VcbiAgICB9O1xuICAgIGNhbGNCQm94KGZlYXR1cmUpO1xuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0KGxvbmxhdHMsIHRvbGVyYW5jZSkge1xuICAgIHZhciBwcm9qZWN0ZWQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmxhdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcHJvamVjdGVkLnB1c2gocHJvamVjdFBvaW50KGxvbmxhdHNbaV0pKTtcbiAgICB9XG4gICAgaWYgKHRvbGVyYW5jZSkge1xuICAgICAgICBzaW1wbGlmeShwcm9qZWN0ZWQsIHRvbGVyYW5jZSk7XG4gICAgICAgIGNhbGNTaXplKHByb2plY3RlZCk7XG4gICAgfVxuICAgIHJldHVybiBwcm9qZWN0ZWQ7XG59XG5cbmZ1bmN0aW9uIHByb2plY3RQb2ludChwKSB7XG4gICAgdmFyIHNpbiA9IE1hdGguc2luKHBbMV0gKiBNYXRoLlBJIC8gMTgwKSxcbiAgICAgICAgeCA9IChwWzBdIC8gMzYwICsgMC41KSxcbiAgICAgICAgeSA9ICgwLjUgLSAwLjI1ICogTWF0aC5sb2coKDEgKyBzaW4pIC8gKDEgLSBzaW4pKSAvIE1hdGguUEkpO1xuXG4gICAgeSA9IHkgPCAtMSA/IC0xIDpcbiAgICAgICAgeSA+IDEgPyAxIDogeTtcblxuICAgIHJldHVybiBbeCwgeSwgMF07XG59XG5cbi8vIGNhbGN1bGF0ZSBhcmVhIGFuZCBsZW5ndGggb2YgdGhlIHBvbHlcbmZ1bmN0aW9uIGNhbGNTaXplKHBvaW50cykge1xuICAgIHZhciBhcmVhID0gMCxcbiAgICAgICAgZGlzdCA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgYSwgYjsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgYSA9IGIgfHwgcG9pbnRzW2ldO1xuICAgICAgICBiID0gcG9pbnRzW2kgKyAxXTtcblxuICAgICAgICBhcmVhICs9IGFbMF0gKiBiWzFdIC0gYlswXSAqIGFbMV07XG5cbiAgICAgICAgLy8gdXNlIE1hbmhhdHRhbiBkaXN0YW5jZSBpbnN0ZWFkIG9mIEV1Y2xpZGlhbiBvbmUgdG8gYXZvaWQgZXhwZW5zaXZlIHNxdWFyZSByb290IGNvbXB1dGF0aW9uXG4gICAgICAgIGRpc3QgKz0gTWF0aC5hYnMoYlswXSAtIGFbMF0pICsgTWF0aC5hYnMoYlsxXSAtIGFbMV0pO1xuICAgIH1cbiAgICBwb2ludHMuYXJlYSA9IE1hdGguYWJzKGFyZWEgLyAyKTtcbiAgICBwb2ludHMuZGlzdCA9IGRpc3Q7XG59XG5cbi8vIGNhbGN1bGF0ZSB0aGUgZmVhdHVyZSBib3VuZGluZyBib3ggZm9yIGZhc3RlciBjbGlwcGluZyBsYXRlclxuZnVuY3Rpb24gY2FsY0JCb3goZmVhdHVyZSkge1xuICAgIHZhciBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgIG1pbiA9IGZlYXR1cmUubWluLFxuICAgICAgICBtYXggPSBmZWF0dXJlLm1heDtcblxuICAgIGlmIChmZWF0dXJlLnR5cGUgPT09IDEpIGNhbGNSaW5nQkJveChtaW4sIG1heCwgZ2VvbWV0cnkpO1xuICAgIGVsc2UgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tZXRyeS5sZW5ndGg7IGkrKykgY2FsY1JpbmdCQm94KG1pbiwgbWF4LCBnZW9tZXRyeVtpXSk7XG5cbiAgICByZXR1cm4gZmVhdHVyZTtcbn1cblxuZnVuY3Rpb24gY2FsY1JpbmdCQm94KG1pbiwgbWF4LCBwb2ludHMpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgcDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwID0gcG9pbnRzW2ldO1xuICAgICAgICBtaW5bMF0gPSBNYXRoLm1pbihwWzBdLCBtaW5bMF0pO1xuICAgICAgICBtYXhbMF0gPSBNYXRoLm1heChwWzBdLCBtYXhbMF0pO1xuICAgICAgICBtaW5bMV0gPSBNYXRoLm1pbihwWzFdLCBtaW5bMV0pO1xuICAgICAgICBtYXhbMV0gPSBNYXRoLm1heChwWzFdLCBtYXhbMV0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBnZW9qc29udnQ7XG5cbnZhciBjb252ZXJ0ID0gcmVxdWlyZSgnLi9jb252ZXJ0JyksIC8vIEdlb0pTT04gY29udmVyc2lvbiBhbmQgcHJlcHJvY2Vzc2luZ1xuICAgIGNsaXAgPSByZXF1aXJlKCcuL2NsaXAnKSwgICAgICAgLy8gc3RyaXBlIGNsaXBwaW5nIGFsZ29yaXRobVxuICAgIHdyYXAgPSByZXF1aXJlKCcuL3dyYXAnKSwgICAgICAgLy8gZGF0ZSBsaW5lIHByb2Nlc3NpbmdcbiAgICBjcmVhdGVUaWxlID0gcmVxdWlyZSgnLi90aWxlJyk7IC8vIGZpbmFsIHNpbXBsaWZpZWQgdGlsZSBnZW5lcmF0aW9uXG5cblxuZnVuY3Rpb24gZ2VvanNvbnZ0KGRhdGEsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEdlb0pTT05WVChkYXRhLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gZXh0ZW5kKE9iamVjdC5jcmVhdGUodGhpcy5vcHRpb25zKSwgb3B0aW9ucyk7XG5cbiAgICB2YXIgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgaWYgKGRlYnVnKSBjb25zb2xlLnRpbWUoJ3ByZXByb2Nlc3MgZGF0YScpO1xuXG4gICAgdmFyIHoyID0gMSA8PCBvcHRpb25zLm1heFpvb20sIC8vIDJeelxuICAgICAgICBmZWF0dXJlcyA9IGNvbnZlcnQoZGF0YSwgb3B0aW9ucy50b2xlcmFuY2UgLyAoejIgKiBvcHRpb25zLmV4dGVudCkpO1xuXG4gICAgdGhpcy50aWxlcyA9IHt9O1xuICAgIHRoaXMudGlsZUNvb3JkcyA9IFtdO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgncHJlcHJvY2VzcyBkYXRhJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdpbmRleDogbWF4Wm9vbTogJWQsIG1heFBvaW50czogJWQnLCBvcHRpb25zLmluZGV4TWF4Wm9vbSwgb3B0aW9ucy5pbmRleE1heFBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZSgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgdGhpcy5zdGF0cyA9IHt9O1xuICAgICAgICB0aGlzLnRvdGFsID0gMDtcbiAgICB9XG5cbiAgICBmZWF0dXJlcyA9IHdyYXAoZmVhdHVyZXMsIG9wdGlvbnMuYnVmZmVyIC8gb3B0aW9ucy5leHRlbnQsIGludGVyc2VjdFgpO1xuXG4gICAgLy8gc3RhcnQgc2xpY2luZyBmcm9tIHRoZSB0b3AgdGlsZSBkb3duXG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgdGhpcy5zcGxpdFRpbGUoZmVhdHVyZXMsIDAsIDAsIDApO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIGNvbnNvbGUubG9nKCdmZWF0dXJlczogJWQsIHBvaW50czogJWQnLCB0aGlzLnRpbGVzWzBdLm51bUZlYXR1cmVzLCB0aGlzLnRpbGVzWzBdLm51bVBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3RpbGVzIGdlbmVyYXRlZDonLCB0aGlzLnRvdGFsLCBKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSk7XG4gICAgfVxufVxuXG5HZW9KU09OVlQucHJvdG90eXBlLm9wdGlvbnMgPSB7XG4gICAgbWF4Wm9vbTogMTQsICAgICAgICAgICAgLy8gbWF4IHpvb20gdG8gcHJlc2VydmUgZGV0YWlsIG9uXG4gICAgaW5kZXhNYXhab29tOiA1LCAgICAgICAgLy8gbWF4IHpvb20gaW4gdGhlIHRpbGUgaW5kZXhcbiAgICBpbmRleE1heFBvaW50czogMTAwMDAwLCAvLyBtYXggbnVtYmVyIG9mIHBvaW50cyBwZXIgdGlsZSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIHNvbGlkQ2hpbGRyZW46IGZhbHNlLCAgIC8vIHdoZXRoZXIgdG8gdGlsZSBzb2xpZCBzcXVhcmUgdGlsZXMgZnVydGhlclxuICAgIHRvbGVyYW5jZTogMywgICAgICAgICAgIC8vIHNpbXBsaWZpY2F0aW9uIHRvbGVyYW5jZSAoaGlnaGVyIG1lYW5zIHNpbXBsZXIpXG4gICAgZXh0ZW50OiA0MDk2LCAgICAgICAgICAgLy8gdGlsZSBleHRlbnRcbiAgICBidWZmZXI6IDY0LCAgICAgICAgICAgICAvLyB0aWxlIGJ1ZmZlciBvbiBlYWNoIHNpZGVcbiAgICBkZWJ1ZzogMCAgICAgICAgICAgICAgICAvLyBsb2dnaW5nIGxldmVsICgwLCAxIG9yIDIpXG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLnNwbGl0VGlsZSA9IGZ1bmN0aW9uIChmZWF0dXJlcywgeiwgeCwgeSwgY3osIGN4LCBjeSkge1xuXG4gICAgdmFyIHN0YWNrID0gW2ZlYXR1cmVzLCB6LCB4LCB5XSxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgLy8gYXZvaWQgcmVjdXJzaW9uIGJ5IHVzaW5nIGEgcHJvY2Vzc2luZyBxdWV1ZVxuICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgeSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB4ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHogPSBzdGFjay5wb3AoKTtcbiAgICAgICAgZmVhdHVyZXMgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICB2YXIgejIgPSAxIDw8IHosXG4gICAgICAgICAgICBpZCA9IHRvSUQoeiwgeCwgeSksXG4gICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1tpZF0sXG4gICAgICAgICAgICB0aWxlVG9sZXJhbmNlID0geiA9PT0gb3B0aW9ucy5tYXhab29tID8gMCA6IG9wdGlvbnMudG9sZXJhbmNlIC8gKHoyICogb3B0aW9ucy5leHRlbnQpO1xuXG4gICAgICAgIGlmICghdGlsZSkge1xuICAgICAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdjcmVhdGlvbicpO1xuXG4gICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1tpZF0gPSBjcmVhdGVUaWxlKGZlYXR1cmVzLCB6MiwgeCwgeSwgdGlsZVRvbGVyYW5jZSwgeiA9PT0gb3B0aW9ucy5tYXhab29tKTtcbiAgICAgICAgICAgIHRoaXMudGlsZUNvb3Jkcy5wdXNoKHt6OiB6LCB4OiB4LCB5OiB5fSk7XG5cbiAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RpbGUgeiVkLSVkLSVkIChmZWF0dXJlczogJWQsIHBvaW50czogJWQsIHNpbXBsaWZpZWQ6ICVkKScsXG4gICAgICAgICAgICAgICAgICAgICAgICB6LCB4LCB5LCB0aWxlLm51bUZlYXR1cmVzLCB0aWxlLm51bVBvaW50cywgdGlsZS5udW1TaW1wbGlmaWVkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lRW5kKCdjcmVhdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJ3onICsgejtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRzW2tleV0gPSAodGhpcy5zdGF0c1trZXldIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzYXZlIHJlZmVyZW5jZSB0byBvcmlnaW5hbCBnZW9tZXRyeSBpbiB0aWxlIHNvIHRoYXQgd2UgY2FuIGRyaWxsIGRvd24gbGF0ZXIgaWYgd2Ugc3RvcCBub3dcbiAgICAgICAgdGlsZS5zb3VyY2UgPSBmZWF0dXJlcztcblxuICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB0aGUgdGlsZSBpcyBzb2xpZCBjbGlwcGVkIHNxdWFyZVxuICAgICAgICBpZiAoIW9wdGlvbnMuc29saWRDaGlsZHJlbiAmJiBpc0NsaXBwZWRTcXVhcmUodGlsZSwgb3B0aW9ucy5leHRlbnQsIG9wdGlvbnMuYnVmZmVyKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gaWYgaXQncyB0aGUgZmlyc3QtcGFzcyB0aWxpbmdcbiAgICAgICAgaWYgKCFjeikge1xuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgd2UgcmVhY2hlZCBtYXggem9vbSwgb3IgaWYgdGhlIHRpbGUgaXMgdG9vIHNpbXBsZVxuICAgICAgICAgICAgaWYgKHogPT09IG9wdGlvbnMuaW5kZXhNYXhab29tIHx8IHRpbGUubnVtUG9pbnRzIDw9IG9wdGlvbnMuaW5kZXhNYXhQb2ludHMpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIGlmIGEgZHJpbGxkb3duIHRvIGEgc3BlY2lmaWMgdGlsZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgd2UgcmVhY2hlZCBiYXNlIHpvb20gb3Igb3VyIHRhcmdldCB0aWxlIHpvb21cbiAgICAgICAgICAgIGlmICh6ID09PSBvcHRpb25zLm1heFpvb20gfHwgeiA9PT0gY3opIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiBpdCdzIG5vdCBhbiBhbmNlc3RvciBvZiB0aGUgdGFyZ2V0IHRpbGVcbiAgICAgICAgICAgIHZhciBtID0gMSA8PCAoY3ogLSB6KTtcbiAgICAgICAgICAgIGlmICh4ICE9PSBNYXRoLmZsb29yKGN4IC8gbSkgfHwgeSAhPT0gTWF0aC5mbG9vcihjeSAvIG0pKSBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHdlIHNsaWNlIGZ1cnRoZXIgZG93biwgbm8gbmVlZCB0byBrZWVwIHNvdXJjZSBnZW9tZXRyeVxuICAgICAgICB0aWxlLnNvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdjbGlwcGluZycpO1xuXG4gICAgICAgIC8vIHZhbHVlcyB3ZSdsbCB1c2UgZm9yIGNsaXBwaW5nXG4gICAgICAgIHZhciBrMSA9IDAuNSAqIG9wdGlvbnMuYnVmZmVyIC8gb3B0aW9ucy5leHRlbnQsXG4gICAgICAgICAgICBrMiA9IDAuNSAtIGsxLFxuICAgICAgICAgICAgazMgPSAwLjUgKyBrMSxcbiAgICAgICAgICAgIGs0ID0gMSArIGsxLFxuICAgICAgICAgICAgdGwsIGJsLCB0ciwgYnIsIGxlZnQsIHJpZ2h0O1xuXG4gICAgICAgIHRsID0gYmwgPSB0ciA9IGJyID0gbnVsbDtcblxuICAgICAgICBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4IC0gazEsIHggKyBrMywgMCwgaW50ZXJzZWN0WCwgdGlsZS5taW5bMF0sIHRpbGUubWF4WzBdKTtcbiAgICAgICAgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCArIGsyLCB4ICsgazQsIDAsIGludGVyc2VjdFgsIHRpbGUubWluWzBdLCB0aWxlLm1heFswXSk7XG5cbiAgICAgICAgaWYgKGxlZnQpIHtcbiAgICAgICAgICAgIHRsID0gY2xpcChsZWZ0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgICAgICBibCA9IGNsaXAobGVmdCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgICB0ciA9IGNsaXAocmlnaHQsIHoyLCB5IC0gazEsIHkgKyBrMywgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgICAgIGJyID0gY2xpcChyaWdodCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lRW5kKCdjbGlwcGluZycpO1xuXG4gICAgICAgIGlmICh0bCkgc3RhY2sucHVzaCh0bCwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIpO1xuICAgICAgICBpZiAoYmwpIHN0YWNrLnB1c2goYmwsIHogKyAxLCB4ICogMiwgICAgIHkgKiAyICsgMSk7XG4gICAgICAgIGlmICh0cikgc3RhY2sucHVzaCh0ciwgeiArIDEsIHggKiAyICsgMSwgeSAqIDIpO1xuICAgICAgICBpZiAoYnIpIHN0YWNrLnB1c2goYnIsIHogKyAxLCB4ICogMiArIDEsIHkgKiAyICsgMSk7XG4gICAgfVxufTtcblxuR2VvSlNPTlZULnByb3RvdHlwZS5nZXRUaWxlID0gZnVuY3Rpb24gKHosIHgsIHkpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZXh0ZW50ID0gb3B0aW9ucy5leHRlbnQsXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIHZhciB6MiA9IDEgPDwgejtcbiAgICB4ID0gKCh4ICUgejIpICsgejIpICUgejI7IC8vIHdyYXAgdGlsZSB4IGNvb3JkaW5hdGVcblxuICAgIHZhciBpZCA9IHRvSUQoeiwgeCwgeSk7XG4gICAgaWYgKHRoaXMudGlsZXNbaWRdKSByZXR1cm4gdHJhbnNmb3JtVGlsZSh0aGlzLnRpbGVzW2lkXSwgZXh0ZW50KTtcblxuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUubG9nKCdkcmlsbGluZyBkb3duIHRvIHolZC0lZC0lZCcsIHosIHgsIHkpO1xuXG4gICAgdmFyIHowID0geixcbiAgICAgICAgeDAgPSB4LFxuICAgICAgICB5MCA9IHksXG4gICAgICAgIHBhcmVudDtcblxuICAgIHdoaWxlICghcGFyZW50ICYmIHowID4gMCkge1xuICAgICAgICB6MC0tO1xuICAgICAgICB4MCA9IE1hdGguZmxvb3IoeDAgLyAyKTtcbiAgICAgICAgeTAgPSBNYXRoLmZsb29yKHkwIC8gMik7XG4gICAgICAgIHBhcmVudCA9IHRoaXMudGlsZXNbdG9JRCh6MCwgeDAsIHkwKV07XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS5sb2coJ2ZvdW5kIHBhcmVudCB0aWxlIHolZC0lZC0lZCcsIHowLCB4MCwgeTApO1xuXG4gICAgLy8gaWYgd2UgZm91bmQgYSBwYXJlbnQgdGlsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBnZW9tZXRyeSwgd2UgY2FuIGRyaWxsIGRvd24gZnJvbSBpdFxuICAgIGlmIChwYXJlbnQuc291cmNlKSB7XG4gICAgICAgIGlmIChpc0NsaXBwZWRTcXVhcmUocGFyZW50LCBleHRlbnQsIG9wdGlvbnMuYnVmZmVyKSkgcmV0dXJuIHRyYW5zZm9ybVRpbGUocGFyZW50LCBleHRlbnQpO1xuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnZHJpbGxpbmcgZG93bicpO1xuICAgICAgICB0aGlzLnNwbGl0VGlsZShwYXJlbnQuc291cmNlLCB6MCwgeDAsIHkwLCB6LCB4LCB5KTtcbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lRW5kKCdkcmlsbGluZyBkb3duJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnRpbGVzW2lkXSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gdHJhbnNmb3JtVGlsZSh0aGlzLnRpbGVzW2lkXSwgZXh0ZW50KTtcbn07XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUodGlsZSwgZXh0ZW50KSB7XG4gICAgaWYgKHRpbGUudHJhbnNmb3JtZWQpIHJldHVybiB0aWxlO1xuXG4gICAgdmFyIHoyID0gdGlsZS56MixcbiAgICAgICAgdHggPSB0aWxlLngsXG4gICAgICAgIHR5ID0gdGlsZS55LFxuICAgICAgICBpLCBqLCBrO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRpbGUuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSB0aWxlLmZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2VvbS5sZW5ndGg7IGorKykgZ2VvbVtqXSA9IHRyYW5zZm9ybVBvaW50KGdlb21bal0sIGV4dGVudCwgejIsIHR4LCB0eSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJpbmcgPSBnZW9tW2pdO1xuICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCByaW5nLmxlbmd0aDsgaysrKSByaW5nW2tdID0gdHJhbnNmb3JtUG9pbnQocmluZ1trXSwgZXh0ZW50LCB6MiwgdHgsIHR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRpbGUudHJhbnNmb3JtZWQgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHRpbGU7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVBvaW50KHAsIGV4dGVudCwgejIsIHR4LCB0eSkge1xuICAgIHZhciB4ID0gTWF0aC5yb3VuZChleHRlbnQgKiAocFswXSAqIHoyIC0gdHgpKSxcbiAgICAgICAgeSA9IE1hdGgucm91bmQoZXh0ZW50ICogKHBbMV0gKiB6MiAtIHR5KSk7XG4gICAgcmV0dXJuIFt4LCB5XTtcbn1cblxuZnVuY3Rpb24gdG9JRCh6LCB4LCB5KSB7XG4gICAgcmV0dXJuICgoKDEgPDwgeikgKiB5ICsgeCkgKiAzMikgKyB6O1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3RYKGEsIGIsIHgpIHtcbiAgICByZXR1cm4gW3gsICh4IC0gYVswXSkgKiAoYlsxXSAtIGFbMV0pIC8gKGJbMF0gLSBhWzBdKSArIGFbMV0sIDFdO1xufVxuZnVuY3Rpb24gaW50ZXJzZWN0WShhLCBiLCB5KSB7XG4gICAgcmV0dXJuIFsoeSAtIGFbMV0pICogKGJbMF0gLSBhWzBdKSAvIChiWzFdIC0gYVsxXSkgKyBhWzBdLCB5LCAxXTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKGRlc3QsIHNyYykge1xuICAgIGZvciAodmFyIGkgaW4gc3JjKSBkZXN0W2ldID0gc3JjW2ldO1xuICAgIHJldHVybiBkZXN0O1xufVxuXG4vLyBjaGVja3Mgd2hldGhlciBhIHRpbGUgaXMgYSB3aG9sZS1hcmVhIGZpbGwgYWZ0ZXIgY2xpcHBpbmc7IGlmIGl0IGlzLCB0aGVyZSdzIG5vIHNlbnNlIHNsaWNpbmcgaXQgZnVydGhlclxuZnVuY3Rpb24gaXNDbGlwcGVkU3F1YXJlKHRpbGUsIGV4dGVudCwgYnVmZmVyKSB7XG5cbiAgICB2YXIgZmVhdHVyZXMgPSB0aWxlLnNvdXJjZTtcbiAgICBpZiAoZmVhdHVyZXMubGVuZ3RoICE9PSAxKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzWzBdO1xuICAgIGlmIChmZWF0dXJlLnR5cGUgIT09IDMgfHwgZmVhdHVyZS5nZW9tZXRyeS5sZW5ndGggPiAxKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgbGVuID0gZmVhdHVyZS5nZW9tZXRyeVswXS5sZW5ndGg7XG4gICAgaWYgKGxlbiAhPT0gNSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgcCA9IHRyYW5zZm9ybVBvaW50KGZlYXR1cmUuZ2VvbWV0cnlbMF1baV0sIGV4dGVudCwgdGlsZS56MiwgdGlsZS54LCB0aWxlLnkpO1xuICAgICAgICBpZiAoKHBbMF0gIT09IC1idWZmZXIgJiYgcFswXSAhPT0gZXh0ZW50ICsgYnVmZmVyKSB8fFxuICAgICAgICAgICAgKHBbMV0gIT09IC1idWZmZXIgJiYgcFsxXSAhPT0gZXh0ZW50ICsgYnVmZmVyKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNpbXBsaWZ5O1xuXG4vLyBjYWxjdWxhdGUgc2ltcGxpZmljYXRpb24gZGF0YSB1c2luZyBvcHRpbWl6ZWQgRG91Z2xhcy1QZXVja2VyIGFsZ29yaXRobVxuXG5mdW5jdGlvbiBzaW1wbGlmeShwb2ludHMsIHRvbGVyYW5jZSkge1xuXG4gICAgdmFyIHNxVG9sZXJhbmNlID0gdG9sZXJhbmNlICogdG9sZXJhbmNlLFxuICAgICAgICBsZW4gPSBwb2ludHMubGVuZ3RoLFxuICAgICAgICBmaXJzdCA9IDAsXG4gICAgICAgIGxhc3QgPSBsZW4gLSAxLFxuICAgICAgICBzdGFjayA9IFtdLFxuICAgICAgICBpLCBtYXhTcURpc3QsIHNxRGlzdCwgaW5kZXg7XG5cbiAgICAvLyBhbHdheXMgcmV0YWluIHRoZSBlbmRwb2ludHMgKDEgaXMgdGhlIG1heCB2YWx1ZSlcbiAgICBwb2ludHNbZmlyc3RdWzJdID0gMTtcbiAgICBwb2ludHNbbGFzdF1bMl0gPSAxO1xuXG4gICAgLy8gYXZvaWQgcmVjdXJzaW9uIGJ5IHVzaW5nIGEgc3RhY2tcbiAgICB3aGlsZSAobGFzdCkge1xuXG4gICAgICAgIG1heFNxRGlzdCA9IDA7XG5cbiAgICAgICAgZm9yIChpID0gZmlyc3QgKyAxOyBpIDwgbGFzdDsgaSsrKSB7XG4gICAgICAgICAgICBzcURpc3QgPSBnZXRTcVNlZ0Rpc3QocG9pbnRzW2ldLCBwb2ludHNbZmlyc3RdLCBwb2ludHNbbGFzdF0pO1xuXG4gICAgICAgICAgICBpZiAoc3FEaXN0ID4gbWF4U3FEaXN0KSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIG1heFNxRGlzdCA9IHNxRGlzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXhTcURpc3QgPiBzcVRvbGVyYW5jZSkge1xuICAgICAgICAgICAgcG9pbnRzW2luZGV4XVsyXSA9IG1heFNxRGlzdDsgLy8gc2F2ZSB0aGUgcG9pbnQgaW1wb3J0YW5jZSBpbiBzcXVhcmVkIHBpeGVscyBhcyBhIHogY29vcmRpbmF0ZVxuICAgICAgICAgICAgc3RhY2sucHVzaChmaXJzdCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGluZGV4KTtcbiAgICAgICAgICAgIGZpcnN0ID0gaW5kZXg7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhc3QgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGZpcnN0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIHNxdWFyZSBkaXN0YW5jZSBmcm9tIGEgcG9pbnQgdG8gYSBzZWdtZW50XG5mdW5jdGlvbiBnZXRTcVNlZ0Rpc3QocCwgYSwgYikge1xuXG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSxcbiAgICAgICAgYnggPSBiWzBdLCBieSA9IGJbMV0sXG4gICAgICAgIHB4ID0gcFswXSwgcHkgPSBwWzFdLFxuICAgICAgICBkeCA9IGJ4IC0geCxcbiAgICAgICAgZHkgPSBieSAtIHk7XG5cbiAgICBpZiAoZHggIT09IDAgfHwgZHkgIT09IDApIHtcblxuICAgICAgICB2YXIgdCA9ICgocHggLSB4KSAqIGR4ICsgKHB5IC0geSkgKiBkeSkgLyAoZHggKiBkeCArIGR5ICogZHkpO1xuXG4gICAgICAgIGlmICh0ID4gMSkge1xuICAgICAgICAgICAgeCA9IGJ4O1xuICAgICAgICAgICAgeSA9IGJ5O1xuXG4gICAgICAgIH0gZWxzZSBpZiAodCA+IDApIHtcbiAgICAgICAgICAgIHggKz0gZHggKiB0O1xuICAgICAgICAgICAgeSArPSBkeSAqIHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkeCA9IHB4IC0geDtcbiAgICBkeSA9IHB5IC0geTtcblxuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVUaWxlO1xuXG5mdW5jdGlvbiBjcmVhdGVUaWxlKGZlYXR1cmVzLCB6MiwgdHgsIHR5LCB0b2xlcmFuY2UsIG5vU2ltcGxpZnkpIHtcbiAgICB2YXIgdGlsZSA9IHtcbiAgICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgICBudW1Qb2ludHM6IDAsXG4gICAgICAgIG51bVNpbXBsaWZpZWQ6IDAsXG4gICAgICAgIG51bUZlYXR1cmVzOiAwLFxuICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgIHg6IHR4LFxuICAgICAgICB5OiB0eSxcbiAgICAgICAgejI6IHoyLFxuICAgICAgICB0cmFuc2Zvcm1lZDogZmFsc2UsXG4gICAgICAgIG1pbjogWzIsIDFdLFxuICAgICAgICBtYXg6IFstMSwgMF1cbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGlsZS5udW1GZWF0dXJlcysrO1xuICAgICAgICBhZGRGZWF0dXJlKHRpbGUsIGZlYXR1cmVzW2ldLCB0b2xlcmFuY2UsIG5vU2ltcGxpZnkpO1xuXG4gICAgICAgIHZhciBtaW4gPSBmZWF0dXJlc1tpXS5taW4sXG4gICAgICAgICAgICBtYXggPSBmZWF0dXJlc1tpXS5tYXg7XG5cbiAgICAgICAgaWYgKG1pblswXSA8IHRpbGUubWluWzBdKSB0aWxlLm1pblswXSA9IG1pblswXTtcbiAgICAgICAgaWYgKG1pblsxXSA8IHRpbGUubWluWzFdKSB0aWxlLm1pblsxXSA9IG1pblsxXTtcbiAgICAgICAgaWYgKG1heFswXSA+IHRpbGUubWF4WzBdKSB0aWxlLm1heFswXSA9IG1heFswXTtcbiAgICAgICAgaWYgKG1heFsxXSA+IHRpbGUubWF4WzFdKSB0aWxlLm1heFsxXSA9IG1heFsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHRpbGU7XG59XG5cbmZ1bmN0aW9uIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KSB7XG5cbiAgICB2YXIgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGUsXG4gICAgICAgIHNpbXBsaWZpZWQgPSBbXSxcbiAgICAgICAgc3FUb2xlcmFuY2UgPSB0b2xlcmFuY2UgKiB0b2xlcmFuY2UsXG4gICAgICAgIGksIGosIHJpbmcsIHA7XG5cbiAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKGdlb21baV0pO1xuICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMrKztcbiAgICAgICAgICAgIHRpbGUubnVtU2ltcGxpZmllZCsrO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2Uge1xuXG4gICAgICAgIC8vIHNpbXBsaWZ5IGFuZCB0cmFuc2Zvcm0gcHJvamVjdGVkIGNvb3JkaW5hdGVzIGZvciB0aWxlIGdlb21ldHJ5XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByaW5nID0gZ2VvbVtpXTtcblxuICAgICAgICAgICAgLy8gZmlsdGVyIG91dCB0aW55IHBvbHlsaW5lcyAmIHBvbHlnb25zXG4gICAgICAgICAgICBpZiAoIW5vU2ltcGxpZnkgJiYgKCh0eXBlID09PSAyICYmIHJpbmcuZGlzdCA8IHRvbGVyYW5jZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT09IDMgJiYgcmluZy5hcmVhIDwgc3FUb2xlcmFuY2UpKSkge1xuICAgICAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzICs9IHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc2ltcGxpZmllZFJpbmcgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBwID0gcmluZ1tqXTtcbiAgICAgICAgICAgICAgICAvLyBrZWVwIHBvaW50cyB3aXRoIGltcG9ydGFuY2UgPiB0b2xlcmFuY2VcbiAgICAgICAgICAgICAgICBpZiAobm9TaW1wbGlmeSB8fCBwWzJdID4gc3FUb2xlcmFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc2ltcGxpZmllZFJpbmcucHVzaChwKTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5udW1TaW1wbGlmaWVkKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNpbXBsaWZpZWQucHVzaChzaW1wbGlmaWVkUmluZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2ltcGxpZmllZC5sZW5ndGgpIHtcbiAgICAgICAgdGlsZS5mZWF0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiBzaW1wbGlmaWVkLFxuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIHRhZ3M6IGZlYXR1cmUudGFncyB8fCBudWxsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNsaXAgPSByZXF1aXJlKCcuL2NsaXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB3cmFwO1xuXG5mdW5jdGlvbiB3cmFwKGZlYXR1cmVzLCBidWZmZXIsIGludGVyc2VjdFgpIHtcbiAgICB2YXIgbWVyZ2VkID0gZmVhdHVyZXMsXG4gICAgICAgIGxlZnQgID0gY2xpcChmZWF0dXJlcywgMSwgLTEgLSBidWZmZXIsIGJ1ZmZlciwgICAgIDAsIGludGVyc2VjdFgsIC0xLCAyKSwgLy8gbGVmdCB3b3JsZCBjb3B5XG4gICAgICAgIHJpZ2h0ID0gY2xpcChmZWF0dXJlcywgMSwgIDEgLSBidWZmZXIsIDIgKyBidWZmZXIsIDAsIGludGVyc2VjdFgsIC0xLCAyKTsgLy8gcmlnaHQgd29ybGQgY29weVxuXG4gICAgaWYgKGxlZnQgfHwgcmlnaHQpIHtcbiAgICAgICAgbWVyZ2VkID0gY2xpcChmZWF0dXJlcywgMSwgLWJ1ZmZlciwgMSArIGJ1ZmZlciwgMCwgaW50ZXJzZWN0WCwgLTEsIDIpOyAvLyBjZW50ZXIgd29ybGQgY29weVxuXG4gICAgICAgIGlmIChsZWZ0KSBtZXJnZWQgPSBzaGlmdEZlYXR1cmVDb29yZHMobGVmdCwgMSkuY29uY2F0KG1lcmdlZCk7IC8vIG1lcmdlIGxlZnQgaW50byBjZW50ZXJcbiAgICAgICAgaWYgKHJpZ2h0KSBtZXJnZWQgPSBtZXJnZWQuY29uY2F0KHNoaWZ0RmVhdHVyZUNvb3JkcyhyaWdodCwgLTEpKTsgLy8gbWVyZ2UgcmlnaHQgaW50byBjZW50ZXJcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBzaGlmdEZlYXR1cmVDb29yZHMoZmVhdHVyZXMsIG9mZnNldCkge1xuICAgIHZhciBuZXdGZWF0dXJlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICB2YXIgbmV3R2VvbWV0cnk7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIG5ld0dlb21ldHJ5ID0gc2hpZnRDb29yZHMoZmVhdHVyZS5nZW9tZXRyeSwgb2Zmc2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0dlb21ldHJ5ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZlYXR1cmUuZ2VvbWV0cnkubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeS5wdXNoKHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnlbal0sIG9mZnNldCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbmV3RmVhdHVyZXMucHVzaCh7XG4gICAgICAgICAgICBnZW9tZXRyeTogbmV3R2VvbWV0cnksXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgdGFnczogZmVhdHVyZS50YWdzLFxuICAgICAgICAgICAgbWluOiBbZmVhdHVyZS5taW5bMF0gKyBvZmZzZXQsIGZlYXR1cmUubWluWzFdXSxcbiAgICAgICAgICAgIG1heDogW2ZlYXR1cmUubWF4WzBdICsgb2Zmc2V0LCBmZWF0dXJlLm1heFsxXV1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBzaGlmdENvb3Jkcyhwb2ludHMsIG9mZnNldCkge1xuICAgIHZhciBuZXdQb2ludHMgPSBbXTtcbiAgICBuZXdQb2ludHMuYXJlYSA9IHBvaW50cy5hcmVhO1xuICAgIG5ld1BvaW50cy5kaXN0ID0gcG9pbnRzLmRpc3Q7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBuZXdQb2ludHMucHVzaChbcG9pbnRzW2ldWzBdICsgb2Zmc2V0LCBwb2ludHNbaV1bMV0sIHBvaW50c1tpXVsyXV0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UG9pbnRzO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBpbnZlcnRcblxuLyoqXG4gKiBJbnZlcnRzIGEgbWF0M1xuICpcbiAqIEBhbGlhcyBtYXQzLmludmVydFxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5mdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdXG4gIHZhciBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdXG4gIHZhciBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdXG5cbiAgdmFyIGIwMSA9IGEyMiAqIGExMSAtIGExMiAqIGEyMVxuICB2YXIgYjExID0gLWEyMiAqIGExMCArIGExMiAqIGEyMFxuICB2YXIgYjIxID0gYTIxICogYTEwIC0gYTExICogYTIwXG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICB2YXIgZGV0ID0gYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxXG5cbiAgaWYgKCFkZXQpIHJldHVybiBudWxsXG4gIGRldCA9IDEuMCAvIGRldFxuXG4gIG91dFswXSA9IGIwMSAqIGRldFxuICBvdXRbMV0gPSAoLWEyMiAqIGEwMSArIGEwMiAqIGEyMSkgKiBkZXRcbiAgb3V0WzJdID0gKGExMiAqIGEwMSAtIGEwMiAqIGExMSkgKiBkZXRcbiAgb3V0WzNdID0gYjExICogZGV0XG4gIG91dFs0XSA9IChhMjIgKiBhMDAgLSBhMDIgKiBhMjApICogZGV0XG4gIG91dFs1XSA9ICgtYTEyICogYTAwICsgYTAyICogYTEwKSAqIGRldFxuICBvdXRbNl0gPSBiMjEgKiBkZXRcbiAgb3V0WzddID0gKC1hMjEgKiBhMDAgKyBhMDEgKiBhMjApICogZGV0XG4gIG91dFs4XSA9IChhMTEgKiBhMDAgLSBhMDEgKiBhMTApICogZGV0XG5cbiAgcmV0dXJuIG91dFxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBub3JtYWxGcm9tTWF0NFxuXG4vKipcbiogQ2FsY3VsYXRlcyBhIDN4MyBub3JtYWwgbWF0cml4ICh0cmFuc3Bvc2UgaW52ZXJzZSkgZnJvbSB0aGUgNHg0IG1hdHJpeFxuKlxuKiBAYWxpYXMgbWF0My5ub3JtYWxGcm9tTWF0NFxuKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4qIEBwYXJhbSB7bWF0NH0gYSBNYXQ0IHRvIGRlcml2ZSB0aGUgbm9ybWFsIG1hdHJpeCBmcm9tXG4qXG4qIEByZXR1cm5zIHttYXQzfSBvdXRcbiovXG5mdW5jdGlvbiBub3JtYWxGcm9tTWF0NChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM11cbiAgdmFyIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN11cbiAgdmFyIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXVxuICB2YXIgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV1cblxuICB2YXIgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwXG4gIHZhciBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTBcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMFxuICB2YXIgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExXG4gIHZhciBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTFcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMlxuICB2YXIgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwXG4gIHZhciBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzBcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMFxuICB2YXIgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxXG4gIHZhciBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzFcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMlxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgdmFyIGRldCA9IGIwMCAqIGIxMVxuICAgICAgICAgIC0gYjAxICogYjEwXG4gICAgICAgICAgKyBiMDIgKiBiMDlcbiAgICAgICAgICArIGIwMyAqIGIwOFxuICAgICAgICAgIC0gYjA0ICogYjA3XG4gICAgICAgICAgKyBiMDUgKiBiMDZcblxuICBpZiAoIWRldCkgcmV0dXJuIG51bGxcbiAgZGV0ID0gMS4wIC8gZGV0XG5cbiAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXRcbiAgb3V0WzFdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXRcbiAgb3V0WzJdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXRcblxuICBvdXRbM10gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldFxuICBvdXRbNF0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldFxuICBvdXRbNV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldFxuXG4gIG91dFs2XSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0XG4gIG91dFs3XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0XG4gIG91dFs4XSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0XG5cbiAgcmV0dXJuIG91dFxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBjb3B5O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQ0IHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgb3V0WzldID0gYVs5XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuXG4vKipcbiAqIFNldCBhIG1hdDQgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAxO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IDE7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07IiwidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvb2tBdDtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBsb29rLWF0IG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBleWUgcG9zaXRpb24sIGZvY2FsIHBvaW50LCBhbmQgdXAgYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7dmVjM30gZXllIFBvc2l0aW9uIG9mIHRoZSB2aWV3ZXJcbiAqIEBwYXJhbSB7dmVjM30gY2VudGVyIFBvaW50IHRoZSB2aWV3ZXIgaXMgbG9va2luZyBhdFxuICogQHBhcmFtIHt2ZWMzfSB1cCB2ZWMzIHBvaW50aW5nIHVwXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIGxvb2tBdChvdXQsIGV5ZSwgY2VudGVyLCB1cCkge1xuICAgIHZhciB4MCwgeDEsIHgyLCB5MCwgeTEsIHkyLCB6MCwgejEsIHoyLCBsZW4sXG4gICAgICAgIGV5ZXggPSBleWVbMF0sXG4gICAgICAgIGV5ZXkgPSBleWVbMV0sXG4gICAgICAgIGV5ZXogPSBleWVbMl0sXG4gICAgICAgIHVweCA9IHVwWzBdLFxuICAgICAgICB1cHkgPSB1cFsxXSxcbiAgICAgICAgdXB6ID0gdXBbMl0sXG4gICAgICAgIGNlbnRlcnggPSBjZW50ZXJbMF0sXG4gICAgICAgIGNlbnRlcnkgPSBjZW50ZXJbMV0sXG4gICAgICAgIGNlbnRlcnogPSBjZW50ZXJbMl07XG5cbiAgICBpZiAoTWF0aC5hYnMoZXlleCAtIGNlbnRlcngpIDwgMC4wMDAwMDEgJiZcbiAgICAgICAgTWF0aC5hYnMoZXlleSAtIGNlbnRlcnkpIDwgMC4wMDAwMDEgJiZcbiAgICAgICAgTWF0aC5hYnMoZXlleiAtIGNlbnRlcnopIDwgMC4wMDAwMDEpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KG91dCk7XG4gICAgfVxuXG4gICAgejAgPSBleWV4IC0gY2VudGVyeDtcbiAgICB6MSA9IGV5ZXkgLSBjZW50ZXJ5O1xuICAgIHoyID0gZXlleiAtIGNlbnRlcno7XG5cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KHowICogejAgKyB6MSAqIHoxICsgejIgKiB6Mik7XG4gICAgejAgKj0gbGVuO1xuICAgIHoxICo9IGxlbjtcbiAgICB6MiAqPSBsZW47XG5cbiAgICB4MCA9IHVweSAqIHoyIC0gdXB6ICogejE7XG4gICAgeDEgPSB1cHogKiB6MCAtIHVweCAqIHoyO1xuICAgIHgyID0gdXB4ICogejEgLSB1cHkgKiB6MDtcbiAgICBsZW4gPSBNYXRoLnNxcnQoeDAgKiB4MCArIHgxICogeDEgKyB4MiAqIHgyKTtcbiAgICBpZiAoIWxlbikge1xuICAgICAgICB4MCA9IDA7XG4gICAgICAgIHgxID0gMDtcbiAgICAgICAgeDIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxlbiA9IDEgLyBsZW47XG4gICAgICAgIHgwICo9IGxlbjtcbiAgICAgICAgeDEgKj0gbGVuO1xuICAgICAgICB4MiAqPSBsZW47XG4gICAgfVxuXG4gICAgeTAgPSB6MSAqIHgyIC0gejIgKiB4MTtcbiAgICB5MSA9IHoyICogeDAgLSB6MCAqIHgyO1xuICAgIHkyID0gejAgKiB4MSAtIHoxICogeDA7XG5cbiAgICBsZW4gPSBNYXRoLnNxcnQoeTAgKiB5MCArIHkxICogeTEgKyB5MiAqIHkyKTtcbiAgICBpZiAoIWxlbikge1xuICAgICAgICB5MCA9IDA7XG4gICAgICAgIHkxID0gMDtcbiAgICAgICAgeTIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxlbiA9IDEgLyBsZW47XG4gICAgICAgIHkwICo9IGxlbjtcbiAgICAgICAgeTEgKj0gbGVuO1xuICAgICAgICB5MiAqPSBsZW47XG4gICAgfVxuXG4gICAgb3V0WzBdID0geDA7XG4gICAgb3V0WzFdID0geTA7XG4gICAgb3V0WzJdID0gejA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSB4MTtcbiAgICBvdXRbNV0gPSB5MTtcbiAgICBvdXRbNl0gPSB6MTtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IHgyO1xuICAgIG91dFs5XSA9IHkyO1xuICAgIG91dFsxMF0gPSB6MjtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gLSh4MCAqIGV5ZXggKyB4MSAqIGV5ZXkgKyB4MiAqIGV5ZXopO1xuICAgIG91dFsxM10gPSAtKHkwICogZXlleCArIHkxICogZXlleSArIHkyICogZXlleik7XG4gICAgb3V0WzE0XSA9IC0oejAgKiBleWV4ICsgejEgKiBleWV5ICsgejIgKiBleWV6KTtcbiAgICBvdXRbMTVdID0gMTtcblxuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gbXVsdGlwbHk7XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0NCdzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXSxcbiAgICAgICAgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdLFxuICAgICAgICBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XTtcblxuICAgIC8vIENhY2hlIG9ubHkgdGhlIGN1cnJlbnQgbGluZSBvZiB0aGUgc2Vjb25kIG1hdHJpeFxuICAgIHZhciBiMCAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdOyAgXG4gICAgb3V0WzBdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFsxXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMl0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzNdID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzRdOyBiMSA9IGJbNV07IGIyID0gYls2XTsgYjMgPSBiWzddO1xuICAgIG91dFs0XSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDtcbiAgICBvdXRbNV0gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjEgKyBiMyphMzE7XG4gICAgb3V0WzZdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFs3XSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcblxuICAgIGIwID0gYls4XTsgYjEgPSBiWzldOyBiMiA9IGJbMTBdOyBiMyA9IGJbMTFdO1xuICAgIG91dFs4XSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDtcbiAgICBvdXRbOV0gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjEgKyBiMyphMzE7XG4gICAgb3V0WzEwXSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbMTFdID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzEyXTsgYjEgPSBiWzEzXTsgYjIgPSBiWzE0XTsgYjMgPSBiWzE1XTtcbiAgICBvdXRbMTJdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFsxM10gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjEgKyBiMyphMzE7XG4gICAgb3V0WzE0XSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbMTVdID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcGVyc3BlY3RpdmU7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IEFzcGVjdCByYXRpby4gdHlwaWNhbGx5IHZpZXdwb3J0IHdpZHRoL2hlaWdodFxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gcGVyc3BlY3RpdmUob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICAgIHZhciBmID0gMS4wIC8gTWF0aC50YW4oZm92eSAvIDIpLFxuICAgICAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzBdID0gZiAvIGFzcGVjdDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IGY7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzExXSA9IC0xO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAoMiAqIGZhciAqIG5lYXIpICogbmY7XG4gICAgb3V0WzE1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBzY2FsZTtcblxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcbiAqIEBwYXJhbSB7dmVjM30gdiB0aGUgdmVjMyB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKiovXG5mdW5jdGlvbiBzY2FsZShvdXQsIGEsIHYpIHtcbiAgICB2YXIgeCA9IHZbMF0sIHkgPSB2WzFdLCB6ID0gdlsyXTtcblxuICAgIG91dFswXSA9IGFbMF0gKiB4O1xuICAgIG91dFsxXSA9IGFbMV0gKiB4O1xuICAgIG91dFsyXSA9IGFbMl0gKiB4O1xuICAgIG91dFszXSA9IGFbM10gKiB4O1xuICAgIG91dFs0XSA9IGFbNF0gKiB5O1xuICAgIG91dFs1XSA9IGFbNV0gKiB5O1xuICAgIG91dFs2XSA9IGFbNl0gKiB5O1xuICAgIG91dFs3XSA9IGFbN10gKiB5O1xuICAgIG91dFs4XSA9IGFbOF0gKiB6O1xuICAgIG91dFs5XSA9IGFbOV0gKiB6O1xuICAgIG91dFsxMF0gPSBhWzEwXSAqIHo7XG4gICAgb3V0WzExXSA9IGFbMTFdICogejtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB0cmFuc2xhdGU7XG5cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0NCBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMzfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV0sIHogPSB2WzJdLFxuICAgICAgICBhMDAsIGEwMSwgYTAyLCBhMDMsXG4gICAgICAgIGExMCwgYTExLCBhMTIsIGExMyxcbiAgICAgICAgYTIwLCBhMjEsIGEyMiwgYTIzO1xuXG4gICAgaWYgKGEgPT09IG91dCkge1xuICAgICAgICBvdXRbMTJdID0gYVswXSAqIHggKyBhWzRdICogeSArIGFbOF0gKiB6ICsgYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzFdICogeCArIGFbNV0gKiB5ICsgYVs5XSAqIHogKyBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMl0gKiB4ICsgYVs2XSAqIHkgKyBhWzEwXSAqIHogKyBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGFbM10gKiB4ICsgYVs3XSAqIHkgKyBhWzExXSAqIHogKyBhWzE1XTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhMDAgPSBhWzBdOyBhMDEgPSBhWzFdOyBhMDIgPSBhWzJdOyBhMDMgPSBhWzNdO1xuICAgICAgICBhMTAgPSBhWzRdOyBhMTEgPSBhWzVdOyBhMTIgPSBhWzZdOyBhMTMgPSBhWzddO1xuICAgICAgICBhMjAgPSBhWzhdOyBhMjEgPSBhWzldOyBhMjIgPSBhWzEwXTsgYTIzID0gYVsxMV07XG5cbiAgICAgICAgb3V0WzBdID0gYTAwOyBvdXRbMV0gPSBhMDE7IG91dFsyXSA9IGEwMjsgb3V0WzNdID0gYTAzO1xuICAgICAgICBvdXRbNF0gPSBhMTA7IG91dFs1XSA9IGExMTsgb3V0WzZdID0gYTEyOyBvdXRbN10gPSBhMTM7XG4gICAgICAgIG91dFs4XSA9IGEyMDsgb3V0WzldID0gYTIxOyBvdXRbMTBdID0gYTIyOyBvdXRbMTFdID0gYTIzO1xuXG4gICAgICAgIG91dFsxMl0gPSBhMDAgKiB4ICsgYTEwICogeSArIGEyMCAqIHogKyBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGEwMSAqIHggKyBhMTEgKiB5ICsgYTIxICogeiArIGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYTAyICogeCArIGExMiAqIHkgKyBhMjIgKiB6ICsgYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhMDMgKiB4ICsgYTEzICogeSArIGEyMyAqIHogKyBhWzE1XTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHBhcnNlRXJyb3JzXG5cbmZ1bmN0aW9uIHBhcnNlRXJyb3JzKGxvZykge1xuICBsb2cgPSBTdHJpbmcobG9nKVxuXG4gIHZhciBsb2dzID0gW11cbiAgdmFyIHJlc3VsdFxuXG4gIHdoaWxlIChyZXN1bHQgPSBsb2cubWF0Y2goL0VSUk9SXFw6KFteXFxuXSspLykpIHtcbiAgICBsb2cgPSBsb2cuc2xpY2UocmVzdWx0LmluZGV4ICsgMSlcblxuICAgIHZhciBsaW5lID0gcmVzdWx0WzFdLnRyaW0oKVxuICAgIHZhciBzZXBzID0gbGluZS5zcGxpdCgnOicpXG4gICAgdmFyIGVtc2cgPSBzZXBzLnNsaWNlKDIpLmpvaW4oJzonKS50cmltKClcbiAgICB2YXIgZmlsZSA9IHBhcnNlSW50KHNlcHNbMF0sIDEwKVxuICAgIHZhciBsaW5lID0gcGFyc2VJbnQoc2Vwc1sxXSwgMTApXG5cbiAgICBsb2dzLnB1c2goe1xuICAgICAgICBtZXNzYWdlOiBlbXNnXG4gICAgICAsIGZpbGU6IGZpbGVcbiAgICAgICwgbGluZTogbGluZVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gbG9nc1xufVxuIiwiZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIi8qIVxuICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlclxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKGlzQnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikgfHwgISFvYmouX2lzQnVmZmVyKVxufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiAhIW9iai5jb25zdHJ1Y3RvciAmJiB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopXG59XG5cbi8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuXG5mdW5jdGlvbiBpc1Nsb3dCdWZmZXIgKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnNsaWNlID09PSAnZnVuY3Rpb24nICYmIGlzQnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB5YW1sID0gcmVxdWlyZSgnLi9saWIvanMteWFtbC5qcycpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0geWFtbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbG9hZGVyID0gcmVxdWlyZSgnLi9qcy15YW1sL2xvYWRlcicpO1xuLy8gdmFyIGR1bXBlciA9IHJlcXVpcmUoJy4vanMteWFtbC9kdW1wZXInKTtcblxuXG5mdW5jdGlvbiBkZXByZWNhdGVkKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uICcgKyBuYW1lICsgJyBpcyBkZXByZWNhdGVkIGFuZCBjYW5ub3QgYmUgdXNlZC4nKTtcbiAgfTtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cy5UeXBlICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3R5cGUnKTtcbm1vZHVsZS5leHBvcnRzLlNjaGVtYSAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hJyk7XG5tb2R1bGUuZXhwb3J0cy5GQUlMU0FGRV9TQ0hFTUEgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuSlNPTl9TQ0hFTUEgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvanNvbicpO1xubW9kdWxlLmV4cG9ydHMuQ09SRV9TQ0hFTUEgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvY29yZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5ERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcbm1vZHVsZS5leHBvcnRzLmxvYWQgICAgICAgICAgICAgICAgPSBsb2FkZXIubG9hZDtcbm1vZHVsZS5leHBvcnRzLmxvYWRBbGwgICAgICAgICAgICAgPSBsb2FkZXIubG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkICAgICAgICAgICAgPSBsb2FkZXIuc2FmZUxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZEFsbCAgICAgICAgID0gbG9hZGVyLnNhZmVMb2FkQWxsO1xuLy8gbW9kdWxlLmV4cG9ydHMuZHVtcCAgICAgICAgICAgICAgICA9IGR1bXBlci5kdW1wO1xuLy8gbW9kdWxlLmV4cG9ydHMuc2FmZUR1bXAgICAgICAgICAgICA9IGR1bXBlci5zYWZlRHVtcDtcbm1vZHVsZS5leHBvcnRzLllBTUxFeGNlcHRpb24gICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvZXhjZXB0aW9uJyk7XG5cbi8vIERlcHJlY2F0ZWQgc2NoZW1hIG5hbWVzIGZyb20gSlMtWUFNTCAyLjAueFxubW9kdWxlLmV4cG9ydHMuTUlOSU1BTF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5TQUZFX1NDSEVNQSAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5ERUZBVUxUX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5cbi8vIERlcHJlY2F0ZWQgZnVuY3Rpb25zIGZyb20gSlMtWUFNTCAxLngueFxubW9kdWxlLmV4cG9ydHMuc2NhbiAgICAgICAgICAgPSBkZXByZWNhdGVkKCdzY2FuJyk7XG5tb2R1bGUuZXhwb3J0cy5wYXJzZSAgICAgICAgICA9IGRlcHJlY2F0ZWQoJ3BhcnNlJyk7XG5tb2R1bGUuZXhwb3J0cy5jb21wb3NlICAgICAgICA9IGRlcHJlY2F0ZWQoJ2NvbXBvc2UnKTtcbm1vZHVsZS5leHBvcnRzLmFkZENvbnN0cnVjdG9yID0gZGVwcmVjYXRlZCgnYWRkQ29uc3RydWN0b3InKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5mdW5jdGlvbiBpc05vdGhpbmcoc3ViamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBzdWJqZWN0ID09PSAndW5kZWZpbmVkJykgfHwgKHN1YmplY3QgPT09IG51bGwpO1xufVxuXG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHN1YmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygc3ViamVjdCA9PT0gJ29iamVjdCcpICYmIChzdWJqZWN0ICE9PSBudWxsKTtcbn1cblxuXG5mdW5jdGlvbiB0b0FycmF5KHNlcXVlbmNlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHNlcXVlbmNlKSkgcmV0dXJuIHNlcXVlbmNlO1xuICBlbHNlIGlmIChpc05vdGhpbmcoc2VxdWVuY2UpKSByZXR1cm4gW107XG5cbiAgcmV0dXJuIFsgc2VxdWVuY2UgXTtcbn1cblxuXG5mdW5jdGlvbiBleHRlbmQodGFyZ2V0LCBzb3VyY2UpIHtcbiAgdmFyIGluZGV4LCBsZW5ndGgsIGtleSwgc291cmNlS2V5cztcblxuICBpZiAoc291cmNlKSB7XG4gICAgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cbiAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gc291cmNlS2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBrZXkgPSBzb3VyY2VLZXlzW2luZGV4XTtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuXG5mdW5jdGlvbiByZXBlYXQoc3RyaW5nLCBjb3VudCkge1xuICB2YXIgcmVzdWx0ID0gJycsIGN5Y2xlO1xuXG4gIGZvciAoY3ljbGUgPSAwOyBjeWNsZSA8IGNvdW50OyBjeWNsZSArPSAxKSB7XG4gICAgcmVzdWx0ICs9IHN0cmluZztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuZnVuY3Rpb24gaXNOZWdhdGl2ZVplcm8obnVtYmVyKSB7XG4gIHJldHVybiAobnVtYmVyID09PSAwKSAmJiAoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZID09PSAxIC8gbnVtYmVyKTtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cy5pc05vdGhpbmcgICAgICA9IGlzTm90aGluZztcbm1vZHVsZS5leHBvcnRzLmlzT2JqZWN0ICAgICAgID0gaXNPYmplY3Q7XG5tb2R1bGUuZXhwb3J0cy50b0FycmF5ICAgICAgICA9IHRvQXJyYXk7XG5tb2R1bGUuZXhwb3J0cy5yZXBlYXQgICAgICAgICA9IHJlcGVhdDtcbm1vZHVsZS5leHBvcnRzLmlzTmVnYXRpdmVaZXJvID0gaXNOZWdhdGl2ZVplcm87XG5tb2R1bGUuZXhwb3J0cy5leHRlbmQgICAgICAgICA9IGV4dGVuZDtcbiIsIi8vIFlBTUwgZXJyb3IgY2xhc3MuIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvODQ1ODk4NFxuLy9cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gWUFNTEV4Y2VwdGlvbihyZWFzb24sIG1hcmspIHtcbiAgLy8gU3VwZXIgY29uc3RydWN0b3JcbiAgRXJyb3IuY2FsbCh0aGlzKTtcblxuICAvLyBJbmNsdWRlIHN0YWNrIHRyYWNlIGluIGVycm9yIG9iamVjdFxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAvLyBDaHJvbWUgYW5kIE5vZGVKU1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9IGVsc2Uge1xuICAgIC8vIEZGLCBJRSAxMCsgYW5kIFNhZmFyaSA2Ky4gRmFsbGJhY2sgZm9yIG90aGVyc1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrIHx8ICcnO1xuICB9XG5cbiAgdGhpcy5uYW1lID0gJ1lBTUxFeGNlcHRpb24nO1xuICB0aGlzLnJlYXNvbiA9IHJlYXNvbjtcbiAgdGhpcy5tYXJrID0gbWFyaztcbiAgdGhpcy5tZXNzYWdlID0gKHRoaXMucmVhc29uIHx8ICcodW5rbm93biByZWFzb24pJykgKyAodGhpcy5tYXJrID8gJyAnICsgdGhpcy5tYXJrLnRvU3RyaW5nKCkgOiAnJyk7XG59XG5cblxuLy8gSW5oZXJpdCBmcm9tIEVycm9yXG5ZQU1MRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbllBTUxFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gWUFNTEV4Y2VwdGlvbjtcblxuXG5ZQU1MRXhjZXB0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGNvbXBhY3QpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMubmFtZSArICc6ICc7XG5cbiAgcmVzdWx0ICs9IHRoaXMucmVhc29uIHx8ICcodW5rbm93biByZWFzb24pJztcblxuICBpZiAoIWNvbXBhY3QgJiYgdGhpcy5tYXJrKSB7XG4gICAgcmVzdWx0ICs9ICcgJyArIHRoaXMubWFyay50b1N0cmluZygpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBZQU1MRXhjZXB0aW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG1heC1sZW4sbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuXG52YXIgY29tbW9uICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgWUFNTEV4Y2VwdGlvbiAgICAgICA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG52YXIgTWFyayAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vbWFyaycpO1xudmFyIERFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbnZhciBERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZSgnLi9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5cblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cblxudmFyIENPTlRFWFRfRkxPV19JTiAgID0gMTtcbnZhciBDT05URVhUX0ZMT1dfT1VUICA9IDI7XG52YXIgQ09OVEVYVF9CTE9DS19JTiAgPSAzO1xudmFyIENPTlRFWFRfQkxPQ0tfT1VUID0gNDtcblxuXG52YXIgQ0hPTVBJTkdfQ0xJUCAgPSAxO1xudmFyIENIT01QSU5HX1NUUklQID0gMjtcbnZhciBDSE9NUElOR19LRUVQICA9IDM7XG5cblxudmFyIFBBVFRFUk5fTk9OX1BSSU5UQUJMRSAgICAgICAgID0gL1tcXHgwMC1cXHgwOFxceDBCXFx4MENcXHgwRS1cXHgxRlxceDdGLVxceDg0XFx4ODYtXFx4OUZcXHVGRkZFXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0vO1xudmFyIFBBVFRFUk5fTk9OX0FTQ0lJX0xJTkVfQlJFQUtTID0gL1tcXHg4NVxcdTIwMjhcXHUyMDI5XS87XG52YXIgUEFUVEVSTl9GTE9XX0lORElDQVRPUlMgICAgICAgPSAvWyxcXFtcXF1cXHtcXH1dLztcbnZhciBQQVRURVJOX1RBR19IQU5ETEUgICAgICAgICAgICA9IC9eKD86IXwhIXwhW2EtelxcLV0rISkkL2k7XG52YXIgUEFUVEVSTl9UQUdfVVJJICAgICAgICAgICAgICAgPSAvXig/OiF8W14sXFxbXFxdXFx7XFx9XSkoPzolWzAtOWEtZl17Mn18WzAtOWEtelxcLSM7XFwvXFw/OkAmPVxcK1xcJCxfXFwuIX5cXConXFwoXFwpXFxbXFxdXSkqJC9pO1xuXG5cbmZ1bmN0aW9uIGlzX0VPTChjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwQS8qIExGICovKSB8fCAoYyA9PT0gMHgwRC8qIENSICovKTtcbn1cblxuZnVuY3Rpb24gaXNfV0hJVEVfU1BBQ0UoYykge1xuICByZXR1cm4gKGMgPT09IDB4MDkvKiBUYWIgKi8pIHx8IChjID09PSAweDIwLyogU3BhY2UgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19XU19PUl9FT0woYykge1xuICByZXR1cm4gKGMgPT09IDB4MDkvKiBUYWIgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgyMC8qIFNwYWNlICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MEEvKiBMRiAqLykgfHxcbiAgICAgICAgIChjID09PSAweDBELyogQ1IgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19GTE9XX0lORElDQVRPUihjKSB7XG4gIHJldHVybiBjID09PSAweDJDLyogLCAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg1Qi8qIFsgKi8gfHxcbiAgICAgICAgIGMgPT09IDB4NUQvKiBdICovIHx8XG4gICAgICAgICBjID09PSAweDdCLyogeyAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg3RC8qIH0gKi87XG59XG5cbmZ1bmN0aW9uIGZyb21IZXhDb2RlKGMpIHtcbiAgdmFyIGxjO1xuXG4gIGlmICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB7XG4gICAgcmV0dXJuIGMgLSAweDMwO1xuICB9XG5cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlKi9cbiAgbGMgPSBjIHwgMHgyMDtcblxuICBpZiAoKDB4NjEvKiBhICovIDw9IGxjKSAmJiAobGMgPD0gMHg2Ni8qIGYgKi8pKSB7XG4gICAgcmV0dXJuIGxjIC0gMHg2MSArIDEwO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVkSGV4TGVuKGMpIHtcbiAgaWYgKGMgPT09IDB4NzgvKiB4ICovKSB7IHJldHVybiAyOyB9XG4gIGlmIChjID09PSAweDc1LyogdSAqLykgeyByZXR1cm4gNDsgfVxuICBpZiAoYyA9PT0gMHg1NS8qIFUgKi8pIHsgcmV0dXJuIDg7IH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGZyb21EZWNpbWFsQ29kZShjKSB7XG4gIGlmICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB7XG4gICAgcmV0dXJuIGMgLSAweDMwO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVFc2NhcGVTZXF1ZW5jZShjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgzMC8qIDAgKi8pID8gJ1xceDAwJyA6XG4gICAgICAgIChjID09PSAweDYxLyogYSAqLykgPyAnXFx4MDcnIDpcbiAgICAgICAgKGMgPT09IDB4NjIvKiBiICovKSA/ICdcXHgwOCcgOlxuICAgICAgICAoYyA9PT0gMHg3NC8qIHQgKi8pID8gJ1xceDA5JyA6XG4gICAgICAgIChjID09PSAweDA5LyogVGFiICovKSA/ICdcXHgwOScgOlxuICAgICAgICAoYyA9PT0gMHg2RS8qIG4gKi8pID8gJ1xceDBBJyA6XG4gICAgICAgIChjID09PSAweDc2LyogdiAqLykgPyAnXFx4MEInIDpcbiAgICAgICAgKGMgPT09IDB4NjYvKiBmICovKSA/ICdcXHgwQycgOlxuICAgICAgICAoYyA9PT0gMHg3Mi8qIHIgKi8pID8gJ1xceDBEJyA6XG4gICAgICAgIChjID09PSAweDY1LyogZSAqLykgPyAnXFx4MUInIDpcbiAgICAgICAgKGMgPT09IDB4MjAvKiBTcGFjZSAqLykgPyAnICcgOlxuICAgICAgICAoYyA9PT0gMHgyMi8qIFwiICovKSA/ICdcXHgyMicgOlxuICAgICAgICAoYyA9PT0gMHgyRi8qIC8gKi8pID8gJy8nIDpcbiAgICAgICAgKGMgPT09IDB4NUMvKiBcXCAqLykgPyAnXFx4NUMnIDpcbiAgICAgICAgKGMgPT09IDB4NEUvKiBOICovKSA/ICdcXHg4NScgOlxuICAgICAgICAoYyA9PT0gMHg1Ri8qIF8gKi8pID8gJ1xceEEwJyA6XG4gICAgICAgIChjID09PSAweDRDLyogTCAqLykgPyAnXFx1MjAyOCcgOlxuICAgICAgICAoYyA9PT0gMHg1MC8qIFAgKi8pID8gJ1xcdTIwMjknIDogJyc7XG59XG5cbmZ1bmN0aW9uIGNoYXJGcm9tQ29kZXBvaW50KGMpIHtcbiAgaWYgKGMgPD0gMHhGRkZGKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gIH1cbiAgLy8gRW5jb2RlIFVURi0xNiBzdXJyb2dhdGUgcGFpclxuICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYjQ29kZV9wb2ludHNfVS4yQjAxMDAwMF90b19VLjJCMTBGRkZGXG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAtIDB4MDEwMDAwKSA+PiAxMCkgKyAweEQ4MDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyAtIDB4MDEwMDAwKSAmIDB4MDNGRikgKyAweERDMDApO1xufVxuXG52YXIgc2ltcGxlRXNjYXBlQ2hlY2sgPSBuZXcgQXJyYXkoMjU2KTsgLy8gaW50ZWdlciwgZm9yIGZhc3QgYWNjZXNzXG52YXIgc2ltcGxlRXNjYXBlTWFwID0gbmV3IEFycmF5KDI1Nik7XG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gIHNpbXBsZUVzY2FwZUNoZWNrW2ldID0gc2ltcGxlRXNjYXBlU2VxdWVuY2UoaSkgPyAxIDogMDtcbiAgc2ltcGxlRXNjYXBlTWFwW2ldID0gc2ltcGxlRXNjYXBlU2VxdWVuY2UoaSk7XG59XG5cblxuZnVuY3Rpb24gU3RhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gIHRoaXMuZmlsZW5hbWUgID0gb3B0aW9uc1snZmlsZW5hbWUnXSAgfHwgbnVsbDtcbiAgdGhpcy5zY2hlbWEgICAgPSBvcHRpb25zWydzY2hlbWEnXSAgICB8fCBERUZBVUxUX0ZVTExfU0NIRU1BO1xuICB0aGlzLm9uV2FybmluZyA9IG9wdGlvbnNbJ29uV2FybmluZyddIHx8IG51bGw7XG4gIHRoaXMubGVnYWN5ICAgID0gb3B0aW9uc1snbGVnYWN5J10gICAgfHwgZmFsc2U7XG4gIHRoaXMuanNvbiAgICAgID0gb3B0aW9uc1snanNvbiddICAgICAgfHwgZmFsc2U7XG4gIHRoaXMubGlzdGVuZXIgID0gb3B0aW9uc1snbGlzdGVuZXInXSAgfHwgbnVsbDtcblxuICB0aGlzLmltcGxpY2l0VHlwZXMgPSB0aGlzLnNjaGVtYS5jb21waWxlZEltcGxpY2l0O1xuICB0aGlzLnR5cGVNYXAgICAgICAgPSB0aGlzLnNjaGVtYS5jb21waWxlZFR5cGVNYXA7XG5cbiAgdGhpcy5sZW5ndGggICAgID0gaW5wdXQubGVuZ3RoO1xuICB0aGlzLnBvc2l0aW9uICAgPSAwO1xuICB0aGlzLmxpbmUgICAgICAgPSAwO1xuICB0aGlzLmxpbmVTdGFydCAgPSAwO1xuICB0aGlzLmxpbmVJbmRlbnQgPSAwO1xuXG4gIHRoaXMuZG9jdW1lbnRzID0gW107XG5cbiAgLypcbiAgdGhpcy52ZXJzaW9uO1xuICB0aGlzLmNoZWNrTGluZUJyZWFrcztcbiAgdGhpcy50YWdNYXA7XG4gIHRoaXMuYW5jaG9yTWFwO1xuICB0aGlzLnRhZztcbiAgdGhpcy5hbmNob3I7XG4gIHRoaXMua2luZDtcbiAgdGhpcy5yZXN1bHQ7Ki9cblxufVxuXG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UpIHtcbiAgcmV0dXJuIG5ldyBZQU1MRXhjZXB0aW9uKFxuICAgIG1lc3NhZ2UsXG4gICAgbmV3IE1hcmsoc3RhdGUuZmlsZW5hbWUsIHN0YXRlLmlucHV0LCBzdGF0ZS5wb3NpdGlvbiwgc3RhdGUubGluZSwgKHN0YXRlLnBvc2l0aW9uIC0gc3RhdGUubGluZVN0YXJ0KSkpO1xufVxuXG5mdW5jdGlvbiB0aHJvd0Vycm9yKHN0YXRlLCBtZXNzYWdlKSB7XG4gIHRocm93IGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiB0aHJvd1dhcm5pbmcoc3RhdGUsIG1lc3NhZ2UpIHtcbiAgaWYgKHN0YXRlLm9uV2FybmluZykge1xuICAgIHN0YXRlLm9uV2FybmluZy5jYWxsKG51bGwsIGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UpKTtcbiAgfVxufVxuXG5cbnZhciBkaXJlY3RpdmVIYW5kbGVycyA9IHtcblxuICBZQU1MOiBmdW5jdGlvbiBoYW5kbGVZYW1sRGlyZWN0aXZlKHN0YXRlLCBuYW1lLCBhcmdzKSB7XG5cbiAgICB2YXIgbWF0Y2gsIG1ham9yLCBtaW5vcjtcblxuICAgIGlmIChzdGF0ZS52ZXJzaW9uICE9PSBudWxsKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgJVlBTUwgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnWUFNTCBkaXJlY3RpdmUgYWNjZXB0cyBleGFjdGx5IG9uZSBhcmd1bWVudCcpO1xuICAgIH1cblxuICAgIG1hdGNoID0gL14oWzAtOV0rKVxcLihbMC05XSspJC8uZXhlYyhhcmdzWzBdKTtcblxuICAgIGlmIChtYXRjaCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2lsbC1mb3JtZWQgYXJndW1lbnQgb2YgdGhlIFlBTUwgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgbWFqb3IgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICAgIG1pbm9yID0gcGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcblxuICAgIGlmIChtYWpvciAhPT0gMSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuYWNjZXB0YWJsZSBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50Jyk7XG4gICAgfVxuXG4gICAgc3RhdGUudmVyc2lvbiA9IGFyZ3NbMF07XG4gICAgc3RhdGUuY2hlY2tMaW5lQnJlYWtzID0gKG1pbm9yIDwgMik7XG5cbiAgICBpZiAobWlub3IgIT09IDEgJiYgbWlub3IgIT09IDIpIHtcbiAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ3Vuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQnKTtcbiAgICB9XG4gIH0sXG5cbiAgVEFHOiBmdW5jdGlvbiBoYW5kbGVUYWdEaXJlY3RpdmUoc3RhdGUsIG5hbWUsIGFyZ3MpIHtcblxuICAgIHZhciBoYW5kbGUsIHByZWZpeDtcblxuICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ1RBRyBkaXJlY3RpdmUgYWNjZXB0cyBleGFjdGx5IHR3byBhcmd1bWVudHMnKTtcbiAgICB9XG5cbiAgICBoYW5kbGUgPSBhcmdzWzBdO1xuICAgIHByZWZpeCA9IGFyZ3NbMV07XG5cbiAgICBpZiAoIVBBVFRFUk5fVEFHX0hBTkRMRS50ZXN0KGhhbmRsZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIHRhZyBoYW5kbGUgKGZpcnN0IGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50YWdNYXAsIGhhbmRsZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0aGVyZSBpcyBhIHByZXZpb3VzbHkgZGVjbGFyZWQgc3VmZml4IGZvciBcIicgKyBoYW5kbGUgKyAnXCIgdGFnIGhhbmRsZScpO1xuICAgIH1cblxuICAgIGlmICghUEFUVEVSTl9UQUdfVVJJLnRlc3QocHJlZml4KSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2lsbC1mb3JtZWQgdGFnIHByZWZpeCAoc2Vjb25kIGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIHN0YXRlLnRhZ01hcFtoYW5kbGVdID0gcHJlZml4O1xuICB9XG59O1xuXG5cbmZ1bmN0aW9uIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBzdGFydCwgZW5kLCBjaGVja0pzb24pIHtcbiAgdmFyIF9wb3NpdGlvbiwgX2xlbmd0aCwgX2NoYXJhY3RlciwgX3Jlc3VsdDtcblxuICBpZiAoc3RhcnQgPCBlbmQpIHtcbiAgICBfcmVzdWx0ID0gc3RhdGUuaW5wdXQuc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgICBpZiAoY2hlY2tKc29uKSB7XG4gICAgICBmb3IgKF9wb3NpdGlvbiA9IDAsIF9sZW5ndGggPSBfcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgICAgX3Bvc2l0aW9uIDwgX2xlbmd0aDtcbiAgICAgICAgICAgX3Bvc2l0aW9uICs9IDEpIHtcbiAgICAgICAgX2NoYXJhY3RlciA9IF9yZXN1bHQuY2hhckNvZGVBdChfcG9zaXRpb24pO1xuICAgICAgICBpZiAoIShfY2hhcmFjdGVyID09PSAweDA5IHx8XG4gICAgICAgICAgICAgICgweDIwIDw9IF9jaGFyYWN0ZXIgJiYgX2NoYXJhY3RlciA8PSAweDEwRkZGRikpKSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2V4cGVjdGVkIHZhbGlkIEpTT04gY2hhcmFjdGVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFBBVFRFUk5fTk9OX1BSSU5UQUJMRS50ZXN0KF9yZXN1bHQpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGhlIHN0cmVhbSBjb250YWlucyBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS5yZXN1bHQgKz0gX3Jlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtZXJnZU1hcHBpbmdzKHN0YXRlLCBkZXN0aW5hdGlvbiwgc291cmNlLCBvdmVycmlkYWJsZUtleXMpIHtcbiAgdmFyIHNvdXJjZUtleXMsIGtleSwgaW5kZXgsIHF1YW50aXR5O1xuXG4gIGlmICghY29tbW9uLmlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2Fubm90IG1lcmdlIG1hcHBpbmdzOyB0aGUgcHJvdmlkZWQgc291cmNlIG9iamVjdCBpcyB1bmFjY2VwdGFibGUnKTtcbiAgfVxuXG4gIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBxdWFudGl0eSA9IHNvdXJjZUtleXMubGVuZ3RoOyBpbmRleCA8IHF1YW50aXR5OyBpbmRleCArPSAxKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpbmRleF07XG5cbiAgICBpZiAoIV9oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlc3RpbmF0aW9uLCBrZXkpKSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gc291cmNlW2tleV07XG4gICAgICBvdmVycmlkYWJsZUtleXNba2V5XSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpIHtcbiAgdmFyIGluZGV4LCBxdWFudGl0eTtcblxuICBrZXlOb2RlID0gU3RyaW5nKGtleU5vZGUpO1xuXG4gIGlmIChfcmVzdWx0ID09PSBudWxsKSB7XG4gICAgX3Jlc3VsdCA9IHt9O1xuICB9XG5cbiAgaWYgKGtleVRhZyA9PT0gJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlTm9kZSkpIHtcbiAgICAgIGZvciAoaW5kZXggPSAwLCBxdWFudGl0eSA9IHZhbHVlTm9kZS5sZW5ndGg7IGluZGV4IDwgcXVhbnRpdHk7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgX3Jlc3VsdCwgdmFsdWVOb2RlW2luZGV4XSwgb3ZlcnJpZGFibGVLZXlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgX3Jlc3VsdCwgdmFsdWVOb2RlLCBvdmVycmlkYWJsZUtleXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoIXN0YXRlLmpzb24gJiZcbiAgICAgICAgIV9oYXNPd25Qcm9wZXJ0eS5jYWxsKG92ZXJyaWRhYmxlS2V5cywga2V5Tm9kZSkgJiZcbiAgICAgICAgX2hhc093blByb3BlcnR5LmNhbGwoX3Jlc3VsdCwga2V5Tm9kZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGVkIG1hcHBpbmcga2V5Jyk7XG4gICAgfVxuICAgIF9yZXN1bHRba2V5Tm9kZV0gPSB2YWx1ZU5vZGU7XG4gICAgZGVsZXRlIG92ZXJyaWRhYmxlS2V5c1trZXlOb2RlXTtcbiAgfVxuXG4gIHJldHVybiBfcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZWFkTGluZUJyZWFrKHN0YXRlKSB7XG4gIHZhciBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHgwQS8qIExGICovKSB7XG4gICAgc3RhdGUucG9zaXRpb24rKztcbiAgfSBlbHNlIGlmIChjaCA9PT0gMHgwRC8qIENSICovKSB7XG4gICAgc3RhdGUucG9zaXRpb24rKztcbiAgICBpZiAoc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgPT09IDB4MEEvKiBMRiAqLykge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2EgbGluZSBicmVhayBpcyBleHBlY3RlZCcpO1xuICB9XG5cbiAgc3RhdGUubGluZSArPSAxO1xuICBzdGF0ZS5saW5lU3RhcnQgPSBzdGF0ZS5wb3NpdGlvbjtcbn1cblxuZnVuY3Rpb24gc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgYWxsb3dDb21tZW50cywgY2hlY2tJbmRlbnQpIHtcbiAgdmFyIGxpbmVCcmVha3MgPSAwLFxuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKGFsbG93Q29tbWVudHMgJiYgY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIH0gd2hpbGUgKGNoICE9PSAweDBBLyogTEYgKi8gJiYgY2ggIT09IDB4MEQvKiBDUiAqLyAmJiBjaCAhPT0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIHJlYWRMaW5lQnJlYWsoc3RhdGUpO1xuXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgICAgbGluZUJyZWFrcysrO1xuICAgICAgc3RhdGUubGluZUluZGVudCA9IDA7XG5cbiAgICAgIHdoaWxlIChjaCA9PT0gMHgyMC8qIFNwYWNlICovKSB7XG4gICAgICAgIHN0YXRlLmxpbmVJbmRlbnQrKztcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoY2hlY2tJbmRlbnQgIT09IC0xICYmIGxpbmVCcmVha3MgIT09IDAgJiYgc3RhdGUubGluZUluZGVudCA8IGNoZWNrSW5kZW50KSB7XG4gICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAnZGVmaWNpZW50IGluZGVudGF0aW9uJyk7XG4gIH1cblxuICByZXR1cm4gbGluZUJyZWFrcztcbn1cblxuZnVuY3Rpb24gdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbixcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24pO1xuXG4gIC8vIENvbmRpdGlvbiBzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0IGlzIHRlc3RlZFxuICAvLyBpbiBwYXJlbnQgb24gZWFjaCBjYWxsLCBmb3IgZWZmaWNpZW5jeS4gTm8gbmVlZHMgdG8gdGVzdCBoZXJlIGFnYWluLlxuICBpZiAoKGNoID09PSAweDJELyogLSAqLyB8fCBjaCA9PT0gMHgyRS8qIC4gKi8pICYmXG4gICAgICBjaCA9PT0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24gKyAxKSAmJlxuICAgICAgY2ggPT09IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uICsgMikpIHtcblxuICAgIF9wb3NpdGlvbiArPSAzO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDAgfHwgaXNfV1NfT1JfRU9MKGNoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBjb3VudCkge1xuICBpZiAoY291bnQgPT09IDEpIHtcbiAgICBzdGF0ZS5yZXN1bHQgKz0gJyAnO1xuICB9IGVsc2UgaWYgKGNvdW50ID4gMSkge1xuICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBjb3VudCAtIDEpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gcmVhZFBsYWluU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50LCB3aXRoaW5GbG93Q29sbGVjdGlvbikge1xuICB2YXIgcHJlY2VkaW5nLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgY2FwdHVyZVN0YXJ0LFxuICAgICAgY2FwdHVyZUVuZCxcbiAgICAgIGhhc1BlbmRpbmdDb250ZW50LFxuICAgICAgX2xpbmUsXG4gICAgICBfbGluZVN0YXJ0LFxuICAgICAgX2xpbmVJbmRlbnQsXG4gICAgICBfa2luZCA9IHN0YXRlLmtpbmQsXG4gICAgICBfcmVzdWx0ID0gc3RhdGUucmVzdWx0LFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoaXNfV1NfT1JfRU9MKGNoKSAgICAgIHx8XG4gICAgICBpc19GTE9XX0lORElDQVRPUihjaCkgfHxcbiAgICAgIGNoID09PSAweDIzLyogIyAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjYvKiAmICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyQS8qICogKi8gICAgfHxcbiAgICAgIGNoID09PSAweDIxLyogISAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4N0MvKiB8ICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgzRS8qID4gKi8gICAgfHxcbiAgICAgIGNoID09PSAweDI3LyogJyAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjIvKiBcIiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjUvKiAlICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg0MC8qIEAgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDYwLyogYCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChjaCA9PT0gMHgzRi8qID8gKi8gfHwgY2ggPT09IDB4MkQvKiAtICovKSB7XG4gICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpIHx8XG4gICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGZvbGxvd2luZykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gIGhhc1BlbmRpbmdDb250ZW50ID0gZmFsc2U7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgaWYgKGNoID09PSAweDNBLyogOiAqLykge1xuICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykgfHxcbiAgICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihmb2xsb3dpbmcpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIHByZWNlZGluZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gLSAxKTtcblxuICAgICAgaWYgKGlzX1dTX09SX0VPTChwcmVjZWRpbmcpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICgoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB8fFxuICAgICAgICAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7XG4gICAgICBicmVhaztcblxuICAgIH0gZWxzZSBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgX2xpbmUgPSBzdGF0ZS5saW5lO1xuICAgICAgX2xpbmVTdGFydCA9IHN0YXRlLmxpbmVTdGFydDtcbiAgICAgIF9saW5lSW5kZW50ID0gc3RhdGUubGluZUluZGVudDtcbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCAtMSk7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID49IG5vZGVJbmRlbnQpIHtcbiAgICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSB0cnVlO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uID0gY2FwdHVyZUVuZDtcbiAgICAgICAgc3RhdGUubGluZSA9IF9saW5lO1xuICAgICAgICBzdGF0ZS5saW5lU3RhcnQgPSBfbGluZVN0YXJ0O1xuICAgICAgICBzdGF0ZS5saW5lSW5kZW50ID0gX2xpbmVJbmRlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNQZW5kaW5nQ29udGVudCkge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgZmFsc2UpO1xuICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc3RhdGUubGluZSAtIF9saW5lKTtcbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICAgIGhhc1BlbmRpbmdDb250ZW50ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbiArIDE7XG4gICAgfVxuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICB9XG5cbiAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgZmFsc2UpO1xuXG4gIGlmIChzdGF0ZS5yZXN1bHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSBfa2luZDtcbiAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWFkU2luZ2xlUXVvdGVkU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBjaCxcbiAgICAgIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyNy8qICcgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuICBzdGF0ZS5wb3NpdGlvbisrO1xuICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkge1xuICAgIGlmIChjaCA9PT0gMHgyNy8qICcgKi8pIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgaWYgKGNoID09PSAweDI3LyogJyAqLykge1xuICAgICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgdHJ1ZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgbm9kZUluZGVudCkpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIGEgc2luZ2xlIHF1b3RlZCBzY2FsYXInKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWREb3VibGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNhcHR1cmVTdGFydCxcbiAgICAgIGNhcHR1cmVFbmQsXG4gICAgICBoZXhMZW5ndGgsXG4gICAgICBoZXhSZXN1bHQsXG4gICAgICB0bXAsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyMi8qIFwiICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcbiAgc3RhdGUucG9zaXRpb24rKztcbiAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4MjIvKiBcIiAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gMHg1Qy8qIFxcICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KTtcblxuICAgICAgICAvLyBUT0RPOiByZXdvcmsgdG8gaW5saW5lIGZuIHdpdGggbm8gdHlwZSBjYXN0P1xuICAgICAgfSBlbHNlIGlmIChjaCA8IDI1NiAmJiBzaW1wbGVFc2NhcGVDaGVja1tjaF0pIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IHNpbXBsZUVzY2FwZU1hcFtjaF07XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICAgIH0gZWxzZSBpZiAoKHRtcCA9IGVzY2FwZWRIZXhMZW4oY2gpKSA+IDApIHtcbiAgICAgICAgaGV4TGVuZ3RoID0gdG1wO1xuICAgICAgICBoZXhSZXN1bHQgPSAwO1xuXG4gICAgICAgIGZvciAoOyBoZXhMZW5ndGggPiAwOyBoZXhMZW5ndGgtLSkge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgICAgIGlmICgodG1wID0gZnJvbUhleENvZGUoY2gpKSA+PSAwKSB7XG4gICAgICAgICAgICBoZXhSZXN1bHQgPSAoaGV4UmVzdWx0IDw8IDQpICsgdG1wO1xuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdleHBlY3RlZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY2hhckZyb21Db2RlcG9pbnQoaGV4UmVzdWx0KTtcblxuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5rbm93biBlc2NhcGUgc2VxdWVuY2UnKTtcbiAgICAgIH1cblxuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCB0cnVlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhcicpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgZG91YmxlIHF1b3RlZCBzY2FsYXInKTtcbn1cblxuZnVuY3Rpb24gcmVhZEZsb3dDb2xsZWN0aW9uKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciByZWFkTmV4dCA9IHRydWUsXG4gICAgICBfbGluZSxcbiAgICAgIF90YWcgICAgID0gc3RhdGUudGFnLFxuICAgICAgX3Jlc3VsdCxcbiAgICAgIF9hbmNob3IgID0gc3RhdGUuYW5jaG9yLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgdGVybWluYXRvcixcbiAgICAgIGlzUGFpcixcbiAgICAgIGlzRXhwbGljaXRQYWlyLFxuICAgICAgaXNNYXBwaW5nLFxuICAgICAgb3ZlcnJpZGFibGVLZXlzID0ge30sXG4gICAgICBrZXlOb2RlLFxuICAgICAga2V5VGFnLFxuICAgICAgdmFsdWVOb2RlLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4NUIvKiBbICovKSB7XG4gICAgdGVybWluYXRvciA9IDB4NUQ7LyogXSAqL1xuICAgIGlzTWFwcGluZyA9IGZhbHNlO1xuICAgIF9yZXN1bHQgPSBbXTtcbiAgfSBlbHNlIGlmIChjaCA9PT0gMHg3Qi8qIHsgKi8pIHtcbiAgICB0ZXJtaW5hdG9yID0gMHg3RDsvKiB9ICovXG4gICAgaXNNYXBwaW5nID0gdHJ1ZTtcbiAgICBfcmVzdWx0ID0ge307XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IHRlcm1pbmF0b3IpIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICAgIHN0YXRlLmtpbmQgPSBpc01hcHBpbmcgPyAnbWFwcGluZycgOiAnc2VxdWVuY2UnO1xuICAgICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIXJlYWROZXh0KSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbWlzc2VkIGNvbW1hIGJldHdlZW4gZmxvdyBjb2xsZWN0aW9uIGVudHJpZXMnKTtcbiAgICB9XG5cbiAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICBpc1BhaXIgPSBpc0V4cGxpY2l0UGFpciA9IGZhbHNlO1xuXG4gICAgaWYgKGNoID09PSAweDNGLyogPyAqLykge1xuICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcbiAgICAgICAgaXNQYWlyID0gaXNFeHBsaWNpdFBhaXIgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfRkxPV19JTiwgZmFsc2UsIHRydWUpO1xuICAgIGtleVRhZyA9IHN0YXRlLnRhZztcbiAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmICgoaXNFeHBsaWNpdFBhaXIgfHwgc3RhdGUubGluZSA9PT0gX2xpbmUpICYmIGNoID09PSAweDNBLyogOiAqLykge1xuICAgICAgaXNQYWlyID0gdHJ1ZTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuICAgICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfRkxPV19JTiwgZmFsc2UsIHRydWUpO1xuICAgICAgdmFsdWVOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChpc01hcHBpbmcpIHtcbiAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgIH0gZWxzZSBpZiAoaXNQYWlyKSB7XG4gICAgICBfcmVzdWx0LnB1c2goc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgbnVsbCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfcmVzdWx0LnB1c2goa2V5Tm9kZSk7XG4gICAgfVxuXG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAweDJDLyogLCAqLykge1xuICAgICAgcmVhZE5leHQgPSB0cnVlO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWFkTmV4dCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGZsb3cgY29sbGVjdGlvbicpO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNhcHR1cmVTdGFydCxcbiAgICAgIGZvbGRpbmcsXG4gICAgICBjaG9tcGluZyAgICAgICA9IENIT01QSU5HX0NMSVAsXG4gICAgICBkZXRlY3RlZEluZGVudCA9IGZhbHNlLFxuICAgICAgdGV4dEluZGVudCAgICAgPSBub2RlSW5kZW50LFxuICAgICAgZW1wdHlMaW5lcyAgICAgPSAwLFxuICAgICAgYXRNb3JlSW5kZW50ZWQgPSBmYWxzZSxcbiAgICAgIHRtcCxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDdDLyogfCAqLykge1xuICAgIGZvbGRpbmcgPSBmYWxzZTtcbiAgfSBlbHNlIGlmIChjaCA9PT0gMHgzRS8qID4gKi8pIHtcbiAgICBmb2xkaW5nID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gMHgyQi8qICsgKi8gfHwgY2ggPT09IDB4MkQvKiAtICovKSB7XG4gICAgICBpZiAoQ0hPTVBJTkdfQ0xJUCA9PT0gY2hvbXBpbmcpIHtcbiAgICAgICAgY2hvbXBpbmcgPSAoY2ggPT09IDB4MkIvKiArICovKSA/IENIT01QSU5HX0tFRVAgOiBDSE9NUElOR19TVFJJUDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdyZXBlYXQgb2YgYSBjaG9tcGluZyBtb2RlIGlkZW50aWZpZXInKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoKHRtcCA9IGZyb21EZWNpbWFsQ29kZShjaCkpID49IDApIHtcbiAgICAgIGlmICh0bXAgPT09IDApIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2JhZCBleHBsaWNpdCBpbmRlbnRhdGlvbiB3aWR0aCBvZiBhIGJsb2NrIHNjYWxhcjsgaXQgY2Fubm90IGJlIGxlc3MgdGhhbiBvbmUnKTtcbiAgICAgIH0gZWxzZSBpZiAoIWRldGVjdGVkSW5kZW50KSB7XG4gICAgICAgIHRleHRJbmRlbnQgPSBub2RlSW5kZW50ICsgdG1wIC0gMTtcbiAgICAgICAgZGV0ZWN0ZWRJbmRlbnQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3JlcGVhdCBvZiBhbiBpbmRlbnRhdGlvbiB3aWR0aCBpZGVudGlmaWVyJyk7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSk7XG5cbiAgICBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgICAgd2hpbGUgKCFpc19FT0woY2gpICYmIChjaCAhPT0gMCkpO1xuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHJlYWRMaW5lQnJlYWsoc3RhdGUpO1xuICAgIHN0YXRlLmxpbmVJbmRlbnQgPSAwO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIHdoaWxlICgoIWRldGVjdGVkSW5kZW50IHx8IHN0YXRlLmxpbmVJbmRlbnQgPCB0ZXh0SW5kZW50KSAmJlxuICAgICAgICAgICAoY2ggPT09IDB4MjAvKiBTcGFjZSAqLykpIHtcbiAgICAgIHN0YXRlLmxpbmVJbmRlbnQrKztcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoIWRldGVjdGVkSW5kZW50ICYmIHN0YXRlLmxpbmVJbmRlbnQgPiB0ZXh0SW5kZW50KSB7XG4gICAgICB0ZXh0SW5kZW50ID0gc3RhdGUubGluZUluZGVudDtcbiAgICB9XG5cbiAgICBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgZW1wdHlMaW5lcysrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gRW5kIG9mIHRoZSBzY2FsYXIuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCB0ZXh0SW5kZW50KSB7XG5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIGNob21waW5nLlxuICAgICAgaWYgKGNob21waW5nID09PSBDSE9NUElOR19LRUVQKSB7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hvbXBpbmcgPT09IENIT01QSU5HX0NMSVApIHtcbiAgICAgICAgaWYgKGRldGVjdGVkSW5kZW50KSB7IC8vIGkuZS4gb25seSBpZiB0aGUgc2NhbGFyIGlzIG5vdCBlbXB0eS5cbiAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQnJlYWsgdGhpcyBgd2hpbGVgIGN5Y2xlIGFuZCBnbyB0byB0aGUgZnVuY2l0b24ncyBlcGlsb2d1ZS5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIEZvbGRlZCBzdHlsZTogdXNlIGZhbmN5IHJ1bGVzIHRvIGhhbmRsZSBsaW5lIGJyZWFrcy5cbiAgICBpZiAoZm9sZGluZykge1xuXG4gICAgICAvLyBMaW5lcyBzdGFydGluZyB3aXRoIHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMgKG1vcmUtaW5kZW50ZWQgbGluZXMpIGFyZSBub3QgZm9sZGVkLlxuICAgICAgaWYgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgICBhdE1vcmVJbmRlbnRlZCA9IHRydWU7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzICsgMSk7XG5cbiAgICAgIC8vIEVuZCBvZiBtb3JlLWluZGVudGVkIGJsb2NrLlxuICAgICAgfSBlbHNlIGlmIChhdE1vcmVJbmRlbnRlZCkge1xuICAgICAgICBhdE1vcmVJbmRlbnRlZCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyArIDEpO1xuXG4gICAgICAvLyBKdXN0IG9uZSBsaW5lIGJyZWFrIC0gcGVyY2VpdmUgYXMgdGhlIHNhbWUgbGluZS5cbiAgICAgIH0gZWxzZSBpZiAoZW1wdHlMaW5lcyA9PT0gMCkge1xuICAgICAgICBpZiAoZGV0ZWN0ZWRJbmRlbnQpIHsgLy8gaS5lLiBvbmx5IGlmIHdlIGhhdmUgYWxyZWFkeSByZWFkIHNvbWUgc2NhbGFyIGNvbnRlbnQuXG4gICAgICAgICAgc3RhdGUucmVzdWx0ICs9ICcgJztcbiAgICAgICAgfVxuXG4gICAgICAvLyBTZXZlcmFsIGxpbmUgYnJlYWtzIC0gcGVyY2VpdmUgYXMgZGlmZmVyZW50IGxpbmVzLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMpO1xuICAgICAgfVxuXG4gICAgLy8gTGl0ZXJhbCBzdHlsZToganVzdCBhZGQgZXhhY3QgbnVtYmVyIG9mIGxpbmUgYnJlYWtzIGJldHdlZW4gY29udGVudCBsaW5lcy5cbiAgICB9IGVsc2UgaWYgKGRldGVjdGVkSW5kZW50KSB7XG4gICAgICAvLyBJZiBjdXJyZW50IGxpbmUgaXNuJ3QgdGhlIGZpcnN0IG9uZSAtIGNvdW50IGxpbmUgYnJlYWsgZnJvbSB0aGUgbGFzdCBjb250ZW50IGxpbmUuXG4gICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBjYXNlIG9mIHRoZSBmaXJzdCBjb250ZW50IGxpbmUgLSBjb3VudCBvbmx5IGVtcHR5IGxpbmVzLlxuICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMpO1xuICAgIH1cblxuICAgIGRldGVjdGVkSW5kZW50ID0gdHJ1ZTtcbiAgICBlbXB0eUxpbmVzID0gMDtcbiAgICBjYXB0dXJlU3RhcnQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiAoY2ggIT09IDApKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgX2xpbmUsXG4gICAgICBfdGFnICAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfYW5jaG9yICAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBfcmVzdWx0ICAgPSBbXSxcbiAgICAgIGZvbGxvd2luZyxcbiAgICAgIGRldGVjdGVkICA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG5cbiAgICBpZiAoY2ggIT09IDB4MkQvKiAtICovKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICBpZiAoIWlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkZXRlY3RlZCA9IHRydWU7XG4gICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50IDw9IG5vZGVJbmRlbnQpIHtcbiAgICAgICAgX3Jlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfSU4sIGZhbHNlLCB0cnVlKTtcbiAgICBfcmVzdWx0LnB1c2goc3RhdGUucmVzdWx0KTtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKChzdGF0ZS5saW5lID09PSBfbGluZSB8fCBzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCkgJiYgKGNoICE9PSAwKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2JhZCBpbmRlbnRhdGlvbiBvZiBhIHNlcXVlbmNlIGVudHJ5Jyk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgbm9kZUluZGVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRldGVjdGVkKSB7XG4gICAgc3RhdGUudGFnID0gX3RhZztcbiAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgIHN0YXRlLmtpbmQgPSAnc2VxdWVuY2UnO1xuICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tNYXBwaW5nKHN0YXRlLCBub2RlSW5kZW50LCBmbG93SW5kZW50KSB7XG4gIHZhciBmb2xsb3dpbmcsXG4gICAgICBhbGxvd0NvbXBhY3QsXG4gICAgICBfbGluZSxcbiAgICAgIF90YWcgICAgICAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfYW5jaG9yICAgICAgID0gc3RhdGUuYW5jaG9yLFxuICAgICAgX3Jlc3VsdCAgICAgICA9IHt9LFxuICAgICAgb3ZlcnJpZGFibGVLZXlzID0ge30sXG4gICAgICBrZXlUYWcgICAgICAgID0gbnVsbCxcbiAgICAgIGtleU5vZGUgICAgICAgPSBudWxsLFxuICAgICAgdmFsdWVOb2RlICAgICA9IG51bGwsXG4gICAgICBhdEV4cGxpY2l0S2V5ID0gZmFsc2UsXG4gICAgICBkZXRlY3RlZCAgICAgID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG4gICAgX2xpbmUgPSBzdGF0ZS5saW5lOyAvLyBTYXZlIHRoZSBjdXJyZW50IGxpbmUuXG5cbiAgICAvL1xuICAgIC8vIEV4cGxpY2l0IG5vdGF0aW9uIGNhc2UuIFRoZXJlIGFyZSB0d28gc2VwYXJhdGUgYmxvY2tzOlxuICAgIC8vIGZpcnN0IGZvciB0aGUga2V5IChkZW5vdGVkIGJ5IFwiP1wiKSBhbmQgc2Vjb25kIGZvciB0aGUgdmFsdWUgKGRlbm90ZWQgYnkgXCI6XCIpXG4gICAgLy9cbiAgICBpZiAoKGNoID09PSAweDNGLyogPyAqLyB8fCBjaCA9PT0gMHgzQS8qIDogKi8pICYmIGlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7XG5cbiAgICAgIGlmIChjaCA9PT0gMHgzRi8qID8gKi8pIHtcbiAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7XG4gICAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkZXRlY3RlZCA9IHRydWU7XG4gICAgICAgIGF0RXhwbGljaXRLZXkgPSB0cnVlO1xuICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlO1xuXG4gICAgICB9IGVsc2UgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgLy8gaS5lLiAweDNBLyogOiAqLyA9PT0gY2hhcmFjdGVyIGFmdGVyIHRoZSBleHBsaWNpdCBrZXkuXG4gICAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZTtcbiAgICAgICAgYWxsb3dDb21wYWN0ID0gdHJ1ZTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2luY29tcGxldGUgZXhwbGljaXQgbWFwcGluZyBwYWlyOyBhIGtleSBub2RlIGlzIG1pc3NlZCcpO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5wb3NpdGlvbiArPSAxO1xuICAgICAgY2ggPSBmb2xsb3dpbmc7XG5cbiAgICAvL1xuICAgIC8vIEltcGxpY2l0IG5vdGF0aW9uIGNhc2UuIEZsb3ctc3R5bGUgbm9kZSBhcyB0aGUga2V5IGZpcnN0LCB0aGVuIFwiOlwiLCBhbmQgdGhlIHZhbHVlLlxuICAgIC8vXG4gICAgfSBlbHNlIGlmIChjb21wb3NlTm9kZShzdGF0ZSwgZmxvd0luZGVudCwgQ09OVEVYVF9GTE9XX09VVCwgZmFsc2UsIHRydWUpKSB7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lID09PSBfbGluZSkge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgICAgaWYgKCFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBleHBlY3RlZCBhZnRlciB0aGUga2V5LXZhbHVlIHNlcGFyYXRvciB3aXRoaW4gYSBibG9jayBtYXBwaW5nJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgICAgICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICBhdEV4cGxpY2l0S2V5ID0gZmFsc2U7XG4gICAgICAgICAgYWxsb3dDb21wYWN0ID0gZmFsc2U7XG4gICAgICAgICAga2V5VGFnID0gc3RhdGUudGFnO1xuICAgICAgICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG5cbiAgICAgICAgfSBlbHNlIGlmIChkZXRlY3RlZCkge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW4gbm90IHJlYWQgYW4gaW1wbGljaXQgbWFwcGluZyBwYWlyOyBhIGNvbG9uIGlzIG1pc3NlZCcpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUudGFnID0gX3RhZztcbiAgICAgICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIHRoZSByZXN1bHQgb2YgYGNvbXBvc2VOb2RlYC5cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW4gbm90IHJlYWQgYSBibG9jayBtYXBwaW5nIGVudHJ5OyBhIG11bHRpbGluZSBrZXkgbWF5IG5vdCBiZSBhbiBpbXBsaWNpdCBrZXknKTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUudGFnID0gX3RhZztcbiAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgdGhlIHJlc3VsdCBvZiBgY29tcG9zZU5vZGVgLlxuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrOyAvLyBSZWFkaW5nIGlzIGRvbmUuIEdvIHRvIHRoZSBlcGlsb2d1ZS5cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIENvbW1vbiByZWFkaW5nIGNvZGUgZm9yIGJvdGggZXhwbGljaXQgYW5kIGltcGxpY2l0IG5vdGF0aW9ucy5cbiAgICAvL1xuICAgIGlmIChzdGF0ZS5saW5lID09PSBfbGluZSB8fCBzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCkge1xuICAgICAgaWYgKGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0JMT0NLX09VVCwgdHJ1ZSwgYWxsb3dDb21wYWN0KSkge1xuICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWVOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghYXRFeHBsaWNpdEtleSkge1xuICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKTtcbiAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50ICYmIChjaCAhPT0gMCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdiYWQgaW5kZW50YXRpb24gb2YgYSBtYXBwaW5nIGVudHJ5Jyk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgbm9kZUluZGVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgLy8gRXBpbG9ndWUuXG4gIC8vXG5cbiAgLy8gU3BlY2lhbCBjYXNlOiBsYXN0IG1hcHBpbmcncyBub2RlIGNvbnRhaW5zIG9ubHkgdGhlIGtleSBpbiBleHBsaWNpdCBub3RhdGlvbi5cbiAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7XG4gIH1cblxuICAvLyBFeHBvc2UgdGhlIHJlc3VsdGluZyBtYXBwaW5nLlxuICBpZiAoZGV0ZWN0ZWQpIHtcbiAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgc3RhdGUua2luZCA9ICdtYXBwaW5nJztcbiAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIGRldGVjdGVkO1xufVxuXG5mdW5jdGlvbiByZWFkVGFnUHJvcGVydHkoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbixcbiAgICAgIGlzVmVyYmF0aW0gPSBmYWxzZSxcbiAgICAgIGlzTmFtZWQgICAgPSBmYWxzZSxcbiAgICAgIHRhZ0hhbmRsZSxcbiAgICAgIHRhZ05hbWUsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyMS8qICEgKi8pIHJldHVybiBmYWxzZTtcblxuICBpZiAoc3RhdGUudGFnICE9PSBudWxsKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mIGEgdGFnIHByb3BlcnR5Jyk7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDNDLyogPCAqLykge1xuICAgIGlzVmVyYmF0aW0gPSB0cnVlO1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB9IGVsc2UgaWYgKGNoID09PSAweDIxLyogISAqLykge1xuICAgIGlzTmFtZWQgPSB0cnVlO1xuICAgIHRhZ0hhbmRsZSA9ICchISc7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIH0gZWxzZSB7XG4gICAgdGFnSGFuZGxlID0gJyEnO1xuICB9XG5cbiAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgaWYgKGlzVmVyYmF0aW0pIHtcbiAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgIHdoaWxlIChjaCAhPT0gMCAmJiBjaCAhPT0gMHgzRS8qID4gKi8pO1xuXG4gICAgaWYgKHN0YXRlLnBvc2l0aW9uIDwgc3RhdGUubGVuZ3RoKSB7XG4gICAgICB0YWdOYW1lID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHZlcmJhdGltIHRhZycpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcblxuICAgICAgaWYgKGNoID09PSAweDIxLyogISAqLykge1xuICAgICAgICBpZiAoIWlzTmFtZWQpIHtcbiAgICAgICAgICB0YWdIYW5kbGUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24gLSAxLCBzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgICAgICAgaWYgKCFQQVRURVJOX1RBR19IQU5ETEUudGVzdCh0YWdIYW5kbGUpKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZWQgdGFnIGhhbmRsZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpc05hbWVkID0gdHJ1ZTtcbiAgICAgICAgICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbiArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZXhjbGFtYXRpb24gbWFya3MnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgdGFnTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKFBBVFRFUk5fRkxPV19JTkRJQ0FUT1JTLnRlc3QodGFnTmFtZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGZsb3cgaW5kaWNhdG9yIGNoYXJhY3RlcnMnKTtcbiAgICB9XG4gIH1cblxuICBpZiAodGFnTmFtZSAmJiAhUEFUVEVSTl9UQUdfVVJJLnRlc3QodGFnTmFtZSkpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIG5hbWUgY2Fubm90IGNvbnRhaW4gc3VjaCBjaGFyYWN0ZXJzOiAnICsgdGFnTmFtZSk7XG4gIH1cblxuICBpZiAoaXNWZXJiYXRpbSkge1xuICAgIHN0YXRlLnRhZyA9IHRhZ05hbWU7XG5cbiAgfSBlbHNlIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50YWdNYXAsIHRhZ0hhbmRsZSkpIHtcbiAgICBzdGF0ZS50YWcgPSBzdGF0ZS50YWdNYXBbdGFnSGFuZGxlXSArIHRhZ05hbWU7XG5cbiAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICchJykge1xuICAgIHN0YXRlLnRhZyA9ICchJyArIHRhZ05hbWU7XG5cbiAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICchIScpIHtcbiAgICBzdGF0ZS50YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6JyArIHRhZ05hbWU7XG5cbiAgfSBlbHNlIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5kZWNsYXJlZCB0YWcgaGFuZGxlIFwiJyArIHRhZ0hhbmRsZSArICdcIicpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRBbmNob3JQcm9wZXJ0eShzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjYvKiAmICovKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiBhbiBhbmNob3IgcHJvcGVydHknKTtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpICYmICFpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBpZiAoc3RhdGUucG9zaXRpb24gPT09IF9wb3NpdGlvbikge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICduYW1lIG9mIGFuIGFuY2hvciBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyJyk7XG4gIH1cblxuICBzdGF0ZS5hbmNob3IgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRBbGlhcyhzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uLCBhbGlhcyxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDJBLyogKiAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpICYmICFpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBpZiAoc3RhdGUucG9zaXRpb24gPT09IF9wb3NpdGlvbikge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICduYW1lIG9mIGFuIGFsaWFzIG5vZGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXInKTtcbiAgfVxuXG4gIGFsaWFzID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKCFzdGF0ZS5hbmNob3JNYXAuaGFzT3duUHJvcGVydHkoYWxpYXMpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuaWRlbnRpZmllZCBhbGlhcyBcIicgKyBhbGlhcyArICdcIicpO1xuICB9XG5cbiAgc3RhdGUucmVzdWx0ID0gc3RhdGUuYW5jaG9yTWFwW2FsaWFzXTtcbiAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29tcG9zZU5vZGUoc3RhdGUsIHBhcmVudEluZGVudCwgbm9kZUNvbnRleHQsIGFsbG93VG9TZWVrLCBhbGxvd0NvbXBhY3QpIHtcbiAgdmFyIGFsbG93QmxvY2tTdHlsZXMsXG4gICAgICBhbGxvd0Jsb2NrU2NhbGFycyxcbiAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyxcbiAgICAgIGluZGVudFN0YXR1cyA9IDEsIC8vIDE6IHRoaXM+cGFyZW50LCAwOiB0aGlzPXBhcmVudCwgLTE6IHRoaXM8cGFyZW50XG4gICAgICBhdE5ld0xpbmUgID0gZmFsc2UsXG4gICAgICBoYXNDb250ZW50ID0gZmFsc2UsXG4gICAgICB0eXBlSW5kZXgsXG4gICAgICB0eXBlUXVhbnRpdHksXG4gICAgICB0eXBlLFxuICAgICAgZmxvd0luZGVudCxcbiAgICAgIGJsb2NrSW5kZW50O1xuXG4gIGlmIChzdGF0ZS5saXN0ZW5lciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmxpc3RlbmVyKCdvcGVuJywgc3RhdGUpO1xuICB9XG5cbiAgc3RhdGUudGFnICAgID0gbnVsbDtcbiAgc3RhdGUuYW5jaG9yID0gbnVsbDtcbiAgc3RhdGUua2luZCAgID0gbnVsbDtcbiAgc3RhdGUucmVzdWx0ID0gbnVsbDtcblxuICBhbGxvd0Jsb2NrU3R5bGVzID0gYWxsb3dCbG9ja1NjYWxhcnMgPSBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPVxuICAgIENPTlRFWFRfQkxPQ0tfT1VUID09PSBub2RlQ29udGV4dCB8fFxuICAgIENPTlRFWFRfQkxPQ0tfSU4gID09PSBub2RlQ29udGV4dDtcblxuICBpZiAoYWxsb3dUb1NlZWspIHtcbiAgICBpZiAoc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpKSB7XG4gICAgICBhdE5ld0xpbmUgPSB0cnVlO1xuXG4gICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IHBhcmVudEluZGVudCkge1xuICAgICAgICBpbmRlbnRTdGF0dXMgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50ID09PSBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgaW5kZW50U3RhdHVzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IHBhcmVudEluZGVudCkge1xuICAgICAgICBpbmRlbnRTdGF0dXMgPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7XG4gICAgd2hpbGUgKHJlYWRUYWdQcm9wZXJ0eShzdGF0ZSkgfHwgcmVhZEFuY2hvclByb3BlcnR5KHN0YXRlKSkge1xuICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkge1xuICAgICAgICBhdE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBhbGxvd0Jsb2NrU3R5bGVzO1xuXG4gICAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gcGFyZW50SW5kZW50KSB7XG4gICAgICAgICAgaW5kZW50U3RhdHVzID0gMTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50ID09PSBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAtMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGFsbG93QmxvY2tDb2xsZWN0aW9ucykge1xuICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGF0TmV3TGluZSB8fCBhbGxvd0NvbXBhY3Q7XG4gIH1cblxuICBpZiAoaW5kZW50U3RhdHVzID09PSAxIHx8IENPTlRFWFRfQkxPQ0tfT1VUID09PSBub2RlQ29udGV4dCkge1xuICAgIGlmIChDT05URVhUX0ZMT1dfSU4gPT09IG5vZGVDb250ZXh0IHx8IENPTlRFWFRfRkxPV19PVVQgPT09IG5vZGVDb250ZXh0KSB7XG4gICAgICBmbG93SW5kZW50ID0gcGFyZW50SW5kZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBmbG93SW5kZW50ID0gcGFyZW50SW5kZW50ICsgMTtcbiAgICB9XG5cbiAgICBibG9ja0luZGVudCA9IHN0YXRlLnBvc2l0aW9uIC0gc3RhdGUubGluZVN0YXJ0O1xuXG4gICAgaWYgKGluZGVudFN0YXR1cyA9PT0gMSkge1xuICAgICAgaWYgKGFsbG93QmxvY2tDb2xsZWN0aW9ucyAmJlxuICAgICAgICAgIChyZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZSwgYmxvY2tJbmRlbnQpIHx8XG4gICAgICAgICAgIHJlYWRCbG9ja01hcHBpbmcoc3RhdGUsIGJsb2NrSW5kZW50LCBmbG93SW5kZW50KSkgfHxcbiAgICAgICAgICByZWFkRmxvd0NvbGxlY3Rpb24oc3RhdGUsIGZsb3dJbmRlbnQpKSB7XG4gICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKChhbGxvd0Jsb2NrU2NhbGFycyAmJiByZWFkQmxvY2tTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpKSB8fFxuICAgICAgICAgICAgcmVhZFNpbmdsZVF1b3RlZFNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkgfHxcbiAgICAgICAgICAgIHJlYWREb3VibGVRdW90ZWRTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpKSB7XG4gICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWFkQWxpYXMoc3RhdGUpKSB7XG4gICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc3RhdGUudGFnICE9PSBudWxsIHx8IHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2FsaWFzIG5vZGUgc2hvdWxkIG5vdCBoYXZlIGFueSBwcm9wZXJ0aWVzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAocmVhZFBsYWluU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50LCBDT05URVhUX0ZMT1dfSU4gPT09IG5vZGVDb250ZXh0KSkge1xuICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLnRhZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhdGUudGFnID0gJz8nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5kZW50U3RhdHVzID09PSAwKSB7XG4gICAgICAvLyBTcGVjaWFsIGNhc2U6IGJsb2NrIHNlcXVlbmNlcyBhcmUgYWxsb3dlZCB0byBoYXZlIHNhbWUgaW5kZW50YXRpb24gbGV2ZWwgYXMgdGhlIHBhcmVudC5cbiAgICAgIC8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjc5OTc4NFxuICAgICAgaGFzQ29udGVudCA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyAmJiByZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZSwgYmxvY2tJbmRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS50YWcgIT09IG51bGwgJiYgc3RhdGUudGFnICE9PSAnIScpIHtcbiAgICBpZiAoc3RhdGUudGFnID09PSAnPycpIHtcbiAgICAgIGZvciAodHlwZUluZGV4ID0gMCwgdHlwZVF1YW50aXR5ID0gc3RhdGUuaW1wbGljaXRUeXBlcy5sZW5ndGg7XG4gICAgICAgICAgIHR5cGVJbmRleCA8IHR5cGVRdWFudGl0eTtcbiAgICAgICAgICAgdHlwZUluZGV4ICs9IDEpIHtcbiAgICAgICAgdHlwZSA9IHN0YXRlLmltcGxpY2l0VHlwZXNbdHlwZUluZGV4XTtcblxuICAgICAgICAvLyBJbXBsaWNpdCByZXNvbHZpbmcgaXMgbm90IGFsbG93ZWQgZm9yIG5vbi1zY2FsYXIgdHlwZXMsIGFuZCAnPydcbiAgICAgICAgLy8gbm9uLXNwZWNpZmljIHRhZyBpcyBvbmx5IGFzc2lnbmVkIHRvIHBsYWluIHNjYWxhcnMuIFNvLCBpdCBpc24ndFxuICAgICAgICAvLyBuZWVkZWQgdG8gY2hlY2sgZm9yICdraW5kJyBjb25mb3JtaXR5LlxuXG4gICAgICAgIGlmICh0eXBlLnJlc29sdmUoc3RhdGUucmVzdWx0KSkgeyAvLyBgc3RhdGUucmVzdWx0YCB1cGRhdGVkIGluIHJlc29sdmVyIGlmIG1hdGNoZWRcbiAgICAgICAgICBzdGF0ZS5yZXN1bHQgPSB0eXBlLmNvbnN0cnVjdChzdGF0ZS5yZXN1bHQpO1xuICAgICAgICAgIHN0YXRlLnRhZyA9IHR5cGUudGFnO1xuICAgICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudHlwZU1hcCwgc3RhdGUudGFnKSkge1xuICAgICAgdHlwZSA9IHN0YXRlLnR5cGVNYXBbc3RhdGUudGFnXTtcblxuICAgICAgaWYgKHN0YXRlLnJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlLmtpbmQgIT09IHN0YXRlLmtpbmQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuYWNjZXB0YWJsZSBub2RlIGtpbmQgZm9yICE8JyArIHN0YXRlLnRhZyArICc+IHRhZzsgaXQgc2hvdWxkIGJlIFwiJyArIHR5cGUua2luZCArICdcIiwgbm90IFwiJyArIHN0YXRlLmtpbmQgKyAnXCInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0eXBlLnJlc29sdmUoc3RhdGUucmVzdWx0KSkgeyAvLyBgc3RhdGUucmVzdWx0YCB1cGRhdGVkIGluIHJlc29sdmVyIGlmIG1hdGNoZWRcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2Nhbm5vdCByZXNvbHZlIGEgbm9kZSB3aXRoICE8JyArIHN0YXRlLnRhZyArICc+IGV4cGxpY2l0IHRhZycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ID0gdHlwZS5jb25zdHJ1Y3Qoc3RhdGUucmVzdWx0KTtcbiAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmtub3duIHRhZyAhPCcgKyBzdGF0ZS50YWcgKyAnPicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5saXN0ZW5lciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmxpc3RlbmVyKCdjbG9zZScsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gc3RhdGUudGFnICE9PSBudWxsIHx8ICBzdGF0ZS5hbmNob3IgIT09IG51bGwgfHwgaGFzQ29udGVudDtcbn1cblxuZnVuY3Rpb24gcmVhZERvY3VtZW50KHN0YXRlKSB7XG4gIHZhciBkb2N1bWVudFN0YXJ0ID0gc3RhdGUucG9zaXRpb24sXG4gICAgICBfcG9zaXRpb24sXG4gICAgICBkaXJlY3RpdmVOYW1lLFxuICAgICAgZGlyZWN0aXZlQXJncyxcbiAgICAgIGhhc0RpcmVjdGl2ZXMgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIHN0YXRlLnZlcnNpb24gPSBudWxsO1xuICBzdGF0ZS5jaGVja0xpbmVCcmVha3MgPSBzdGF0ZS5sZWdhY3k7XG4gIHN0YXRlLnRhZ01hcCA9IHt9O1xuICBzdGF0ZS5hbmNob3JNYXAgPSB7fTtcblxuICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gMCB8fCBjaCAhPT0gMHgyNS8qICUgKi8pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlO1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkge1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGRpcmVjdGl2ZU5hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcbiAgICBkaXJlY3RpdmVBcmdzID0gW107XG5cbiAgICBpZiAoZGlyZWN0aXZlTmFtZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZGlyZWN0aXZlIG5hbWUgbXVzdCBub3QgYmUgbGVzcyB0aGFuIG9uZSBjaGFyYWN0ZXIgaW4gbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX0VPTChjaCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzX0VPTChjaCkpIGJyZWFrO1xuXG4gICAgICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZGlyZWN0aXZlQXJncy5wdXNoKHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pKTtcbiAgICB9XG5cbiAgICBpZiAoY2ggIT09IDApIHJlYWRMaW5lQnJlYWsoc3RhdGUpO1xuXG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKGRpcmVjdGl2ZUhhbmRsZXJzLCBkaXJlY3RpdmVOYW1lKSkge1xuICAgICAgZGlyZWN0aXZlSGFuZGxlcnNbZGlyZWN0aXZlTmFtZV0oc3RhdGUsIGRpcmVjdGl2ZU5hbWUsIGRpcmVjdGl2ZUFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICd1bmtub3duIGRvY3VtZW50IGRpcmVjdGl2ZSBcIicgKyBkaXJlY3RpdmVOYW1lICsgJ1wiJyk7XG4gICAgfVxuICB9XG5cbiAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gIGlmIChzdGF0ZS5saW5lSW5kZW50ID09PSAwICYmXG4gICAgICBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSAgICAgPT09IDB4MkQvKiAtICovICYmXG4gICAgICBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSkgPT09IDB4MkQvKiAtICovICYmXG4gICAgICBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMikgPT09IDB4MkQvKiAtICovKSB7XG4gICAgc3RhdGUucG9zaXRpb24gKz0gMztcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgfSBlbHNlIGlmIChoYXNEaXJlY3RpdmVzKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2RpcmVjdGl2ZXMgZW5kIG1hcmsgaXMgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIGNvbXBvc2VOb2RlKHN0YXRlLCBzdGF0ZS5saW5lSW5kZW50IC0gMSwgQ09OVEVYVF9CTE9DS19PVVQsIGZhbHNlLCB0cnVlKTtcbiAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gIGlmIChzdGF0ZS5jaGVja0xpbmVCcmVha3MgJiZcbiAgICAgIFBBVFRFUk5fTk9OX0FTQ0lJX0xJTkVfQlJFQUtTLnRlc3Qoc3RhdGUuaW5wdXQuc2xpY2UoZG9jdW1lbnRTdGFydCwgc3RhdGUucG9zaXRpb24pKSkge1xuICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ25vbi1BU0NJSSBsaW5lIGJyZWFrcyBhcmUgaW50ZXJwcmV0ZWQgYXMgY29udGVudCcpO1xuICB9XG5cbiAgc3RhdGUuZG9jdW1lbnRzLnB1c2goc3RhdGUucmVzdWx0KTtcblxuICBpZiAoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB7XG5cbiAgICBpZiAoc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgPT09IDB4MkUvKiAuICovKSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbiArPSAzO1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc3RhdGUucG9zaXRpb24gPCAoc3RhdGUubGVuZ3RoIC0gMSkpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZW5kIG9mIHRoZSBzdHJlYW0gb3IgYSBkb2N1bWVudCBzZXBhcmF0b3IgaXMgZXhwZWN0ZWQnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBsb2FkRG9jdW1lbnRzKGlucHV0LCBvcHRpb25zKSB7XG4gIGlucHV0ID0gU3RyaW5nKGlucHV0KTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKGlucHV0Lmxlbmd0aCAhPT0gMCkge1xuXG4gICAgLy8gQWRkIHRhaWxpbmcgYFxcbmAgaWYgbm90IGV4aXN0c1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KGlucHV0Lmxlbmd0aCAtIDEpICE9PSAweDBBLyogTEYgKi8gJiZcbiAgICAgICAgaW5wdXQuY2hhckNvZGVBdChpbnB1dC5sZW5ndGggLSAxKSAhPT0gMHgwRC8qIENSICovKSB7XG4gICAgICBpbnB1dCArPSAnXFxuJztcbiAgICB9XG5cbiAgICAvLyBTdHJpcCBCT01cbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XG4gICAgICBpbnB1dCA9IGlucHV0LnNsaWNlKDEpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdGF0ZSA9IG5ldyBTdGF0ZShpbnB1dCwgb3B0aW9ucyk7XG5cbiAgLy8gVXNlIDAgYXMgc3RyaW5nIHRlcm1pbmF0b3IuIFRoYXQgc2lnbmlmaWNhbnRseSBzaW1wbGlmaWVzIGJvdW5kcyBjaGVjay5cbiAgc3RhdGUuaW5wdXQgKz0gJ1xcMCc7XG5cbiAgd2hpbGUgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAweDIwLyogU3BhY2UgKi8pIHtcbiAgICBzdGF0ZS5saW5lSW5kZW50ICs9IDE7XG4gICAgc3RhdGUucG9zaXRpb24gKz0gMTtcbiAgfVxuXG4gIHdoaWxlIChzdGF0ZS5wb3NpdGlvbiA8IChzdGF0ZS5sZW5ndGggLSAxKSkge1xuICAgIHJlYWREb2N1bWVudChzdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGUuZG9jdW1lbnRzO1xufVxuXG5cbmZ1bmN0aW9uIGxvYWRBbGwoaW5wdXQsIGl0ZXJhdG9yLCBvcHRpb25zKSB7XG4gIHZhciBkb2N1bWVudHMgPSBsb2FkRG9jdW1lbnRzKGlucHV0LCBvcHRpb25zKSwgaW5kZXgsIGxlbmd0aDtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gZG9jdW1lbnRzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBpdGVyYXRvcihkb2N1bWVudHNbaW5kZXhdKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGxvYWQoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIGlmIChkb2N1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgLyplc2xpbnQtZGlzYWJsZSBuby11bmRlZmluZWQqL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBkb2N1bWVudHNbMF07XG4gIH1cbiAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ2V4cGVjdGVkIGEgc2luZ2xlIGRvY3VtZW50IGluIHRoZSBzdHJlYW0sIGJ1dCBmb3VuZCBtb3JlJyk7XG59XG5cblxuZnVuY3Rpb24gc2FmZUxvYWRBbGwoaW5wdXQsIG91dHB1dCwgb3B0aW9ucykge1xuICBsb2FkQWxsKGlucHV0LCBvdXRwdXQsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpO1xufVxuXG5cbmZ1bmN0aW9uIHNhZmVMb2FkKGlucHV0LCBvcHRpb25zKSB7XG4gIHJldHVybiBsb2FkKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cy5sb2FkQWxsICAgICA9IGxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5sb2FkICAgICAgICA9IGxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZEFsbCA9IHNhZmVMb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWQgICAgPSBzYWZlTG9hZDtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxuXG5mdW5jdGlvbiBNYXJrKG5hbWUsIGJ1ZmZlciwgcG9zaXRpb24sIGxpbmUsIGNvbHVtbikge1xuICB0aGlzLm5hbWUgICAgID0gbmFtZTtcbiAgdGhpcy5idWZmZXIgICA9IGJ1ZmZlcjtcbiAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICB0aGlzLmxpbmUgICAgID0gbGluZTtcbiAgdGhpcy5jb2x1bW4gICA9IGNvbHVtbjtcbn1cblxuXG5NYXJrLnByb3RvdHlwZS5nZXRTbmlwcGV0ID0gZnVuY3Rpb24gZ2V0U25pcHBldChpbmRlbnQsIG1heExlbmd0aCkge1xuICB2YXIgaGVhZCwgc3RhcnQsIHRhaWwsIGVuZCwgc25pcHBldDtcblxuICBpZiAoIXRoaXMuYnVmZmVyKSByZXR1cm4gbnVsbDtcblxuICBpbmRlbnQgPSBpbmRlbnQgfHwgNDtcbiAgbWF4TGVuZ3RoID0gbWF4TGVuZ3RoIHx8IDc1O1xuXG4gIGhlYWQgPSAnJztcbiAgc3RhcnQgPSB0aGlzLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChzdGFydCA+IDAgJiYgJ1xceDAwXFxyXFxuXFx4ODVcXHUyMDI4XFx1MjAyOScuaW5kZXhPZih0aGlzLmJ1ZmZlci5jaGFyQXQoc3RhcnQgLSAxKSkgPT09IC0xKSB7XG4gICAgc3RhcnQgLT0gMTtcbiAgICBpZiAodGhpcy5wb3NpdGlvbiAtIHN0YXJ0ID4gKG1heExlbmd0aCAvIDIgLSAxKSkge1xuICAgICAgaGVhZCA9ICcgLi4uICc7XG4gICAgICBzdGFydCArPSA1O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdGFpbCA9ICcnO1xuICBlbmQgPSB0aGlzLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChlbmQgPCB0aGlzLmJ1ZmZlci5sZW5ndGggJiYgJ1xceDAwXFxyXFxuXFx4ODVcXHUyMDI4XFx1MjAyOScuaW5kZXhPZih0aGlzLmJ1ZmZlci5jaGFyQXQoZW5kKSkgPT09IC0xKSB7XG4gICAgZW5kICs9IDE7XG4gICAgaWYgKGVuZCAtIHRoaXMucG9zaXRpb24gPiAobWF4TGVuZ3RoIC8gMiAtIDEpKSB7XG4gICAgICB0YWlsID0gJyAuLi4gJztcbiAgICAgIGVuZCAtPSA1O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc25pcHBldCA9IHRoaXMuYnVmZmVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gIHJldHVybiBjb21tb24ucmVwZWF0KCcgJywgaW5kZW50KSArIGhlYWQgKyBzbmlwcGV0ICsgdGFpbCArICdcXG4nICtcbiAgICAgICAgIGNvbW1vbi5yZXBlYXQoJyAnLCBpbmRlbnQgKyB0aGlzLnBvc2l0aW9uIC0gc3RhcnQgKyBoZWFkLmxlbmd0aCkgKyAnXic7XG59O1xuXG5cbk1hcmsucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoY29tcGFjdCkge1xuICB2YXIgc25pcHBldCwgd2hlcmUgPSAnJztcblxuICBpZiAodGhpcy5uYW1lKSB7XG4gICAgd2hlcmUgKz0gJ2luIFwiJyArIHRoaXMubmFtZSArICdcIiAnO1xuICB9XG5cbiAgd2hlcmUgKz0gJ2F0IGxpbmUgJyArICh0aGlzLmxpbmUgKyAxKSArICcsIGNvbHVtbiAnICsgKHRoaXMuY29sdW1uICsgMSk7XG5cbiAgaWYgKCFjb21wYWN0KSB7XG4gICAgc25pcHBldCA9IHRoaXMuZ2V0U25pcHBldCgpO1xuXG4gICAgaWYgKHNuaXBwZXQpIHtcbiAgICAgIHdoZXJlICs9ICc6XFxuJyArIHNuaXBwZXQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdoZXJlO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcms7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbWF4LWxlbiovXG5cbnZhciBjb21tb24gICAgICAgID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcbnZhciBUeXBlICAgICAgICAgID0gcmVxdWlyZSgnLi90eXBlJyk7XG5cblxuZnVuY3Rpb24gY29tcGlsZUxpc3Qoc2NoZW1hLCBuYW1lLCByZXN1bHQpIHtcbiAgdmFyIGV4Y2x1ZGUgPSBbXTtcblxuICBzY2hlbWEuaW5jbHVkZS5mb3JFYWNoKGZ1bmN0aW9uIChpbmNsdWRlZFNjaGVtYSkge1xuICAgIHJlc3VsdCA9IGNvbXBpbGVMaXN0KGluY2x1ZGVkU2NoZW1hLCBuYW1lLCByZXN1bHQpO1xuICB9KTtcblxuICBzY2hlbWFbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAoY3VycmVudFR5cGUpIHtcbiAgICByZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocHJldmlvdXNUeXBlLCBwcmV2aW91c0luZGV4KSB7XG4gICAgICBpZiAocHJldmlvdXNUeXBlLnRhZyA9PT0gY3VycmVudFR5cGUudGFnKSB7XG4gICAgICAgIGV4Y2x1ZGUucHVzaChwcmV2aW91c0luZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlc3VsdC5wdXNoKGN1cnJlbnRUeXBlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdC5maWx0ZXIoZnVuY3Rpb24gKHR5cGUsIGluZGV4KSB7XG4gICAgcmV0dXJuIGV4Y2x1ZGUuaW5kZXhPZihpbmRleCkgPT09IC0xO1xuICB9KTtcbn1cblxuXG5mdW5jdGlvbiBjb21waWxlTWFwKC8qIGxpc3RzLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7fSwgaW5kZXgsIGxlbmd0aDtcblxuICBmdW5jdGlvbiBjb2xsZWN0VHlwZSh0eXBlKSB7XG4gICAgcmVzdWx0W3R5cGUudGFnXSA9IHR5cGU7XG4gIH1cblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBhcmd1bWVudHNbaW5kZXhdLmZvckVhY2goY29sbGVjdFR5cGUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5mdW5jdGlvbiBTY2hlbWEoZGVmaW5pdGlvbikge1xuICB0aGlzLmluY2x1ZGUgID0gZGVmaW5pdGlvbi5pbmNsdWRlICB8fCBbXTtcbiAgdGhpcy5pbXBsaWNpdCA9IGRlZmluaXRpb24uaW1wbGljaXQgfHwgW107XG4gIHRoaXMuZXhwbGljaXQgPSBkZWZpbml0aW9uLmV4cGxpY2l0IHx8IFtdO1xuXG4gIHRoaXMuaW1wbGljaXQuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgIGlmICh0eXBlLmxvYWRLaW5kICYmIHR5cGUubG9hZEtpbmQgIT09ICdzY2FsYXInKSB7XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVGhlcmUgaXMgYSBub24tc2NhbGFyIHR5cGUgaW4gdGhlIGltcGxpY2l0IGxpc3Qgb2YgYSBzY2hlbWEuIEltcGxpY2l0IHJlc29sdmluZyBvZiBzdWNoIHR5cGVzIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLmNvbXBpbGVkSW1wbGljaXQgPSBjb21waWxlTGlzdCh0aGlzLCAnaW1wbGljaXQnLCBbXSk7XG4gIHRoaXMuY29tcGlsZWRFeHBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICdleHBsaWNpdCcsIFtdKTtcbiAgdGhpcy5jb21waWxlZFR5cGVNYXAgID0gY29tcGlsZU1hcCh0aGlzLmNvbXBpbGVkSW1wbGljaXQsIHRoaXMuY29tcGlsZWRFeHBsaWNpdCk7XG59XG5cblxuU2NoZW1hLkRFRkFVTFQgPSBudWxsO1xuXG5cblNjaGVtYS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGVTY2hlbWEoKSB7XG4gIHZhciBzY2hlbWFzLCB0eXBlcztcblxuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDE6XG4gICAgICBzY2hlbWFzID0gU2NoZW1hLkRFRkFVTFQ7XG4gICAgICB0eXBlcyA9IGFyZ3VtZW50c1swXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAyOlxuICAgICAgc2NoZW1hcyA9IGFyZ3VtZW50c1swXTtcbiAgICAgIHR5cGVzID0gYXJndW1lbnRzWzFdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1dyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIFNjaGVtYS5jcmVhdGUgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIHNjaGVtYXMgPSBjb21tb24udG9BcnJheShzY2hlbWFzKTtcbiAgdHlwZXMgPSBjb21tb24udG9BcnJheSh0eXBlcyk7XG5cbiAgaWYgKCFzY2hlbWFzLmV2ZXJ5KGZ1bmN0aW9uIChzY2hlbWEpIHsgcmV0dXJuIHNjaGVtYSBpbnN0YW5jZW9mIFNjaGVtYTsgfSkpIHtcbiAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignU3BlY2lmaWVkIGxpc3Qgb2Ygc3VwZXIgc2NoZW1hcyAob3IgYSBzaW5nbGUgU2NoZW1hIG9iamVjdCkgY29udGFpbnMgYSBub24tU2NoZW1hIG9iamVjdC4nKTtcbiAgfVxuXG4gIGlmICghdHlwZXMuZXZlcnkoZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIHR5cGUgaW5zdGFuY2VvZiBUeXBlOyB9KSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdTcGVjaWZpZWQgbGlzdCBvZiBZQU1MIHR5cGVzIChvciBhIHNpbmdsZSBUeXBlIG9iamVjdCkgY29udGFpbnMgYSBub24tVHlwZSBvYmplY3QuJyk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNjaGVtYSh7XG4gICAgaW5jbHVkZTogc2NoZW1hcyxcbiAgICBleHBsaWNpdDogdHlwZXNcbiAgfSk7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gU2NoZW1hO1xuIiwiLy8gU3RhbmRhcmQgWUFNTCdzIENvcmUgc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODA0OTIzXG4vL1xuLy8gTk9URTogSlMtWUFNTCBkb2VzIG5vdCBzdXBwb3J0IHNjaGVtYS1zcGVjaWZpYyB0YWcgcmVzb2x1dGlvbiByZXN0cmljdGlvbnMuXG4vLyBTbywgQ29yZSBzY2hlbWEgaGFzIG5vIGRpc3RpbmN0aW9ucyBmcm9tIEpTT04gc2NoZW1hIGlzIEpTLVlBTUwuXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9qc29uJylcbiAgXVxufSk7XG4iLCIvLyBKUy1ZQU1MJ3MgZGVmYXVsdCBzY2hlbWEgZm9yIGBsb2FkYCBmdW5jdGlvbi5cbi8vIEl0IGlzIG5vdCBkZXNjcmliZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vXG4vLyBUaGlzIHNjaGVtYSBpcyBiYXNlZCBvbiBKUy1ZQU1MJ3MgZGVmYXVsdCBzYWZlIHNjaGVtYSBhbmQgaW5jbHVkZXNcbi8vIEphdmFTY3JpcHQtc3BlY2lmaWMgdHlwZXM6ICEhanMvdW5kZWZpbmVkLCAhIWpzL3JlZ2V4cCBhbmQgISFqcy9mdW5jdGlvbi5cbi8vXG4vLyBBbHNvIHRoaXMgc2NoZW1hIGlzIHVzZWQgYXMgZGVmYXVsdCBiYXNlIHNjaGVtYSBhdCBgU2NoZW1hLmNyZWF0ZWAgZnVuY3Rpb24uXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFNjaGVtYS5ERUZBVUxUID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2RlZmF1bHRfc2FmZScpXG4gIF0sXG4gIGV4cGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy91bmRlZmluZWQnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL3JlZ2V4cCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvZnVuY3Rpb24nKVxuICBdXG59KTtcbiIsIi8vIEpTLVlBTUwncyBkZWZhdWx0IHNjaGVtYSBmb3IgYHNhZmVMb2FkYCBmdW5jdGlvbi5cbi8vIEl0IGlzIG5vdCBkZXNjcmliZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vXG4vLyBUaGlzIHNjaGVtYSBpcyBiYXNlZCBvbiBzdGFuZGFyZCBZQU1MJ3MgQ29yZSBzY2hlbWEgYW5kIGluY2x1ZGVzIG1vc3Qgb2Zcbi8vIGV4dHJhIHR5cGVzIGRlc2NyaWJlZCBhdCBZQU1MIHRhZyByZXBvc2l0b3J5LiAoaHR0cDovL3lhbWwub3JnL3R5cGUvKVxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vY29yZScpXG4gIF0sXG4gIGltcGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS90aW1lc3RhbXAnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL21lcmdlJylcbiAgXSxcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL2JpbmFyeScpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvb21hcCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvcGFpcnMnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL3NldCcpXG4gIF1cbn0pO1xuIiwiLy8gU3RhbmRhcmQgWUFNTCdzIEZhaWxzYWZlIHNjaGVtYS5cbi8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjgwMjM0NlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL3N0cicpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvc2VxJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9tYXAnKVxuICBdXG59KTtcbiIsIi8vIFN0YW5kYXJkIFlBTUwncyBKU09OIHNjaGVtYS5cbi8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjgwMzIzMVxuLy9cbi8vIE5PVEU6IEpTLVlBTUwgZG9lcyBub3Qgc3VwcG9ydCBzY2hlbWEtc3BlY2lmaWMgdGFnIHJlc29sdXRpb24gcmVzdHJpY3Rpb25zLlxuLy8gU28sIHRoaXMgc2NoZW1hIGlzIG5vdCBzdWNoIHN0cmljdCBhcyBkZWZpbmVkIGluIHRoZSBZQU1MIHNwZWNpZmljYXRpb24uXG4vLyBJdCBhbGxvd3MgbnVtYmVycyBpbiBiaW5hcnkgbm90YWlvbiwgdXNlIGBOdWxsYCBhbmQgYE5VTExgIGFzIGBudWxsYCwgZXRjLlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vZmFpbHNhZmUnKVxuICBdLFxuICBpbXBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvbnVsbCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvYm9vbCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvaW50JyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9mbG9hdCcpXG4gIF1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG5cbnZhciBUWVBFX0NPTlNUUlVDVE9SX09QVElPTlMgPSBbXG4gICdraW5kJyxcbiAgJ3Jlc29sdmUnLFxuICAnY29uc3RydWN0JyxcbiAgJ2luc3RhbmNlT2YnLFxuICAncHJlZGljYXRlJyxcbiAgJ3JlcHJlc2VudCcsXG4gICdkZWZhdWx0U3R5bGUnLFxuICAnc3R5bGVBbGlhc2VzJ1xuXTtcblxudmFyIFlBTUxfTk9ERV9LSU5EUyA9IFtcbiAgJ3NjYWxhcicsXG4gICdzZXF1ZW5jZScsXG4gICdtYXBwaW5nJ1xuXTtcblxuZnVuY3Rpb24gY29tcGlsZVN0eWxlQWxpYXNlcyhtYXApIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGlmIChtYXAgIT09IG51bGwpIHtcbiAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICBtYXBbc3R5bGVdLmZvckVhY2goZnVuY3Rpb24gKGFsaWFzKSB7XG4gICAgICAgIHJlc3VsdFtTdHJpbmcoYWxpYXMpXSA9IHN0eWxlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBUeXBlKHRhZywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBPYmplY3Qua2V5cyhvcHRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24gb3B0aW9uIFwiJyArIG5hbWUgKyAnXCIgaXMgbWV0IGluIGRlZmluaXRpb24gb2YgXCInICsgdGFnICsgJ1wiIFlBTUwgdHlwZS4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFRPRE86IEFkZCB0YWcgZm9ybWF0IGNoZWNrLlxuICB0aGlzLnRhZyAgICAgICAgICA9IHRhZztcbiAgdGhpcy5raW5kICAgICAgICAgPSBvcHRpb25zWydraW5kJ10gICAgICAgICB8fCBudWxsO1xuICB0aGlzLnJlc29sdmUgICAgICA9IG9wdGlvbnNbJ3Jlc29sdmUnXSAgICAgIHx8IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XG4gIHRoaXMuY29uc3RydWN0ICAgID0gb3B0aW9uc1snY29uc3RydWN0J10gICAgfHwgZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGE7IH07XG4gIHRoaXMuaW5zdGFuY2VPZiAgID0gb3B0aW9uc1snaW5zdGFuY2VPZiddICAgfHwgbnVsbDtcbiAgdGhpcy5wcmVkaWNhdGUgICAgPSBvcHRpb25zWydwcmVkaWNhdGUnXSAgICB8fCBudWxsO1xuICB0aGlzLnJlcHJlc2VudCAgICA9IG9wdGlvbnNbJ3JlcHJlc2VudCddICAgIHx8IG51bGw7XG4gIHRoaXMuZGVmYXVsdFN0eWxlID0gb3B0aW9uc1snZGVmYXVsdFN0eWxlJ10gfHwgbnVsbDtcbiAgdGhpcy5zdHlsZUFsaWFzZXMgPSBjb21waWxlU3R5bGVBbGlhc2VzKG9wdGlvbnNbJ3N0eWxlQWxpYXNlcyddIHx8IG51bGwpO1xuXG4gIGlmIChZQU1MX05PREVfS0lORFMuaW5kZXhPZih0aGlzLmtpbmQpID09PSAtMSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdVbmtub3duIGtpbmQgXCInICsgdGhpcy5raW5kICsgJ1wiIGlzIHNwZWNpZmllZCBmb3IgXCInICsgdGFnICsgJ1wiIFlBTUwgdHlwZS4nKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFR5cGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSovXG5cbi8vIEEgdHJpY2sgZm9yIGJyb3dzZXJpZmllZCB2ZXJzaW9uLlxuLy8gU2luY2Ugd2UgbWFrZSBicm93c2VyaWZpZXIgdG8gaWdub3JlIGBidWZmZXJgIG1vZHVsZSwgTm9kZUJ1ZmZlciB3aWxsIGJlIHVuZGVmaW5lZFxudmFyIE5vZGVCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG52YXIgVHlwZSAgICAgICA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuXG4vLyBbIDY0LCA2NSwgNjYgXSAtPiBbIHBhZGRpbmcsIENSLCBMRiBdXG52YXIgQkFTRTY0X01BUCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVxcblxccic7XG5cblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxCaW5hcnkoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBjb2RlLCBpZHgsIGJpdGxlbiA9IDAsIG1heCA9IGRhdGEubGVuZ3RoLCBtYXAgPSBCQVNFNjRfTUFQO1xuXG4gIC8vIENvbnZlcnQgb25lIGJ5IG9uZS5cbiAgZm9yIChpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrKSB7XG4gICAgY29kZSA9IG1hcC5pbmRleE9mKGRhdGEuY2hhckF0KGlkeCkpO1xuXG4gICAgLy8gU2tpcCBDUi9MRlxuICAgIGlmIChjb2RlID4gNjQpIGNvbnRpbnVlO1xuXG4gICAgLy8gRmFpbCBvbiBpbGxlZ2FsIGNoYXJhY3RlcnNcbiAgICBpZiAoY29kZSA8IDApIHJldHVybiBmYWxzZTtcblxuICAgIGJpdGxlbiArPSA2O1xuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIGFueSBiaXRzIGxlZnQsIHNvdXJjZSB3YXMgY29ycnVwdGVkXG4gIHJldHVybiAoYml0bGVuICUgOCkgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxCaW5hcnkoZGF0YSkge1xuICB2YXIgaWR4LCB0YWlsYml0cyxcbiAgICAgIGlucHV0ID0gZGF0YS5yZXBsYWNlKC9bXFxyXFxuPV0vZywgJycpLCAvLyByZW1vdmUgQ1IvTEYgJiBwYWRkaW5nIHRvIHNpbXBsaWZ5IHNjYW5cbiAgICAgIG1heCA9IGlucHV0Lmxlbmd0aCxcbiAgICAgIG1hcCA9IEJBU0U2NF9NQVAsXG4gICAgICBiaXRzID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIC8vIENvbGxlY3QgYnkgNio0IGJpdHMgKDMgYnl0ZXMpXG5cbiAgZm9yIChpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrKSB7XG4gICAgaWYgKChpZHggJSA0ID09PSAwKSAmJiBpZHgpIHtcbiAgICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDE2KSAmIDB4RkYpO1xuICAgICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gOCkgJiAweEZGKTtcbiAgICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAweEZGKTtcbiAgICB9XG5cbiAgICBiaXRzID0gKGJpdHMgPDwgNikgfCBtYXAuaW5kZXhPZihpbnB1dC5jaGFyQXQoaWR4KSk7XG4gIH1cblxuICAvLyBEdW1wIHRhaWxcblxuICB0YWlsYml0cyA9IChtYXggJSA0KSAqIDY7XG5cbiAgaWYgKHRhaWxiaXRzID09PSAwKSB7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTYpICYgMHhGRik7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gOCkgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaChiaXRzICYgMHhGRik7XG4gIH0gZWxzZSBpZiAodGFpbGJpdHMgPT09IDE4KSB7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTApICYgMHhGRik7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMikgJiAweEZGKTtcbiAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTIpIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiA0KSAmIDB4RkYpO1xuICB9XG5cbiAgLy8gV3JhcCBpbnRvIEJ1ZmZlciBmb3IgTm9kZUpTIGFuZCBsZWF2ZSBBcnJheSBmb3IgYnJvd3NlclxuICBpZiAoTm9kZUJ1ZmZlcikgcmV0dXJuIG5ldyBOb2RlQnVmZmVyKHJlc3VsdCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbEJpbmFyeShvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgdmFyIHJlc3VsdCA9ICcnLCBiaXRzID0gMCwgaWR4LCB0YWlsLFxuICAgICAgbWF4ID0gb2JqZWN0Lmxlbmd0aCxcbiAgICAgIG1hcCA9IEJBU0U2NF9NQVA7XG5cbiAgLy8gQ29udmVydCBldmVyeSB0aHJlZSBieXRlcyB0byA0IEFTQ0lJIGNoYXJhY3RlcnMuXG5cbiAgZm9yIChpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrKSB7XG4gICAgaWYgKChpZHggJSAzID09PSAwKSAmJiBpZHgpIHtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTgpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEyKSAmIDB4M0ZdO1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiA2KSAmIDB4M0ZdO1xuICAgICAgcmVzdWx0ICs9IG1hcFtiaXRzICYgMHgzRl07XG4gICAgfVxuXG4gICAgYml0cyA9IChiaXRzIDw8IDgpICsgb2JqZWN0W2lkeF07XG4gIH1cblxuICAvLyBEdW1wIHRhaWxcblxuICB0YWlsID0gbWF4ICUgMztcblxuICBpZiAodGFpbCA9PT0gMCkge1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTgpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDYpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFtiaXRzICYgMHgzRl07XG4gIH0gZWxzZSBpZiAodGFpbCA9PT0gMikge1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTApICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiA0KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPDwgMikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWzY0XTtcbiAgfSBlbHNlIGlmICh0YWlsID09PSAxKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPDwgNCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWzY0XTtcbiAgICByZXN1bHQgKz0gbWFwWzY0XTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzQmluYXJ5KG9iamVjdCkge1xuICByZXR1cm4gTm9kZUJ1ZmZlciAmJiBOb2RlQnVmZmVyLmlzQnVmZmVyKG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmJpbmFyeScsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sQmluYXJ5LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxCaW5hcnksXG4gIHByZWRpY2F0ZTogaXNCaW5hcnksXG4gIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbEJpbmFyeVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEJvb2xlYW4oZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aDtcblxuICByZXR1cm4gKG1heCA9PT0gNCAmJiAoZGF0YSA9PT0gJ3RydWUnIHx8IGRhdGEgPT09ICdUcnVlJyB8fCBkYXRhID09PSAnVFJVRScpKSB8fFxuICAgICAgICAgKG1heCA9PT0gNSAmJiAoZGF0YSA9PT0gJ2ZhbHNlJyB8fCBkYXRhID09PSAnRmFsc2UnIHx8IGRhdGEgPT09ICdGQUxTRScpKTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEJvb2xlYW4oZGF0YSkge1xuICByZXR1cm4gZGF0YSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICBkYXRhID09PSAnVHJ1ZScgfHxcbiAgICAgICAgIGRhdGEgPT09ICdUUlVFJztcbn1cblxuZnVuY3Rpb24gaXNCb29sZWFuKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEJvb2xlYW5dJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sQm9vbGVhbixcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sQm9vbGVhbixcbiAgcHJlZGljYXRlOiBpc0Jvb2xlYW4sXG4gIHJlcHJlc2VudDoge1xuICAgIGxvd2VyY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ3RydWUnIDogJ2ZhbHNlJzsgfSxcbiAgICB1cHBlcmNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICdUUlVFJyA6ICdGQUxTRSc7IH0sXG4gICAgY2FtZWxjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAnVHJ1ZScgOiAnRmFsc2UnOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2xvd2VyY2FzZSdcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgVHlwZSAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgWUFNTF9GTE9BVF9QQVRURVJOID0gbmV3IFJlZ0V4cChcbiAgJ14oPzpbLStdPyg/OlswLTldWzAtOV9dKilcXFxcLlswLTlfXSooPzpbZUVdWy0rXVswLTldKyk/JyArXG4gICd8XFxcXC5bMC05X10rKD86W2VFXVstK11bMC05XSspPycgK1xuICAnfFstK10/WzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKStcXFxcLlswLTlfXSonICtcbiAgJ3xbLStdP1xcXFwuKD86aW5mfEluZnxJTkYpJyArXG4gICd8XFxcXC4oPzpuYW58TmFOfE5BTikpJCcpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEZsb2F0KGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICBpZiAoIVlBTUxfRkxPQVRfUEFUVEVSTi50ZXN0KGRhdGEpKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxGbG9hdChkYXRhKSB7XG4gIHZhciB2YWx1ZSwgc2lnbiwgYmFzZSwgZGlnaXRzO1xuXG4gIHZhbHVlICA9IGRhdGEucmVwbGFjZSgvXy9nLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgc2lnbiAgID0gdmFsdWVbMF0gPT09ICctJyA/IC0xIDogMTtcbiAgZGlnaXRzID0gW107XG5cbiAgaWYgKCcrLScuaW5kZXhPZih2YWx1ZVswXSkgPj0gMCkge1xuICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gIH1cblxuICBpZiAodmFsdWUgPT09ICcuaW5mJykge1xuICAgIHJldHVybiAoc2lnbiA9PT0gMSkgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG5cbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJy5uYW4nKSB7XG4gICAgcmV0dXJuIE5hTjtcblxuICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJzonKSA+PSAwKSB7XG4gICAgdmFsdWUuc3BsaXQoJzonKS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUZsb2F0KHYsIDEwKSk7XG4gICAgfSk7XG5cbiAgICB2YWx1ZSA9IDAuMDtcbiAgICBiYXNlID0gMTtcblxuICAgIGRpZ2l0cy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgICB2YWx1ZSArPSBkICogYmFzZTtcbiAgICAgIGJhc2UgKj0gNjA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2lnbiAqIHZhbHVlO1xuXG4gIH1cbiAgcmV0dXJuIHNpZ24gKiBwYXJzZUZsb2F0KHZhbHVlLCAxMCk7XG59XG5cblxudmFyIFNDSUVOVElGSUNfV0lUSE9VVF9ET1QgPSAvXlstK10/WzAtOV0rZS87XG5cbmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxGbG9hdChvYmplY3QsIHN0eWxlKSB7XG4gIHZhciByZXM7XG5cbiAgaWYgKGlzTmFOKG9iamVjdCkpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy5uYW4nO1xuICAgICAgY2FzZSAndXBwZXJjYXNlJzogcmV0dXJuICcuTkFOJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLk5hTic7XG4gICAgfVxuICB9IGVsc2UgaWYgKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA9PT0gb2JqZWN0KSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICcuaW5mJztcbiAgICAgIGNhc2UgJ3VwcGVyY2FzZSc6IHJldHVybiAnLklORic7XG4gICAgICBjYXNlICdjYW1lbGNhc2UnOiByZXR1cm4gJy5JbmYnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IG9iamVjdCkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLS5pbmYnO1xuICAgICAgY2FzZSAndXBwZXJjYXNlJzogcmV0dXJuICctLklORic7XG4gICAgICBjYXNlICdjYW1lbGNhc2UnOiByZXR1cm4gJy0uSW5mJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpIHtcbiAgICByZXR1cm4gJy0wLjAnO1xuICB9XG5cbiAgcmVzID0gb2JqZWN0LnRvU3RyaW5nKDEwKTtcblxuICAvLyBKUyBzdHJpbmdpZmllciBjYW4gYnVpbGQgc2NpZW50aWZpYyBmb3JtYXQgd2l0aG91dCBkb3RzOiA1ZS0xMDAsXG4gIC8vIHdoaWxlIFlBTUwgcmVxdXJlcyBkb3Q6IDUuZS0xMDAuIEZpeCBpdCB3aXRoIHNpbXBsZSBoYWNrXG5cbiAgcmV0dXJuIFNDSUVOVElGSUNfV0lUSE9VVF9ET1QudGVzdChyZXMpID8gcmVzLnJlcGxhY2UoJ2UnLCAnLmUnKSA6IHJlcztcbn1cblxuZnVuY3Rpb24gaXNGbG9hdChvYmplY3QpIHtcbiAgcmV0dXJuIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgTnVtYmVyXScpICYmXG4gICAgICAgICAob2JqZWN0ICUgMSAhPT0gMCB8fCBjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxGbG9hdCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sRmxvYXQsXG4gIHByZWRpY2F0ZTogaXNGbG9hdCxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sRmxvYXQsXG4gIGRlZmF1bHRTdHlsZTogJ2xvd2VyY2FzZSdcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgVHlwZSAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiBpc0hleENvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHx8XG4gICAgICAgICAoKDB4NDEvKiBBICovIDw9IGMpICYmIChjIDw9IDB4NDYvKiBGICovKSkgfHxcbiAgICAgICAgICgoMHg2MS8qIGEgKi8gPD0gYykgJiYgKGMgPD0gMHg2Ni8qIGYgKi8pKTtcbn1cblxuZnVuY3Rpb24gaXNPY3RDb2RlKGMpIHtcbiAgcmV0dXJuICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzNy8qIDcgKi8pKTtcbn1cblxuZnVuY3Rpb24gaXNEZWNDb2RlKGMpIHtcbiAgcmV0dXJuICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxJbnRlZ2VyKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGgsXG4gICAgICBpbmRleCA9IDAsXG4gICAgICBoYXNEaWdpdHMgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIGlmICghbWF4KSByZXR1cm4gZmFsc2U7XG5cbiAgY2ggPSBkYXRhW2luZGV4XTtcblxuICAvLyBzaWduXG4gIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycpIHtcbiAgICBjaCA9IGRhdGFbKytpbmRleF07XG4gIH1cblxuICBpZiAoY2ggPT09ICcwJykge1xuICAgIC8vIDBcbiAgICBpZiAoaW5kZXggKyAxID09PSBtYXgpIHJldHVybiB0cnVlO1xuICAgIGNoID0gZGF0YVsrK2luZGV4XTtcblxuICAgIC8vIGJhc2UgMiwgYmFzZSA4LCBiYXNlIDE2XG5cbiAgICBpZiAoY2ggPT09ICdiJykge1xuICAgICAgLy8gYmFzZSAyXG4gICAgICBpbmRleCsrO1xuXG4gICAgICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICAgICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoY2ggIT09ICcwJyAmJiBjaCAhPT0gJzEnKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzRGlnaXRzO1xuICAgIH1cblxuXG4gICAgaWYgKGNoID09PSAneCcpIHtcbiAgICAgIC8vIGJhc2UgMTZcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICAgIGlmICghaXNIZXhDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzRGlnaXRzO1xuICAgIH1cblxuICAgIC8vIGJhc2UgOFxuICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNPY3RDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSByZXR1cm4gZmFsc2U7XG4gICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzRGlnaXRzO1xuICB9XG5cbiAgLy8gYmFzZSAxMCAoZXhjZXB0IDApIG9yIGJhc2UgNjBcblxuICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICBpZiAoY2ggPT09ICc6JykgYnJlYWs7XG4gICAgaWYgKCFpc0RlY0NvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaGFzRGlnaXRzKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gaWYgIWJhc2U2MCAtIGRvbmU7XG4gIGlmIChjaCAhPT0gJzonKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBiYXNlNjAgYWxtb3N0IG5vdCB1c2VkLCBubyBuZWVkcyB0byBvcHRpbWl6ZVxuICByZXR1cm4gL14oOlswLTVdP1swLTldKSskLy50ZXN0KGRhdGEuc2xpY2UoaW5kZXgpKTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEludGVnZXIoZGF0YSkge1xuICB2YXIgdmFsdWUgPSBkYXRhLCBzaWduID0gMSwgY2gsIGJhc2UsIGRpZ2l0cyA9IFtdO1xuXG4gIGlmICh2YWx1ZS5pbmRleE9mKCdfJykgIT09IC0xKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9fL2csICcnKTtcbiAgfVxuXG4gIGNoID0gdmFsdWVbMF07XG5cbiAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykge1xuICAgIGlmIChjaCA9PT0gJy0nKSBzaWduID0gLTE7XG4gICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgICBjaCA9IHZhbHVlWzBdO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnMCcpIHJldHVybiAwO1xuXG4gIGlmIChjaCA9PT0gJzAnKSB7XG4gICAgaWYgKHZhbHVlWzFdID09PSAnYicpIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIDIpO1xuICAgIGlmICh2YWx1ZVsxXSA9PT0gJ3gnKSByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCAxNik7XG4gICAgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgOCk7XG4gIH1cblxuICBpZiAodmFsdWUuaW5kZXhPZignOicpICE9PSAtMSkge1xuICAgIHZhbHVlLnNwbGl0KCc6JykuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgZGlnaXRzLnVuc2hpZnQocGFyc2VJbnQodiwgMTApKTtcbiAgICB9KTtcblxuICAgIHZhbHVlID0gMDtcbiAgICBiYXNlID0gMTtcblxuICAgIGRpZ2l0cy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgICB2YWx1ZSArPSAoZCAqIGJhc2UpO1xuICAgICAgYmFzZSAqPSA2MDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaWduICogdmFsdWU7XG5cbiAgfVxuXG4gIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDEwKTtcbn1cblxuZnVuY3Rpb24gaXNJbnRlZ2VyKG9iamVjdCkge1xuICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiZcbiAgICAgICAgIChvYmplY3QgJSAxID09PSAwICYmICFjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sSW50ZWdlcixcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sSW50ZWdlcixcbiAgcHJlZGljYXRlOiBpc0ludGVnZXIsXG4gIHJlcHJlc2VudDoge1xuICAgIGJpbmFyeTogICAgICBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAnMGInICsgb2JqZWN0LnRvU3RyaW5nKDIpOyB9LFxuICAgIG9jdGFsOiAgICAgICBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAnMCcgICsgb2JqZWN0LnRvU3RyaW5nKDgpOyB9LFxuICAgIGRlY2ltYWw6ICAgICBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAgICAgICAgb2JqZWN0LnRvU3RyaW5nKDEwKTsgfSxcbiAgICBoZXhhZGVjaW1hbDogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gJzB4JyArIG9iamVjdC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdkZWNpbWFsJyxcbiAgc3R5bGVBbGlhc2VzOiB7XG4gICAgYmluYXJ5OiAgICAgIFsgMiwgICdiaW4nIF0sXG4gICAgb2N0YWw6ICAgICAgIFsgOCwgICdvY3QnIF0sXG4gICAgZGVjaW1hbDogICAgIFsgMTAsICdkZWMnIF0sXG4gICAgaGV4YWRlY2ltYWw6IFsgMTYsICdoZXgnIF1cbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBlc3ByaW1hO1xuXG4vLyBCcm93c2VyaWZpZWQgdmVyc2lvbiBkb2VzIG5vdCBoYXZlIGVzcHJpbWFcbi8vXG4vLyAxLiBGb3Igbm9kZS5qcyBqdXN0IHJlcXVpcmUgbW9kdWxlIGFzIGRlcHNcbi8vIDIuIEZvciBicm93c2VyIHRyeSB0byByZXF1aXJlIG11ZHVsZSB2aWEgZXh0ZXJuYWwgQU1EIHN5c3RlbS5cbi8vICAgIElmIG5vdCBmb3VuZCAtIHRyeSB0byBmYWxsYmFjayB0byB3aW5kb3cuZXNwcmltYS4gSWYgbm90XG4vLyAgICBmb3VuZCB0b28gLSB0aGVuIGZhaWwgdG8gcGFyc2UuXG4vL1xudHJ5IHtcbiAgLy8gd29ya2Fyb3VuZCB0byBleGNsdWRlIHBhY2thZ2UgZnJvbSBicm93c2VyaWZ5IGxpc3QuXG4gIHZhciBfcmVxdWlyZSA9IHJlcXVpcmU7XG4gIGVzcHJpbWEgPSBfcmVxdWlyZSgnZXNwcmltYScpO1xufSBjYXRjaCAoXykge1xuICAvKmdsb2JhbCB3aW5kb3cgKi9cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSBlc3ByaW1hID0gd2luZG93LmVzcHJpbWE7XG59XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdEZ1bmN0aW9uKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIHZhciBzb3VyY2UgPSAnKCcgKyBkYXRhICsgJyknLFxuICAgICAgICBhc3QgICAgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KTtcblxuICAgIGlmIChhc3QudHlwZSAgICAgICAgICAgICAgICAgICAgIT09ICdQcm9ncmFtJyAgICAgICAgICAgICB8fFxuICAgICAgICBhc3QuYm9keS5sZW5ndGggICAgICAgICAgICAgIT09IDEgICAgICAgICAgICAgICAgICAgICB8fFxuICAgICAgICBhc3QuYm9keVswXS50eXBlICAgICAgICAgICAgIT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyB8fFxuICAgICAgICBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICdGdW5jdGlvbkV4cHJlc3Npb24nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24oZGF0YSkge1xuICAvKmpzbGludCBldmlsOnRydWUqL1xuXG4gIHZhciBzb3VyY2UgPSAnKCcgKyBkYXRhICsgJyknLFxuICAgICAgYXN0ICAgID0gZXNwcmltYS5wYXJzZShzb3VyY2UsIHsgcmFuZ2U6IHRydWUgfSksXG4gICAgICBwYXJhbXMgPSBbXSxcbiAgICAgIGJvZHk7XG5cbiAgaWYgKGFzdC50eXBlICAgICAgICAgICAgICAgICAgICAhPT0gJ1Byb2dyYW0nICAgICAgICAgICAgIHx8XG4gICAgICBhc3QuYm9keS5sZW5ndGggICAgICAgICAgICAgIT09IDEgICAgICAgICAgICAgICAgICAgICB8fFxuICAgICAgYXN0LmJvZHlbMF0udHlwZSAgICAgICAgICAgICE9PSAnRXhwcmVzc2lvblN0YXRlbWVudCcgfHxcbiAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBhc3QuYm9keVswXS5leHByZXNzaW9uLnBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgIHBhcmFtcy5wdXNoKHBhcmFtLm5hbWUpO1xuICB9KTtcblxuICBib2R5ID0gYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5ib2R5LnJhbmdlO1xuXG4gIC8vIEVzcHJpbWEncyByYW5nZXMgaW5jbHVkZSB0aGUgZmlyc3QgJ3snIGFuZCB0aGUgbGFzdCAnfScgY2hhcmFjdGVycyBvblxuICAvLyBmdW5jdGlvbiBleHByZXNzaW9ucy4gU28gY3V0IHRoZW0gb3V0LlxuICAvKmVzbGludC1kaXNhYmxlIG5vLW5ldy1mdW5jKi9cbiAgcmV0dXJuIG5ldyBGdW5jdGlvbihwYXJhbXMsIHNvdXJjZS5zbGljZShib2R5WzBdICsgMSwgYm9keVsxXSAtIDEpKTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uKG9iamVjdCAvKiwgc3R5bGUqLykge1xuICByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvZnVuY3Rpb24nLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdEZ1bmN0aW9uLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbixcbiAgcHJlZGljYXRlOiBpc0Z1bmN0aW9uLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvblxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciByZWdleHAgPSBkYXRhLFxuICAgICAgdGFpbCAgID0gL1xcLyhbZ2ltXSopJC8uZXhlYyhkYXRhKSxcbiAgICAgIG1vZGlmaWVycyA9ICcnO1xuXG4gIC8vIGlmIHJlZ2V4cCBzdGFydHMgd2l0aCAnLycgaXQgY2FuIGhhdmUgbW9kaWZpZXJzIGFuZCBtdXN0IGJlIHByb3Blcmx5IGNsb3NlZFxuICAvLyBgL2Zvby9naW1gIC0gbW9kaWZpZXJzIHRhaWwgY2FuIGJlIG1heGltdW0gMyBjaGFyc1xuICBpZiAocmVnZXhwWzBdID09PSAnLycpIHtcbiAgICBpZiAodGFpbCkgbW9kaWZpZXJzID0gdGFpbFsxXTtcblxuICAgIGlmIChtb2RpZmllcnMubGVuZ3RoID4gMykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGlmIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggLywgaXMgc2hvdWxkIGJlIHByb3Blcmx5IHRlcm1pbmF0ZWRcbiAgICBpZiAocmVnZXhwW3JlZ2V4cC5sZW5ndGggLSBtb2RpZmllcnMubGVuZ3RoIC0gMV0gIT09ICcvJykgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRSZWdFeHAoZGF0YSkge1xuICB2YXIgcmVnZXhwID0gZGF0YSxcbiAgICAgIHRhaWwgICA9IC9cXC8oW2dpbV0qKSQvLmV4ZWMoZGF0YSksXG4gICAgICBtb2RpZmllcnMgPSAnJztcblxuICAvLyBgL2Zvby9naW1gIC0gdGFpbCBjYW4gYmUgbWF4aW11bSA0IGNoYXJzXG4gIGlmIChyZWdleHBbMF0gPT09ICcvJykge1xuICAgIGlmICh0YWlsKSBtb2RpZmllcnMgPSB0YWlsWzFdO1xuICAgIHJlZ2V4cCA9IHJlZ2V4cC5zbGljZSgxLCByZWdleHAubGVuZ3RoIC0gbW9kaWZpZXJzLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWdFeHAocmVnZXhwLCBtb2RpZmllcnMpO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwKG9iamVjdCAvKiwgc3R5bGUqLykge1xuICB2YXIgcmVzdWx0ID0gJy8nICsgb2JqZWN0LnNvdXJjZSArICcvJztcblxuICBpZiAob2JqZWN0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKG9iamVjdC5tdWx0aWxpbmUpIHJlc3VsdCArPSAnbSc7XG4gIGlmIChvYmplY3QuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc1JlZ0V4cChvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvcmVnZXhwJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRSZWdFeHAsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFJlZ0V4cCxcbiAgcHJlZGljYXRlOiBpc1JlZ0V4cCxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCgpIHtcbiAgLyplc2xpbnQtZGlzYWJsZSBuby11bmRlZmluZWQqL1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmpzL3VuZGVmaW5lZCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRVbmRlZmluZWQsXG4gIHByZWRpY2F0ZTogaXNVbmRlZmluZWQsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdFVuZGVmaW5lZFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjptYXAnLCB7XG4gIGtpbmQ6ICdtYXBwaW5nJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE1lcmdlKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgPT09ICc8PCcgfHwgZGF0YSA9PT0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbE1lcmdlXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sTnVsbChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGg7XG5cbiAgcmV0dXJuIChtYXggPT09IDEgJiYgZGF0YSA9PT0gJ34nKSB8fFxuICAgICAgICAgKG1heCA9PT0gNCAmJiAoZGF0YSA9PT0gJ251bGwnIHx8IGRhdGEgPT09ICdOdWxsJyB8fCBkYXRhID09PSAnTlVMTCcpKTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbE51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpc051bGwob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT09IG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm51bGwnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbE51bGwsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbE51bGwsXG4gIHByZWRpY2F0ZTogaXNOdWxsLFxuICByZXByZXNlbnQ6IHtcbiAgICBjYW5vbmljYWw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICd+JzsgICAgfSxcbiAgICBsb3dlcmNhc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdudWxsJzsgfSxcbiAgICB1cHBlcmNhc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdOVUxMJzsgfSxcbiAgICBjYW1lbGNhc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdOdWxsJzsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdsb3dlcmNhc2UnXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF90b1N0cmluZyAgICAgICA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sT21hcChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgb2JqZWN0S2V5cyA9IFtdLCBpbmRleCwgbGVuZ3RoLCBwYWlyLCBwYWlyS2V5LCBwYWlySGFzS2V5LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcbiAgICBwYWlySGFzS2V5ID0gZmFsc2U7XG5cbiAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHBhaXJLZXkgaW4gcGFpcikge1xuICAgICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhaXIsIHBhaXJLZXkpKSB7XG4gICAgICAgIGlmICghcGFpckhhc0tleSkgcGFpckhhc0tleSA9IHRydWU7XG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGFpckhhc0tleSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKG9iamVjdEtleXMuaW5kZXhPZihwYWlyS2V5KSA9PT0gLTEpIG9iamVjdEtleXMucHVzaChwYWlyS2V5KTtcbiAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sT21hcChkYXRhKSB7XG4gIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpvbWFwJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbE9tYXAsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbE9tYXBcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sUGFpcnMoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIGluZGV4LCBsZW5ndGgsIHBhaXIsIGtleXMsIHJlc3VsdCxcbiAgICAgIG9iamVjdCA9IGRhdGE7XG5cbiAgcmVzdWx0ID0gbmV3IEFycmF5KG9iamVjdC5sZW5ndGgpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHBhaXIgPSBvYmplY3RbaW5kZXhdO1xuXG4gICAgaWYgKF90b1N0cmluZy5jYWxsKHBhaXIpICE9PSAnW29iamVjdCBPYmplY3RdJykgcmV0dXJuIGZhbHNlO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHBhaXIpO1xuXG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXN1bHRbaW5kZXhdID0gWyBrZXlzWzBdLCBwYWlyW2tleXNbMF1dIF07XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbFBhaXJzKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBbXTtcblxuICB2YXIgaW5kZXgsIGxlbmd0aCwgcGFpciwga2V5cywgcmVzdWx0LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMocGFpcik7XG5cbiAgICByZXN1bHRbaW5kZXhdID0gWyBrZXlzWzBdLCBwYWlyW2tleXNbMF1dIF07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpwYWlycycsIHtcbiAga2luZDogJ3NlcXVlbmNlJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxQYWlycyxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sUGFpcnNcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c2VxJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IFtdOyB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbFNldChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIga2V5LCBvYmplY3QgPSBkYXRhO1xuXG4gIGZvciAoa2V5IGluIG9iamVjdCkge1xuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgIGlmIChvYmplY3Rba2V5XSAhPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sU2V0KGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnNldCcsIHtcbiAga2luZDogJ21hcHBpbmcnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFNldCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sU2V0XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogJyc7IH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIFlBTUxfVElNRVNUQU1QX1JFR0VYUCA9IG5ldyBSZWdFeHAoXG4gICdeKFswLTldWzAtOV1bMC05XVswLTldKScgICAgICAgICAgKyAvLyBbMV0geWVhclxuICAnLShbMC05XVswLTldPyknICAgICAgICAgICAgICAgICAgICsgLy8gWzJdIG1vbnRoXG4gICctKFswLTldWzAtOV0/KScgICAgICAgICAgICAgICAgICAgKyAvLyBbM10gZGF5XG4gICcoPzooPzpbVHRdfFsgXFxcXHRdKyknICAgICAgICAgICAgICArIC8vIC4uLlxuICAnKFswLTldWzAtOV0/KScgICAgICAgICAgICAgICAgICAgICsgLy8gWzRdIGhvdXJcbiAgJzooWzAtOV1bMC05XSknICAgICAgICAgICAgICAgICAgICArIC8vIFs1XSBtaW51dGVcbiAgJzooWzAtOV1bMC05XSknICAgICAgICAgICAgICAgICAgICArIC8vIFs2XSBzZWNvbmRcbiAgJyg/OlxcXFwuKFswLTldKikpPycgICAgICAgICAgICAgICAgICsgLy8gWzddIGZyYWN0aW9uXG4gICcoPzpbIFxcXFx0XSooWnwoWy0rXSkoWzAtOV1bMC05XT8pJyArIC8vIFs4XSB0eiBbOV0gdHpfc2lnbiBbMTBdIHR6X2hvdXJcbiAgJyg/OjooWzAtOV1bMC05XSkpPykpPyk/JCcpOyAgICAgICAgIC8vIFsxMV0gdHpfbWludXRlXG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sVGltZXN0YW1wKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wKGRhdGEpIHtcbiAgdmFyIG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24gPSAwLFxuICAgICAgZGVsdGEgPSBudWxsLCB0el9ob3VyLCB0el9taW51dGUsIGRhdGU7XG5cbiAgbWF0Y2ggPSBZQU1MX1RJTUVTVEFNUF9SRUdFWFAuZXhlYyhkYXRhKTtcblxuICBpZiAobWF0Y2ggPT09IG51bGwpIHRocm93IG5ldyBFcnJvcignRGF0ZSByZXNvbHZlIGVycm9yJyk7XG5cbiAgLy8gbWF0Y2g6IFsxXSB5ZWFyIFsyXSBtb250aCBbM10gZGF5XG5cbiAgeWVhciA9ICsobWF0Y2hbMV0pO1xuICBtb250aCA9ICsobWF0Y2hbMl0pIC0gMTsgLy8gSlMgbW9udGggc3RhcnRzIHdpdGggMFxuICBkYXkgPSArKG1hdGNoWzNdKTtcblxuICBpZiAoIW1hdGNoWzRdKSB7IC8vIG5vIGhvdXJcbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSkpO1xuICB9XG5cbiAgLy8gbWF0Y2g6IFs0XSBob3VyIFs1XSBtaW51dGUgWzZdIHNlY29uZCBbN10gZnJhY3Rpb25cblxuICBob3VyID0gKyhtYXRjaFs0XSk7XG4gIG1pbnV0ZSA9ICsobWF0Y2hbNV0pO1xuICBzZWNvbmQgPSArKG1hdGNoWzZdKTtcblxuICBpZiAobWF0Y2hbN10pIHtcbiAgICBmcmFjdGlvbiA9IG1hdGNoWzddLnNsaWNlKDAsIDMpO1xuICAgIHdoaWxlIChmcmFjdGlvbi5sZW5ndGggPCAzKSB7IC8vIG1pbGxpLXNlY29uZHNcbiAgICAgIGZyYWN0aW9uICs9ICcwJztcbiAgICB9XG4gICAgZnJhY3Rpb24gPSArZnJhY3Rpb247XG4gIH1cblxuICAvLyBtYXRjaDogWzhdIHR6IFs5XSB0el9zaWduIFsxMF0gdHpfaG91ciBbMTFdIHR6X21pbnV0ZVxuXG4gIGlmIChtYXRjaFs5XSkge1xuICAgIHR6X2hvdXIgPSArKG1hdGNoWzEwXSk7XG4gICAgdHpfbWludXRlID0gKyhtYXRjaFsxMV0gfHwgMCk7XG4gICAgZGVsdGEgPSAodHpfaG91ciAqIDYwICsgdHpfbWludXRlKSAqIDYwMDAwOyAvLyBkZWx0YSBpbiBtaWxpLXNlY29uZHNcbiAgICBpZiAobWF0Y2hbOV0gPT09ICctJykgZGVsdGEgPSAtZGVsdGE7XG4gIH1cblxuICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWN0aW9uKSk7XG5cbiAgaWYgKGRlbHRhKSBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgLSBkZWx0YSk7XG5cbiAgcmV0dXJuIGRhdGU7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxUaW1lc3RhbXAob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHJldHVybiBvYmplY3QudG9JU09TdHJpbmcoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxUaW1lc3RhbXAsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFRpbWVzdGFtcCxcbiAgaW5zdGFuY2VPZjogRGF0ZSxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sVGltZXN0YW1wXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG4vLyBwcml2YXRlIHByb3BlcnR5XG52YXIgX2tleVN0ciA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIjtcblxuXG4vLyBwdWJsaWMgbWV0aG9kIGZvciBlbmNvZGluZ1xuLy8gZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuLy8gICAgIHZhciBvdXRwdXQgPSBbXTtcbi8vICAgICB2YXIgY2hyMSwgY2hyMiwgY2hyMywgZW5jMSwgZW5jMiwgZW5jMywgZW5jNDtcbi8vICAgICB2YXIgaSA9IDAsIGxlbiA9IGlucHV0Lmxlbmd0aCwgcmVtYWluaW5nQnl0ZXMgPSBsZW47XG5cbi8vICAgICB2YXIgaXNBcnJheSA9IHV0aWxzLmdldFR5cGVPZihpbnB1dCkgIT09IFwic3RyaW5nXCI7XG4vLyAgICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcbi8vICAgICAgICAgcmVtYWluaW5nQnl0ZXMgPSBsZW4gLSBpO1xuXG4vLyAgICAgICAgIGlmICghaXNBcnJheSkge1xuLy8gICAgICAgICAgICAgY2hyMSA9IGlucHV0LmNoYXJDb2RlQXQoaSsrKTtcbi8vICAgICAgICAgICAgIGNocjIgPSBpIDwgbGVuID8gaW5wdXQuY2hhckNvZGVBdChpKyspIDogMDtcbi8vICAgICAgICAgICAgIGNocjMgPSBpIDwgbGVuID8gaW5wdXQuY2hhckNvZGVBdChpKyspIDogMDtcbi8vICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgIGNocjEgPSBpbnB1dFtpKytdO1xuLy8gICAgICAgICAgICAgY2hyMiA9IGkgPCBsZW4gPyBpbnB1dFtpKytdIDogMDtcbi8vICAgICAgICAgICAgIGNocjMgPSBpIDwgbGVuID8gaW5wdXRbaSsrXSA6IDA7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBlbmMxID0gY2hyMSA+PiAyO1xuLy8gICAgICAgICBlbmMyID0gKChjaHIxICYgMykgPDwgNCkgfCAoY2hyMiA+PiA0KTtcbi8vICAgICAgICAgZW5jMyA9IHJlbWFpbmluZ0J5dGVzID4gMSA/ICgoKGNocjIgJiAxNSkgPDwgMikgfCAoY2hyMyA+PiA2KSkgOiA2NDtcbi8vICAgICAgICAgZW5jNCA9IHJlbWFpbmluZ0J5dGVzID4gMiA/IChjaHIzICYgNjMpIDogNjQ7XG5cbi8vICAgICAgICAgb3V0cHV0LnB1c2goX2tleVN0ci5jaGFyQXQoZW5jMSkgKyBfa2V5U3RyLmNoYXJBdChlbmMyKSArIF9rZXlTdHIuY2hhckF0KGVuYzMpICsgX2tleVN0ci5jaGFyQXQoZW5jNCkpO1xuXG4vLyAgICAgfVxuXG4vLyAgICAgcmV0dXJuIG91dHB1dC5qb2luKFwiXCIpO1xuLy8gfTtcblxuLy8gcHVibGljIG1ldGhvZCBmb3IgZGVjb2RpbmdcbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24oaW5wdXQpIHtcbiAgICB2YXIgY2hyMSwgY2hyMiwgY2hyMztcbiAgICB2YXIgZW5jMSwgZW5jMiwgZW5jMywgZW5jNDtcbiAgICB2YXIgaSA9IDAsIHJlc3VsdEluZGV4ID0gMDtcblxuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvW15BLVphLXowLTlcXCtcXC9cXD1dL2csIFwiXCIpO1xuXG4gICAgdmFyIHRvdGFsTGVuZ3RoID0gaW5wdXQubGVuZ3RoICogMyAvIDQ7XG4gICAgaWYoaW5wdXQuY2hhckF0KGlucHV0Lmxlbmd0aCAtIDEpID09PSBfa2V5U3RyLmNoYXJBdCg2NCkpIHtcbiAgICAgICAgdG90YWxMZW5ndGgtLTtcbiAgICB9XG4gICAgaWYoaW5wdXQuY2hhckF0KGlucHV0Lmxlbmd0aCAtIDIpID09PSBfa2V5U3RyLmNoYXJBdCg2NCkpIHtcbiAgICAgICAgdG90YWxMZW5ndGgtLTtcbiAgICB9XG4gICAgdmFyIG91dHB1dDtcbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIG91dHB1dCA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXQgPSBuZXcgQXJyYXkodG90YWxMZW5ndGgpO1xuICAgIH1cblxuICAgIHdoaWxlIChpIDwgaW5wdXQubGVuZ3RoKSB7XG5cbiAgICAgICAgZW5jMSA9IF9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzIgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmMzID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jNCA9IF9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG5cbiAgICAgICAgY2hyMSA9IChlbmMxIDw8IDIpIHwgKGVuYzIgPj4gNCk7XG4gICAgICAgIGNocjIgPSAoKGVuYzIgJiAxNSkgPDwgNCkgfCAoZW5jMyA+PiAyKTtcbiAgICAgICAgY2hyMyA9ICgoZW5jMyAmIDMpIDw8IDYpIHwgZW5jNDtcblxuICAgICAgICBvdXRwdXRbcmVzdWx0SW5kZXgrK10gPSBjaHIxO1xuXG4gICAgICAgIGlmIChlbmMzICE9PSA2NCkge1xuICAgICAgICAgICAgb3V0cHV0W3Jlc3VsdEluZGV4KytdID0gY2hyMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5jNCAhPT0gNjQpIHtcbiAgICAgICAgICAgIG91dHB1dFtyZXN1bHRJbmRleCsrXSA9IGNocjM7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi9leHRlcm5hbFwiKTtcbnZhciBEYXRhV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vRGF0YVdvcmtlcicpO1xudmFyIERhdGFMZW5ndGhQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFMZW5ndGhQcm9iZScpO1xudmFyIENyYzMyUHJvYmUgPSByZXF1aXJlKCcuL3N0cmVhbS9DcmMzMlByb2JlJyk7XG52YXIgRGF0YUxlbmd0aFByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlJyk7XG5cbi8qKlxuICogUmVwcmVzZW50IGEgY29tcHJlc3NlZCBvYmplY3QsIHdpdGggZXZlcnl0aGluZyBuZWVkZWQgdG8gZGVjb21wcmVzcyBpdC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtudW1iZXJ9IGNvbXByZXNzZWRTaXplIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbXByZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gdW5jb21wcmVzc2VkU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBhZnRlciBkZWNvbXByZXNzaW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGNyYzMyIHRoZSBjcmMzMiBvZiB0aGUgZGVjb21wcmVzc2VkIGZpbGUuXG4gKiBAcGFyYW0ge29iamVjdH0gY29tcHJlc3Npb24gdGhlIHR5cGUgb2YgY29tcHJlc3Npb24sIHNlZSBsaWIvY29tcHJlc3Npb25zLmpzLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGNvbXByZXNzZWQgZGF0YS5cbiAqL1xuZnVuY3Rpb24gQ29tcHJlc3NlZE9iamVjdChjb21wcmVzc2VkU2l6ZSwgdW5jb21wcmVzc2VkU2l6ZSwgY3JjMzIsIGNvbXByZXNzaW9uLCBkYXRhKSB7XG4gICAgdGhpcy5jb21wcmVzc2VkU2l6ZSA9IGNvbXByZXNzZWRTaXplO1xuICAgIHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9IHVuY29tcHJlc3NlZFNpemU7XG4gICAgdGhpcy5jcmMzMiA9IGNyYzMyO1xuICAgIHRoaXMuY29tcHJlc3Npb24gPSBjb21wcmVzc2lvbjtcbiAgICB0aGlzLmNvbXByZXNzZWRDb250ZW50ID0gZGF0YTtcbn1cblxuQ29tcHJlc3NlZE9iamVjdC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgd29ya2VyIHRvIGdldCB0aGUgdW5jb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICBnZXRDb250ZW50V29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd29ya2VyID0gbmV3IERhdGFXb3JrZXIoZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29tcHJlc3NlZENvbnRlbnQpKVxuICAgICAgICAucGlwZSh0aGlzLmNvbXByZXNzaW9uLnVuY29tcHJlc3NXb3JrZXIoKSlcbiAgICAgICAgLnBpcGUobmV3IERhdGFMZW5ndGhQcm9iZShcImRhdGFfbGVuZ3RoXCIpKTtcblxuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHdvcmtlci5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZih0aGlzLnN0cmVhbUluZm9bJ2RhdGFfbGVuZ3RoJ10gIT09IHRoYXQudW5jb21wcmVzc2VkU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZyA6IHVuY29tcHJlc3NlZCBkYXRhIHNpemUgbWlzbWF0Y2hcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gd29ya2VyO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgd29ya2VyIHRvIGdldCB0aGUgY29tcHJlc3NlZCBjb250ZW50LlxuICAgICAqIEByZXR1cm4ge0dlbmVyaWNXb3JrZXJ9IHRoZSB3b3JrZXIuXG4gICAgICovXG4gICAgZ2V0Q29tcHJlc3NlZFdvcmtlciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhV29ya2VyKGV4dGVybmFsLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSlcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwiY29tcHJlc3NlZFNpemVcIiwgdGhpcy5jb21wcmVzc2VkU2l6ZSlcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwidW5jb21wcmVzc2VkU2l6ZVwiLCB0aGlzLnVuY29tcHJlc3NlZFNpemUpXG4gICAgICAgIC53aXRoU3RyZWFtSW5mbyhcImNyYzMyXCIsIHRoaXMuY3JjMzIpXG4gICAgICAgIC53aXRoU3RyZWFtSW5mbyhcImNvbXByZXNzaW9uXCIsIHRoaXMuY29tcHJlc3Npb24pXG4gICAgICAgIDtcbiAgICB9XG59O1xuXG4vKipcbiAqIENoYWluIHRoZSBnaXZlbiB3b3JrZXIgd2l0aCBvdGhlciB3b3JrZXJzIHRvIGNvbXByZXNzIHRoZSBjb250ZW50IHdpdGggdGhlXG4gKiBnaXZlbiBjb21wcmVzaW9uLlxuICogQHBhcmFtIHtHZW5lcmljV29ya2VyfSB1bmNvbXByZXNzZWRXb3JrZXIgdGhlIHdvcmtlciB0byBwaXBlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbXByZXNzaW9uIHRoZSBjb21wcmVzc2lvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb25PcHRpb25zIHRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIGNvbXByZXNzaW5nLlxuICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIG5ldyB3b3JrZXIgY29tcHJlc3NpbmcgdGhlIGNvbnRlbnQuXG4gKi9cbkNvbXByZXNzZWRPYmplY3QuY3JlYXRlV29ya2VyRnJvbSA9IGZ1bmN0aW9uICh1bmNvbXByZXNzZWRXb3JrZXIsIGNvbXByZXNzaW9uLCBjb21wcmVzc2lvbk9wdGlvbnMpIHtcbiAgICByZXR1cm4gdW5jb21wcmVzc2VkV29ya2VyXG4gICAgLnBpcGUobmV3IENyYzMyUHJvYmUoKSlcbiAgICAucGlwZShuZXcgRGF0YUxlbmd0aFByb2JlKFwidW5jb21wcmVzc2VkU2l6ZVwiKSlcbiAgICAucGlwZShjb21wcmVzc2lvbi5jb21wcmVzc1dvcmtlcihjb21wcmVzc2lvbk9wdGlvbnMpKVxuICAgIC5waXBlKG5ldyBEYXRhTGVuZ3RoUHJvYmUoXCJjb21wcmVzc2VkU2l6ZVwiKSlcbiAgICAud2l0aFN0cmVhbUluZm8oXCJjb21wcmVzc2lvblwiLCBjb21wcmVzc2lvbik7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXByZXNzZWRPYmplY3Q7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZShcIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXJcIik7XG5cbmV4cG9ydHMuU1RPUkUgPSB7XG4gICAgbWFnaWM6IFwiXFx4MDBcXHgwMFwiLFxuICAgIC8vIGNvbXByZXNzV29ya2VyIDogZnVuY3Rpb24gKGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIC8vICAgICByZXR1cm4gbmV3IEdlbmVyaWNXb3JrZXIoXCJTVE9SRSBjb21wcmVzc2lvblwiKTtcbiAgICAvLyB9LFxuICAgIHVuY29tcHJlc3NXb3JrZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgR2VuZXJpY1dvcmtlcihcIlNUT1JFIGRlY29tcHJlc3Npb25cIik7XG4gICAgfVxufTtcbmV4cG9ydHMuREVGTEFURSA9IHJlcXVpcmUoJy4vZmxhdGUnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNvbWUgZnJvbSBwYWtvLCBmcm9tIHBha28vbGliL3psaWIvY3JjMzIuanNcbiAqIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgc2VlIHBha28gaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9wYWtvL1xuICovXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gICAgdmFyIGMsIHRhYmxlID0gW107XG5cbiAgICBmb3IodmFyIG4gPTA7IG4gPCAyNTY7IG4rKyl7XG4gICAgICAgIGMgPSBuO1xuICAgICAgICBmb3IodmFyIGsgPTA7IGsgPCA4OyBrKyspe1xuICAgICAgICAgICAgYyA9ICgoYyYxKSA/ICgweEVEQjg4MzIwIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGFibGVbbl0gPSBjO1xuICAgIH1cblxuICAgIHJldHVybiB0YWJsZTtcbn1cblxuLy8gQ3JlYXRlIHRhYmxlIG9uIGxvYWQuIEp1c3QgMjU1IHNpZ25lZCBsb25ncy4gTm90IGEgcHJvYmxlbS5cbnZhciBjcmNUYWJsZSA9IG1ha2VUYWJsZSgpO1xuXG5cbmZ1bmN0aW9uIGNyYzMyKGNyYywgYnVmLCBsZW4sIHBvcykge1xuICAgIHZhciB0ID0gY3JjVGFibGUsIGVuZCA9IHBvcyArIGxlbjtcblxuICAgIGNyYyA9IGNyYyBeICgtMSk7XG5cbiAgICBmb3IgKHZhciBpID0gcG9zOyBpIDwgZW5kOyBpKysgKSB7XG4gICAgICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICAgIH1cblxuICAgIHJldHVybiAoY3JjIF4gKC0xKSk7IC8vID4+PiAwO1xufVxuXG4vLyBUaGF0J3MgYWxsIGZvciB0aGUgcGFrbyBmdW5jdGlvbnMuXG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgY3JjMzIgb2YgYSBzdHJpbmcuXG4gKiBUaGlzIGlzIGFsbW9zdCB0aGUgc2FtZSBhcyB0aGUgZnVuY3Rpb24gY3JjMzIsIGJ1dCBmb3Igc3RyaW5ncy4gVXNpbmcgdGhlXG4gKiBzYW1lIGZ1bmN0aW9uIGZvciB0aGUgdHdvIHVzZSBjYXNlcyBsZWFkcyB0byBob3JyaWJsZSBwZXJmb3JtYW5jZXMuXG4gKiBAcGFyYW0ge051bWJlcn0gY3JjIHRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgY3JjLlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHVzZS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLlxuICogQHBhcmFtIHtOdW1iZXJ9IHBvcyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBjcmMzMiBjb21wdXRhdGlvbi5cbiAqIEByZXR1cm4ge051bWJlcn0gdGhlIGNvbXB1dGVkIGNyYzMyLlxuICovXG5mdW5jdGlvbiBjcmMzMnN0cihjcmMsIHN0ciwgbGVuLCBwb3MpIHtcbiAgICB2YXIgdCA9IGNyY1RhYmxlLCBlbmQgPSBwb3MgKyBsZW47XG5cbiAgICBjcmMgPSBjcmMgXiAoLTEpO1xuXG4gICAgZm9yICh2YXIgaSA9IHBvczsgaSA8IGVuZDsgaSsrICkge1xuICAgICAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRbKGNyYyBeIHN0ci5jaGFyQ29kZUF0KGkpKSAmIDB4RkZdO1xuICAgIH1cblxuICAgIHJldHVybiAoY3JjIF4gKC0xKSk7IC8vID4+PiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyYzMyd3JhcHBlcihpbnB1dCwgY3JjKSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHZhciBpc0FycmF5ID0gdXRpbHMuZ2V0VHlwZU9mKGlucHV0KSAhPT0gXCJzdHJpbmdcIjtcblxuICAgIGlmKGlzQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIGNyYzMyKGNyY3wwLCBpbnB1dCwgaW5wdXQubGVuZ3RoLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY3JjMzJzdHIoY3JjfDAsIGlucHV0LCBpbnB1dC5sZW5ndGgsIDApO1xuICAgIH1cbn07XG4vLyB2aW06IHNldCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDpcbiIsIid1c2Ugc3RyaWN0JztcbmV4cG9ydHMuYmFzZTY0ID0gZmFsc2U7XG5leHBvcnRzLmJpbmFyeSA9IGZhbHNlO1xuZXhwb3J0cy5kaXIgPSBmYWxzZTtcbmV4cG9ydHMuY3JlYXRlRm9sZGVycyA9IHRydWU7XG5leHBvcnRzLmRhdGUgPSBudWxsO1xuZXhwb3J0cy5jb21wcmVzc2lvbiA9IG51bGw7XG5leHBvcnRzLmNvbXByZXNzaW9uT3B0aW9ucyA9IG51bGw7XG5leHBvcnRzLmNvbW1lbnQgPSBudWxsO1xuZXhwb3J0cy51bml4UGVybWlzc2lvbnMgPSBudWxsO1xuZXhwb3J0cy5kb3NQZXJtaXNzaW9ucyA9IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIHZhciBFUzZQcm9taXNlID0gcmVxdWlyZShcImVzNi1wcm9taXNlXCIpLlByb21pc2U7XG5cbi8qKlxuICogTGV0IHRoZSB1c2VyIHVzZS9jaGFuZ2Ugc29tZSBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIFByb21pc2U6IHdpbmRvdy5Qcm9taXNlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFVTRV9UWVBFREFSUkFZID0gKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykgJiYgKHR5cGVvZiBVaW50MTZBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmICh0eXBlb2YgVWludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKTtcblxudmFyIHBha28gPSByZXF1aXJlKFwicGFrb1wiKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKFwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlclwiKTtcblxudmFyIEFSUkFZX1RZUEUgPSBVU0VfVFlQRURBUlJBWSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiO1xuXG5leHBvcnRzLm1hZ2ljID0gXCJcXHgwOFxceDAwXCI7XG5cbi8qKlxuICogQ3JlYXRlIGEgd29ya2VyIHRoYXQgdXNlcyBwYWtvIHRvIGluZmxhdGUvZGVmbGF0ZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvbiB0aGUgbmFtZSBvZiB0aGUgcGFrbyBmdW5jdGlvbiB0byBjYWxsIDogZWl0aGVyIFwiRGVmbGF0ZVwiIG9yIFwiSW5mbGF0ZVwiLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gKGRlKWNvbXByZXNzaW5nLlxuICovXG5mdW5jdGlvbiBGbGF0ZVdvcmtlcihhY3Rpb24sIG9wdGlvbnMpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJGbGF0ZVdvcmtlci9cIiArIGFjdGlvbik7XG5cbiAgICB0aGlzLl9wYWtvID0gbmV3IHBha29bYWN0aW9uXSh7XG4gICAgICAgIHJhdzp0cnVlLFxuICAgICAgICBsZXZlbCA6IG9wdGlvbnMubGV2ZWwgfHwgLTEgLy8gZGVmYXVsdCBjb21wcmVzc2lvblxuICAgIH0pO1xuICAgIC8vIHRoZSBgbWV0YWAgb2JqZWN0IGZyb20gdGhlIGxhc3QgY2h1bmsgcmVjZWl2ZWRcbiAgICAvLyB0aGlzIGFsbG93IHRoaXMgd29ya2VyIHRvIHBhc3MgYXJvdW5kIG1ldGFkYXRhXG4gICAgdGhpcy5tZXRhID0ge307XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fcGFrby5vbkRhdGEgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHNlbGYucHVzaCh7XG4gICAgICAgICAgICBkYXRhIDogZGF0YSxcbiAgICAgICAgICAgIG1ldGEgOiBzZWxmLm1ldGFcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxudXRpbHMuaW5oZXJpdHMoRmxhdGVXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuRmxhdGVXb3JrZXIucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHRoaXMubWV0YSA9IGNodW5rLm1ldGE7XG4gICAgdGhpcy5fcGFrby5wdXNoKHV0aWxzLnRyYW5zZm9ybVRvKEFSUkFZX1RZUEUsIGNodW5rLmRhdGEpLCBmYWxzZSk7XG59O1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5mbHVzaFxuICovXG5GbGF0ZVdvcmtlci5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5wcm90b3R5cGUuZmx1c2guY2FsbCh0aGlzKTtcbiAgICB0aGlzLl9wYWtvLnB1c2goW10sIHRydWUpO1xufTtcbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmNsZWFuVXBcbiAqL1xuRmxhdGVXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5wcm90b3R5cGUuY2xlYW5VcC5jYWxsKHRoaXMpO1xuICAgIHRoaXMuX3Bha28gPSBudWxsO1xufTtcblxuZXhwb3J0cy5jb21wcmVzc1dvcmtlciA9IGZ1bmN0aW9uIChjb21wcmVzc2lvbk9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEZsYXRlV29ya2VyKFwiRGVmbGF0ZVwiLCBjb21wcmVzc2lvbk9wdGlvbnMpO1xufTtcbmV4cG9ydHMudW5jb21wcmVzc1dvcmtlciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IEZsYXRlV29ya2VyKFwiSW5mbGF0ZVwiLCB7fSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFJlcHJlc2VudGF0aW9uIGEgb2YgemlwIGZpbGUgaW4ganNcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBKU1ppcCgpIHtcbiAgICAvLyBpZiB0aGlzIGNvbnN0cnVjdG9yIGlzwqB1c2VkIHdpdGhvdXTCoGBuZXdgLCBpdMKgYWRkcyBgbmV3YCBiZWZvcmXCoGl0c2VsZjpcbiAgICBpZighKHRoaXMgaW5zdGFuY2VvZiBKU1ppcCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKU1ppcCgpO1xuICAgIH1cblxuICAgIGlmKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGNvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycyBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLlwiKTtcbiAgICB9XG5cbiAgICAvLyBvYmplY3QgY29udGFpbmluZyB0aGUgZmlsZXMgOlxuICAgIC8vIHtcbiAgICAvLyAgIFwiZm9sZGVyL1wiIDogey4uLn0sXG4gICAgLy8gICBcImZvbGRlci9kYXRhLnR4dFwiIDogey4uLn1cbiAgICAvLyB9XG4gICAgdGhpcy5maWxlcyA9IHt9O1xuXG4gICAgdGhpcy5jb21tZW50ID0gbnVsbDtcblxuICAgIC8vIFdoZXJlIHdlIGFyZSBpbiB0aGUgaGllcmFyY2h5XG4gICAgdGhpcy5yb290ID0gXCJcIjtcbiAgICB0aGlzLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBuZXdPYmogPSBuZXcgSlNaaXAoKTtcbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXNbaV0gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIG5ld09ialtpXSA9IHRoaXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld09iajtcbiAgICB9O1xufVxuSlNaaXAucHJvdG90eXBlID0gcmVxdWlyZSgnLi9vYmplY3QnKTtcbkpTWmlwLnByb3RvdHlwZS5sb2FkQXN5bmMgPSByZXF1aXJlKCcuL2xvYWQnKTtcbkpTWmlwLnN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbkpTWmlwLmRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xuXG5KU1ppcC5sb2FkQXN5bmMgPSBmdW5jdGlvbiAoY29udGVudCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgSlNaaXAoKS5sb2FkQXN5bmMoY29udGVudCwgb3B0aW9ucyk7XG59O1xuXG5KU1ppcC5leHRlcm5hbCA9IHJlcXVpcmUoXCIuL2V4dGVybmFsXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBKU1ppcDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBleHRlcm5hbCA9IHJlcXVpcmUoXCIuL2V4dGVybmFsXCIpO1xudmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBaaXBFbnRyaWVzID0gcmVxdWlyZSgnLi96aXBFbnRyaWVzJyk7XG52YXIgQ3JjMzJQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0NyYzMyUHJvYmUnKTtcbnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoXCIuL25vZGVqc1V0aWxzXCIpO1xuXG4vKipcbiAqIENoZWNrIHRoZSBDUkMzMiBvZiBhbiBlbnRyeS5cbiAqIEBwYXJhbSB7WmlwRW50cnl9IHppcEVudHJ5IHRoZSB6aXAgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBjaGVja0VudHJ5Q1JDMzIoemlwRW50cnkpIHtcbiAgICByZXR1cm4gbmV3IGV4dGVybmFsLlByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgd29ya2VyID0gemlwRW50cnkuZGVjb21wcmVzc2VkLmdldENvbnRlbnRXb3JrZXIoKS5waXBlKG5ldyBDcmMzMlByb2JlKCkpO1xuICAgICAgICB3b3JrZXIub24oXCJlcnJvclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9KVxuICAgICAgICAub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHdvcmtlci5zdHJlYW1JbmZvLmNyYzMyICE9PSB6aXBFbnRyeS5kZWNvbXByZXNzZWQuY3JjMzIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IENSQzMyIG1pc21hdGNoXCIpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAucmVzdW1lKCk7XG4gICAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZGF0YSwgb3B0aW9ucykge1xuICAgIHZhciB6aXAgPSB0aGlzO1xuICAgIG9wdGlvbnMgPSB1dGlscy5leHRlbmQob3B0aW9ucyB8fCB7fSwge1xuICAgICAgICBiYXNlNjQ6IGZhbHNlLFxuICAgICAgICBjaGVja0NSQzMyOiBmYWxzZSxcbiAgICAgICAgb3B0aW1pemVkQmluYXJ5U3RyaW5nOiBmYWxzZSxcbiAgICAgICAgY3JlYXRlRm9sZGVyczogZmFsc2UsXG4gICAgICAgIGRlY29kZUZpbGVOYW1lOiB1dGY4LnV0ZjhkZWNvZGVcbiAgICB9KTtcblxuICAgIGlmIChub2RlanNVdGlscy5pc05vZGUgJiYgbm9kZWpzVXRpbHMuaXNTdHJlYW0oZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVybmFsLlByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkpTWmlwIGNhbid0IGFjY2VwdCBhIHN0cmVhbSB3aGVuIGxvYWRpbmcgYSB6aXAgZmlsZS5cIikpO1xuICAgIH1cblxuICAgIHJldHVybiB1dGlscy5wcmVwYXJlQ29udGVudChcInRoZSBsb2FkZWQgemlwIGZpbGVcIiwgZGF0YSwgdHJ1ZSwgb3B0aW9ucy5vcHRpbWl6ZWRCaW5hcnlTdHJpbmcsIG9wdGlvbnMuYmFzZTY0KVxuICAgIC50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdmFyIHppcEVudHJpZXMgPSBuZXcgWmlwRW50cmllcyhvcHRpb25zKTtcbiAgICAgICAgemlwRW50cmllcy5sb2FkKGRhdGEpO1xuICAgICAgICByZXR1cm4gemlwRW50cmllcztcbiAgICB9KS50aGVuKGZ1bmN0aW9uIGNoZWNrQ1JDMzIoemlwRW50cmllcykge1xuICAgICAgICB2YXIgcHJvbWlzZXMgPSBbZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHppcEVudHJpZXMpXTtcbiAgICAgICAgdmFyIGZpbGVzID0gemlwRW50cmllcy5maWxlcztcbiAgICAgICAgaWYgKG9wdGlvbnMuY2hlY2tDUkMzMikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goY2hlY2tFbnRyeUNSQzMyKGZpbGVzW2ldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4dGVybmFsLlByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIGFkZEZpbGVzKHJlc3VsdHMpIHtcbiAgICAgICAgdmFyIHppcEVudHJpZXMgPSByZXN1bHRzLnNoaWZ0KCk7XG4gICAgICAgIHZhciBmaWxlcyA9IHppcEVudHJpZXMuZmlsZXM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpbnB1dCA9IGZpbGVzW2ldO1xuICAgICAgICAgICAgemlwLmZpbGUoaW5wdXQuZmlsZU5hbWVTdHIsIGlucHV0LmRlY29tcHJlc3NlZCwge1xuICAgICAgICAgICAgICAgIGJpbmFyeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgZGF0ZTogaW5wdXQuZGF0ZSxcbiAgICAgICAgICAgICAgICBkaXI6IGlucHV0LmRpcixcbiAgICAgICAgICAgICAgICBjb21tZW50IDogaW5wdXQuZmlsZUNvbW1lbnRTdHIubGVuZ3RoID8gaW5wdXQuZmlsZUNvbW1lbnRTdHIgOiBudWxsLFxuICAgICAgICAgICAgICAgIHVuaXhQZXJtaXNzaW9ucyA6IGlucHV0LnVuaXhQZXJtaXNzaW9ucyxcbiAgICAgICAgICAgICAgICBkb3NQZXJtaXNzaW9ucyA6IGlucHV0LmRvc1Blcm1pc3Npb25zLFxuICAgICAgICAgICAgICAgIGNyZWF0ZUZvbGRlcnM6IG9wdGlvbnMuY3JlYXRlRm9sZGVyc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHppcEVudHJpZXMuemlwQ29tbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHppcC5jb21tZW50ID0gemlwRW50cmllcy56aXBDb21tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHppcDtcbiAgICB9KTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi4vc3RyZWFtL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBBIHdvcmtlciB0aGF0IHVzZSBhIG5vZGVqcyBzdHJlYW0gYXMgc291cmNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZW50cnkgZm9yIHRoaXMgc3RyZWFtLlxuICogQHBhcmFtIHtSZWFkYWJsZX0gc3RyZWFtIHRoZSBub2RlanMgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIoZmlsZW5hbWUsIHN0cmVhbSkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIk5vZGVqcyBzdHJlYW0gaW5wdXQgYWRhcHRlciBmb3IgXCIgKyBmaWxlbmFtZSk7XG4gICAgdGhpcy5fdXBzdHJlYW1FbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2JpbmRTdHJlYW0oc3RyZWFtKTtcbn1cblxudXRpbHMuaW5oZXJpdHMoTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBQcmVwYXJlIHRoZSBzdHJlYW0gYW5kIGJpbmQgdGhlIGNhbGxiYWNrcyBvbiBpdC5cbiAqIERvIHRoaXMgQVNBUCBvbiBub2RlIDAuMTAgISBBIGxhenkgYmluZGluZyBkb2Vzbid0IGFsd2F5cyB3b3JrLlxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSB0aGUgbm9kZWpzIHN0cmVhbSB0byB1c2UuXG4gKi9cbk5vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5wcm90b3R5cGUuX2JpbmRTdHJlYW0gPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICBzdHJlYW1cbiAgICAub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICBzZWxmLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogY2h1bmssXG4gICAgICAgICAgICBtZXRhIDoge1xuICAgICAgICAgICAgICAgIHBlcmNlbnQgOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYoc2VsZi5pc1BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWRFcnJvciA9IGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfSlcbiAgICAub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZihzZWxmLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICBzZWxmLl91cHN0cmVhbUVuZGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuZW5kKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKCFHZW5lcmljV29ya2VyLnByb3RvdHlwZS5wYXVzZS5jYWxsKHRoaXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5fc3RyZWFtLnBhdXNlKCk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoIUdlbmVyaWNXb3JrZXIucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZih0aGlzLl91cHN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHRoaXMuZW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlJlYWRhYmxlO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnV0aWwuaW5oZXJpdHMoTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlciwgUmVhZGFibGUpO1xuXG4vKipcbiogQSBub2RlanMgc3RyZWFtIHVzaW5nIGEgd29ya2VyIGFzIHNvdXJjZS5cbiogQHNlZSB0aGUgU291cmNlV3JhcHBlciBpbiBodHRwOi8vbm9kZWpzLm9yZy9hcGkvc3RyZWFtLmh0bWxcbiogQGNvbnN0cnVjdG9yXG4qIEBwYXJhbSB7U3RyZWFtSGVscGVyfSBoZWxwZXIgdGhlIGhlbHBlciB3cmFwcGluZyB0aGUgd29ya2VyXG4qIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBub2RlanMgc3RyZWFtIG9wdGlvbnNcbiogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2IgdGhlIHVwZGF0ZSBjYWxsYmFjay5cbiovXG5mdW5jdGlvbiBOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyKGhlbHBlciwgb3B0aW9ucywgdXBkYXRlQ2IpIHtcbiAgICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuX2hlbHBlciA9IGhlbHBlcjtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBoZWxwZXIub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChkYXRhLCBtZXRhKSB7XG4gICAgICAgIGlmICghc2VsZi5wdXNoKGRhdGEpKSB7XG4gICAgICAgICAgICBzZWxmLl9oZWxwZXIucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZih1cGRhdGVDYikge1xuICAgICAgICAgICAgdXBkYXRlQ2IobWV0YSk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgIC5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0pXG4gICAgLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5wdXNoKG51bGwpO1xuICAgIH0pO1xufVxuXG5cbk5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5faGVscGVyLnJlc3VtZSgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIHRoaXMgaXMgcnVubmluZyBpbiBOb2RlanMsIHdpbGwgYmUgdW5kZWZpbmVkIGluIGEgYnJvd3Nlci5cbiAgICAgKiBJbiBhIGJyb3dzZXIsIGJyb3dzZXJpZnkgd29uJ3QgaW5jbHVkZSB0aGlzIGZpbGUgYW5kIHRoZSB3aG9sZSBtb2R1bGVcbiAgICAgKiB3aWxsIGJlIHJlc29sdmVkIGFuIGVtcHR5IG9iamVjdC5cbiAgICAgKi9cbiAgICBpc05vZGUgOiB0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiLFxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBub2RlanMgQnVmZmVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBlbmNvZGluZyB0aGUgZW5jb2RpbmcgdG8gdXNlLlxuICAgICAqIEByZXR1cm4ge0J1ZmZlcn0gYSBuZXcgQnVmZmVyLlxuICAgICAqL1xuICAgIG5ld0J1ZmZlciA6IGZ1bmN0aW9uKGRhdGEsIGVuY29kaW5nKXtcbiAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXIoZGF0YSwgZW5jb2RpbmcpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRmluZCBvdXQgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBiIHRoZSBvYmplY3QgdG8gdGVzdC5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBCdWZmZXIsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc0J1ZmZlciA6IGZ1bmN0aW9uKGIpe1xuICAgICAgICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKGIpO1xuICAgIH0sXG5cbiAgICBpc1N0cmVhbSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJlxuICAgICAgICAgICAgdHlwZW9mIG9iai5vbiA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLnBhdXNlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBvYmoucmVzdW1lID09PSBcImZ1bmN0aW9uXCI7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIHZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0dlbmVyaWNXb3JrZXInKTtcbi8vIHZhciBTdHJlYW1IZWxwZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9TdHJlYW1IZWxwZXInKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKTtcbnZhciBDb21wcmVzc2VkT2JqZWN0ID0gcmVxdWlyZSgnLi9jb21wcmVzc2VkT2JqZWN0Jyk7XG52YXIgWmlwT2JqZWN0ID0gcmVxdWlyZSgnLi96aXBPYmplY3QnKTtcbi8vIHZhciBnZW5lcmF0ZSA9IHJlcXVpcmUoXCIuL2dlbmVyYXRlXCIpO1xudmFyIG5vZGVqc1V0aWxzID0gcmVxdWlyZShcIi4vbm9kZWpzVXRpbHNcIik7XG52YXIgTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyID0gcmVxdWlyZShcIi4vbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlclwiKTtcblxuXG4vKipcbiAqIEFkZCBhIGZpbGUgaW4gdGhlIGN1cnJlbnQgZm9sZGVyLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgZGF0YSBvZiB0aGUgZmlsZVxuICogQHBhcmFtIHtPYmplY3R9IG8gdGhlIG9wdGlvbnMgb2YgdGhlIGZpbGVcbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIG5ldyBmaWxlLlxuICovXG52YXIgZmlsZUFkZCA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEsIG8pIHtcbiAgICAvLyBiZSBzdXJlIHN1YiBmb2xkZXJzIGV4aXN0XG4gICAgdmFyIGRhdGFUeXBlID0gdXRpbHMuZ2V0VHlwZU9mKGRhdGEpLFxuICAgICAgICBwYXJlbnQ7XG5cblxuICAgIC8qXG4gICAgICogQ29ycmVjdCBvcHRpb25zLlxuICAgICAqL1xuXG4gICAgbyA9IHV0aWxzLmV4dGVuZChvIHx8IHt9LCBkZWZhdWx0cyk7XG4gICAgby5kYXRlID0gby5kYXRlIHx8IG5ldyBEYXRlKCk7XG4gICAgaWYgKG8uY29tcHJlc3Npb24gIT09IG51bGwpIHtcbiAgICAgICAgby5jb21wcmVzc2lvbiA9IG8uY29tcHJlc3Npb24udG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG8udW5peFBlcm1pc3Npb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG8udW5peFBlcm1pc3Npb25zID0gcGFyc2VJbnQoby51bml4UGVybWlzc2lvbnMsIDgpO1xuICAgIH1cblxuICAgIC8vIFVOWF9JRkRJUiAgMDA0MDAwMCBzZWUgemlwaW5mby5jXG4gICAgaWYgKG8udW5peFBlcm1pc3Npb25zICYmIChvLnVuaXhQZXJtaXNzaW9ucyAmIDB4NDAwMCkpIHtcbiAgICAgICAgby5kaXIgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBCaXQgNCAgICBEaXJlY3RvcnlcbiAgICBpZiAoby5kb3NQZXJtaXNzaW9ucyAmJiAoby5kb3NQZXJtaXNzaW9ucyAmIDB4MDAxMCkpIHtcbiAgICAgICAgby5kaXIgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvLmRpcikge1xuICAgICAgICBuYW1lID0gZm9yY2VUcmFpbGluZ1NsYXNoKG5hbWUpO1xuICAgIH1cbiAgICBpZiAoby5jcmVhdGVGb2xkZXJzICYmIChwYXJlbnQgPSBwYXJlbnRGb2xkZXIobmFtZSkpKSB7XG4gICAgICAgIGZvbGRlckFkZC5jYWxsKHRoaXMsIHBhcmVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdmFyIGlzVW5pY29kZVN0cmluZyA9IGRhdGFUeXBlID09PSBcInN0cmluZ1wiICYmIG8uYmluYXJ5ID09PSBmYWxzZSAmJiBvLmJhc2U2NCA9PT0gZmFsc2U7XG4gICAgby5iaW5hcnkgPSAhaXNVbmljb2RlU3RyaW5nO1xuXG5cbiAgICB2YXIgaXNDb21wcmVzc2VkRW1wdHkgPSAoZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QpICYmIGRhdGEudW5jb21wcmVzc2VkU2l6ZSA9PT0gMDtcblxuICAgIGlmIChpc0NvbXByZXNzZWRFbXB0eSB8fCBvLmRpciB8fCAhZGF0YSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBvLmJhc2U2NCA9IGZhbHNlO1xuICAgICAgICBvLmJpbmFyeSA9IHRydWU7XG4gICAgICAgIGRhdGEgPSBcIlwiO1xuICAgICAgICBvLmNvbXByZXNzaW9uID0gXCJTVE9SRVwiO1xuICAgICAgICBkYXRhVHlwZSA9IFwic3RyaW5nXCI7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBDb252ZXJ0IGNvbnRlbnQgdG8gZml0LlxuICAgICAqL1xuXG4gICAgdmFyIHppcE9iamVjdENvbnRlbnQgPSBudWxsO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCB8fCBkYXRhIGluc3RhbmNlb2YgR2VuZXJpY1dvcmtlcikge1xuICAgICAgICB6aXBPYmplY3RDb250ZW50ID0gZGF0YTtcbiAgICB9IGVsc2UgaWYgKG5vZGVqc1V0aWxzLmlzTm9kZSAmJiBub2RlanNVdGlscy5pc1N0cmVhbShkYXRhKSkge1xuICAgICAgICB6aXBPYmplY3RDb250ZW50ID0gbmV3IE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlcihuYW1lLCBkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB6aXBPYmplY3RDb250ZW50ID0gdXRpbHMucHJlcGFyZUNvbnRlbnQobmFtZSwgZGF0YSwgby5iaW5hcnksIG8ub3B0aW1pemVkQmluYXJ5U3RyaW5nLCBvLmJhc2U2NCk7XG4gICAgfVxuXG4gICAgdmFyIG9iamVjdCA9IG5ldyBaaXBPYmplY3QobmFtZSwgemlwT2JqZWN0Q29udGVudCwgbyk7XG4gICAgdGhpcy5maWxlc1tuYW1lXSA9IG9iamVjdDtcbiAgICAvKlxuICAgIFRPRE86IHdlIGNhbid0IHRocm93IGFuIGV4Y2VwdGlvbiBiZWNhdXNlIHdlIGhhdmUgYXN5bmMgcHJvbWlzZXNcbiAgICAod2UgY2FuIGhhdmUgYSBwcm9taXNlIG9mIGEgRGF0ZSgpIGZvciBleGFtcGxlKSBidXQgcmV0dXJuaW5nIGFcbiAgICBwcm9taXNlIGlzIHVzZWxlc3MgYmVjYXVzZSBmaWxlKG5hbWUsIGRhdGEpIHJldHVybnMgdGhlIEpTWmlwXG4gICAgb2JqZWN0IGZvciBjaGFpbmluZy4gU2hvdWxkIHdlIGJyZWFrIHRoYXQgdG8gYWxsb3cgdGhlIHVzZXJcbiAgICB0byBjYXRjaCB0aGUgZXJyb3IgP1xuXG4gICAgcmV0dXJuIGV4dGVybmFsLlByb21pc2UucmVzb2x2ZSh6aXBPYmplY3RDb250ZW50KVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcbiAgICAqL1xufTtcblxuLyoqXG4gKiBGaW5kIHRoZSBwYXJlbnQgZm9sZGVyIG9mIHRoZSBwYXRoLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBwYXRoIHRvIHVzZVxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgcGFyZW50IGZvbGRlciwgb3IgXCJcIlxuICovXG52YXIgcGFyZW50Rm9sZGVyID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICBpZiAocGF0aC5zbGljZSgtMSkgPT09ICcvJykge1xuICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgdmFyIGxhc3RTbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTtcbiAgICByZXR1cm4gKGxhc3RTbGFzaCA+IDApID8gcGF0aC5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoKSA6IFwiXCI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhdGggd2l0aCBhIHNsYXNoIGF0IHRoZSBlbmQuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGggdGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBwYXRoIHdpdGggYSB0cmFpbGluZyBzbGFzaC5cbiAqL1xudmFyIGZvcmNlVHJhaWxpbmdTbGFzaCA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAvLyBDaGVjayB0aGUgbmFtZSBlbmRzIHdpdGggYSAvXG4gICAgaWYgKHBhdGguc2xpY2UoLTEpICE9PSBcIi9cIikge1xuICAgICAgICBwYXRoICs9IFwiL1wiOyAvLyBJRSBkb2Vzbid0IGxpa2Ugc3Vic3RyKC0xKVxuICAgIH1cbiAgICByZXR1cm4gcGF0aDtcbn07XG5cbi8qKlxuICogQWRkIGEgKHN1YikgZm9sZGVyIGluIHRoZSBjdXJyZW50IGZvbGRlci5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZm9sZGVyJ3MgbmFtZVxuICogQHBhcmFtIHtib29sZWFuPX0gW2NyZWF0ZUZvbGRlcnNdIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN1YlxuICogIGZvbGRlcnMuIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgbmV3IGZvbGRlci5cbiAqL1xudmFyIGZvbGRlckFkZCA9IGZ1bmN0aW9uKG5hbWUsIGNyZWF0ZUZvbGRlcnMpIHtcbiAgICBjcmVhdGVGb2xkZXJzID0gKHR5cGVvZiBjcmVhdGVGb2xkZXJzICE9PSAndW5kZWZpbmVkJykgPyBjcmVhdGVGb2xkZXJzIDogZGVmYXVsdHMuY3JlYXRlRm9sZGVycztcblxuICAgIG5hbWUgPSBmb3JjZVRyYWlsaW5nU2xhc2gobmFtZSk7XG5cbiAgICAvLyBEb2VzIHRoaXMgZm9sZGVyIGFscmVhZHkgZXhpc3Q/XG4gICAgaWYgKCF0aGlzLmZpbGVzW25hbWVdKSB7XG4gICAgICAgIGZpbGVBZGQuY2FsbCh0aGlzLCBuYW1lLCBudWxsLCB7XG4gICAgICAgICAgICBkaXI6IHRydWUsXG4gICAgICAgICAgICBjcmVhdGVGb2xkZXJzOiBjcmVhdGVGb2xkZXJzXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maWxlc1tuYW1lXTtcbn07XG5cbi8qKlxuKiBDcm9zcy13aW5kb3csIGNyb3NzLU5vZGUtY29udGV4dCByZWd1bGFyIGV4cHJlc3Npb24gZGV0ZWN0aW9uXG4qIEBwYXJhbSAge09iamVjdH0gIG9iamVjdCBBbnl0aGluZ1xuKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgcmVndWxhciBleHByZXNzaW9uLFxuKiBmYWxzZSBvdGhlcndpc2VcbiovXG5mdW5jdGlvbiBpc1JlZ0V4cChvYmplY3QpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09IFwiW29iamVjdCBSZWdFeHBdXCI7XG59XG5cbi8vIHJldHVybiB0aGUgYWN0dWFsIHByb3RvdHlwZSBvZiBKU1ppcFxudmFyIG91dCA9IHtcbiAgICAvKipcbiAgICAgKiBAc2VlIGxvYWRBc3luY1xuICAgICAqL1xuICAgIGxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLlwiKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBDYWxsIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVhY2ggZW50cnkgYXQgdGhpcyBmb2xkZXIgbGV2ZWwuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uOlxuICAgICAqIGZ1bmN0aW9uIChyZWxhdGl2ZVBhdGgsIGZpbGUpIHsuLi59XG4gICAgICogSXQgdGFrZXMgMiBhcmd1bWVudHMgOiB0aGUgcmVsYXRpdmUgcGF0aCBhbmQgdGhlIGZpbGUuXG4gICAgICovXG4gICAgZm9yRWFjaDogZnVuY3Rpb24oY2IpIHtcbiAgICAgICAgdmFyIGZpbGVuYW1lLCByZWxhdGl2ZVBhdGgsIGZpbGU7XG4gICAgICAgIGZvciAoZmlsZW5hbWUgaW4gdGhpcy5maWxlcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVzLmhhc093blByb3BlcnR5KGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbZmlsZW5hbWVdO1xuICAgICAgICAgICAgcmVsYXRpdmVQYXRoID0gZmlsZW5hbWUuc2xpY2UodGhpcy5yb290Lmxlbmd0aCwgZmlsZW5hbWUubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChyZWxhdGl2ZVBhdGggJiYgZmlsZW5hbWUuc2xpY2UoMCwgdGhpcy5yb290Lmxlbmd0aCkgPT09IHRoaXMucm9vdCkgeyAvLyB0aGUgZmlsZSBpcyBpbiB0aGUgY3VycmVudCByb290XG4gICAgICAgICAgICAgICAgY2IocmVsYXRpdmVQYXRoLCBmaWxlKTsgLy8gVE9ETyByZXZlcnNlIHRoZSBwYXJhbWV0ZXJzID8gbmVlZCB0byBiZSBjbGVhbiBBTkQgY29uc2lzdGVudCB3aXRoIHRoZSBmaWx0ZXIgc2VhcmNoIGZuLi4uXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmlsdGVyIG5lc3RlZCBmaWxlcy9mb2xkZXJzIHdpdGggdGhlIHNwZWNpZmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWFyY2ggdGhlIHByZWRpY2F0ZSB0byB1c2UgOlxuICAgICAqIGZ1bmN0aW9uIChyZWxhdGl2ZVBhdGgsIGZpbGUpIHsuLi59XG4gICAgICogSXQgdGFrZXMgMiBhcmd1bWVudHMgOiB0aGUgcmVsYXRpdmUgcGF0aCBhbmQgdGhlIGZpbGUuXG4gICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIG1hdGNoaW5nIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZpbHRlcjogZnVuY3Rpb24oc2VhcmNoKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGl2ZVBhdGgsIGVudHJ5KSB7XG4gICAgICAgICAgICBpZiAoc2VhcmNoKHJlbGF0aXZlUGF0aCwgZW50cnkpKSB7IC8vIHRoZSBmaWxlIG1hdGNoZXMgdGhlIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZW50cnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBmaWxlIHRvIHRoZSB6aXAgZmlsZSwgb3Igc2VhcmNoIGEgZmlsZS5cbiAgICAgKiBAcGFyYW0gICB7c3RyaW5nfFJlZ0V4cH0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBhZGQgKGlmIGRhdGEgaXMgZGVmaW5lZCksXG4gICAgICogdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gZmluZCAoaWYgbm8gZGF0YSkgb3IgYSByZWdleCB0byBtYXRjaCBmaWxlcy5cbiAgICAgKiBAcGFyYW0gICB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhICBUaGUgZmlsZSBkYXRhLCBlaXRoZXIgcmF3IG9yIGJhc2U2NCBlbmNvZGVkXG4gICAgICogQHBhcmFtICAge09iamVjdH0gbyAgICAgRmlsZSBvcHRpb25zXG4gICAgICogQHJldHVybiAge0pTWmlwfE9iamVjdHxBcnJheX0gdGhpcyBKU1ppcCBvYmplY3QgKHdoZW4gYWRkaW5nIGEgZmlsZSksXG4gICAgICogYSBmaWxlICh3aGVuIHNlYXJjaGluZyBieSBzdHJpbmcpIG9yIGFuIGFycmF5IG9mIGZpbGVzICh3aGVuIHNlYXJjaGluZyBieSByZWdleCkuXG4gICAgICovXG4gICAgZmlsZTogZnVuY3Rpb24obmFtZSwgZGF0YSwgbykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKGlzUmVnRXhwKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZ2V4cCA9IG5hbWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKHJlbGF0aXZlUGF0aCwgZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWZpbGUuZGlyICYmIHJlZ2V4cC50ZXN0KHJlbGF0aXZlUGF0aCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gdGV4dFxuICAgICAgICAgICAgICAgIHZhciBvYmogPSB0aGlzLmZpbGVzW3RoaXMucm9vdCArIG5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChvYmogJiYgIW9iai5kaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgOiB3ZSBoYXZlIGRhdGEgIVxuICAgICAgICAgICAgbmFtZSA9IHRoaXMucm9vdCArIG5hbWU7XG4gICAgICAgICAgICBmaWxlQWRkLmNhbGwodGhpcywgbmFtZSwgZGF0YSwgbyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgemlwIGZpbGUsIG9yIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0gICB7U3RyaW5nfFJlZ0V4cH0gYXJnIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdG8gYWRkLCBvciBhIHJlZ2V4IHRvIHNlYXJjaCBmb2xkZXJzLlxuICAgICAqIEByZXR1cm4gIHtKU1ppcH0gYW4gb2JqZWN0IHdpdGggdGhlIG5ldyBkaXJlY3RvcnkgYXMgdGhlIHJvb3QsIG9yIGFuIGFycmF5IGNvbnRhaW5pbmcgbWF0Y2hpbmcgZm9sZGVycy5cbiAgICAgKi9cbiAgICBmb2xkZXI6IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICBpZiAoIWFyZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNSZWdFeHAoYXJnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKHJlbGF0aXZlUGF0aCwgZmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLmRpciAmJiBhcmcudGVzdChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbHNlLCBuYW1lIGlzIGEgbmV3IGZvbGRlclxuICAgICAgICB2YXIgbmFtZSA9IHRoaXMucm9vdCArIGFyZztcbiAgICAgICAgdmFyIG5ld0ZvbGRlciA9IGZvbGRlckFkZC5jYWxsKHRoaXMsIG5hbWUpO1xuXG4gICAgICAgIC8vIEFsbG93IGNoYWluaW5nIGJ5IHJldHVybmluZyBhIG5ldyBvYmplY3Qgd2l0aCB0aGlzIGZvbGRlciBhcyB0aGUgcm9vdFxuICAgICAgICB2YXIgcmV0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXQucm9vdCA9IG5ld0ZvbGRlci5uYW1lO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH0vLyxcblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIGZpbGUsIG9yIGEgZGlyZWN0b3J5IGFuZCBhbGwgc3ViLWZpbGVzLCBmcm9tIHRoZSB6aXBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBkZWxldGVcbiAgICAgKiBAcmV0dXJuIHtKU1ppcH0gdGhpcyBKU1ppcCBvYmplY3RcbiAgICAgKi9cbiAgICAvLyByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAvLyAgICAgbmFtZSA9IHRoaXMucm9vdCArIG5hbWU7XG4gICAgLy8gICAgIHZhciBmaWxlID0gdGhpcy5maWxlc1tuYW1lXTtcbiAgICAvLyAgICAgaWYgKCFmaWxlKSB7XG4gICAgLy8gICAgICAgICAvLyBMb29rIGZvciBhbnkgZm9sZGVyc1xuICAgIC8vICAgICAgICAgaWYgKG5hbWUuc2xpY2UoLTEpICE9PSBcIi9cIikge1xuICAgIC8vICAgICAgICAgICAgIG5hbWUgKz0gXCIvXCI7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICBmaWxlID0gdGhpcy5maWxlc1tuYW1lXTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIGlmIChmaWxlICYmICFmaWxlLmRpcikge1xuICAgIC8vICAgICAgICAgLy8gZmlsZVxuICAgIC8vICAgICAgICAgZGVsZXRlIHRoaXMuZmlsZXNbbmFtZV07XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICAvLyBtYXliZSBhIGZvbGRlciwgZGVsZXRlIHJlY3Vyc2l2ZWx5XG4gICAgLy8gICAgICAgICB2YXIga2lkcyA9IHRoaXMuZmlsdGVyKGZ1bmN0aW9uKHJlbGF0aXZlUGF0aCwgZmlsZSkge1xuICAgIC8vICAgICAgICAgICAgIHJldHVybiBmaWxlLm5hbWUuc2xpY2UoMCwgbmFtZS5sZW5ndGgpID09PSBuYW1lO1xuICAgIC8vICAgICAgICAgfSk7XG4gICAgLy8gICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyAgICAgICAgICAgICBkZWxldGUgdGhpcy5maWxlc1traWRzW2ldLm5hbWVdO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgcmV0dXJuIHRoaXM7XG4gICAgLy8gfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIGdlbmVyYXRlIHRoZSB6aXAgZmlsZSA6XG4gICAgICogLSBjb21wcmVzc2lvbiwgXCJTVE9SRVwiIGJ5IGRlZmF1bHQuXG4gICAgICogLSB0eXBlLCBcImJhc2U2NFwiIGJ5IGRlZmF1bHQuIFZhbHVlcyBhcmUgOiBzdHJpbmcsIGJhc2U2NCwgdWludDhhcnJheSwgYXJyYXlidWZmZXIsIGJsb2IuXG4gICAgICogQHJldHVybiB7U3RyaW5nfFVpbnQ4QXJyYXl8QXJyYXlCdWZmZXJ8QnVmZmVyfEJsb2J9IHRoZSB6aXAgZmlsZVxuICAgICAqL1xuICAgIC8vIGdlbmVyYXRlOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xuICAgIC8vIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGUgYXMgYW4gaW50ZXJuYWwgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIGdlbmVyYXRlIHRoZSB6aXAgZmlsZSA6XG4gICAgICogLSBjb21wcmVzc2lvbiwgXCJTVE9SRVwiIGJ5IGRlZmF1bHQuXG4gICAgICogLSB0eXBlLCBcImJhc2U2NFwiIGJ5IGRlZmF1bHQuIFZhbHVlcyBhcmUgOiBzdHJpbmcsIGJhc2U2NCwgdWludDhhcnJheSwgYXJyYXlidWZmZXIsIGJsb2IuXG4gICAgICogQHJldHVybiB7U3RyZWFtSGVscGVyfSB0aGUgc3RyZWFtZWQgemlwIGZpbGUuXG4gICAgICovXG4gICAgLy8gZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIC8vICAgdmFyIHdvcmtlciwgb3B0cyA9IHt9O1xuICAgIC8vICAgdHJ5IHtcbiAgICAvLyAgICAgICBvcHRzID0gdXRpbHMuZXh0ZW5kKG9wdGlvbnMgfHwge30sIHtcbiAgICAvLyAgICAgICAgICAgc3RyZWFtRmlsZXM6IGZhbHNlLFxuICAgIC8vICAgICAgICAgICBjb21wcmVzc2lvbjogXCJTVE9SRVwiLFxuICAgIC8vICAgICAgICAgICBjb21wcmVzc2lvbk9wdGlvbnMgOiBudWxsLFxuICAgIC8vICAgICAgICAgICB0eXBlOiBcIlwiLFxuICAgIC8vICAgICAgICAgICBwbGF0Zm9ybTogXCJET1NcIixcbiAgICAvLyAgICAgICAgICAgY29tbWVudDogbnVsbCxcbiAgICAvLyAgICAgICAgICAgbWltZVR5cGU6ICdhcHBsaWNhdGlvbi96aXAnLFxuICAgIC8vICAgICAgICAgICBlbmNvZGVGaWxlTmFtZTogdXRmOC51dGY4ZW5jb2RlXG4gICAgLy8gICAgICAgfSk7XG5cbiAgICAvLyAgICAgICBvcHRzLnR5cGUgPSBvcHRzLnR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAvLyAgICAgICBvcHRzLmNvbXByZXNzaW9uID0gb3B0cy5jb21wcmVzc2lvbi50b1VwcGVyQ2FzZSgpO1xuXG4gICAgLy8gICAgICAgLy8gXCJiaW5hcnlzdHJpbmdcIiBpcyBwcmVmZXJlZCBidXQgdGhlIGludGVybmFscyB1c2UgXCJzdHJpbmdcIi5cbiAgICAvLyAgICAgICBpZihvcHRzLnR5cGUgPT09IFwiYmluYXJ5c3RyaW5nXCIpIHtcbiAgICAvLyAgICAgICAgIG9wdHMudHlwZSA9IFwic3RyaW5nXCI7XG4gICAgLy8gICAgICAgfVxuXG4gICAgLy8gICAgICAgaWYgKCFvcHRzLnR5cGUpIHtcbiAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG91dHB1dCB0eXBlIHNwZWNpZmllZC5cIik7XG4gICAgLy8gICAgICAgfVxuXG4gICAgLy8gICAgICAgdXRpbHMuY2hlY2tTdXBwb3J0KG9wdHMudHlwZSk7XG5cbiAgICAvLyAgICAgICAvLyBhY2NlcHQgbm9kZWpzIGBwcm9jZXNzLnBsYXRmb3JtYFxuICAgIC8vICAgICAgIGlmKFxuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID09PSAnZGFyd2luJyB8fFxuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID09PSAnZnJlZWJzZCcgfHxcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ2xpbnV4JyB8fFxuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID09PSAnc3Vub3MnXG4gICAgLy8gICAgICAgKSB7XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPSBcIlVOSVhcIjtcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgICAgaWYgKG9wdGlvbnMucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9IFwiRE9TXCI7XG4gICAgLy8gICAgICAgfVxuXG4gICAgLy8gICAgICAgdmFyIGNvbW1lbnQgPSBvcHRzLmNvbW1lbnQgfHwgdGhpcy5jb21tZW50IHx8IFwiXCI7XG4gICAgLy8gICAgICAgd29ya2VyID0gZ2VuZXJhdGUuZ2VuZXJhdGVXb3JrZXIodGhpcywgb3B0cywgY29tbWVudCk7XG4gICAgLy8gICB9IGNhdGNoIChlKSB7XG4gICAgLy8gICAgIHdvcmtlciA9IG5ldyBHZW5lcmljV29ya2VyKFwiZXJyb3JcIik7XG4gICAgLy8gICAgIHdvcmtlci5lcnJvcihlKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIHJldHVybiBuZXcgU3RyZWFtSGVscGVyKHdvcmtlciwgb3B0cy50eXBlIHx8IFwic3RyaW5nXCIsIG9wdHMubWltZVR5cGUpO1xuICAgIC8vIH0sXG4gICAgLy8gLyoqXG4gICAgLy8gICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlIGFzeW5jaHJvbm91c2x5LlxuICAgIC8vICAqIEBzZWUgZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbVxuICAgIC8vICAqL1xuICAgIC8vIGdlbmVyYXRlQXN5bmM6IGZ1bmN0aW9uKG9wdGlvbnMsIG9uVXBkYXRlKSB7XG4gICAgLy8gICAgIHJldHVybiB0aGlzLmdlbmVyYXRlSW50ZXJuYWxTdHJlYW0ob3B0aW9ucykuYWNjdW11bGF0ZShvblVwZGF0ZSk7XG4gICAgLy8gfSxcbiAgICAvLyAvKipcbiAgICAvLyAgKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGUgYXN5bmNocm9ub3VzbHkuXG4gICAgLy8gICogQHNlZSBnZW5lcmF0ZUludGVybmFsU3RyZWFtXG4gICAgLy8gICovXG4gICAgLy8gZ2VuZXJhdGVOb2RlU3RyZWFtOiBmdW5jdGlvbihvcHRpb25zLCBvblVwZGF0ZSkge1xuICAgIC8vICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAvLyAgICAgaWYgKCFvcHRpb25zLnR5cGUpIHtcbiAgICAvLyAgICAgICAgIG9wdGlvbnMudHlwZSA9IFwibm9kZWJ1ZmZlclwiO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIHJldHVybiB0aGlzLmdlbmVyYXRlSW50ZXJuYWxTdHJlYW0ob3B0aW9ucykudG9Ob2RlanNTdHJlYW0ob25VcGRhdGUpO1xuICAgIC8vIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IG91dDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBEYXRhUmVhZGVyID0gcmVxdWlyZSgnLi9EYXRhUmVhZGVyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5mdW5jdGlvbiBBcnJheVJlYWRlcihkYXRhKSB7XG4gICAgRGF0YVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0ZGF0YVtpXSA9IGRhdGFbaV0gJiAweEZGO1xuXHR9XG59XG51dGlscy5pbmhlcml0cyhBcnJheVJlYWRlciwgRGF0YVJlYWRlcik7XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5ieXRlQXRcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLmJ5dGVBdCA9IGZ1bmN0aW9uKGkpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhW3RoaXMuemVybyArIGldO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlXG4gKi9cbkFycmF5UmVhZGVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZSA9IGZ1bmN0aW9uKHNpZykge1xuICAgIHZhciBzaWcwID0gc2lnLmNoYXJDb2RlQXQoMCksXG4gICAgICAgIHNpZzEgPSBzaWcuY2hhckNvZGVBdCgxKSxcbiAgICAgICAgc2lnMiA9IHNpZy5jaGFyQ29kZUF0KDIpLFxuICAgICAgICBzaWczID0gc2lnLmNoYXJDb2RlQXQoMyk7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gNDsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtpXSA9PT0gc2lnMCAmJiB0aGlzLmRhdGFbaSArIDFdID09PSBzaWcxICYmIHRoaXMuZGF0YVtpICsgMl0gPT09IHNpZzIgJiYgdGhpcy5kYXRhW2kgKyAzXSA9PT0gc2lnMykge1xuICAgICAgICAgICAgcmV0dXJuIGkgLSB0aGlzLnplcm87XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlXG4gKi9cbkFycmF5UmVhZGVyLnByb3RvdHlwZS5yZWFkQW5kQ2hlY2tTaWduYXR1cmUgPSBmdW5jdGlvbiAoc2lnKSB7XG4gICAgdmFyIHNpZzAgPSBzaWcuY2hhckNvZGVBdCgwKSxcbiAgICAgICAgc2lnMSA9IHNpZy5jaGFyQ29kZUF0KDEpLFxuICAgICAgICBzaWcyID0gc2lnLmNoYXJDb2RlQXQoMiksXG4gICAgICAgIHNpZzMgPSBzaWcuY2hhckNvZGVBdCgzKSxcbiAgICAgICAgZGF0YSA9IHRoaXMucmVhZERhdGEoNCk7XG4gICAgcmV0dXJuIHNpZzAgPT09IGRhdGFbMF0gJiYgc2lnMSA9PT0gZGF0YVsxXSAmJiBzaWcyID09PSBkYXRhWzJdICYmIHNpZzMgPT09IGRhdGFbM107XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgaWYoc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSB0aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvICsgdGhpcy5pbmRleCwgdGhpcy56ZXJvICsgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbm1vZHVsZS5leHBvcnRzID0gQXJyYXlSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5mdW5jdGlvbiBEYXRhUmVhZGVyKGRhdGEpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhOyAvLyB0eXBlIDogc2VlIGltcGxlbWVudGF0aW9uXG4gICAgdGhpcy5sZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB0aGlzLnplcm8gPSAwO1xufVxuRGF0YVJlYWRlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCB0aGUgb2Zmc2V0IHdpbGwgbm90IGdvIHRvbyBmYXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9mZnNldCB0aGUgYWRkaXRpb25hbCBvZmZzZXQgdG8gY2hlY2suXG4gICAgICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcy5cbiAgICAgKi9cbiAgICBjaGVja09mZnNldDogZnVuY3Rpb24ob2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuY2hlY2tJbmRleCh0aGlzLmluZGV4ICsgb2Zmc2V0KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENoZWNrIHRoYXQgdGhlIHNwZWNpZmVkIGluZGV4IHdpbGwgbm90IGJlIHRvbyBmYXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld0luZGV4IHRoZSBpbmRleCB0byBjaGVjay5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMuXG4gICAgICovXG4gICAgY2hlY2tJbmRleDogZnVuY3Rpb24obmV3SW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIDwgdGhpcy56ZXJvICsgbmV3SW5kZXggfHwgbmV3SW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbmQgb2YgZGF0YSByZWFjaGVkIChkYXRhIGxlbmd0aCA9IFwiICsgdGhpcy5sZW5ndGggKyBcIiwgYXNrZWQgaW5kZXggPSBcIiArIChuZXdJbmRleCkgKyBcIikuIENvcnJ1cHRlZCB6aXAgP1wiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbmV3SW5kZXggVGhlIG5ldyBpbmRleC5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIG5ldyBpbmRleCBpcyBvdXQgb2YgdGhlIGRhdGEuXG4gICAgICovXG4gICAgc2V0SW5kZXg6IGZ1bmN0aW9uKG5ld0luZGV4KSB7XG4gICAgICAgIHRoaXMuY2hlY2tJbmRleChuZXdJbmRleCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBuZXdJbmRleDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFNraXAgdGhlIG5leHQgbiBieXRlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuXG4gICAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBuZXcgaW5kZXggaXMgb3V0IG9mIHRoZSBkYXRhLlxuICAgICAqL1xuICAgIHNraXA6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgdGhpcy5zZXRJbmRleCh0aGlzLmluZGV4ICsgbik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGJ5dGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaSB0aGUgaW5kZXggdG8gdXNlLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gYSBieXRlLlxuICAgICAqL1xuICAgIGJ5dGVBdDogZnVuY3Rpb24oaSkge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgbnVtYmVyIHdpdGggYSBnaXZlbiBieXRlIHNpemUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyLlxuICAgICAqL1xuICAgIHJlYWRJbnQ6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IDAsXG4gICAgICAgICAgICBpO1xuICAgICAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgICAgICBmb3IgKGkgPSB0aGlzLmluZGV4ICsgc2l6ZSAtIDE7IGkgPj0gdGhpcy5pbmRleDsgaS0tKSB7XG4gICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpICsgdGhpcy5ieXRlQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBuZXh0IHN0cmluZyB3aXRoIGEgZ2l2ZW4gYnl0ZSBzaXplLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZy5cbiAgICAgKi9cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbihzaXplKSB7XG4gICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1UbyhcInN0cmluZ1wiLCB0aGlzLnJlYWREYXRhKHNpemUpKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCByYXcgZGF0YSB3aXRob3V0IGNvbnZlcnNpb24sIDxzaXplPiBieXRlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgcmF3IGRhdGEsIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLlxuICAgICAqL1xuICAgIHJlYWREYXRhOiBmdW5jdGlvbihzaXplKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIGEgemlwIHNpZ25hdHVyZSAoNCBieXRlcykuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNpZyB0aGUgc2lnbmF0dXJlIHRvIGZpbmQuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJlbmNlLCAtMSBpZiBub3QgZm91bmQuXG4gICAgICovXG4gICAgbGFzdEluZGV4T2ZTaWduYXR1cmU6IGZ1bmN0aW9uKHNpZykge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBzaWduYXR1cmUgKDQgYnl0ZXMpIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBjb21wYXJlIGl0IHdpdGggc2lnLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaWcgdGhlIGV4cGVjdGVkIHNpZ25hdHVyZVxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIHNpZ25hdHVyZSBtYXRjaGVzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcmVhZEFuZENoZWNrU2lnbmF0dXJlOiBmdW5jdGlvbihzaWcpIHtcbiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9uc1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBuZXh0IGRhdGUuXG4gICAgICogQHJldHVybiB7RGF0ZX0gdGhlIGRhdGUuXG4gICAgICovXG4gICAgcmVhZERhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZG9zdGltZSA9IHRoaXMucmVhZEludCg0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKFxuICAgICAgICAoKGRvc3RpbWUgPj4gMjUpICYgMHg3ZikgKyAxOTgwLCAvLyB5ZWFyXG4gICAgICAgICgoZG9zdGltZSA+PiAyMSkgJiAweDBmKSAtIDEsIC8vIG1vbnRoXG4gICAgICAgIChkb3N0aW1lID4+IDE2KSAmIDB4MWYsIC8vIGRheVxuICAgICAgICAoZG9zdGltZSA+PiAxMSkgJiAweDFmLCAvLyBob3VyXG4gICAgICAgIChkb3N0aW1lID4+IDUpICYgMHgzZiwgLy8gbWludXRlXG4gICAgICAgIChkb3N0aW1lICYgMHgxZikgPDwgMSkpOyAvLyBzZWNvbmRcbiAgICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBEYXRhUmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFVpbnQ4QXJyYXlSZWFkZXIgPSByZXF1aXJlKCcuL1VpbnQ4QXJyYXlSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIE5vZGVCdWZmZXJSZWFkZXIoZGF0YSkge1xuICAgIFVpbnQ4QXJyYXlSZWFkZXIuY2FsbCh0aGlzLCBkYXRhKTtcbn1cbnV0aWxzLmluaGVyaXRzKE5vZGVCdWZmZXJSZWFkZXIsIFVpbnQ4QXJyYXlSZWFkZXIpO1xuXG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5Ob2RlQnVmZmVyUmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIHZhciByZXN1bHQgPSB0aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvICsgdGhpcy5pbmRleCwgdGhpcy56ZXJvICsgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbm1vZHVsZS5leHBvcnRzID0gTm9kZUJ1ZmZlclJlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBEYXRhUmVhZGVyID0gcmVxdWlyZSgnLi9EYXRhUmVhZGVyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5mdW5jdGlvbiBTdHJpbmdSZWFkZXIoZGF0YSkge1xuICAgIERhdGFSZWFkZXIuY2FsbCh0aGlzLCBkYXRhKTtcbn1cbnV0aWxzLmluaGVyaXRzKFN0cmluZ1JlYWRlciwgRGF0YVJlYWRlcik7XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5ieXRlQXRcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5ieXRlQXQgPSBmdW5jdGlvbihpKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMuemVybyArIGkpO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlXG4gKi9cblN0cmluZ1JlYWRlci5wcm90b3R5cGUubGFzdEluZGV4T2ZTaWduYXR1cmUgPSBmdW5jdGlvbihzaWcpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmxhc3RJbmRleE9mKHNpZykgLSB0aGlzLnplcm87XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlXG4gKi9cblN0cmluZ1JlYWRlci5wcm90b3R5cGUucmVhZEFuZENoZWNrU2lnbmF0dXJlID0gZnVuY3Rpb24gKHNpZykge1xuICAgIHZhciBkYXRhID0gdGhpcy5yZWFkRGF0YSg0KTtcbiAgICByZXR1cm4gc2lnID09PSBkYXRhO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWREYXRhXG4gKi9cblN0cmluZ1JlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICAvLyB0aGlzIHdpbGwgd29yayBiZWNhdXNlIHRoZSBjb25zdHJ1Y3RvciBhcHBsaWVkIHRoZSBcIiYgMHhmZlwiIG1hc2suXG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmdSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgQXJyYXlSZWFkZXIgPSByZXF1aXJlKCcuL0FycmF5UmVhZGVyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5mdW5jdGlvbiBVaW50OEFycmF5UmVhZGVyKGRhdGEpIHtcbiAgICBBcnJheVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xufVxudXRpbHMuaW5oZXJpdHMoVWludDhBcnJheVJlYWRlciwgQXJyYXlSZWFkZXIpO1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuVWludDhBcnJheVJlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICBpZihzaXplID09PSAwKSB7XG4gICAgICAgIC8vIGluIElFMTAsIHdoZW4gdXNpbmcgc3ViYXJyYXkoaWR4LCBpZHgpLCB3ZSBnZXQgdGhlIGFycmF5IFsweDAwXSBpbnN0ZWFkIG9mIFtdLlxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSB0aGlzLmRhdGEuc3ViYXJyYXkodGhpcy56ZXJvICsgdGhpcy5pbmRleCwgdGhpcy56ZXJvICsgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheVJlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi4vc3VwcG9ydCcpO1xudmFyIEFycmF5UmVhZGVyID0gcmVxdWlyZSgnLi9BcnJheVJlYWRlcicpO1xudmFyIFN0cmluZ1JlYWRlciA9IHJlcXVpcmUoJy4vU3RyaW5nUmVhZGVyJyk7XG52YXIgTm9kZUJ1ZmZlclJlYWRlciA9IHJlcXVpcmUoJy4vTm9kZUJ1ZmZlclJlYWRlcicpO1xudmFyIFVpbnQ4QXJyYXlSZWFkZXIgPSByZXF1aXJlKCcuL1VpbnQ4QXJyYXlSZWFkZXInKTtcblxuLyoqXG4gKiBDcmVhdGUgYSByZWFkZXIgYWRhcHRlZCB0byB0aGUgZGF0YS5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhIHRvIHJlYWQuXG4gKiBAcmV0dXJuIHtEYXRhUmVhZGVyfSB0aGUgZGF0YSByZWFkZXIuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgdHlwZSA9IHV0aWxzLmdldFR5cGVPZihkYXRhKTtcbiAgICB1dGlscy5jaGVja1N1cHBvcnQodHlwZSk7XG4gICAgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIgJiYgIXN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1JlYWRlcihkYXRhKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFwibm9kZWJ1ZmZlclwiKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZUJ1ZmZlclJlYWRlcihkYXRhKTtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXlSZWFkZXIodXRpbHMudHJhbnNmb3JtVG8oXCJ1aW50OGFycmF5XCIsIGRhdGEpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBcnJheVJlYWRlcih1dGlscy50cmFuc2Zvcm1UbyhcImFycmF5XCIsIGRhdGEpKTtcbn07XG5cbi8vIHZpbTogc2V0IHNoaWZ0d2lkdGg9NCBzb2Z0dGFic3RvcD00OlxuIiwiJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy5MT0NBTF9GSUxFX0hFQURFUiA9IFwiUEtcXHgwM1xceDA0XCI7XG5leHBvcnRzLkNFTlRSQUxfRklMRV9IRUFERVIgPSBcIlBLXFx4MDFcXHgwMlwiO1xuZXhwb3J0cy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQgPSBcIlBLXFx4MDVcXHgwNlwiO1xuZXhwb3J0cy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SID0gXCJQS1xceDA2XFx4MDdcIjtcbmV4cG9ydHMuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EID0gXCJQS1xceDA2XFx4MDZcIjtcbmV4cG9ydHMuREFUQV9ERVNDUklQVE9SID0gXCJQS1xceDA3XFx4MDhcIjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbi8qKlxuICogQSB3b3JrZXIgd2hpY2ggY29udmVydCBjaHVua3MgdG8gYSBzcGVjaWZpZWQgdHlwZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IGRlc3RUeXBlIHRoZSBkZXN0aW5hdGlvbiB0eXBlLlxuICovXG5mdW5jdGlvbiBDb252ZXJ0V29ya2VyKGRlc3RUeXBlKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiQ29udmVydFdvcmtlciB0byBcIiArIGRlc3RUeXBlKTtcbiAgICB0aGlzLmRlc3RUeXBlID0gZGVzdFR5cGU7XG59XG51dGlscy5pbmhlcml0cyhDb252ZXJ0V29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cbkNvbnZlcnRXb3JrZXIucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHRoaXMucHVzaCh7XG4gICAgICAgIGRhdGEgOiB1dGlscy50cmFuc2Zvcm1Ubyh0aGlzLmRlc3RUeXBlLCBjaHVuay5kYXRhKSxcbiAgICAgICAgbWV0YSA6IGNodW5rLm1ldGFcbiAgICB9KTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IENvbnZlcnRXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7XG52YXIgY3JjMzIgPSByZXF1aXJlKCcuLi9jcmMzMicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBBIHdvcmtlciB3aGljaCBjYWxjdWxhdGUgdGhlIGNyYzMyIG9mIHRoZSBkYXRhIGZsb3dpbmcgdGhyb3VnaC5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBDcmMzMlByb2JlKCkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkNyYzMyUHJvYmVcIik7XG59XG51dGlscy5pbmhlcml0cyhDcmMzMlByb2JlLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cbkNyYzMyUHJvYmUucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHRoaXMuc3RyZWFtSW5mby5jcmMzMiA9IGNyYzMyKGNodW5rLmRhdGEsIHRoaXMuc3RyZWFtSW5mby5jcmMzMiB8fCAwKTtcbiAgICB0aGlzLnB1c2goY2h1bmspO1xufTtcbm1vZHVsZS5leHBvcnRzID0gQ3JjMzJQcm9iZTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7XG5cbi8qKlxuICogQSB3b3JrZXIgd2hpY2ggY2FsY3VsYXRlIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGRhdGEgZmxvd2luZyB0aHJvdWdoLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcE5hbWUgdGhlIG5hbWUgdXNlZCB0byBleHBvc2UgdGhlIGxlbmd0aFxuICovXG5mdW5jdGlvbiBEYXRhTGVuZ3RoUHJvYmUocHJvcE5hbWUpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJEYXRhTGVuZ3RoUHJvYmUgZm9yIFwiICsgcHJvcE5hbWUpO1xuICAgIHRoaXMucHJvcE5hbWUgPSBwcm9wTmFtZTtcbiAgICB0aGlzLndpdGhTdHJlYW1JbmZvKHByb3BOYW1lLCAwKTtcbn1cbnV0aWxzLmluaGVyaXRzKERhdGFMZW5ndGhQcm9iZSwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5EYXRhTGVuZ3RoUHJvYmUucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGlmKGNodW5rKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLnN0cmVhbUluZm9bdGhpcy5wcm9wTmFtZV0gfHwgMDtcbiAgICAgICAgdGhpcy5zdHJlYW1JbmZvW3RoaXMucHJvcE5hbWVdID0gbGVuZ3RoICsgY2h1bmsuZGF0YS5sZW5ndGg7XG4gICAgfVxuICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLnByb2Nlc3NDaHVuay5jYWxsKHRoaXMsIGNodW5rKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IERhdGFMZW5ndGhQcm9iZTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcblxuLy8gdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjaHVua3Ncbi8vIFRPRE8gZXhwb3NlIHRoaXMgYXMgYSBwdWJsaWMgdmFyaWFibGVcbnZhciBERUZBVUxUX0JMT0NLX1NJWkUgPSAxNiAqIDEwMjQ7XG5cbi8qKlxuICogQSB3b3JrZXIgdGhhdCByZWFkcyBhIGNvbnRlbnQgYW5kIGVtaXRzIGNodW5rcy5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtQcm9taXNlfSBkYXRhUCB0aGUgcHJvbWlzZSBvZiB0aGUgZGF0YSB0byBzcGxpdFxuICovXG5mdW5jdGlvbiBEYXRhV29ya2VyKGRhdGFQKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiRGF0YVdvcmtlclwiKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5kYXRhSXNSZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIHRoaXMubWF4ID0gMDtcbiAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgIHRoaXMudHlwZSA9IFwiXCI7XG5cbiAgICB0aGlzLl90aWNrU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgICBkYXRhUC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHNlbGYuZGF0YUlzUmVhZHkgPSB0cnVlO1xuICAgICAgICBzZWxmLmRhdGEgPSBkYXRhO1xuICAgICAgICBzZWxmLm1heCA9IGRhdGEgJiYgZGF0YS5sZW5ndGggfHwgMDtcbiAgICAgICAgc2VsZi50eXBlID0gdXRpbHMuZ2V0VHlwZU9mKGRhdGEpO1xuICAgICAgICBpZighc2VsZi5pc1BhdXNlZCkge1xuICAgICAgICAgICAgc2VsZi5fdGlja0FuZFJlcGVhdCgpO1xuICAgICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICB9KTtcbn1cblxudXRpbHMuaW5oZXJpdHMoRGF0YVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmNsZWFuVXBcbiAqL1xuRGF0YVdvcmtlci5wcm90b3R5cGUuY2xlYW5VcCA9IGZ1bmN0aW9uICgpIHtcbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5jbGVhblVwLmNhbGwodGhpcyk7XG4gICAgdGhpcy5kYXRhID0gbnVsbDtcbn07XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnJlc3VtZVxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoIUdlbmVyaWNXb3JrZXIucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3RpY2tTY2hlZHVsZWQgJiYgdGhpcy5kYXRhSXNSZWFkeSkge1xuICAgICAgICB0aGlzLl90aWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgdXRpbHMuZGVsYXkodGhpcy5fdGlja0FuZFJlcGVhdCwgW10sIHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBhIHRpY2sgYSBzY2hlZHVsZSBhbiBvdGhlciBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uXG4gKi9cbkRhdGFXb3JrZXIucHJvdG90eXBlLl90aWNrQW5kUmVwZWF0ID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fdGlja1NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGlmKHRoaXMuaXNQYXVzZWQgfHwgdGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdGljaygpO1xuICAgIGlmKCF0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgdXRpbHMuZGVsYXkodGhpcy5fdGlja0FuZFJlcGVhdCwgW10sIHRoaXMpO1xuICAgICAgICB0aGlzLl90aWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFJlYWQgYW5kIHB1c2ggYSBjaHVuay5cbiAqL1xuRGF0YVdvcmtlci5wcm90b3R5cGUuX3RpY2sgPSBmdW5jdGlvbigpIHtcblxuICAgIGlmKHRoaXMuaXNQYXVzZWQgfHwgdGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgc2l6ZSA9IERFRkFVTFRfQkxPQ0tfU0laRTtcbiAgICB2YXIgZGF0YSA9IG51bGwsIG5leHRJbmRleCA9IE1hdGgubWluKHRoaXMubWF4LCB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgaWYgKHRoaXMuaW5kZXggPj0gdGhpcy5tYXgpIHtcbiAgICAgICAgLy8gRU9GXG4gICAgICAgIHJldHVybiB0aGlzLmVuZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXRjaCh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhLnN1YnN0cmluZyh0aGlzLmluZGV4LCBuZXh0SW5kZXgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwidWludDhhcnJheVwiOlxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmRhdGEuc3ViYXJyYXkodGhpcy5pbmRleCwgbmV4dEluZGV4KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwibm9kZWJ1ZmZlclwiOlxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmRhdGEuc2xpY2UodGhpcy5pbmRleCwgbmV4dEluZGV4KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgIHJldHVybiB0aGlzLnB1c2goe1xuICAgICAgICAgICAgZGF0YSA6IGRhdGEsXG4gICAgICAgICAgICBtZXRhIDoge1xuICAgICAgICAgICAgICAgIHBlcmNlbnQgOiB0aGlzLm1heCA/IHRoaXMuaW5kZXggLyB0aGlzLm1heCAqIDEwMCA6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYXRhV29ya2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEEgd29ya2VyIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCBwYXNzaW5nIGNodW5rcyB0byB0aGUgbmV4dCBvbmUuIFRoaXMgaXMgbGlrZVxuICogYSBub2RlanMgc3RyZWFtIGJ1dCB3aXRoIHNvbWUgZGlmZmVyZW5jZXMuIE9uIHRoZSBnb29kIHNpZGUgOlxuICogLSBpdCB3b3JrcyBvbiBJRSA2LTkgd2l0aG91dCBhbnkgaXNzdWUgLyBwb2x5ZmlsbFxuICogLSBpdCB3ZWlnaHRzIGxlc3MgdGhhbiB0aGUgZnVsbCBkZXBlbmRlbmNpZXMgYnVuZGxlZCB3aXRoIGJyb3dzZXJpZnlcbiAqIC0gaXQgZm9yd2FyZHMgZXJyb3JzIChubyBuZWVkIHRvIGRlY2xhcmUgYW4gZXJyb3IgaGFuZGxlciBFVkVSWVdIRVJFKVxuICpcbiAqIEEgY2h1bmsgaXMgYW4gb2JqZWN0IHdpdGggMiBhdHRyaWJ1dGVzIDogYG1ldGFgIGFuZCBgZGF0YWAuIFRoZSBmb3JtZXIgaXMgYW5cbiAqIG9iamVjdCBjb250YWluaW5nIGFueXRoaW5nIChgcGVyY2VudGAgZm9yIGV4YW1wbGUpLCBzZWUgZWFjaCB3b3JrZXIgZm9yIG1vcmVcbiAqIGRldGFpbHMuIFRoZSBsYXR0ZXIgaXMgdGhlIHJlYWwgZGF0YSAoU3RyaW5nLCBVaW50OEFycmF5LCBldGMpLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHN0cmVhbSAobWFpbmx5IHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcylcbiAqL1xuZnVuY3Rpb24gR2VuZXJpY1dvcmtlcihuYW1lKSB7XG4gICAgLy8gdGhlIG5hbWUgb2YgdGhlIHdvcmtlclxuICAgIHRoaXMubmFtZSA9IG5hbWUgfHwgXCJkZWZhdWx0XCI7XG4gICAgLy8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgYWJvdXQgdGhlIHdvcmtlcnMgY2hhaW5cbiAgICB0aGlzLnN0cmVhbUluZm8gPSB7fTtcbiAgICAvLyBhbiBlcnJvciB3aGljaCBoYXBwZW5lZCB3aGVuIHRoZSB3b3JrZXIgd2FzIHBhdXNlZFxuICAgIHRoaXMuZ2VuZXJhdGVkRXJyb3IgPSBudWxsO1xuICAgIC8vIGFuIG9iamVjdCBjb250YWluaW5nIG1ldGFkYXRhIHRvIGJlIG1lcmdlZCBieSB0aGlzIHdvcmtlciBpbnRvIHRoZSBnZW5lcmFsIG1ldGFkYXRhXG4gICAgdGhpcy5leHRyYVN0cmVhbUluZm8gPSB7fTtcbiAgICAvLyB0cnVlIGlmIHRoZSBzdHJlYW0gaXMgcGF1c2VkIChhbmQgc2hvdWxkIG5vdCBkbyBhbnl0aGluZyksIGZhbHNlIG90aGVyd2lzZVxuICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xuICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBmaW5pc2hlZCAoYW5kIHNob3VsZCBub3QgZG8gYW55dGhpbmcpLCBmYWxzZSBvdGhlcndpc2VcbiAgICB0aGlzLmlzRmluaXNoZWQgPSBmYWxzZTtcbiAgICAvLyB0cnVlIGlmIHRoZSBzdHJlYW0gaXMgbG9ja2VkIHRvIHByZXZlbnQgZnVydGhlciBzdHJ1Y3R1cmUgdXBkYXRlcyAocGlwZSksIGZhbHNlIG90aGVyd2lzZVxuICAgIHRoaXMuaXNMb2NrZWQgPSBmYWxzZTtcbiAgICAvLyB0aGUgZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5fbGlzdGVuZXJzID0ge1xuICAgICAgICAnZGF0YSc6W10sXG4gICAgICAgICdlbmQnOltdLFxuICAgICAgICAnZXJyb3InOltdXG4gICAgfTtcbiAgICAvLyB0aGUgcHJldmlvdXMgd29ya2VyLCBpZiBhbnlcbiAgICB0aGlzLnByZXZpb3VzID0gbnVsbDtcbn1cblxuR2VuZXJpY1dvcmtlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogUHVzaCBhIGNodW5rIHRvIHRoZSBuZXh0IHdvcmtlcnMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNodW5rIHRoZSBjaHVuayB0byBwdXNoXG4gICAgICovXG4gICAgcHVzaCA6IGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICB0aGlzLmVtaXQoXCJkYXRhXCIsIGNodW5rKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEVuZCB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBjYWxsIGVuZGVkIHRoZSB3b3JrZXIsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBlbmQgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImVuZFwiKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW5VcCgpO1xuICAgICAgICAgICAgdGhpcy5pc0ZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBFbmQgdGhlIHN0cmVhbSB3aXRoIGFuIGVycm9yLlxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGUgdGhlIGVycm9yIHdoaWNoIGNhdXNlZCB0aGUgcHJlbWF0dXJlIGVuZC5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCBlbmRlZCB0aGUgd29ya2VyIHdpdGggYW4gZXJyb3IsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBlcnJvciA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVkRXJyb3IgPSBlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0ZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZSk7XG5cbiAgICAgICAgICAgIC8vIGluIHRoZSB3b3JrZXJzIGNoYWluIGV4cGxvZGVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIGNoYWluLFxuICAgICAgICAgICAgLy8gdGhlIGVycm9yIGV2ZW50IHdpbGwgZ28gZG93bndhcmQgYnV0IHdlIGFsc28gbmVlZCB0byBub3RpZnlcbiAgICAgICAgICAgIC8vIHdvcmtlcnMgdXB3YXJkIHRoYXQgdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IuXG4gICAgICAgICAgICBpZih0aGlzLnByZXZpb3VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91cy5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jbGVhblVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBZGQgYSBjYWxsYmFjayBvbiBhbiBldmVudC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgKGRhdGEsIGVuZCwgZXJyb3IpXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkXG4gICAgICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIGN1cnJlbnQgb2JqZWN0IGZvciBjaGFpbmFiaWxpdHlcbiAgICAgKi9cbiAgICBvbiA6IGZ1bmN0aW9uIChuYW1lLCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnNbbmFtZV0ucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2xlYW4gYW55IHJlZmVyZW5jZXMgd2hlbiBhIHdvcmtlciBpcyBlbmRpbmcuXG4gICAgICovXG4gICAgY2xlYW5VcCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zdHJlYW1JbmZvID0gdGhpcy5nZW5lcmF0ZWRFcnJvciA9IHRoaXMuZXh0cmFTdHJlYW1JbmZvID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW107XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyIGFuIGV2ZW50LiBUaGlzIHdpbGwgY2FsbCByZWdpc3RlcmVkIGNhbGxiYWNrIHdpdGggdGhlIHByb3ZpZGVkIGFyZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgKGRhdGEsIGVuZCwgZXJyb3IpXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFyZyB0aGUgYXJndW1lbnQgdG8gY2FsbCB0aGUgY2FsbGJhY2sgd2l0aC5cbiAgICAgKi9cbiAgICBlbWl0IDogZnVuY3Rpb24gKG5hbWUsIGFyZykge1xuICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW25hbWVdKSB7XG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5fbGlzdGVuZXJzW25hbWVdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzW25hbWVdW2ldLmNhbGwodGhpcywgYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hhaW4gYSB3b3JrZXIgd2l0aCBhbiBvdGhlci5cbiAgICAgKiBAcGFyYW0ge1dvcmtlcn0gbmV4dCB0aGUgd29ya2VyIHJlY2VpdmluZyBldmVudHMgZnJvbSB0aGUgY3VycmVudCBvbmUuXG4gICAgICogQHJldHVybiB7d29ya2VyfSB0aGUgbmV4dCB3b3JrZXIgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIHBpcGUgOiBmdW5jdGlvbiAobmV4dCkge1xuICAgICAgICByZXR1cm4gbmV4dC5yZWdpc3RlclByZXZpb3VzKHRoaXMpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogU2FtZSBhcyBgcGlwZWAgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgICAgKiBVc2luZyBhbiBBUEkgd2l0aCBgcGlwZShuZXh0KWAgaXMgdmVyeSBlYXN5LlxuICAgICAqIEltcGxlbWVudGluZyB0aGUgQVBJIHdpdGggdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIG5leHQgb25lIHJlZ2lzdGVyaW5nXG4gICAgICogYSBzb3VyY2UgaXMgZWFzaWVyLCBzZWUgdGhlIFppcEZpbGVXb3JrZXIuXG4gICAgICogQHBhcmFtIHtXb3JrZXJ9IHByZXZpb3VzIHRoZSBwcmV2aW91cyB3b3JrZXIsIHNlbmRpbmcgZXZlbnRzIHRvIHRoaXMgb25lXG4gICAgICogQHJldHVybiB7V29ya2VyfSB0aGUgY3VycmVudCB3b3JrZXIgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIHJlZ2lzdGVyUHJldmlvdXMgOiBmdW5jdGlvbiAocHJldmlvdXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2NrZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBzdHJlYW0gJ1wiICsgdGhpcyArIFwiJyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2hhcmluZyB0aGUgc3RyZWFtSW5mby4uLlxuICAgICAgICB0aGlzLnN0cmVhbUluZm8gPSBwcmV2aW91cy5zdHJlYW1JbmZvO1xuICAgICAgICAvLyAuLi4gYW5kIGFkZGluZyBvdXIgb3duIGJpdHNcbiAgICAgICAgdGhpcy5tZXJnZVN0cmVhbUluZm8oKTtcbiAgICAgICAgdGhpcy5wcmV2aW91cyA9ICBwcmV2aW91cztcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBwcmV2aW91cy5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgc2VsZi5wcm9jZXNzQ2h1bmsoY2h1bmspO1xuICAgICAgICB9KTtcbiAgICAgICAgcHJldmlvdXMub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYuZW5kKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBwcmV2aW91cy5vbignZXJyb3InLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUGF1c2UgdGhlIHN0cmVhbSBzbyBpdCBkb2Vzbid0IHNlbmQgZXZlbnRzIGFueW1vcmUuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgcGF1c2VkIHRoZSB3b3JrZXIsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwYXVzZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYodGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcblxuICAgICAgICBpZih0aGlzLnByZXZpb3VzKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzLnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXN1bWUgYSBwYXVzZWQgc3RyZWFtLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBjYWxsIHJlc3VtZWQgdGhlIHdvcmtlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHJlc3VtZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYoIXRoaXMuaXNQYXVzZWQgfHwgdGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGlmIHRydWUsIHRoZSB3b3JrZXIgdHJpZWQgdG8gcmVzdW1lIGJ1dCBmYWlsZWRcbiAgICAgICAgdmFyIHdpdGhFcnJvciA9IGZhbHNlO1xuICAgICAgICBpZih0aGlzLmdlbmVyYXRlZEVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yKHRoaXMuZ2VuZXJhdGVkRXJyb3IpO1xuICAgICAgICAgICAgd2l0aEVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLnByZXZpb3VzKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzLnJlc3VtZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICF3aXRoRXJyb3I7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBGbHVzaCBhbnkgcmVtYWluaW5nIGJ5dGVzIGFzIHRoZSBzdHJlYW0gaXMgZW5kaW5nLlxuICAgICAqL1xuICAgIGZsdXNoIDogZnVuY3Rpb24gKCkge30sXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyBhIGNodW5rLiBUaGlzIGlzIHVzdWFsbHkgdGhlIG1ldGhvZCBvdmVycmlkZGVuLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaHVuayB0aGUgY2h1bmsgdG8gcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBwcm9jZXNzQ2h1bmsgOiBmdW5jdGlvbihjaHVuaykge1xuICAgICAgICB0aGlzLnB1c2goY2h1bmspO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQWRkIGEga2V5L3ZhbHVlIHRvIGJlIGFkZGVkIGluIHRoZSB3b3JrZXJzIGNoYWluIHN0cmVhbUluZm8gb25jZSBhY3RpdmF0ZWQuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUga2V5IHRvIHVzZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSB0aGUgYXNzb2NpYXRlZCB2YWx1ZVxuICAgICAqIEByZXR1cm4ge1dvcmtlcn0gdGhlIGN1cnJlbnQgd29ya2VyIGZvciBjaGFpbmFiaWxpdHlcbiAgICAgKi9cbiAgICB3aXRoU3RyZWFtSW5mbyA6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZXh0cmFTdHJlYW1JbmZvW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5tZXJnZVN0cmVhbUluZm8oKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBNZXJnZSB0aGlzIHdvcmtlcidzIHN0cmVhbUluZm8gaW50byB0aGUgY2hhaW4ncyBzdHJlYW1JbmZvLlxuICAgICAqL1xuICAgIG1lcmdlU3RyZWFtSW5mbyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gdGhpcy5leHRyYVN0cmVhbUluZm8pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5leHRyYVN0cmVhbUluZm8uaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdHJlYW1JbmZvW2tleV0gPSB0aGlzLmV4dHJhU3RyZWFtSW5mb1trZXldO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExvY2sgdGhlIHN0cmVhbSB0byBwcmV2ZW50IGZ1cnRoZXIgdXBkYXRlcyBvbiB0aGUgd29ya2VycyBjaGFpbi5cbiAgICAgKiBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBhbGwgY2FsbHMgdG8gcGlwZSB3aWxsIGZhaWwuXG4gICAgICovXG4gICAgbG9jazogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc0xvY2tlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0cmVhbSAnXCIgKyB0aGlzICsgXCInIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0xvY2tlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzLmxvY2soKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIFByZXR0eSBwcmludCB0aGUgd29ya2VycyBjaGFpbi5cbiAgICAgKi9cbiAgICB0b1N0cmluZyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1lID0gXCJXb3JrZXIgXCIgKyB0aGlzLm5hbWU7XG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91cyArIFwiIC0+IFwiICsgbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbWU7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdlbmVyaWNXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgQ29udmVydFdvcmtlciA9IHJlcXVpcmUoJy4vQ29udmVydFdvcmtlcicpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuLi9iYXNlNjQnKTtcbnZhciBOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyID0gcmVxdWlyZSgnLi4vbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXInKTtcbnZhciBleHRlcm5hbCA9IHJlcXVpcmUoXCIuLi9leHRlcm5hbFwiKTtcblxuLyoqXG4gKiBBcHBseSB0aGUgZmluYWwgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGRhdGEuIElmIHRoZSB1c2VyIHdhbnRzIGEgQmxvYiBmb3JcbiAqIGV4YW1wbGUsIGl0J3MgZWFzaWVyIHRvIHdvcmsgd2l0aCBhbiBVOGludEFycmF5IGFuZCBmaW5hbGx5IGRvIHRoZVxuICogQXJyYXlCdWZmZXIvQmxvYiBjb252ZXJzaW9uLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIG5hbWUgb2YgdGhlIGZpbmFsIHR5cGVcbiAqIEBwYXJhbSB7U3RyaW5nfFVpbnQ4QXJyYXl8QnVmZmVyfSBjb250ZW50IHRoZSBjb250ZW50IHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVUeXBlIHRoZSBtaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQsIGlmIGFwcGxpY2FibGUuXG4gKiBAcmV0dXJuIHtTdHJpbmd8VWludDhBcnJheXxBcnJheUJ1ZmZlcnxCdWZmZXJ8QmxvYn0gdGhlIGNvbnRlbnQgaW4gdGhlIHJpZ2h0IGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtWmlwT3V0cHV0KHR5cGUsIGNvbnRlbnQsIG1pbWVUeXBlKSB7XG4gICAgc3dpdGNoKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImJsb2JcIiA6XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMubmV3QmxvYih1dGlscy50cmFuc2Zvcm1UbyhcImFycmF5YnVmZmVyXCIsIGNvbnRlbnQpLCBtaW1lVHlwZSk7XG4gICAgICAgIGNhc2UgXCJiYXNlNjRcIiA6XG4gICAgICAgICAgICByZXR1cm4gYmFzZTY0LmVuY29kZShjb250ZW50KTtcbiAgICAgICAgZGVmYXVsdCA6XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMudHJhbnNmb3JtVG8odHlwZSwgY29udGVudCk7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlIGFuIGFycmF5IG9mIGRhdGEgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiB0aGUgZGF0YSBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5fSBkYXRhQXJyYXkgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgY2h1bmtzIHRvIGNvbmNhdGVuYXRlXG4gKiBAcmV0dXJuIHtTdHJpbmd8VWludDhBcnJheXxCdWZmZXJ9IHRoZSBjb25jYXRlbmF0ZWQgZGF0YVxuICogQHRocm93cyBFcnJvciBpZiB0aGUgYXNrZWQgdHlwZSBpcyB1bnN1cHBvcnRlZFxuICovXG5mdW5jdGlvbiBjb25jYXQgKHR5cGUsIGRhdGFBcnJheSkge1xuICAgIHZhciBpLCBpbmRleCA9IDAsIHJlcyA9IG51bGwsIHRvdGFsTGVuZ3RoID0gMDtcbiAgICBmb3IoaSA9IDA7IGkgPCBkYXRhQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdG90YWxMZW5ndGggKz0gZGF0YUFycmF5W2ldLmxlbmd0aDtcbiAgICB9XG4gICAgc3dpdGNoKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIGRhdGFBcnJheS5qb2luKFwiXCIpO1xuICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIGRhdGFBcnJheSk7XG4gICAgICAgIGNhc2UgXCJ1aW50OGFycmF5XCI6XG4gICAgICAgICAgICByZXMgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBkYXRhQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZXMuc2V0KGRhdGFBcnJheVtpXSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIGluZGV4ICs9IGRhdGFBcnJheVtpXS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICBjYXNlIFwibm9kZWJ1ZmZlclwiOlxuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoZGF0YUFycmF5KTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvbmNhdCA6IHVuc3VwcG9ydGVkIHR5cGUgJ1wiICArIHR5cGUgKyBcIidcIik7XG4gICAgfVxufVxuXG4vKipcbiAqIExpc3RlbiBhIFN0cmVhbUhlbHBlciwgYWNjdW11bGF0ZSBpdHMgY29udGVudCBhbmQgY29uY2F0ZW5hdGUgaXQgaW50byBhXG4gKiBjb21wbGV0ZSBibG9jay5cbiAqIEBwYXJhbSB7U3RyZWFtSGVscGVyfSBoZWxwZXIgdGhlIGhlbHBlciB0byB1c2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYWxsYmFjayBhIGNhbGxiYWNrIGNhbGxlZCBvbiBlYWNoIHVwZGF0ZS4gQ2FsbGVkXG4gKiB3aXRoIG9uZSBhcmcgOlxuICogLSB0aGUgbWV0YWRhdGEgbGlua2VkIHRvIHRoZSB1cGRhdGUgcmVjZWl2ZWQuXG4gKiBAcmV0dXJuIFByb21pc2UgdGhlIHByb21pc2UgZm9yIHRoZSBhY2N1bXVsYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGUoaGVscGVyLCB1cGRhdGVDYWxsYmFjaykge1xuICAgIHJldHVybiBuZXcgZXh0ZXJuYWwuUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICAgICAgdmFyIGRhdGFBcnJheSA9IFtdO1xuICAgICAgICB2YXIgY2h1bmtUeXBlID0gaGVscGVyLl9pbnRlcm5hbFR5cGUsXG4gICAgICAgICAgICByZXN1bHRUeXBlID0gaGVscGVyLl9vdXRwdXRUeXBlLFxuICAgICAgICAgICAgbWltZVR5cGUgPSBoZWxwZXIuX21pbWVUeXBlO1xuICAgICAgICBoZWxwZXJcbiAgICAgICAgLm9uKCdkYXRhJywgZnVuY3Rpb24gKGRhdGEsIG1ldGEpIHtcbiAgICAgICAgICAgIGRhdGFBcnJheS5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgaWYodXBkYXRlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVDYWxsYmFjayhtZXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgZGF0YUFycmF5ID0gW107XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlbmQnLCBmdW5jdGlvbiAoKXtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRyYW5zZm9ybVppcE91dHB1dChyZXN1bHRUeXBlLCBjb25jYXQoY2h1bmtUeXBlLCBkYXRhQXJyYXkpLCBtaW1lVHlwZSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGFBcnJheSA9IFtdO1xuICAgICAgICB9KVxuICAgICAgICAucmVzdW1lKCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQW4gaGVscGVyIHRvIGVhc2lseSB1c2Ugd29ya2VycyBvdXRzaWRlIG9mIEpTWmlwLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1dvcmtlcn0gd29ya2VyIHRoZSB3b3JrZXIgdG8gd3JhcFxuICogQHBhcmFtIHtTdHJpbmd9IG91dHB1dFR5cGUgdGhlIHR5cGUgb2YgZGF0YSBleHBlY3RlZCBieSB0aGUgdXNlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWltZVR5cGUgdGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgaWYgYXBwbGljYWJsZS5cbiAqL1xuZnVuY3Rpb24gU3RyZWFtSGVscGVyKHdvcmtlciwgb3V0cHV0VHlwZSwgbWltZVR5cGUpIHtcbiAgICB2YXIgaW50ZXJuYWxUeXBlID0gb3V0cHV0VHlwZTtcbiAgICBzd2l0Y2gob3V0cHV0VHlwZSkge1xuICAgICAgICBjYXNlIFwiYmxvYlwiOlxuICAgICAgICBjYXNlIFwiYXJyYXlidWZmZXJcIjpcbiAgICAgICAgICAgIGludGVybmFsVHlwZSA9IFwidWludDhhcnJheVwiO1xuICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImJhc2U2NFwiOlxuICAgICAgICAgICAgaW50ZXJuYWxUeXBlID0gXCJzdHJpbmdcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gdGhlIHR5cGUgdXNlZCBpbnRlcm5hbGx5XG4gICAgICAgIHRoaXMuX2ludGVybmFsVHlwZSA9IGludGVybmFsVHlwZTtcbiAgICAgICAgLy8gdGhlIHR5cGUgdXNlZCB0byBvdXRwdXQgcmVzdWx0c1xuICAgICAgICB0aGlzLl9vdXRwdXRUeXBlID0gb3V0cHV0VHlwZTtcbiAgICAgICAgLy8gdGhlIG1pbWUgdHlwZVxuICAgICAgICB0aGlzLl9taW1lVHlwZSA9IG1pbWVUeXBlO1xuICAgICAgICB1dGlscy5jaGVja1N1cHBvcnQoaW50ZXJuYWxUeXBlKTtcbiAgICAgICAgdGhpcy5fd29ya2VyID0gd29ya2VyLnBpcGUobmV3IENvbnZlcnRXb3JrZXIoaW50ZXJuYWxUeXBlKSk7XG4gICAgICAgIC8vIHRoZSBsYXN0IHdvcmtlcnMgY2FuIGJlIHJld2lyZWQgd2l0aG91dCBpc3N1ZXMgYnV0IHdlIG5lZWQgdG9cbiAgICAgICAgLy8gcHJldmVudCBhbnkgdXBkYXRlcyBvbiBwcmV2aW91cyB3b3JrZXJzLlxuICAgICAgICB3b3JrZXIubG9jaygpO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICB0aGlzLl93b3JrZXIgPSBuZXcgR2VuZXJpY1dvcmtlcihcImVycm9yXCIpO1xuICAgICAgICB0aGlzLl93b3JrZXIuZXJyb3IoZSk7XG4gICAgfVxufVxuXG5TdHJlYW1IZWxwZXIucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIExpc3RlbiBhIFN0cmVhbUhlbHBlciwgYWNjdW11bGF0ZSBpdHMgY29udGVudCBhbmQgY29uY2F0ZW5hdGUgaXQgaW50byBhXG4gICAgICogY29tcGxldGUgYmxvY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2IgdGhlIHVwZGF0ZSBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJuIFByb21pc2UgdGhlIHByb21pc2UgZm9yIHRoZSBhY2N1bXVsYXRpb24uXG4gICAgICovXG4gICAgYWNjdW11bGF0ZSA6IGZ1bmN0aW9uICh1cGRhdGVDYikge1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0ZSh0aGlzLCB1cGRhdGVDYik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBZGQgYSBsaXN0ZW5lciBvbiBhbiBldmVudCB0cmlnZ2VyZWQgb24gYSBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2dCB0aGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiB0aGUgbGlzdGVuZXJcbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBjdXJyZW50IGhlbHBlci5cbiAgICAgKi9cbiAgICBvbiA6IGZ1bmN0aW9uIChldnQsIGZuKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICBpZihldnQgPT09IFwiZGF0YVwiKSB7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIub24oZXZ0LCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgICAgICAgICBmbi5jYWxsKHNlbGYsIGNodW5rLmRhdGEsIGNodW5rLm1ldGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIub24oZXZ0LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdXRpbHMuZGVsYXkoZm4sIGFyZ3VtZW50cywgc2VsZik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlc3VtZSB0aGUgZmxvdyBvZiBjaHVua3MuXG4gICAgICogQHJldHVybiB7U3RyZWFtSGVscGVyfSB0aGUgY3VycmVudCBoZWxwZXIuXG4gICAgICovXG4gICAgcmVzdW1lIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB1dGlscy5kZWxheSh0aGlzLl93b3JrZXIucmVzdW1lLCBbXSwgdGhpcy5fd29ya2VyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgZmxvdyBvZiBjaHVua3MuXG4gICAgICogQHJldHVybiB7U3RyZWFtSGVscGVyfSB0aGUgY3VycmVudCBoZWxwZXIuXG4gICAgICovXG4gICAgcGF1c2UgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3dvcmtlci5wYXVzZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIG5vZGVqcyBzdHJlYW0gZm9yIHRoaXMgaGVscGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZUNiIHRoZSB1cGRhdGUgY2FsbGJhY2suXG4gICAgICogQHJldHVybiB7Tm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcn0gdGhlIG5vZGVqcyBzdHJlYW0uXG4gICAgICovXG4gICAgdG9Ob2RlanNTdHJlYW0gOiBmdW5jdGlvbiAodXBkYXRlQ2IpIHtcbiAgICAgICAgdXRpbHMuY2hlY2tTdXBwb3J0KFwibm9kZXN0cmVhbVwiKTtcbiAgICAgICAgaWYgKHRoaXMuX291dHB1dFR5cGUgIT09IFwibm9kZWJ1ZmZlclwiKSB7XG4gICAgICAgICAgICAvLyBhbiBvYmplY3Qgc3RyZWFtIGNvbnRhaW5pbmcgYmxvYi9hcnJheWJ1ZmZlci91aW50OGFycmF5L3N0cmluZ1xuICAgICAgICAgICAgLy8gaXMgc3RyYW5nZSBhbmQgSSBkb24ndCBrbm93IGlmIGl0IHdvdWxkIGJlIHVzZWZ1bC5cbiAgICAgICAgICAgIC8vIEkgeW91IGZpbmQgdGhpcyBjb21tZW50IGFuZCBoYXZlIGEgZ29vZCB1c2VjYXNlLCBwbGVhc2Ugb3BlbiBhXG4gICAgICAgICAgICAvLyBidWcgcmVwb3J0ICFcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLl9vdXRwdXRUeXBlICsgXCIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1ldGhvZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcih0aGlzLCB7XG4gICAgICAgICAgICBvYmplY3RNb2RlIDogdGhpcy5fb3V0cHV0VHlwZSAhPT0gXCJub2RlYnVmZmVyXCJcbiAgICAgICAgfSwgdXBkYXRlQ2IpO1xuICAgIH1cbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTdHJlYW1IZWxwZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuYmFzZTY0ID0gdHJ1ZTtcbmV4cG9ydHMuYXJyYXkgPSB0cnVlO1xuZXhwb3J0cy5zdHJpbmcgPSB0cnVlO1xuZXhwb3J0cy5hcnJheWJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgVWludDhBcnJheSAhPT0gXCJ1bmRlZmluZWRcIjtcbmV4cG9ydHMubm9kZWJ1ZmZlciA9IHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCI7XG4vLyBjb250YWlucyB0cnVlIGlmIEpTWmlwIGNhbiByZWFkL2dlbmVyYXRlIFVpbnQ4QXJyYXksIGZhbHNlIG90aGVyd2lzZS5cbmV4cG9ydHMudWludDhhcnJheSA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSBcInVuZGVmaW5lZFwiO1xuXG5pZiAodHlwZW9mIEFycmF5QnVmZmVyID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZXhwb3J0cy5ibG9iID0gZmFsc2U7XG59XG5lbHNlIHtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgIHRyeSB7XG4gICAgICAgIGV4cG9ydHMuYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7XG4gICAgICAgICAgICB0eXBlOiBcImFwcGxpY2F0aW9uL3ppcFwiXG4gICAgICAgIH0pLnNpemUgPT09IDA7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgQnVpbGRlciA9IHdpbmRvdy5CbG9iQnVpbGRlciB8fCB3aW5kb3cuV2ViS2l0QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1vekJsb2JCdWlsZGVyIHx8IHdpbmRvdy5NU0Jsb2JCdWlsZGVyO1xuICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpO1xuICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyKTtcbiAgICAgICAgICAgIGV4cG9ydHMuYmxvYiA9IGJ1aWxkZXIuZ2V0QmxvYignYXBwbGljYXRpb24vemlwJykuc2l6ZSA9PT0gMDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZXhwb3J0cy5ibG9iID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydHMubm9kZXN0cmVhbSA9ICEhcmVxdWlyZShcIi4vbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXJcIikucHJvdG90eXBlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xudmFyIG5vZGVqc1V0aWxzID0gcmVxdWlyZSgnLi9ub2RlanNVdGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9HZW5lcmljV29ya2VyJyk7XG5cbi8qKlxuICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY29tZSBmcm9tIHBha28sIGZyb20gcGFrby9saWIvdXRpbHMvc3RyaW5nc1xuICogcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLCBzZWUgcGFrbyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28vXG4gKi9cblxuLy8gVGFibGUgd2l0aCB1dGY4IGxlbmd0aHMgKGNhbGN1bGF0ZWQgYnkgZmlyc3QgYnl0ZSBvZiBzZXF1ZW5jZSlcbi8vIE5vdGUsIHRoYXQgNSAmIDYtYnl0ZSB2YWx1ZXMgYW5kIHNvbWUgNC1ieXRlIHZhbHVlcyBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGluIEpTLFxuLy8gYmVjYXVzZSBtYXggcG9zc2libGUgY29kZXBvaW50IGlzIDB4MTBmZmZmXG52YXIgX3V0ZjhsZW4gPSBuZXcgQXJyYXkoMjU2KTtcbmZvciAodmFyIGk9MDsgaTwyNTY7IGkrKykge1xuICBfdXRmOGxlbltpXSA9IChpID49IDI1MiA/IDYgOiBpID49IDI0OCA/IDUgOiBpID49IDI0MCA/IDQgOiBpID49IDIyNCA/IDMgOiBpID49IDE5MiA/IDIgOiAxKTtcbn1cbl91dGY4bGVuWzI1NF09X3V0ZjhsZW5bMjU0XT0xOyAvLyBJbnZhbGlkIHNlcXVlbmNlIHN0YXJ0XG5cbi8vIGNvbnZlcnQgc3RyaW5nIHRvIGFycmF5ICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbnZhciBzdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHZhciBidWYsIGMsIGMyLCBtX3BvcywgaSwgc3RyX2xlbiA9IHN0ci5sZW5ndGgsIGJ1Zl9sZW4gPSAwO1xuXG4gICAgLy8gY291bnQgYmluYXJ5IHNpemVcbiAgICBmb3IgKG1fcG9zID0gMDsgbV9wb3MgPCBzdHJfbGVuOyBtX3BvcysrKSB7XG4gICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MrMSA8IHN0cl9sZW4pKSB7XG4gICAgICAgICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKzEpO1xuICAgICAgICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICAgICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICAgICAgICAgIG1fcG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnVmX2xlbiArPSBjIDwgMHg4MCA/IDEgOiBjIDwgMHg4MDAgPyAyIDogYyA8IDB4MTAwMDAgPyAzIDogNDtcbiAgICB9XG5cbiAgICAvLyBhbGxvY2F0ZSBidWZmZXJcbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGJ1Zl9sZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1ZiA9IG5ldyBBcnJheShidWZfbGVuKTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0XG4gICAgZm9yIChpPTAsIG1fcG9zID0gMDsgaSA8IGJ1Zl9sZW47IG1fcG9zKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICAgICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcysxIDwgc3RyX2xlbikpIHtcbiAgICAgICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MrMSk7XG4gICAgICAgICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgICAgICAgICAgbV9wb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgIC8qIG9uZSBieXRlICovXG4gICAgICAgICAgICBidWZbaSsrXSA9IGM7XG4gICAgICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICAvKiB0d28gYnl0ZXMgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhDMCB8IChjID4+PiA2KTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgICAgIH0gZWxzZSBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgICAgICAgIC8qIHRocmVlIGJ5dGVzICovXG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4RTAgfCAoYyA+Pj4gMTIpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBmb3VyIGJ5dGVzICovXG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ZjAgfCAoYyA+Pj4gMTgpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDEyICYgMHgzZik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBidWY7XG59O1xuXG4vLyBDYWxjdWxhdGUgbWF4IHBvc3NpYmxlIHBvc2l0aW9uIGluIHV0ZjggYnVmZmVyLFxuLy8gdGhhdCB3aWxsIG5vdCBicmVhayBzZXF1ZW5jZS4gSWYgdGhhdCdzIG5vdCBwb3NzaWJsZVxuLy8gLSAodmVyeSBzbWFsbCBsaW1pdHMpIHJldHVybiBtYXggc2l6ZSBhcyBpcy5cbi8vXG4vLyBidWZbXSAtIHV0ZjggYnl0ZXMgYXJyYXlcbi8vIG1heCAgIC0gbGVuZ3RoIGxpbWl0IChtYW5kYXRvcnkpO1xudmFyIHV0Zjhib3JkZXIgPSBmdW5jdGlvbihidWYsIG1heCkge1xuICAgIHZhciBwb3M7XG5cbiAgICBtYXggPSBtYXggfHwgYnVmLmxlbmd0aDtcbiAgICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgICAvLyBnbyBiYWNrIGZyb20gbGFzdCBwb3NpdGlvbiwgdW50aWwgc3RhcnQgb2Ygc2VxdWVuY2UgZm91bmRcbiAgICBwb3MgPSBtYXgtMTtcbiAgICB3aGlsZSAocG9zID49IDAgJiYgKGJ1Zltwb3NdICYgMHhDMCkgPT09IDB4ODApIHsgcG9zLS07IH1cblxuICAgIC8vIEZ1Y2t1cCAtIHZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgICAvLyByZXR1cm4gbWF4LCBiZWNhdXNlIHdlIHNob3VsZCByZXR1cm4gc29tZXRoaW5nIGFueXdheS5cbiAgICBpZiAocG9zIDwgMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgdnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgICAvLyByZXR1cm4gbWF4IHRvby5cbiAgICBpZiAocG9zID09PSAwKSB7IHJldHVybiBtYXg7IH1cblxuICAgIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG5cbi8vIGNvbnZlcnQgYXJyYXkgdG8gc3RyaW5nXG52YXIgYnVmMnN0cmluZyA9IGZ1bmN0aW9uIChidWYpIHtcbiAgICB2YXIgc3RyLCBpLCBvdXQsIGMsIGNfbGVuO1xuICAgIHZhciBsZW4gPSBidWYubGVuZ3RoO1xuXG4gICAgLy8gUmVzZXJ2ZSBtYXggcG9zc2libGUgbGVuZ3RoICgyIHdvcmRzIHBlciBjaGFyKVxuICAgIC8vIE5COiBieSB1bmtub3duIHJlYXNvbnMsIEFycmF5IGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIGZvclxuICAgIC8vICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5IHRoYW4gVWludDE2QXJyYXkuXG4gICAgdmFyIHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbioyKTtcblxuICAgIGZvciAob3V0PTAsIGk9MDsgaTxsZW47KSB7XG4gICAgICAgIGMgPSBidWZbaSsrXTtcbiAgICAgICAgLy8gcXVpY2sgcHJvY2VzcyBhc2NpaVxuICAgICAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgICAgICBjX2xlbiA9IF91dGY4bGVuW2NdO1xuICAgICAgICAvLyBza2lwIDUgJiA2IGJ5dGUgY29kZXNcbiAgICAgICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4tMTsgY29udGludWU7IH1cblxuICAgICAgICAvLyBhcHBseSBtYXNrIG9uIGZpcnN0IGJ5dGVcbiAgICAgICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgICAgICAvLyBqb2luIHRoZSByZXN0XG4gICAgICAgIHdoaWxlIChjX2xlbiA+IDEgJiYgaSA8IGxlbikge1xuICAgICAgICAgICAgYyA9IChjIDw8IDYpIHwgKGJ1ZltpKytdICYgMHgzZik7XG4gICAgICAgICAgICBjX2xlbi0tO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGVybWluYXRlZCBieSBlbmQgb2Ygc3RyaW5nP1xuICAgICAgICBpZiAoY19sZW4gPiAxKSB7IHV0ZjE2YnVmW291dCsrXSA9IDB4ZmZmZDsgY29udGludWU7IH1cblxuICAgICAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjIC09IDB4MTAwMDA7XG4gICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGQ4MDAgfCAoKGMgPj4gMTApICYgMHgzZmYpO1xuICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkYzAwIHwgKGMgJiAweDNmZik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzaHJpbmtCdWYodXRmMTZidWYsIG91dClcbiAgICBpZiAodXRmMTZidWYubGVuZ3RoICE9PSBvdXQpIHtcbiAgICAgICAgaWYodXRmMTZidWYuc3ViYXJyYXkpIHtcbiAgICAgICAgICAgIHV0ZjE2YnVmID0gdXRmMTZidWYuc3ViYXJyYXkoMCwgb3V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHV0ZjE2YnVmLmxlbmd0aCA9IG91dDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0ZjE2YnVmKTtcbiAgICByZXR1cm4gdXRpbHMuYXBwbHlGcm9tQ2hhckNvZGUodXRmMTZidWYpO1xufTtcblxuXG4vLyBUaGF0J3MgYWxsIGZvciB0aGUgcGFrbyBmdW5jdGlvbnMuXG5cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSBqYXZhc2NyaXB0IHN0cmluZyBpbnRvIGFuIGFycmF5ICh0eXBlZCBpZiBwb3NzaWJsZSkgb2YgYnl0ZXMsXG4gKiBVVEYtOCBlbmNvZGVkLlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIGVuY29kZVxuICogQHJldHVybiB7QXJyYXl8VWludDhBcnJheXxCdWZmZXJ9IHRoZSBVVEYtOCBlbmNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0cy51dGY4ZW5jb2RlID0gZnVuY3Rpb24gdXRmOGVuY29kZShzdHIpIHtcbiAgICBpZiAoc3VwcG9ydC5ub2RlYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBub2RlanNVdGlscy5uZXdCdWZmZXIoc3RyLCBcInV0Zi04XCIpO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmcyYnVmKHN0cik7XG59O1xuXG5cbi8qKlxuICogVHJhbnNmb3JtIGEgYnl0ZXMgYXJyYXkgKG9yIGEgcmVwcmVzZW50YXRpb24pIHJlcHJlc2VudGluZyBhbiBVVEYtOCBlbmNvZGVkXG4gKiBzdHJpbmcgaW50byBhIGphdmFzY3JpcHQgc3RyaW5nLlxuICogQHBhcmFtIHtBcnJheXxVaW50OEFycmF5fEJ1ZmZlcn0gYnVmIHRoZSBkYXRhIGRlIGRlY29kZVxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgZGVjb2RlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydHMudXRmOGRlY29kZSA9IGZ1bmN0aW9uIHV0ZjhkZWNvZGUoYnVmKSB7XG4gICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gdXRpbHMudHJhbnNmb3JtVG8oXCJub2RlYnVmZmVyXCIsIGJ1ZikudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICB9XG5cbiAgICBidWYgPSB1dGlscy50cmFuc2Zvcm1UbyhzdXBwb3J0LnVpbnQ4YXJyYXkgPyBcInVpbnQ4YXJyYXlcIiA6IFwiYXJyYXlcIiwgYnVmKTtcblxuICAgIHJldHVybiBidWYyc3RyaW5nKGJ1Zik7XG59O1xuXG4vKipcbiAqIEEgd29ya2VyIHRvIGRlY29kZSB1dGY4IGVuY29kZWQgYmluYXJ5IGNodW5rcyBpbnRvIHN0cmluZyBjaHVua3MuXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gVXRmOERlY29kZVdvcmtlcigpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJ1dGYtOCBkZWNvZGVcIik7XG4gICAgLy8gdGhlIGxhc3QgYnl0ZXMgaWYgYSBjaHVuayBkaWRuJ3QgZW5kIHdpdGggYSBjb21wbGV0ZSBjb2RlcG9pbnQuXG4gICAgdGhpcy5sZWZ0T3ZlciA9IG51bGw7XG59XG51dGlscy5pbmhlcml0cyhVdGY4RGVjb2RlV29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cblV0ZjhEZWNvZGVXb3JrZXIucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuXG4gICAgdmFyIGRhdGEgPSB1dGlscy50cmFuc2Zvcm1UbyhzdXBwb3J0LnVpbnQ4YXJyYXkgPyBcInVpbnQ4YXJyYXlcIiA6IFwiYXJyYXlcIiwgY2h1bmsuZGF0YSk7XG5cbiAgICAvLyAxc3Qgc3RlcCwgcmUtdXNlIHdoYXQncyBsZWZ0IG9mIHRoZSBwcmV2aW91cyBjaHVua1xuICAgIGlmICh0aGlzLmxlZnRPdmVyICYmIHRoaXMubGVmdE92ZXIubGVuZ3RoKSB7XG4gICAgICAgIGlmKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICAgICAgdmFyIHByZXZpb3VzRGF0YSA9IGRhdGE7XG4gICAgICAgICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocHJldmlvdXNEYXRhLmxlbmd0aCArIHRoaXMubGVmdE92ZXIubGVuZ3RoKTtcbiAgICAgICAgICAgIGRhdGEuc2V0KHRoaXMubGVmdE92ZXIsIDApO1xuICAgICAgICAgICAgZGF0YS5zZXQocHJldmlvdXNEYXRhLCB0aGlzLmxlZnRPdmVyLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy5sZWZ0T3Zlci5jb25jYXQoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG5leHRCb3VuZGFyeSA9IHV0Zjhib3JkZXIoZGF0YSk7XG4gICAgdmFyIHVzYWJsZURhdGEgPSBkYXRhO1xuICAgIGlmIChuZXh0Qm91bmRhcnkgIT09IGRhdGEubGVuZ3RoKSB7XG4gICAgICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgICAgIHVzYWJsZURhdGEgPSBkYXRhLnN1YmFycmF5KDAsIG5leHRCb3VuZGFyeSk7XG4gICAgICAgICAgICB0aGlzLmxlZnRPdmVyID0gZGF0YS5zdWJhcnJheShuZXh0Qm91bmRhcnksIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVzYWJsZURhdGEgPSBkYXRhLnNsaWNlKDAsIG5leHRCb3VuZGFyeSk7XG4gICAgICAgICAgICB0aGlzLmxlZnRPdmVyID0gZGF0YS5zbGljZShuZXh0Qm91bmRhcnksIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucHVzaCh7XG4gICAgICAgIGRhdGEgOiBleHBvcnRzLnV0ZjhkZWNvZGUodXNhYmxlRGF0YSksXG4gICAgICAgIG1ldGEgOiBjaHVuay5tZXRhXG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5mbHVzaFxuICovXG5VdGY4RGVjb2RlV29ya2VyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZih0aGlzLmxlZnRPdmVyICYmIHRoaXMubGVmdE92ZXIubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucHVzaCh7XG4gICAgICAgICAgICBkYXRhIDogZXhwb3J0cy51dGY4ZGVjb2RlKHRoaXMubGVmdE92ZXIpLFxuICAgICAgICAgICAgbWV0YSA6IHt9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmxlZnRPdmVyID0gbnVsbDtcbiAgICB9XG59O1xuZXhwb3J0cy5VdGY4RGVjb2RlV29ya2VyID0gVXRmOERlY29kZVdvcmtlcjtcblxuLyoqXG4gKiBBIHdvcmtlciB0byBlbmRjb2RlIHN0cmluZyBjaHVua3MgaW50byB1dGY4IGVuY29kZWQgYmluYXJ5IGNodW5rcy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBVdGY4RW5jb2RlV29ya2VyKCkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcInV0Zi04IGVuY29kZVwiKTtcbn1cbnV0aWxzLmluaGVyaXRzKFV0ZjhFbmNvZGVXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuVXRmOEVuY29kZVdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5wdXNoKHtcbiAgICAgICAgZGF0YSA6IGV4cG9ydHMudXRmOGVuY29kZShjaHVuay5kYXRhKSxcbiAgICAgICAgbWV0YSA6IGNodW5rLm1ldGFcbiAgICB9KTtcbn07XG5leHBvcnRzLlV0ZjhFbmNvZGVXb3JrZXIgPSBVdGY4RW5jb2RlV29ya2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4vYmFzZTY0Jyk7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKCcuL25vZGVqc1V0aWxzJyk7XG52YXIgYXNhcCA9IHJlcXVpcmUoJ2FzYXAnKTtcbnZhciBleHRlcm5hbCA9IHJlcXVpcmUoXCIuL2V4dGVybmFsXCIpO1xuXG5cbi8qKlxuICogQ29udmVydCBhIHN0cmluZyB0aGF0IHBhc3MgYXMgYSBcImJpbmFyeSBzdHJpbmdcIjogaXQgc2hvdWxkIHJlcHJlc2VudCBhIGJ5dGVcbiAqIGFycmF5IGJ1dCBtYXkgaGF2ZSA+IDI1NSBjaGFyIGNvZGVzLiBCZSBzdXJlIHRvIHRha2Ugb25seSB0aGUgZmlyc3QgYnl0ZVxuICogYW5kIHJldHVybnMgdGhlIGJ5dGUgYXJyYXkuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7QXJyYXl8VWludDhBcnJheX0gdGhlIHN0cmluZyBpbiBhIGJpbmFyeSBmb3JtYXQuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZzJiaW5hcnkoc3RyKSB7XG4gICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShzdHIubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cmluZ1RvQXJyYXlMaWtlKHN0ciwgcmVzdWx0KTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgYmxvYiB3aXRoIHRoZSBnaXZlbiBjb250ZW50IGFuZCB0aGUgZ2l2ZW4gdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfSBwYXJ0IHRoZSBjb250ZW50IHRvIHB1dCBpbiB0aGUgYmxvYi4gRE8gTk9UIHVzZVxuICogYW4gVWludDhBcnJheSBiZWNhdXNlIHRoZSBzdG9jayBicm93c2VyIG9mIGFuZHJvaWQgNCB3b24ndCBhY2NlcHQgaXQgKGl0XG4gKiB3aWxsIGJlIHNpbGVudGx5IGNvbnZlcnRlZCB0byBhIHN0cmluZywgXCJbb2JqZWN0IFVpbnQ4QXJyYXldXCIpLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIG1pbWUgdHlwZSBvZiB0aGUgYmxvYi5cbiAqIEByZXR1cm4ge0Jsb2J9IHRoZSBjcmVhdGVkIGJsb2IuXG4gKi9cbmV4cG9ydHMubmV3QmxvYiA9IGZ1bmN0aW9uKHBhcnQsIHR5cGUpIHtcbiAgICBleHBvcnRzLmNoZWNrU3VwcG9ydChcImJsb2JcIik7XG5cbiAgICB0cnkge1xuICAgICAgICAvLyBCbG9iIGNvbnN0cnVjdG9yXG4gICAgICAgIHJldHVybiBuZXcgQmxvYihbcGFydF0sIHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGRlcHJlY2F0ZWQsIGJyb3dzZXIgb25seSwgb2xkIHdheVxuICAgICAgICAgICAgdmFyIEJ1aWxkZXIgPSB3aW5kb3cuQmxvYkJ1aWxkZXIgfHwgd2luZG93LldlYktpdEJsb2JCdWlsZGVyIHx8IHdpbmRvdy5Nb3pCbG9iQnVpbGRlciB8fCB3aW5kb3cuTVNCbG9iQnVpbGRlcjtcbiAgICAgICAgICAgIHZhciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTtcbiAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHBhcnQpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0QmxvYih0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuXG4gICAgICAgICAgICAvLyB3ZWxsLCBmdWNrID8hXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCdWcgOiBjYW4ndCBjb25zdHJ1Y3QgdGhlIEJsb2IuXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn07XG4vKipcbiAqIFRoZSBpZGVudGl0eSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCB0aGUgaW5wdXQuXG4gKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBzYW1lIGlucHV0LlxuICovXG5mdW5jdGlvbiBpZGVudGl0eShpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dDtcbn1cblxuLyoqXG4gKiBGaWxsIGluIGFuIGFycmF5IHdpdGggYSBzdHJpbmcuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gdXNlLlxuICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXkgdGhlIGFycmF5IHRvIGZpbGwgaW4gKHdpbGwgYmUgbXV0YXRlZCkuXG4gKiBAcmV0dXJuIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIHVwZGF0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ1RvQXJyYXlMaWtlKHN0ciwgYXJyYXkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgICAgICBhcnJheVtpXSA9IHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRjtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIEFuIGhlbHBlciBmb3IgdGhlIGZ1bmN0aW9uIGFycmF5TGlrZVRvU3RyaW5nLlxuICogVGhpcyBjb250YWlucyBzdGF0aWMgaW5mb3JtYXRpb25zIGFuZCBmdW5jdGlvbnMgdGhhdFxuICogY2FuIGJlIG9wdGltaXplZCBieSB0aGUgYnJvd3NlciBKSVQgY29tcGlsZXIuXG4gKi9cbnZhciBhcnJheVRvU3RyaW5nSGVscGVyID0ge1xuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBhbiBhcnJheSBvZiBpbnQgaW50byBhIHN0cmluZywgY2h1bmsgYnkgY2h1bmsuXG4gICAgICogU2VlIHRoZSBwZXJmb3JtYW5jZXMgbm90ZXMgb24gYXJyYXlMaWtlVG9TdHJpbmcuXG4gICAgICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXkgdGhlIGFycmF5IHRvIHRyYW5zZm9ybS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjaHVuayB0aGUgY2h1bmsgc2l6ZS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSByZXN1bHRpbmcgc3RyaW5nLlxuICAgICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGNodW5rIGlzIHRvbyBiaWcgZm9yIHRoZSBzdGFjay5cbiAgICAgKi9cbiAgICBzdHJpbmdpZnlCeUNodW5rOiBmdW5jdGlvbihhcnJheSwgdHlwZSwgY2h1bmspIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdLCBrID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgICAgICAvLyBzaG9ydGN1dFxuICAgICAgICBpZiAobGVuIDw9IGNodW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGsgPCBsZW4pIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcImFycmF5XCIgfHwgdHlwZSA9PT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5LnNsaWNlKGssIE1hdGgubWluKGsgKyBjaHVuaywgbGVuKSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkuc3ViYXJyYXkoaywgTWF0aC5taW4oayArIGNodW5rLCBsZW4pKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgayArPSBjaHVuaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCJcIik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDYWxsIFN0cmluZy5mcm9tQ2hhckNvZGUgb24gZXZlcnkgaXRlbSBpbiB0aGUgYXJyYXkuXG4gICAgICogVGhpcyBpcyB0aGUgbmFpdmUgaW1wbGVtZW50YXRpb24sIHdoaWNoIGdlbmVyYXRlIEEgTE9UIG9mIGludGVybWVkaWF0ZSBzdHJpbmcuXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuIGV2ZXJ5dGhpbmcgZWxzZSBmYWlsLlxuICAgICAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byB0cmFuc2Zvcm0uXG4gICAgICogQHJldHVybiB7U3RyaW5nfSB0aGUgcmVzdWx0LlxuICAgICAqL1xuICAgIHN0cmluZ2lmeUJ5Q2hhcjogZnVuY3Rpb24oYXJyYXkpe1xuICAgICAgICB2YXIgcmVzdWx0U3RyID0gXCJcIjtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHRTdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhcnJheVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdFN0cjtcbiAgICB9LFxuICAgIGFwcGx5Q2FuQmVVc2VkIDoge1xuICAgICAgICAvKipcbiAgICAgICAgICogdHJ1ZSBpZiB0aGUgYnJvd3NlciBhY2NlcHRzIHRvIHVzZSBTdHJpbmcuZnJvbUNoYXJDb2RlIG9uIFVpbnQ4QXJyYXlcbiAgICAgICAgICovXG4gICAgICAgIHVpbnQ4YXJyYXkgOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwcG9ydC51aW50OGFycmF5ICYmIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoMSkpLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCksXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0cnVlIGlmIHRoZSBicm93c2VyIGFjY2VwdHMgdG8gdXNlIFN0cmluZy5mcm9tQ2hhckNvZGUgb24gbm9kZWpzIEJ1ZmZlci5cbiAgICAgICAgICovXG4gICAgICAgIG5vZGVidWZmZXIgOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwcG9ydC5ub2RlYnVmZmVyICYmIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbm9kZWpzVXRpbHMubmV3QnVmZmVyKDEpKS5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgfVxufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gYXJyYXktbGlrZSBvYmplY3QgdG8gYSBzdHJpbmcuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VUb1N0cmluZyhhcnJheSkge1xuICAgIC8vIFBlcmZvcm1hbmNlcyBub3RlcyA6XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KSBpcyB0aGUgZmFzdGVzdCwgc2VlXG4gICAgLy8gc2VlIGh0dHA6Ly9qc3BlcmYuY29tL2NvbnZlcnRpbmctYS11aW50OGFycmF5LXRvLWEtc3RyaW5nLzJcbiAgICAvLyBidXQgdGhlIHN0YWNrIGlzIGxpbWl0ZWQgKGFuZCB3ZSBjYW4gZ2V0IGh1Z2UgYXJyYXlzICEpLlxuICAgIC8vXG4gICAgLy8gcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXJyYXlbaV0pOyBnZW5lcmF0ZSB0b28gbWFueSBzdHJpbmdzICFcbiAgICAvL1xuICAgIC8vIFRoaXMgY29kZSBpcyBpbnNwaXJlZCBieSBodHRwOi8vanNwZXJmLmNvbS9hcnJheWJ1ZmZlci10by1zdHJpbmctYXBwbHktcGVyZm9ybWFuY2UvMlxuICAgIC8vIFRPRE8gOiB3ZSBub3cgaGF2ZSB3b3JrZXJzIHRoYXQgc3BsaXQgdGhlIHdvcmsuIERvIHdlIHN0aWxsIG5lZWQgdGhhdCA/XG4gICAgdmFyIGNodW5rID0gNjU1MzYsXG4gICAgICAgIHR5cGUgPSBleHBvcnRzLmdldFR5cGVPZihhcnJheSksXG4gICAgICAgIGNhblVzZUFwcGx5ID0gdHJ1ZTtcbiAgICBpZiAodHlwZSA9PT0gXCJ1aW50OGFycmF5XCIpIHtcbiAgICAgICAgY2FuVXNlQXBwbHkgPSBhcnJheVRvU3RyaW5nSGVscGVyLmFwcGx5Q2FuQmVVc2VkLnVpbnQ4YXJyYXk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICBjYW5Vc2VBcHBseSA9IGFycmF5VG9TdHJpbmdIZWxwZXIuYXBwbHlDYW5CZVVzZWQubm9kZWJ1ZmZlcjtcbiAgICB9XG5cbiAgICBpZiAoY2FuVXNlQXBwbHkpIHtcbiAgICAgICAgd2hpbGUgKGNodW5rID4gMSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlUb1N0cmluZ0hlbHBlci5zdHJpbmdpZnlCeUNodW5rKGFycmF5LCB0eXBlLCBjaHVuayk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY2h1bmsgPSBNYXRoLmZsb29yKGNodW5rIC8gMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBubyBhcHBseSBvciBjaHVuayBlcnJvciA6IHNsb3cgYW5kIHBhaW5mdWwgYWxnb3JpdGhtXG4gICAgLy8gZGVmYXVsdCBicm93c2VyIG9uIGFuZHJvaWQgNC4qXG4gICAgcmV0dXJuIGFycmF5VG9TdHJpbmdIZWxwZXIuc3RyaW5naWZ5QnlDaGFyKGFycmF5KTtcbn1cblxuZXhwb3J0cy5hcHBseUZyb21DaGFyQ29kZSA9IGFycmF5TGlrZVRvU3RyaW5nO1xuXG5cbi8qKlxuICogQ29weSB0aGUgZGF0YSBmcm9tIGFuIGFycmF5LWxpa2UgdG8gYW4gb3RoZXIgYXJyYXktbGlrZS5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5RnJvbSB0aGUgb3JpZ2luIGFycmF5LlxuICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXlUbyB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hpY2ggd2lsbCBiZSBtdXRhdGVkLlxuICogQHJldHVybiB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IHRoZSB1cGRhdGVkIGRlc3RpbmF0aW9uIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VUb0FycmF5TGlrZShhcnJheUZyb20sIGFycmF5VG8pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5RnJvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJheVRvW2ldID0gYXJyYXlGcm9tW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlUbztcbn1cblxuLy8gYSBtYXRyaXggY29udGFpbmluZyBmdW5jdGlvbnMgdG8gdHJhbnNmb3JtIGV2ZXJ5dGhpbmcgaW50byBldmVyeXRoaW5nLlxudmFyIHRyYW5zZm9ybSA9IHt9O1xuXG4vLyBzdHJpbmcgdG8gP1xudHJhbnNmb3JtW1wic3RyaW5nXCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGlkZW50aXR5LFxuICAgIFwiYXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1RvQXJyYXlMaWtlKGlucHV0LCBuZXcgQXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1bXCJzdHJpbmdcIl1bXCJ1aW50OGFycmF5XCJdKGlucHV0KS5idWZmZXI7XG4gICAgfSxcbiAgICBcInVpbnQ4YXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1RvQXJyYXlMaWtlKGlucHV0LCBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2UoaW5wdXQsIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihpbnB1dC5sZW5ndGgpKTtcbiAgICB9XG59O1xuXG4vLyBhcnJheSB0byA/XG50cmFuc2Zvcm1bXCJhcnJheVwiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBhcnJheUxpa2VUb1N0cmluZyxcbiAgICBcImFycmF5XCI6IGlkZW50aXR5LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVWludDhBcnJheShpbnB1dCkpLmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaW5wdXQpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBub2RlanNVdGlscy5uZXdCdWZmZXIoaW5wdXQpO1xuICAgIH1cbn07XG5cbi8vIGFycmF5YnVmZmVyIHRvID9cbnRyYW5zZm9ybVtcImFycmF5YnVmZmVyXCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb1N0cmluZyhuZXcgVWludDhBcnJheShpbnB1dCkpO1xuICAgIH0sXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxpa2UobmV3IFVpbnQ4QXJyYXkoaW5wdXQpLCBuZXcgQXJyYXkoaW5wdXQuYnl0ZUxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBpZGVudGl0eSxcbiAgICBcInVpbnQ4YXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGlucHV0KTtcbiAgICB9LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyKG5ldyBVaW50OEFycmF5KGlucHV0KSk7XG4gICAgfVxufTtcblxuLy8gdWludDhhcnJheSB0byA/XG50cmFuc2Zvcm1bXCJ1aW50OGFycmF5XCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKGlucHV0LCBuZXcgQXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dC5idWZmZXI7XG4gICAgfSxcbiAgICBcInVpbnQ4YXJyYXlcIjogaWRlbnRpdHksXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBub2RlanNVdGlscy5uZXdCdWZmZXIoaW5wdXQpO1xuICAgIH1cbn07XG5cbi8vIG5vZGVidWZmZXIgdG8gP1xudHJhbnNmb3JtW1wibm9kZWJ1ZmZlclwiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBhcnJheUxpa2VUb1N0cmluZyxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShpbnB1dCwgbmV3IEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtW1wibm9kZWJ1ZmZlclwiXVtcInVpbnQ4YXJyYXlcIl0oaW5wdXQpLmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBVaW50OEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGlkZW50aXR5XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBpbnB1dCBpbnRvIGFueSB0eXBlLlxuICogVGhlIHN1cHBvcnRlZCBvdXRwdXQgdHlwZSBhcmUgOiBzdHJpbmcsIGFycmF5LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlciwgbm9kZWJ1ZmZlci5cbiAqIElmIG5vIG91dHB1dCB0eXBlIGlzIHNwZWNpZmllZCwgdGhlIHVubW9kaWZpZWQgaW5wdXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBvdXRwdXRUeXBlIHRoZSBvdXRwdXQgdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBpbnB1dCB0aGUgaW5wdXQgdG8gY29udmVydC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBvdXRwdXQgdHlwZS5cbiAqL1xuZXhwb3J0cy50cmFuc2Zvcm1UbyA9IGZ1bmN0aW9uKG91dHB1dFR5cGUsIGlucHV0KSB7XG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgICAvLyB1bmRlZmluZWQsIG51bGwsIGV0Y1xuICAgICAgICAvLyBhbiBlbXB0eSBzdHJpbmcgd29uJ3QgaGFybS5cbiAgICAgICAgaW5wdXQgPSBcIlwiO1xuICAgIH1cbiAgICBpZiAoIW91dHB1dFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbiAgICBleHBvcnRzLmNoZWNrU3VwcG9ydChvdXRwdXRUeXBlKTtcbiAgICB2YXIgaW5wdXRUeXBlID0gZXhwb3J0cy5nZXRUeXBlT2YoaW5wdXQpO1xuICAgIHZhciByZXN1bHQgPSB0cmFuc2Zvcm1baW5wdXRUeXBlXVtvdXRwdXRUeXBlXShpbnB1dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBpbnB1dC5cbiAqIFRoZSB0eXBlIHdpbGwgYmUgaW4gYSBmb3JtYXQgdmFsaWQgZm9yIEpTWmlwLnV0aWxzLnRyYW5zZm9ybVRvIDogc3RyaW5nLCBhcnJheSwgdWludDhhcnJheSwgYXJyYXlidWZmZXIuXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXQgdGhlIGlucHV0IHRvIGlkZW50aWZ5LlxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgKGxvd2VyY2FzZSkgdHlwZSBvZiB0aGUgaW5wdXQuXG4gKi9cbmV4cG9ydHMuZ2V0VHlwZU9mID0gZnVuY3Rpb24oaW5wdXQpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG4gICAgICAgIHJldHVybiBcImFycmF5XCI7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0Lm5vZGVidWZmZXIgJiYgbm9kZWpzVXRpbHMuaXNCdWZmZXIoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBcIm5vZGVidWZmZXJcIjtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQudWludDhhcnJheSAmJiBpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIFwidWludDhhcnJheVwiO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC5hcnJheWJ1ZmZlciAmJiBpbnB1dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBcImFycmF5YnVmZmVyXCI7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHR5cGUgaXMgbm90IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIHRvIGNoZWNrLlxuICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIHR5cGUuXG4gKi9cbmV4cG9ydHMuY2hlY2tTdXBwb3J0ID0gZnVuY3Rpb24odHlwZSkge1xuICAgIHZhciBzdXBwb3J0ZWQgPSBzdXBwb3J0W3R5cGUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKCFzdXBwb3J0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHR5cGUgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm1cIik7XG4gICAgfVxufTtcblxuZXhwb3J0cy5NQVhfVkFMVUVfMTZCSVRTID0gNjU1MzU7XG5leHBvcnRzLk1BWF9WQUxVRV8zMkJJVFMgPSAtMTsgLy8gd2VsbCwgXCJcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXCIgaXMgcGFyc2VkIGFzIC0xXG5cbi8qKlxuICogUHJldHRpZnkgYSBzdHJpbmcgcmVhZCBhcyBiaW5hcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gcHJldHRpZnkuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGEgcHJldHR5IHN0cmluZy5cbiAqL1xuZXhwb3J0cy5wcmV0dHkgPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgcmVzID0gJycsXG4gICAgICAgIGNvZGUsIGk7XG4gICAgZm9yIChpID0gMDsgaSA8IChzdHIgfHwgXCJcIikubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICByZXMgKz0gJ1xcXFx4JyArIChjb2RlIDwgMTYgPyBcIjBcIiA6IFwiXCIpICsgY29kZS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogRGVmZXIgdGhlIGNhbGwgb2YgYSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBjYWxsIGFzeW5jaHJvbm91c2x5LlxuICogQHBhcmFtIHtBcnJheX0gYXJncyB0aGUgYXJndW1lbnRzIHRvIGdpdmUgdG8gdGhlIGNhbGxiYWNrLlxuICovXG5leHBvcnRzLmRlbGF5ID0gZnVuY3Rpb24oY2FsbGJhY2ssIGFyZ3MsIHNlbGYpIHtcbiAgICBhc2FwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2suYXBwbHkoc2VsZiB8fCBudWxsLCBhcmdzIHx8IFtdKTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogRXh0ZW5kcyBhIHByb3RvdHlwZSB3aXRoIGFuIG90aGVyLCB3aXRob3V0IGNhbGxpbmcgYSBjb25zdHJ1Y3RvciB3aXRoXG4gKiBzaWRlIGVmZmVjdHMuIEluc3BpcmVkIGJ5IG5vZGVqcycgYHV0aWxzLmluaGVyaXRzYFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3RvciB0aGUgY29uc3RydWN0b3IgdG8gYXVnbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VwZXJDdG9yIHRoZSBwYXJlbnQgY29uc3RydWN0b3IgdG8gdXNlXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSBmdW5jdGlvbiAoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgdmFyIE9iaiA9IGZ1bmN0aW9uKCkge307XG4gICAgT2JqLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGU7XG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgT2JqKCk7XG59O1xuXG4vKipcbiAqIE1lcmdlIHRoZSBvYmplY3RzIHBhc3NlZCBhcyBwYXJhbWV0ZXJzIGludG8gYSBuZXcgb25lLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSB2YXJfYXJncyBBbGwgb2JqZWN0cyB0byBtZXJnZS5cbiAqIEByZXR1cm4ge09iamVjdH0gYSBuZXcgb2JqZWN0IHdpdGggdGhlIGRhdGEgb2YgdGhlIG90aGVycy5cbiAqL1xuZXhwb3J0cy5leHRlbmQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzdWx0ID0ge30sIGksIGF0dHI7XG4gICAgZm9yIChpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyAvLyBhcmd1bWVudHMgaXMgbm90IGVudW1lcmFibGUgaW4gc29tZSBicm93c2Vyc1xuICAgICAgICBmb3IgKGF0dHIgaW4gYXJndW1lbnRzW2ldKSB7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldLmhhc093blByb3BlcnR5KGF0dHIpICYmIHR5cGVvZiByZXN1bHRbYXR0cl0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbYXR0cl0gPSBhcmd1bWVudHNbaV1bYXR0cl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtIGFyYml0cmFyeSBjb250ZW50IGludG8gYSBQcm9taXNlLlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgYSBuYW1lIGZvciB0aGUgY29udGVudCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhIHRoZSBjb250ZW50IHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzQmluYXJ5IHRydWUgaWYgdGhlIGNvbnRlbnQgaXMgbm90IGFuIHVuaWNvZGUgc3RyaW5nXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzT3B0aW1pemVkQmluYXJ5U3RyaW5nIHRydWUgaWYgdGhlIHN0cmluZyBjb250ZW50IG9ubHkgaGFzIG9uZSBieXRlIHBlciBjaGFyYWN0ZXIuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzQmFzZTY0IHRydWUgaWYgdGhlIHN0cmluZyBjb250ZW50IGlzIGVuY29kZWQgd2l0aCBiYXNlNjQuXG4gKiBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgaW4gYSBmb3JtYXQgdXNhYmxlIGJ5IEpTWmlwLlxuICovXG5leHBvcnRzLnByZXBhcmVDb250ZW50ID0gZnVuY3Rpb24obmFtZSwgaW5wdXREYXRhLCBpc0JpbmFyeSwgaXNPcHRpbWl6ZWRCaW5hcnlTdHJpbmcsIGlzQmFzZTY0KSB7XG5cbiAgICB2YXIgcHJvbWlzZSA9IG51bGw7XG4gICAgaWYgKHN1cHBvcnQuYmxvYiAmJiBpbnB1dERhdGEgaW5zdGFuY2VvZiBCbG9iICYmIHR5cGVvZiBGaWxlUmVhZGVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHByb21pc2UgPSBuZXcgZXh0ZXJuYWwuUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGUudGFyZ2V0LnJlc3VsdCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUudGFyZ2V0LmVycm9yKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoaW5wdXREYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgZGF0YSBpcyBhbHJlYWR5IGEgcHJvbWlzZSwgdGhpcyBmbGF0dGVuIGl0LlxuICAgICAgICBwcm9taXNlID0gZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKGlucHV0RGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHZhciBkYXRhVHlwZSA9IGV4cG9ydHMuZ2V0VHlwZU9mKGRhdGEpO1xuXG4gICAgICAgIGlmICghZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBleHRlcm5hbC5Qcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgICBuZXcgRXJyb3IoXCJUaGUgZGF0YSBvZiAnXCIgKyBuYW1lICsgXCInIGlzIGluIGFuIHVuc3VwcG9ydGVkIGZvcm1hdCAhXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNwZWNpYWwgY2FzZSA6IGl0J3Mgd2F5IGVhc2llciB0byB3b3JrIHdpdGggVWludDhBcnJheSB0aGFuIHdpdGggQXJyYXlCdWZmZXJcbiAgICAgICAgaWYgKGRhdGFUeXBlID09PSBcImFycmF5YnVmZmVyXCIpIHtcbiAgICAgICAgICAgIGRhdGEgPSBleHBvcnRzLnRyYW5zZm9ybVRvKFwidWludDhhcnJheVwiLCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKGlzQmFzZTY0KSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGJhc2U2NC5kZWNvZGUoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0JpbmFyeSkge1xuICAgICAgICAgICAgICAgIC8vIG9wdGltaXplZEJpbmFyeVN0cmluZyA9PT0gdHJ1ZSBtZWFucyB0aGF0IHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gZmlsdGVyZWQgd2l0aCBhIDB4RkYgbWFza1xuICAgICAgICAgICAgICAgIGlmIChpc09wdGltaXplZEJpbmFyeVN0cmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgc3RyaW5nLCBub3QgaW4gYSBiYXNlNjQgZm9ybWF0LlxuICAgICAgICAgICAgICAgICAgICAvLyBCZSBzdXJlIHRoYXQgdGhpcyBpcyBhIGNvcnJlY3QgXCJiaW5hcnkgc3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHN0cmluZzJiaW5hcnkoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciByZWFkZXJGb3IgPSByZXF1aXJlKCcuL3JlYWRlci9yZWFkZXJGb3InKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBzaWcgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xudmFyIFppcEVudHJ5ID0gcmVxdWlyZSgnLi96aXBFbnRyeScpO1xudmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG4vLyAgY2xhc3MgWmlwRW50cmllcyB7e3tcbi8qKlxuICogQWxsIHRoZSBlbnRyaWVzIGluIHRoZSB6aXAgZmlsZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IGxvYWRPcHRpb25zIE9wdGlvbnMgZm9yIGxvYWRpbmcgdGhlIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gWmlwRW50cmllcyhsb2FkT3B0aW9ucykge1xuICAgIHRoaXMuZmlsZXMgPSBbXTtcbiAgICB0aGlzLmxvYWRPcHRpb25zID0gbG9hZE9wdGlvbnM7XG59XG5aaXBFbnRyaWVzLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGF0IHRoZSByZWFkZXIgaXMgb24gdGhlIHNwZWZpY2llZCBzaWduYXR1cmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkU2lnbmF0dXJlIHRoZSBleHBlY3RlZCBzaWduYXR1cmUuXG4gICAgICogQHRocm93cyB7RXJyb3J9IGlmIGl0IGlzIGFuIG90aGVyIHNpZ25hdHVyZS5cbiAgICAgKi9cbiAgICBjaGVja1NpZ25hdHVyZTogZnVuY3Rpb24oZXhwZWN0ZWRTaWduYXR1cmUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUoZXhwZWN0ZWRTaWduYXR1cmUpKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5pbmRleCAtPSA0O1xuICAgICAgICAgICAgdmFyIHNpZ25hdHVyZSA9IHRoaXMucmVhZGVyLnJlYWRTdHJpbmcoNCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIG9yIGJ1ZyA6IHVuZXhwZWN0ZWQgc2lnbmF0dXJlIFwiICsgXCIoXCIgKyB1dGlscy5wcmV0dHkoc2lnbmF0dXJlKSArIFwiLCBleHBlY3RlZCBcIiArIHV0aWxzLnByZXR0eShleHBlY3RlZFNpZ25hdHVyZSkgKyBcIilcIik7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBzaWduYXR1cmUgaXMgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhc2tlZEluZGV4IHRoZSBpbmRleCB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRTaWduYXR1cmUgdGhlIHNpZ25hdHVyZSB0byBleHBlY3QuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIGlzIGhlcmUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc1NpZ25hdHVyZTogZnVuY3Rpb24oYXNrZWRJbmRleCwgZXhwZWN0ZWRTaWduYXR1cmUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IHRoaXMucmVhZGVyLmluZGV4O1xuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChhc2tlZEluZGV4KTtcbiAgICAgICAgdmFyIHNpZ25hdHVyZSA9IHRoaXMucmVhZGVyLnJlYWRTdHJpbmcoNCk7XG4gICAgICAgIHZhciByZXN1bHQgPSBzaWduYXR1cmUgPT09IGV4cGVjdGVkU2lnbmF0dXJlO1xuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChjdXJyZW50SW5kZXgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW5kIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICByZWFkQmxvY2tFbmRPZkNlbnRyYWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmRpc2tOdW1iZXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2sgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyU2l6ZSA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpck9mZnNldCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG5cbiAgICAgICAgdGhpcy56aXBDb21tZW50TGVuZ3RoID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgLy8gd2FybmluZyA6IHRoZSBlbmNvZGluZyBkZXBlbmRzIG9mIHRoZSBzeXN0ZW0gbG9jYWxlXG4gICAgICAgIC8vIE9uIGEgbGludXggbWFjaGluZSB3aXRoIExBTkc9ZW5fVVMudXRmOCwgdGhpcyBmaWVsZCBpcyB1dGY4IGVuY29kZWQuXG4gICAgICAgIC8vIE9uIGEgd2luZG93cyBtYWNoaW5lLCB0aGlzIGZpZWxkIGlzIGVuY29kZWQgd2l0aCB0aGUgbG9jYWxpemVkIHdpbmRvd3MgY29kZSBwYWdlLlxuICAgICAgICB2YXIgemlwQ29tbWVudCA9IHRoaXMucmVhZGVyLnJlYWREYXRhKHRoaXMuemlwQ29tbWVudExlbmd0aCk7XG4gICAgICAgIHZhciBkZWNvZGVQYXJhbVR5cGUgPSBzdXBwb3J0LnVpbnQ4YXJyYXkgPyBcInVpbnQ4YXJyYXlcIiA6IFwiYXJyYXlcIjtcbiAgICAgICAgLy8gVG8gZ2V0IGNvbnNpc3RlbnQgYmVoYXZpb3Igd2l0aCB0aGUgZ2VuZXJhdGlvbiBwYXJ0LCB3ZSB3aWxsIGFzc3VtZSB0aGF0XG4gICAgICAgIC8vIHRoaXMgaXMgdXRmOCBlbmNvZGVkIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlLlxuICAgICAgICB2YXIgZGVjb2RlQ29udGVudCA9IHV0aWxzLnRyYW5zZm9ybVRvKGRlY29kZVBhcmFtVHlwZSwgemlwQ29tbWVudCk7XG4gICAgICAgIHRoaXMuemlwQ29tbWVudCA9IHRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoZGVjb2RlQ29udGVudCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgdGhlIFppcCA2NCBjZW50cmFsIGRpcmVjdG9yeS5cbiAgICAgKiBOb3QgbWVyZ2VkIHdpdGggdGhlIG1ldGhvZCByZWFkRW5kT2ZDZW50cmFsIDpcbiAgICAgKiBUaGUgZW5kIG9mIGNlbnRyYWwgY2FuIGNvZXhpc3Qgd2l0aCBpdHMgWmlwNjQgYnJvdGhlcixcbiAgICAgKiBJIGRvbid0IHdhbnQgdG8gcmVhZCB0aGUgd3JvbmcgbnVtYmVyIG9mIGJ5dGVzICFcbiAgICAgKi9cbiAgICByZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5yZWFkZXIuc2tpcCg0KTtcbiAgICAgICAgLy8gdGhpcy52ZXJzaW9uTWFkZUJ5ID0gdGhpcy5yZWFkZXIucmVhZFN0cmluZygyKTtcbiAgICAgICAgLy8gdGhpcy52ZXJzaW9uTmVlZGVkID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5kaXNrTnVtYmVyID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3JkcyA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclNpemUgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuXG4gICAgICAgIHRoaXMuemlwNjRFeHRlbnNpYmxlRGF0YSA9IHt9O1xuICAgICAgICB2YXIgZXh0cmFEYXRhU2l6ZSA9IHRoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplIC0gNDQsXG4gICAgICAgICAgICBpbmRleCA9IDAsXG4gICAgICAgICAgICBleHRyYUZpZWxkSWQsXG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoLFxuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBleHRyYURhdGFTaXplKSB7XG4gICAgICAgICAgICBleHRyYUZpZWxkSWQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAgICAgZXh0cmFGaWVsZExlbmd0aCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWUgPSB0aGlzLnJlYWRlci5yZWFkRGF0YShleHRyYUZpZWxkTGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuemlwNjRFeHRlbnNpYmxlRGF0YVtleHRyYUZpZWxkSWRdID0ge1xuICAgICAgICAgICAgICAgIGlkOiBleHRyYUZpZWxkSWQsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiBleHRyYUZpZWxkTGVuZ3RoLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBleHRyYUZpZWxkVmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiB0aGUgWmlwIDY0IGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IuXG4gICAgICovXG4gICAgcmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWxMb2NhdG9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5kaXNrV2l0aFppcDY0Q2VudHJhbERpclN0YXJ0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5kaXNrc0NvdW50ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgaWYgKHRoaXMuZGlza3NDb3VudCA+IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11bHRpLXZvbHVtZXMgemlwIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBsb2NhbCBmaWxlcywgYmFzZWQgb24gdGhlIG9mZnNldCByZWFkIGluIHRoZSBjZW50cmFsIHBhcnQuXG4gICAgICovXG4gICAgcmVhZExvY2FsRmlsZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaSwgZmlsZTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZpbGUgPSB0aGlzLmZpbGVzW2ldO1xuICAgICAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgoZmlsZS5sb2NhbEhlYWRlck9mZnNldCk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5MT0NBTF9GSUxFX0hFQURFUik7XG4gICAgICAgICAgICBmaWxlLnJlYWRMb2NhbFBhcnQodGhpcy5yZWFkZXIpO1xuICAgICAgICAgICAgZmlsZS5oYW5kbGVVVEY4KCk7XG4gICAgICAgICAgICBmaWxlLnByb2Nlc3NBdHRyaWJ1dGVzKCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIHJlYWRDZW50cmFsRGlyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGZpbGU7XG5cbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgodGhpcy5jZW50cmFsRGlyT2Zmc2V0KTtcbiAgICAgICAgd2hpbGUgKHRoaXMucmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZShzaWcuQ0VOVFJBTF9GSUxFX0hFQURFUikpIHtcbiAgICAgICAgICAgIGZpbGUgPSBuZXcgWmlwRW50cnkoe1xuICAgICAgICAgICAgICAgIHppcDY0OiB0aGlzLnppcDY0XG4gICAgICAgICAgICB9LCB0aGlzLmxvYWRPcHRpb25zKTtcbiAgICAgICAgICAgIGZpbGUucmVhZENlbnRyYWxQYXJ0KHRoaXMucmVhZGVyKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNlbnRyYWxEaXJSZWNvcmRzICE9PSB0aGlzLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2VudHJhbERpclJlY29yZHMgIT09IDAgJiYgdGhpcy5maWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBleHBlY3RlZCBzb21lIHJlY29yZHMgYnV0IGNvdWxkbid0IGZpbmQgQU5ZLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVhbGx5IHN1c3BpY2lvdXMsIGFzIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgb3IgYnVnOiBleHBlY3RlZCBcIiArIHRoaXMuY2VudHJhbERpclJlY29yZHMgKyBcIiByZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3QgXCIgKyB0aGlzLmZpbGVzLmxlbmd0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIHNvbWUgcmVjb3JkcyBidXQgbm90IGFsbC5cbiAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgaXMgd3JvbmcgYnV0IHdlIGdvdCBzb21ldGhpbmcgZm9yIHRoZSB1c2VyOiBubyBlcnJvciBoZXJlLlxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihcImV4cGVjdGVkXCIsIHRoaXMuY2VudHJhbERpclJlY29yZHMsIFwicmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290XCIsIHRoaXMuZmlsZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIHJlYWRFbmRPZkNlbnRyYWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoc2lnLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY29udGVudCBpcyBhIHRydW5jYXRlZCB6aXAgb3IgY29tcGxldGUgZ2FyYmFnZS5cbiAgICAgICAgICAgIC8vIEEgXCJMT0NBTF9GSUxFX0hFQURFUlwiIGlzIG5vdCByZXF1aXJlZCBhdCB0aGUgYmVnaW5uaW5nIChhdXRvXG4gICAgICAgICAgICAvLyBleHRyYWN0aWJsZSB6aXAgZm9yIGV4YW1wbGUpIGJ1dCBpdCBjYW4gZ2l2ZSBhIGdvb2QgaGludC5cbiAgICAgICAgICAgIC8vIElmIGFuIGFqYXggcmVxdWVzdCB3YXMgdXNlZCB3aXRob3V0IHJlc3BvbnNlVHlwZSwgd2Ugd2lsbCBhbHNvXG4gICAgICAgICAgICAvLyBnZXQgdW5yZWFkYWJsZSBkYXRhLlxuICAgICAgICAgICAgdmFyIGlzR2FyYmFnZSA9ICF0aGlzLmlzU2lnbmF0dXJlKDAsIHNpZy5MT0NBTF9GSUxFX0hFQURFUik7XG5cbiAgICAgICAgICAgIGlmIChpc0dhcmJhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBmaW5kIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSA6IGlzIHRoaXMgYSB6aXAgZmlsZSA/IFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJZiBpdCBpcywgc2VlIGh0dHA6Ly9zdHVrLmdpdGh1Yi5pby9qc3ppcC9kb2N1bWVudGF0aW9uL2hvd3RvL3JlYWRfemlwLmh0bWxcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjYW4ndCBmaW5kIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KG9mZnNldCk7XG4gICAgICAgIHZhciBlbmRPZkNlbnRyYWxEaXJPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgIHRoaXMucmVhZEJsb2NrRW5kT2ZDZW50cmFsKCk7XG5cblxuICAgICAgICAvKiBleHRyYWN0IGZyb20gdGhlIHppcCBzcGVjIDpcbiAgICAgICAgICAgIDQpICBJZiBvbmUgb2YgdGhlIGZpZWxkcyBpbiB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XG4gICAgICAgICAgICAgICAgcmVjb3JkIGlzIHRvbyBzbWFsbCB0byBob2xkIHJlcXVpcmVkIGRhdGEsIHRoZSBmaWVsZFxuICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzZXQgdG8gLTEgKDB4RkZGRiBvciAweEZGRkZGRkZGKSBhbmQgdGhlXG4gICAgICAgICAgICAgICAgWklQNjQgZm9ybWF0IHJlY29yZCBzaG91bGQgYmUgY3JlYXRlZC5cbiAgICAgICAgICAgIDUpICBUaGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IgcmVjb3JkIG11c3RcbiAgICAgICAgICAgICAgICByZXNpZGUgb24gdGhlIHNhbWUgZGlzayB3aGVuIHNwbGl0dGluZyBvciBzcGFubmluZ1xuICAgICAgICAgICAgICAgIGFuIGFyY2hpdmUuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpcy5kaXNrTnVtYmVyID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2sgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyUmVjb3JkcyA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmNlbnRyYWxEaXJTaXplID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTIHx8IHRoaXMuY2VudHJhbERpck9mZnNldCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUykge1xuICAgICAgICAgICAgdGhpcy56aXA2NCA9IHRydWU7XG5cbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICBXYXJuaW5nIDogdGhlIHppcDY0IGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQsIGJ1dCBPTkxZIGlmIHRoZSA2NGJpdHMgaW50ZWdlciByZWFkIGZyb21cbiAgICAgICAgICAgIHRoZSB6aXAgZmlsZSBjYW4gZml0IGludG8gYSAzMmJpdHMgaW50ZWdlci4gVGhpcyBjYW5ub3QgYmUgc29sdmVkIDogSmF2YXNjcmlwdCByZXByZXNlbnRzXG4gICAgICAgICAgICBhbGwgbnVtYmVycyBhcyA2NC1iaXQgZG91YmxlIHByZWNpc2lvbiBJRUVFIDc1NCBmbG9hdGluZyBwb2ludCBudW1iZXJzLlxuICAgICAgICAgICAgU28sIHdlIGhhdmUgNTNiaXRzIGZvciBpbnRlZ2VycyBhbmQgYml0d2lzZSBvcGVyYXRpb25zIHRyZWF0IGV2ZXJ5dGhpbmcgYXMgMzJiaXRzLlxuICAgICAgICAgICAgc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL0JpdHdpc2VfT3BlcmF0b3JzXG4gICAgICAgICAgICBhbmQgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VDTUEtMjYyLnBkZiBzZWN0aW9uIDguNVxuICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgLy8gc2hvdWxkIGxvb2sgZm9yIGEgemlwNjQgRU9DRCBsb2NhdG9yXG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUik7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KG9mZnNldCk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKTtcbiAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWxMb2NhdG9yKCk7XG5cbiAgICAgICAgICAgIC8vIG5vdyB0aGUgemlwNjQgRU9DRCByZWNvcmRcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1NpZ25hdHVyZSh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIsIHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKFwiWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IG5vdCB3aGVyZSBleHBlY3RlZC5cIik7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyID0gdGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNhbid0IGZpbmQgdGhlIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIpO1xuICAgICAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBleHBlY3RlZEVuZE9mQ2VudHJhbERpck9mZnNldCA9IHRoaXMuY2VudHJhbERpck9mZnNldCArIHRoaXMuY2VudHJhbERpclNpemU7XG4gICAgICAgIGlmICh0aGlzLnppcDY0KSB7XG4gICAgICAgICAgICBleHBlY3RlZEVuZE9mQ2VudHJhbERpck9mZnNldCArPSAyMDsgLy8gZW5kIG9mIGNlbnRyYWwgZGlyIDY0IGxvY2F0b3JcbiAgICAgICAgICAgIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0ICs9IDEyIC8qIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgbGVhZGluZyAxMiBieXRlcyAqLyArIHRoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4dHJhQnl0ZXMgPSBlbmRPZkNlbnRyYWxEaXJPZmZzZXQgLSBleHBlY3RlZEVuZE9mQ2VudHJhbERpck9mZnNldDtcblxuICAgICAgICBpZiAoZXh0cmFCeXRlcyA+IDApIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihleHRyYUJ5dGVzLCBcImV4dHJhIGJ5dGVzIGF0IGJlZ2lubmluZyBvciB3aXRoaW4gemlwZmlsZVwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2lnbmF0dXJlKGVuZE9mQ2VudHJhbERpck9mZnNldCwgc2lnLkNFTlRSQUxfRklMRV9IRUFERVIpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG9mZnNldHMgc2VlbSB3cm9uZywgYnV0IHdlIGhhdmUgc29tZXRoaW5nIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LlxuICAgICAgICAgICAgICAgIC8vIFNv4oCmIHdlIGtlZXAgaXQuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBvZmZzZXQgaXMgd3JvbmcsIHVwZGF0ZSB0aGUgXCJ6ZXJvXCIgb2YgdGhlIHJlYWRlclxuICAgICAgICAgICAgICAgIC8vIHRoaXMgaGFwcGVucyBpZiBkYXRhIGhhcyBiZWVuIHByZXBlbmRlZCAoY3J4IGZpbGVzIGZvciBleGFtcGxlKVxuICAgICAgICAgICAgICAgIHRoaXMucmVhZGVyLnplcm8gPSBleHRyYUJ5dGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwOiBtaXNzaW5nIFwiICsgTWF0aC5hYnMoZXh0cmFCeXRlcykgKyBcIiBieXRlcy5cIik7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHByZXBhcmVSZWFkZXI6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXJGb3IoZGF0YSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIGEgemlwIGZpbGUgYW5kIGNyZWF0ZSBaaXBFbnRyaWVzLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBiaW5hcnkgc3RyaW5nIHJlcHJlc2VudGluZyBhIHppcCBmaWxlLlxuICAgICAqL1xuICAgIGxvYWQ6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlUmVhZGVyKGRhdGEpO1xuICAgICAgICB0aGlzLnJlYWRFbmRPZkNlbnRyYWwoKTtcbiAgICAgICAgdGhpcy5yZWFkQ2VudHJhbERpcigpO1xuICAgICAgICB0aGlzLnJlYWRMb2NhbEZpbGVzKCk7XG4gICAgfVxufTtcbi8vIH19fSBlbmQgb2YgWmlwRW50cmllc1xubW9kdWxlLmV4cG9ydHMgPSBaaXBFbnRyaWVzO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlYWRlckZvciA9IHJlcXVpcmUoJy4vcmVhZGVyL3JlYWRlckZvcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIENvbXByZXNzZWRPYmplY3QgPSByZXF1aXJlKCcuL2NvbXByZXNzZWRPYmplY3QnKTtcbnZhciBjcmMzMmZuID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTtcbnZhciBjb21wcmVzc2lvbnMgPSByZXF1aXJlKCcuL2NvbXByZXNzaW9ucycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcblxudmFyIE1BREVfQllfRE9TID0gMHgwMDtcbnZhciBNQURFX0JZX1VOSVggPSAweDAzO1xuXG4vKipcbiAqIEZpbmQgYSBjb21wcmVzc2lvbiByZWdpc3RlcmVkIGluIEpTWmlwLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXByZXNzaW9uTWV0aG9kIHRoZSBtZXRob2QgbWFnaWMgdG8gZmluZC5cbiAqIEByZXR1cm4ge09iamVjdHxudWxsfSB0aGUgSlNaaXAgY29tcHJlc3Npb24gb2JqZWN0LCBudWxsIGlmIG5vbmUgZm91bmQuXG4gKi9cbnZhciBmaW5kQ29tcHJlc3Npb24gPSBmdW5jdGlvbihjb21wcmVzc2lvbk1ldGhvZCkge1xuICAgIGZvciAodmFyIG1ldGhvZCBpbiBjb21wcmVzc2lvbnMpIHtcbiAgICAgICAgaWYgKCFjb21wcmVzc2lvbnMuaGFzT3duUHJvcGVydHkobWV0aG9kKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXByZXNzaW9uc1ttZXRob2RdLm1hZ2ljID09PSBjb21wcmVzc2lvbk1ldGhvZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXByZXNzaW9uc1ttZXRob2RdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuLy8gY2xhc3MgWmlwRW50cnkge3t7XG4vKipcbiAqIEFuIGVudHJ5IGluIHRoZSB6aXAgZmlsZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvZiB0aGUgY3VycmVudCBmaWxlLlxuICogQHBhcmFtIHtPYmplY3R9IGxvYWRPcHRpb25zIE9wdGlvbnMgZm9yIGxvYWRpbmcgdGhlIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gWmlwRW50cnkob3B0aW9ucywgbG9hZE9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMubG9hZE9wdGlvbnMgPSBsb2FkT3B0aW9ucztcbn1cblppcEVudHJ5LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzYXkgaWYgdGhlIGZpbGUgaXMgZW5jcnlwdGVkLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGZpbGUgaXMgZW5jcnlwdGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNFbmNyeXB0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBiaXQgMSBpcyBzZXRcbiAgICAgICAgcmV0dXJuICh0aGlzLmJpdEZsYWcgJiAweDAwMDEpID09PSAweDAwMDE7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBzYXkgaWYgdGhlIGZpbGUgaGFzIHV0Zi04IGZpbGVuYW1lL2NvbW1lbnQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZmlsZW5hbWUvY29tbWVudCBpcyBpbiB1dGYtOCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHVzZVVURjg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBiaXQgMTEgaXMgc2V0XG4gICAgICAgIHJldHVybiAodGhpcy5iaXRGbGFnICYgMHgwODAwKSA9PT0gMHgwODAwO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgbG9jYWwgcGFydCBvZiBhIHppcCBmaWxlIGFuZCBhZGQgdGhlIGluZm8gaW4gdGhpcyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRlciB0byB1c2UuXG4gICAgICovXG4gICAgcmVhZExvY2FsUGFydDogZnVuY3Rpb24ocmVhZGVyKSB7XG4gICAgICAgIHZhciBjb21wcmVzc2lvbiwgbG9jYWxFeHRyYUZpZWxkc0xlbmd0aDtcblxuICAgICAgICAvLyB3ZSBhbHJlYWR5IGtub3cgZXZlcnl0aGluZyBmcm9tIHRoZSBjZW50cmFsIGRpciAhXG4gICAgICAgIC8vIElmIHRoZSBjZW50cmFsIGRpciBkYXRhIGFyZSBmYWxzZSwgd2UgYXJlIGRvb21lZC5cbiAgICAgICAgLy8gT24gdGhlIGJyaWdodCBzaWRlLCB0aGUgbG9jYWwgcGFydCBpcyBzY2FyeSAgOiB6aXA2NCwgZGF0YSBkZXNjcmlwdG9ycywgYm90aCwgZXRjLlxuICAgICAgICAvLyBUaGUgbGVzcyBkYXRhIHdlIGdldCBoZXJlLCB0aGUgbW9yZSByZWxpYWJsZSB0aGlzIHNob3VsZCBiZS5cbiAgICAgICAgLy8gTGV0J3Mgc2tpcCB0aGUgd2hvbGUgaGVhZGVyIGFuZCBkYXNoIHRvIHRoZSBkYXRhICFcbiAgICAgICAgcmVhZGVyLnNraXAoMjIpO1xuICAgICAgICAvLyBpbiBzb21lIHppcCBjcmVhdGVkIG9uIHdpbmRvd3MsIHRoZSBmaWxlbmFtZSBzdG9yZWQgaW4gdGhlIGNlbnRyYWwgZGlyIGNvbnRhaW5zIFxcIGluc3RlYWQgb2YgLy5cbiAgICAgICAgLy8gU3RyYW5nZWx5LCB0aGUgZmlsZW5hbWUgaGVyZSBpcyBPSy5cbiAgICAgICAgLy8gSSB3b3VsZCBsb3ZlIHRvIHRyZWF0IHRoZXNlIHppcCBmaWxlcyBhcyBjb3JydXB0ZWQgKHNlZSBodHRwOi8vd3d3LmluZm8temlwLm9yZy9GQVEuaHRtbCNiYWNrc2xhc2hlc1xuICAgICAgICAvLyBvciBBUFBOT1RFIzQuNC4xNy4xLCBcIkFsbCBzbGFzaGVzIE1VU1QgYmUgZm9yd2FyZCBzbGFzaGVzICcvJ1wiKSBidXQgdGhlcmUgYXJlIGEgbG90IG9mIGJhZCB6aXAgZ2VuZXJhdG9ycy4uLlxuICAgICAgICAvLyBTZWFyY2ggXCJ1bnppcCBtaXNtYXRjaGluZyBcImxvY2FsXCIgZmlsZW5hbWUgY29udGludWluZyB3aXRoIFwiY2VudHJhbFwiIGZpbGVuYW1lIHZlcnNpb25cIiBvblxuICAgICAgICAvLyB0aGUgaW50ZXJuZXQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEkgdGhpbmsgSSBzZWUgdGhlIGxvZ2ljIGhlcmUgOiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaXMgdXNlZCB0byBkaXNwbGF5XG4gICAgICAgIC8vIGNvbnRlbnQgYW5kIHRoZSBsb2NhbCBkaXJlY3RvcnkgaXMgdXNlZCB0byBleHRyYWN0IHRoZSBmaWxlcy4gTWl4aW5nIC8gYW5kIFxcXG4gICAgICAgIC8vIG1heSBiZSB1c2VkIHRvIGRpc3BsYXkgXFwgdG8gd2luZG93cyB1c2VycyBhbmQgdXNlIC8gd2hlbiBleHRyYWN0aW5nIHRoZSBmaWxlcy5cbiAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBsZWFkIGFsc28gdG8gc29tZSBpc3N1ZXMgOiBodHRwOi8vc2VjbGlzdHMub3JnL2Z1bGxkaXNjbG9zdXJlLzIwMDkvU2VwLzM5NFxuICAgICAgICB0aGlzLmZpbGVOYW1lTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIGxvY2FsRXh0cmFGaWVsZHNMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTsgLy8gY2FuJ3QgYmUgc3VyZSB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGNlbnRyYWwgZGlyXG4gICAgICAgIC8vIHRoZSBmaWxlTmFtZSBpcyBzdG9yZWQgYXMgYmluYXJ5IGRhdGEsIHRoZSBoYW5kbGVVVEY4IG1ldGhvZCB3aWxsIHRha2UgY2FyZSBvZiB0aGUgZW5jb2RpbmcuXG4gICAgICAgIHRoaXMuZmlsZU5hbWUgPSByZWFkZXIucmVhZERhdGEodGhpcy5maWxlTmFtZUxlbmd0aCk7XG4gICAgICAgIHJlYWRlci5za2lwKGxvY2FsRXh0cmFGaWVsZHNMZW5ndGgpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbXByZXNzZWRTaXplID09PSAtMSB8fCB0aGlzLnVuY29tcHJlc3NlZFNpemUgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCdWcgb3IgY29ycnVwdGVkIHppcCA6IGRpZG4ndCBnZXQgZW5vdWdoIGluZm9ybWF0aW9ucyBmcm9tIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBcIiArIFwiKGNvbXByZXNzZWRTaXplID09PSAtMSB8fCB1bmNvbXByZXNzZWRTaXplID09PSAtMSlcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wcmVzc2lvbiA9IGZpbmRDb21wcmVzc2lvbih0aGlzLmNvbXByZXNzaW9uTWV0aG9kKTtcbiAgICAgICAgaWYgKGNvbXByZXNzaW9uID09PSBudWxsKSB7IC8vIG5vIGNvbXByZXNzaW9uIGZvdW5kXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY29tcHJlc3Npb24gXCIgKyB1dGlscy5wcmV0dHkodGhpcy5jb21wcmVzc2lvbk1ldGhvZCkgKyBcIiB1bmtub3duIChpbm5lciBmaWxlIDogXCIgKyB1dGlscy50cmFuc2Zvcm1UbyhcInN0cmluZ1wiLCB0aGlzLmZpbGVOYW1lKSArIFwiKVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlY29tcHJlc3NlZCA9IG5ldyBDb21wcmVzc2VkT2JqZWN0KHRoaXMuY29tcHJlc3NlZFNpemUsIHRoaXMudW5jb21wcmVzc2VkU2l6ZSwgdGhpcy5jcmMzMiwgY29tcHJlc3Npb24sIHJlYWRlci5yZWFkRGF0YSh0aGlzLmNvbXByZXNzZWRTaXplKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGNlbnRyYWwgcGFydCBvZiBhIHppcCBmaWxlIGFuZCBhZGQgdGhlIGluZm8gaW4gdGhpcyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRlciB0byB1c2UuXG4gICAgICovXG4gICAgcmVhZENlbnRyYWxQYXJ0OiBmdW5jdGlvbihyZWFkZXIpIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uTWFkZUJ5ID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHJlYWRlci5za2lwKDIpO1xuICAgICAgICAvLyB0aGlzLnZlcnNpb25OZWVkZWQgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5iaXRGbGFnID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY29tcHJlc3Npb25NZXRob2QgPSByZWFkZXIucmVhZFN0cmluZygyKTtcbiAgICAgICAgdGhpcy5kYXRlID0gcmVhZGVyLnJlYWREYXRlKCk7XG4gICAgICAgIHRoaXMuY3JjMzIgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jb21wcmVzc2VkU2l6ZSA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLnVuY29tcHJlc3NlZFNpemUgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdmFyIGZpbGVOYW1lTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZXh0cmFGaWVsZHNMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5maWxlQ29tbWVudExlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmRpc2tOdW1iZXJTdGFydCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmludGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMubG9jYWxIZWFkZXJPZmZzZXQgPSByZWFkZXIucmVhZEludCg0KTtcblxuICAgICAgICBpZiAodGhpcy5pc0VuY3J5cHRlZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2lsbCBiZSByZWFkIGluIHRoZSBsb2NhbCBwYXJ0LCBzZWUgdGhlIGNvbW1lbnRzIHRoZXJlXG4gICAgICAgIHJlYWRlci5za2lwKGZpbGVOYW1lTGVuZ3RoKTtcbiAgICAgICAgdGhpcy5yZWFkRXh0cmFGaWVsZHMocmVhZGVyKTtcbiAgICAgICAgdGhpcy5wYXJzZVpJUDY0RXh0cmFGaWVsZChyZWFkZXIpO1xuICAgICAgICB0aGlzLmZpbGVDb21tZW50ID0gcmVhZGVyLnJlYWREYXRhKHRoaXMuZmlsZUNvbW1lbnRMZW5ndGgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSB0aGUgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIGFuZCBnZXQgdGhlIHVuaXgvZG9zIHBlcm1pc3Npb25zLlxuICAgICAqL1xuICAgIHByb2Nlc3NBdHRyaWJ1dGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudW5peFBlcm1pc3Npb25zID0gbnVsbDtcbiAgICAgICAgdGhpcy5kb3NQZXJtaXNzaW9ucyA9IG51bGw7XG4gICAgICAgIHZhciBtYWRlQnkgPSB0aGlzLnZlcnNpb25NYWRlQnkgPj4gODtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHRoZSBET1MgZGlyZWN0b3J5IGZsYWcgc2V0LlxuICAgICAgICAvLyBXZSBsb29rIGZvciBpdCBpbiB0aGUgRE9TIGFuZCBVTklYIHBlcm1pc3Npb25zXG4gICAgICAgIC8vIGJ1dCBzb21lIHVua25vd24gcGxhdGZvcm0gY291bGQgc2V0IGl0IGFzIGEgY29tcGF0aWJpbGl0eSBmbGFnLlxuICAgICAgICB0aGlzLmRpciA9IHRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyAmIDB4MDAxMCA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICBpZihtYWRlQnkgPT09IE1BREVfQllfRE9TKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCA2IGJpdHMgKDAgdG8gNSlcbiAgICAgICAgICAgIHRoaXMuZG9zUGVybWlzc2lvbnMgPSB0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgJiAweDNGO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobWFkZUJ5ID09PSBNQURFX0JZX1VOSVgpIHtcbiAgICAgICAgICAgIHRoaXMudW5peFBlcm1pc3Npb25zID0gKHRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyA+PiAxNikgJiAweEZGRkY7XG4gICAgICAgICAgICAvLyB0aGUgb2N0YWwgcGVybWlzc2lvbnMgYXJlIGluICh0aGlzLnVuaXhQZXJtaXNzaW9ucyAmIDB4MDFGRikudG9TdHJpbmcoOCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmYWlsIHNhZmUgOiBpZiB0aGUgbmFtZSBlbmRzIHdpdGggYSAvIGl0IHByb2JhYmx5IG1lYW5zIGEgZm9sZGVyXG4gICAgICAgIGlmICghdGhpcy5kaXIgJiYgdGhpcy5maWxlTmFtZVN0ci5zbGljZSgtMSkgPT09ICcvJykge1xuICAgICAgICAgICAgdGhpcy5kaXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBaSVA2NCBleHRyYSBmaWVsZCBhbmQgbWVyZ2UgdGhlIGluZm8gaW4gdGhlIGN1cnJlbnQgWmlwRW50cnkuXG4gICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRlciB0byB1c2UuXG4gICAgICovXG4gICAgcGFyc2VaSVA2NEV4dHJhRmllbGQ6IGZ1bmN0aW9uKHJlYWRlcikge1xuXG4gICAgICAgIGlmICghdGhpcy5leHRyYUZpZWxkc1sweDAwMDFdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaG91bGQgYmUgc29tZXRoaW5nLCBwcmVwYXJpbmcgdGhlIGV4dHJhIHJlYWRlclxuICAgICAgICB2YXIgZXh0cmFSZWFkZXIgPSByZWFkZXJGb3IodGhpcy5leHRyYUZpZWxkc1sweDAwMDFdLnZhbHVlKTtcblxuICAgICAgICAvLyBJIHJlYWxseSBob3BlIHRoYXQgdGhlc2UgNjRiaXRzIGludGVnZXIgY2FuIGZpdCBpbiAzMiBiaXRzIGludGVnZXIsIGJlY2F1c2UganNcbiAgICAgICAgLy8gd29uJ3QgbGV0IHVzIGhhdmUgbW9yZS5cbiAgICAgICAgaWYgKHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUykge1xuICAgICAgICAgICAgdGhpcy51bmNvbXByZXNzZWRTaXplID0gZXh0cmFSZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb21wcmVzc2VkU2l6ZSA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUykge1xuICAgICAgICAgICAgdGhpcy5jb21wcmVzc2VkU2l6ZSA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9jYWxIZWFkZXJPZmZzZXQgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMubG9jYWxIZWFkZXJPZmZzZXQgPSBleHRyYVJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRpc2tOdW1iZXJTdGFydCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUykge1xuICAgICAgICAgICAgdGhpcy5kaXNrTnVtYmVyU3RhcnQgPSBleHRyYVJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBjZW50cmFsIHBhcnQgb2YgYSB6aXAgZmlsZSBhbmQgYWRkIHRoZSBpbmZvIGluIHRoaXMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RGF0YVJlYWRlcn0gcmVhZGVyIHRoZSByZWFkZXIgdG8gdXNlLlxuICAgICAqL1xuICAgIHJlYWRFeHRyYUZpZWxkczogZnVuY3Rpb24ocmVhZGVyKSB7XG4gICAgICAgIHZhciBlbmQgPSByZWFkZXIuaW5kZXggKyB0aGlzLmV4dHJhRmllbGRzTGVuZ3RoLFxuICAgICAgICAgICAgZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZTtcblxuICAgICAgICBpZiAoIXRoaXMuZXh0cmFGaWVsZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZXh0cmFGaWVsZHMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChyZWFkZXIuaW5kZXggPCBlbmQpIHtcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAgICAgZXh0cmFGaWVsZExlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlID0gcmVhZGVyLnJlYWREYXRhKGV4dHJhRmllbGRMZW5ndGgpO1xuXG4gICAgICAgICAgICB0aGlzLmV4dHJhRmllbGRzW2V4dHJhRmllbGRJZF0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGV4dHJhRmllbGRWYWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQXBwbHkgYW4gVVRGOCB0cmFuc2Zvcm1hdGlvbiBpZiBuZWVkZWQuXG4gICAgICovXG4gICAgaGFuZGxlVVRGODogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkZWNvZGVQYXJhbVR5cGUgPSBzdXBwb3J0LnVpbnQ4YXJyYXkgPyBcInVpbnQ4YXJyYXlcIiA6IFwiYXJyYXlcIjtcbiAgICAgICAgaWYgKHRoaXMudXNlVVRGOCgpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVOYW1lU3RyID0gdXRmOC51dGY4ZGVjb2RlKHRoaXMuZmlsZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5maWxlQ29tbWVudFN0ciA9IHV0ZjgudXRmOGRlY29kZSh0aGlzLmZpbGVDb21tZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB1cGF0aCA9IHRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aCgpO1xuICAgICAgICAgICAgaWYgKHVwYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZVN0ciA9IHVwYXRoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBU0NJSSB0ZXh0IG9yIHVuc3VwcG9ydGVkIGNvZGUgcGFnZVxuICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZUJ5dGVBcnJheSA9ICB1dGlscy50cmFuc2Zvcm1UbyhkZWNvZGVQYXJhbVR5cGUsIHRoaXMuZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVTdHIgPSB0aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKGZpbGVOYW1lQnl0ZUFycmF5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHVjb21tZW50ID0gdGhpcy5maW5kRXh0cmFGaWVsZFVuaWNvZGVDb21tZW50KCk7XG4gICAgICAgICAgICBpZiAodWNvbW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVDb21tZW50U3RyID0gdWNvbW1lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFTQ0lJIHRleHQgb3IgdW5zdXBwb3J0ZWQgY29kZSBwYWdlXG4gICAgICAgICAgICAgICAgdmFyIGNvbW1lbnRCeXRlQXJyYXkgPSAgdXRpbHMudHJhbnNmb3JtVG8oZGVjb2RlUGFyYW1UeXBlLCB0aGlzLmZpbGVDb21tZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVDb21tZW50U3RyID0gdGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShjb21tZW50Qnl0ZUFycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSB1bmljb2RlIHBhdGggZGVjbGFyZWQgaW4gdGhlIGV4dHJhIGZpZWxkLCBpZiBhbnkuXG4gICAgICogQHJldHVybiB7U3RyaW5nfSB0aGUgdW5pY29kZSBwYXRoLCBudWxsIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBmaW5kRXh0cmFGaWVsZFVuaWNvZGVQYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHVwYXRoRmllbGQgPSB0aGlzLmV4dHJhRmllbGRzWzB4NzA3NV07XG4gICAgICAgIGlmICh1cGF0aEZpZWxkKSB7XG4gICAgICAgICAgICB2YXIgZXh0cmFSZWFkZXIgPSByZWFkZXJGb3IodXBhdGhGaWVsZC52YWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIHdyb25nIHZlcnNpb25cbiAgICAgICAgICAgIGlmIChleHRyYVJlYWRlci5yZWFkSW50KDEpICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHRoZSBjcmMgb2YgdGhlIGZpbGVuYW1lIGNoYW5nZWQsIHRoaXMgZmllbGQgaXMgb3V0IG9mIGRhdGUuXG4gICAgICAgICAgICBpZiAoY3JjMzJmbih0aGlzLmZpbGVOYW1lKSAhPT0gZXh0cmFSZWFkZXIucmVhZEludCg0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXRmOC51dGY4ZGVjb2RlKGV4dHJhUmVhZGVyLnJlYWREYXRhKHVwYXRoRmllbGQubGVuZ3RoIC0gNSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSB1bmljb2RlIGNvbW1lbnQgZGVjbGFyZWQgaW4gdGhlIGV4dHJhIGZpZWxkLCBpZiBhbnkuXG4gICAgICogQHJldHVybiB7U3RyaW5nfSB0aGUgdW5pY29kZSBjb21tZW50LCBudWxsIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBmaW5kRXh0cmFGaWVsZFVuaWNvZGVDb21tZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHVjb21tZW50RmllbGQgPSB0aGlzLmV4dHJhRmllbGRzWzB4NjM3NV07XG4gICAgICAgIGlmICh1Y29tbWVudEZpZWxkKSB7XG4gICAgICAgICAgICB2YXIgZXh0cmFSZWFkZXIgPSByZWFkZXJGb3IodWNvbW1lbnRGaWVsZC52YWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIHdyb25nIHZlcnNpb25cbiAgICAgICAgICAgIGlmIChleHRyYVJlYWRlci5yZWFkSW50KDEpICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHRoZSBjcmMgb2YgdGhlIGNvbW1lbnQgY2hhbmdlZCwgdGhpcyBmaWVsZCBpcyBvdXQgb2YgZGF0ZS5cbiAgICAgICAgICAgIGlmIChjcmMzMmZuKHRoaXMuZmlsZUNvbW1lbnQpICE9PSBleHRyYVJlYWRlci5yZWFkSW50KDQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1dGY4LnV0ZjhkZWNvZGUoZXh0cmFSZWFkZXIucmVhZERhdGEodWNvbW1lbnRGaWVsZC5sZW5ndGggLSA1KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gWmlwRW50cnk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBTdHJlYW1IZWxwZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9TdHJlYW1IZWxwZXInKTtcbnZhciBEYXRhV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vRGF0YVdvcmtlcicpO1xudmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTtcbnZhciBDb21wcmVzc2VkT2JqZWN0ID0gcmVxdWlyZSgnLi9jb21wcmVzc2VkT2JqZWN0Jyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBBIHNpbXBsZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgZmlsZSBpbiB0aGUgemlwIGZpbGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgZGF0YVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgb2YgdGhlIGZpbGVcbiAqL1xudmFyIFppcE9iamVjdCA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZGlyID0gb3B0aW9ucy5kaXI7XG4gICAgdGhpcy5kYXRlID0gb3B0aW9ucy5kYXRlO1xuICAgIHRoaXMuY29tbWVudCA9IG9wdGlvbnMuY29tbWVudDtcbiAgICB0aGlzLnVuaXhQZXJtaXNzaW9ucyA9IG9wdGlvbnMudW5peFBlcm1pc3Npb25zO1xuICAgIHRoaXMuZG9zUGVybWlzc2lvbnMgPSBvcHRpb25zLmRvc1Blcm1pc3Npb25zO1xuXG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5fZGF0YUJpbmFyeSA9IG9wdGlvbnMuYmluYXJ5O1xuICAgIC8vIGtlZXAgb25seSB0aGUgY29tcHJlc3Npb25cbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgIGNvbXByZXNzaW9uIDogb3B0aW9ucy5jb21wcmVzc2lvbixcbiAgICAgICAgY29tcHJlc3Npb25PcHRpb25zIDogb3B0aW9ucy5jb21wcmVzc2lvbk9wdGlvbnNcbiAgICB9O1xufTtcblxuWmlwT2JqZWN0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gaW50ZXJuYWwgc3RyZWFtIGZvciB0aGUgY29udGVudCBvZiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiBlYWNoIGNodW5rLlxuICAgICAqIEByZXR1cm4gU3RyZWFtSGVscGVyIHRoZSBzdHJlYW0uXG4gICAgICovXG4gICAgaW50ZXJuYWxTdHJlYW06IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHZhciBvdXRwdXRUeXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB2YXIgYXNrVW5pY29kZVN0cmluZyA9IG91dHB1dFR5cGUgPT09IFwic3RyaW5nXCIgfHwgb3V0cHV0VHlwZSA9PT0gXCJ0ZXh0XCI7XG4gICAgICAgIGlmIChvdXRwdXRUeXBlID09PSBcImJpbmFyeXN0cmluZ1wiIHx8IG91dHB1dFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gXCJzdHJpbmdcIjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fZGVjb21wcmVzc1dvcmtlcigpO1xuXG4gICAgICAgIHZhciBpc1VuaWNvZGVTdHJpbmcgPSAhdGhpcy5fZGF0YUJpbmFyeTtcblxuICAgICAgICBpZiAoaXNVbmljb2RlU3RyaW5nICYmICFhc2tVbmljb2RlU3RyaW5nKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucGlwZShuZXcgdXRmOC5VdGY4RW5jb2RlV29ya2VyKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmljb2RlU3RyaW5nICYmIGFza1VuaWNvZGVTdHJpbmcpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5waXBlKG5ldyB1dGY4LlV0ZjhEZWNvZGVXb3JrZXIoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFN0cmVhbUhlbHBlcihyZXN1bHQsIG91dHB1dFR5cGUsIFwiXCIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlIHRoZSBjb250ZW50IGluIHRoZSBhc2tlZCB0eXBlLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSByZXN1bHQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25VcGRhdGUgYSBmdW5jdGlvbiB0byBjYWxsIG9uIGVhY2ggaW50ZXJuYWwgdXBkYXRlLlxuICAgICAqIEByZXR1cm4gUHJvbWlzZSB0aGUgcHJvbWlzZSBvZiB0aGUgcmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jOiBmdW5jdGlvbiAodHlwZSwgb25VcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxTdHJlYW0odHlwZSkuYWNjdW11bGF0ZShvblVwZGF0ZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmUgdGhlIGNvbnRlbnQgYXMgYSBub2RlanMgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIGVhY2ggY2h1bmsuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25VcGRhdGUgYSBmdW5jdGlvbiB0byBjYWxsIG9uIGVhY2ggaW50ZXJuYWwgdXBkYXRlLlxuICAgICAqIEByZXR1cm4gU3RyZWFtIHRoZSBzdHJlYW0uXG4gICAgICovXG4gICAgbm9kZVN0cmVhbTogZnVuY3Rpb24gKHR5cGUsIG9uVXBkYXRlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU3RyZWFtKHR5cGUgfHwgXCJub2RlYnVmZmVyXCIpLnRvTm9kZWpzU3RyZWFtKG9uVXBkYXRlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgd29ya2VyIGZvciB0aGUgY29tcHJlc3NlZCBjb250ZW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbXByZXNzaW9uIHRoZSBjb21wcmVzc2lvbiBvYmplY3QgdG8gdXNlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbk9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gY29tcHJlc3NpbmcuXG4gICAgICogQHJldHVybiBXb3JrZXIgdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICAvLyBfY29tcHJlc3NXb3JrZXI6IGZ1bmN0aW9uIChjb21wcmVzc2lvbiwgY29tcHJlc3Npb25PcHRpb25zKSB7XG4gICAgLy8gICAgIGlmIChcbiAgICAvLyAgICAgICAgIHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0ICYmXG4gICAgLy8gICAgICAgICB0aGlzLl9kYXRhLmNvbXByZXNzaW9uLm1hZ2ljID09PSBjb21wcmVzc2lvbi5tYWdpY1xuICAgIC8vICAgICApIHtcbiAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdldENvbXByZXNzZWRXb3JrZXIoKTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9kZWNvbXByZXNzV29ya2VyKCk7XG4gICAgLy8gICAgICAgICBpZighdGhpcy5fZGF0YUJpbmFyeSkge1xuICAgIC8vICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5waXBlKG5ldyB1dGY4LlV0ZjhFbmNvZGVXb3JrZXIoKSk7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICByZXR1cm4gQ29tcHJlc3NlZE9iamVjdC5jcmVhdGVXb3JrZXJGcm9tKHJlc3VsdCwgY29tcHJlc3Npb24sIGNvbXByZXNzaW9uT3B0aW9ucyk7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9LFxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHdvcmtlciBmb3IgdGhlIGRlY29tcHJlc3NlZCBjb250ZW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybiBXb3JrZXIgdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICBfZGVjb21wcmVzc1dvcmtlciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5nZXRDb250ZW50V29ya2VyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZGF0YSBpbnN0YW5jZW9mIEdlbmVyaWNXb3JrZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhV29ya2VyKHRoaXMuX2RhdGEpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIHJlbW92ZWRNZXRob2RzID0gW1wiYXNUZXh0XCIsIFwiYXNCaW5hcnlcIiwgXCJhc05vZGVCdWZmZXJcIiwgXCJhc1VpbnQ4QXJyYXlcIiwgXCJhc0FycmF5QnVmZmVyXCJdO1xudmFyIHJlbW92ZWRGbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLlwiKTtcbn07XG5cbmZvcih2YXIgaSA9IDA7IGkgPCByZW1vdmVkTWV0aG9kcy5sZW5ndGg7IGkrKykge1xuICAgIFppcE9iamVjdC5wcm90b3R5cGVbcmVtb3ZlZE1ldGhvZHNbaV1dID0gcmVtb3ZlZEZuO1xufVxubW9kdWxlLmV4cG9ydHMgPSBaaXBPYmplY3Q7XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIG5vdE51bGwoeCkgIHsgcmV0dXJuIHggIT0gbnVsbDsgfVxuZnVuY3Rpb24gd3JhcCh4KSAgICAgeyByZXR1cm4gJygnICsgeCArICcpJzt9XG5cbmZ1bmN0aW9uIG1heWJlUXVvdGUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJ1wiJyArIHZhbHVlICsgJ1wiJztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBsb29rVXAoa2V5KSB7XG4gICAgaWYgKGtleVswXSA9PT0gJyQnKSB7XG4gICAgICAgIHJldHVybiAnY29udGV4dC4nICsga2V5LnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgcmV0dXJuICdjb250ZXh0LmZlYXR1cmUucHJvcGVydGllcy4nICsga2V5O1xufVxuXG5mdW5jdGlvbiBudWxsVmFsdWUoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiAnIHRydWUgJztcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlFcXVhbChrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHdyYXAobWF5YmVRdW90ZSh2YWx1ZSkgKyAnID09PSAnICsgbG9va1VwKGtleSkpO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eU9yKGtleSwgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHdyYXAodmFsdWVzLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gcHJvcGVydHlFcXVhbChrZXksIHgpOyB9KS5qb2luKCcgfHwgJykpO1xufVxuXG5mdW5jdGlvbiBwcmludE5lc3RlZCh2YWx1ZXMsIGpvaW5lcikge1xuICAgIHJldHVybiB3cmFwKHZhbHVlcy5maWx0ZXIobm90TnVsbCkubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB3cmFwKHguam9pbignICYmICcpKTtcbiAgICB9KS5qb2luKCcgJyArIGpvaW5lciArICcgJykpO1xufVxuXG5mdW5jdGlvbiBhbnkoXywgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApID8gcHJpbnROZXN0ZWQodmFsdWVzLm1hcChmdW5jdGlvbih2KSB7IHJldHVybiBwYXJzZUZpbHRlcih2LCBvcHRpb25zKSB9KSwgJ3x8JykgOiAndHJ1ZSc7XG59XG5cbmZ1bmN0aW9uIGFsbChfLCB2YWx1ZXMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkgPyBwcmludE5lc3RlZCh2YWx1ZXMubWFwKGZ1bmN0aW9uKHYpIHsgcmV0dXJuIHBhcnNlRmlsdGVyKHYsIG9wdGlvbnMpIH0pLCAnJiYnKSA6ICd0cnVlJztcbn1cblxuZnVuY3Rpb24gbm90KGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gJyEnICsgd3JhcChwYXJzZUZpbHRlcih2YWx1ZSwgb3B0aW9ucykuam9pbignICYmICcpKTtcbn1cblxuZnVuY3Rpb24gbm9uZShrZXksIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHJldHVybiAnIScgKyB3cmFwKGFueShudWxsLCB2YWx1ZXMsIG9wdGlvbnMpKTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlNYXRjaGVzQm9vbGVhbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHdyYXAobG9va1VwKGtleSkgKyAodmFsdWUgPyAnICE9ICcgOiAnID09ICcpICArICdudWxsJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmdlTWF0Y2goa2V5LCB2YWx1ZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTtcbiAgICB2YXIgdHJhbnNmb3JtID0gb3B0aW9ucyAmJiAodHlwZW9mIG9wdGlvbnMucmFuZ2VUcmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpICYmIG9wdGlvbnMucmFuZ2VUcmFuc2Zvcm07XG5cbiAgICBpZiAodmFsdWVzLm1heCkge1xuICAgICAgICB2YXIgbWF4ID0gdHJhbnNmb3JtID8gdHJhbnNmb3JtKHZhbHVlcy5tYXgpIDogdmFsdWVzLm1heDtcbiAgICAgICAgZXhwcmVzc2lvbnMucHVzaCgnJyArIGxvb2tVcChrZXkpICsgJyA8ICcgKyBtYXgpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZXMubWluKSB7XG4gICAgICAgIHZhciBtaW4gPSB0cmFuc2Zvcm0gPyBtaW4gPSB0cmFuc2Zvcm0odmFsdWVzLm1pbikgOiB2YWx1ZXMubWluO1xuICAgICAgICBleHByZXNzaW9ucy5wdXNoKCcnICsgbG9va1VwKGtleSkgKyAnID49ICcgKyBtaW4pO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwKGV4cHJlc3Npb25zLmpvaW4oJyAmJiAnKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRmlsdGVyKGZpbHRlciwgb3B0aW9ucykge1xuICAgIHZhciBmaWx0ZXJBU1QgPSBbXTtcblxuICAgIC8vIEZ1bmN0aW9uIGZpbHRlclxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBbd3JhcChmaWx0ZXIudG9TdHJpbmcoKSArICcoY29udGV4dCknKV07XG4gICAgfVxuICAgIC8vIEFycmF5IGZpbHRlciwgaW1wbGljaXQgJ2FueSdcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHtcbiAgICAgICAgcmV0dXJuIFthbnkobnVsbCwgZmlsdGVyLCBvcHRpb25zKV07XG4gICAgfVxuICAgIC8vIE51bGwgZmlsdGVyIG9iamVjdFxuICAgIGVsc2UgaWYgKGZpbHRlciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbJ3RydWUnXTtcbiAgICB9XG5cbiAgICAvLyBPYmplY3QgZmlsdGVyLCBlLmcuIGltcGxpY2l0ICdhbGwnXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmaWx0ZXIpO1xuICAgIGZvciAodmFyIGs9MDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNba107XG5cbiAgICAgICAgdmFyIHZhbHVlID0gZmlsdGVyW2tleV0sXG4gICAgICAgICAgICB0eXBlICA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChwcm9wZXJ0eUVxdWFsKGtleSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHByb3BlcnR5TWF0Y2hlc0Jvb2xlYW4oa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ25vdCcpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG5vdChrZXksIHZhbHVlLCBvcHRpb25zKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnYW55Jykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2goYW55KGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChhbGwoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChub25lKGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gocHJvcGVydHlPcihrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLm1heCB8fCB2YWx1ZS5taW4pIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChyYW5nZU1hdGNoKGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChudWxsVmFsdWUoa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIFF1ZXJ5IHN5dG5heDogJyArIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBrZXlzLmxlbmd0aCA9PT0gMCA/IFsndHJ1ZSddIDogZmlsdGVyQVNUO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJUb1N0cmluZyhmaWx0ZXJBU1QpIHtcbiAgICByZXR1cm4gd3JhcChmaWx0ZXJBU1Quam9pbignICYmICcpKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2goZmlsdGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKGZpbHRlciA9PSBudWxsKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9OyB9XG4gICAgLy8ganNoaW50IGV2aWw6IHRydWVcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ3JldHVybiAnICsgZmlsdGVyVG9TdHJpbmcocGFyc2VGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSkgKyAnOycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBtYXRjaDogbWF0Y2gsXG4gICAgZmlsdGVyVG9TdHJpbmc6IGZpbHRlclRvU3RyaW5nLFxuICAgIHBhcnNlRmlsdGVyOiBwYXJzZUZpbHRlclxufTtcbiIsIi8vIFRvcCBsZXZlbCBmaWxlIGlzIGp1c3QgYSBtaXhpbiBvZiBzdWJtb2R1bGVzICYgY29uc3RhbnRzXG4ndXNlIHN0cmljdCc7XG5cbnZhciBhc3NpZ24gICAgPSByZXF1aXJlKCcuL2xpYi91dGlscy9jb21tb24nKS5hc3NpZ247XG5cbnZhciBkZWZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9kZWZsYXRlJyk7XG52YXIgaW5mbGF0ZSAgID0gcmVxdWlyZSgnLi9saWIvaW5mbGF0ZScpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vbGliL3psaWIvY29uc3RhbnRzJyk7XG5cbnZhciBwYWtvID0ge307XG5cbmFzc2lnbihwYWtvLCBkZWZsYXRlLCBpbmZsYXRlLCBjb25zdGFudHMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBha287XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHpsaWJfZGVmbGF0ZSA9IHJlcXVpcmUoJy4vemxpYi9kZWZsYXRlJyk7XG52YXIgdXRpbHMgICAgICAgID0gcmVxdWlyZSgnLi91dGlscy9jb21tb24nKTtcbnZhciBzdHJpbmdzICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL3N0cmluZ3MnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcblxudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbnZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuXG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cbnZhciBaX0RFRkFVTFRfU1RSQVRFR1kgICAgPSAwO1xuXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qKlxuICogY2xhc3MgRGVmbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2RlZmxhdGVdXSxcbiAqIFtbZGVmbGF0ZVJhd11dIGFuZCBbW2d6aXBdXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIERlZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0RlZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRlbi5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5XG4gKlxuICogQ29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbRGVmbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbRGVmbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pICBvciBpZiB5b3VcbiAqIHB1c2ggYSBjaHVuayB3aXRoIGV4cGxpY2l0IGZsdXNoIChjYWxsIFtbRGVmbGF0ZSNwdXNoXV0gd2l0aFxuICogYFpfU1lOQ19GTFVTSGAgcGFyYW0pLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUuZXJyIC0+IE51bWJlclxuICpcbiAqIEVycm9yIGNvZGUgYWZ0ZXIgZGVmbGF0ZSBmaW5pc2hlZC4gMCAoWl9PSykgb24gc3VjY2Vzcy5cbiAqIFlvdSB3aWxsIG5vdCBuZWVkIGl0IGluIHJlYWwgbGlmZSwgYmVjYXVzZSBkZWZsYXRlIGVycm9yc1xuICogYXJlIHBvc3NpYmxlIG9ubHkgb24gd3Jvbmcgb3B0aW9ucyBvciBiYWQgYG9uRGF0YWAgLyBgb25FbmRgXG4gKiBjdXN0b20gaGFuZGxlcnMuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tEZWZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBEZWZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGRlZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgbGV2ZWxgXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgbWVtTGV2ZWxgXG4gKiAtIGBzdHJhdGVneWBcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGRlZmxhdGVcbiAqIC0gYGd6aXBgIChCb29sZWFuKSAtIGNyZWF0ZSBnemlwIHdyYXBwZXJcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIFwiYmluYXJ5IHN0cmluZ1wiXG4gKiAgICAoZWFjaCBjaGFyIGNvZGUgWzAuLjI1NV0pXG4gKiAtIGBoZWFkZXJgIChPYmplY3QpIC0gY3VzdG9tIGhlYWRlciBmb3IgZ3ppcFxuICogICAtIGB0ZXh0YCAoQm9vbGVhbikgLSB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0XG4gKiAgIC0gYHRpbWVgIChOdW1iZXIpIC0gbW9kaWZpY2F0aW9uIHRpbWUsIHVuaXggdGltZXN0YW1wXG4gKiAgIC0gYG9zYCAoTnVtYmVyKSAtIG9wZXJhdGlvbiBzeXN0ZW0gY29kZVxuICogICAtIGBleHRyYWAgKEFycmF5KSAtIGFycmF5IG9mIGJ5dGVzIHdpdGggZXh0cmEgZGF0YSAobWF4IDY1NTM2KVxuICogICAtIGBuYW1lYCAoU3RyaW5nKSAtIGZpbGUgbmFtZSAoYmluYXJ5IHN0cmluZylcbiAqICAgLSBgY29tbWVudGAgKFN0cmluZykgLSBjb21tZW50IChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBoY3JjYCAoQm9vbGVhbikgLSB0cnVlIGlmIGhlYWRlciBjcmMgc2hvdWxkIGJlIGFkZGVkXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGNodW5rMSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSlcbiAqICAgLCBjaHVuazIgPSBVaW50OEFycmF5KFsxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOV0pO1xuICpcbiAqIHZhciBkZWZsYXRlID0gbmV3IHBha28uRGVmbGF0ZSh7IGxldmVsOiAzfSk7XG4gKlxuICogZGVmbGF0ZS5wdXNoKGNodW5rMSwgZmFsc2UpO1xuICogZGVmbGF0ZS5wdXNoKGNodW5rMiwgdHJ1ZSk7ICAvLyB0cnVlIC0+IGxhc3QgY2h1bmtcbiAqXG4gKiBpZiAoZGVmbGF0ZS5lcnIpIHsgdGhyb3cgbmV3IEVycm9yKGRlZmxhdGUuZXJyKTsgfVxuICpcbiAqIGNvbnNvbGUubG9nKGRlZmxhdGUucmVzdWx0KTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gRGVmbGF0ZShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWZsYXRlKSkgcmV0dXJuIG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIHRoaXMub3B0aW9ucyA9IHV0aWxzLmFzc2lnbih7XG4gICAgbGV2ZWw6IFpfREVGQVVMVF9DT01QUkVTU0lPTixcbiAgICBtZXRob2Q6IFpfREVGTEFURUQsXG4gICAgY2h1bmtTaXplOiAxNjM4NCxcbiAgICB3aW5kb3dCaXRzOiAxNSxcbiAgICBtZW1MZXZlbDogOCxcbiAgICBzdHJhdGVneTogWl9ERUZBVUxUX1NUUkFURUdZLFxuICAgIHRvOiAnJ1xuICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICB2YXIgb3B0ID0gdGhpcy5vcHRpb25zO1xuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+IDApKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmIChvcHQuZ3ppcCAmJiAob3B0LndpbmRvd0JpdHMgPiAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAxNjtcbiAgfVxuXG4gIHRoaXMuZXJyICAgID0gMDsgICAgICAvLyBlcnJvciBjb2RlLCBpZiBoYXBwZW5zICgwID0gWl9PSylcbiAgdGhpcy5tc2cgICAgPSAnJzsgICAgIC8vIGVycm9yIG1lc3NhZ2VcbiAgdGhpcy5lbmRlZCAgPSBmYWxzZTsgIC8vIHVzZWQgdG8gYXZvaWQgbXVsdGlwbGUgb25FbmQoKSBjYWxsc1xuICB0aGlzLmNodW5rcyA9IFtdOyAgICAgLy8gY2h1bmtzIG9mIGNvbXByZXNzZWQgZGF0YVxuXG4gIHRoaXMuc3RybSA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUluaXQyKFxuICAgIHRoaXMuc3RybSxcbiAgICBvcHQubGV2ZWwsXG4gICAgb3B0Lm1ldGhvZCxcbiAgICBvcHQud2luZG93Qml0cyxcbiAgICBvcHQubWVtTGV2ZWwsXG4gICAgb3B0LnN0cmF0ZWd5XG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gWl9PSykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gIH1cblxuICBpZiAob3B0LmhlYWRlcikge1xuICAgIHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSwgb3B0LmhlYWRlcik7XG4gIH1cblxuICBpZiAob3B0LmRpY3Rpb25hcnkpIHtcbiAgICB2YXIgZGljdDtcbiAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBvcHQuZGljdGlvbmFyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguXG4gICAgICBkaWN0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICBkaWN0ID0gbmV3IFVpbnQ4QXJyYXkob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWN0ID0gb3B0LmRpY3Rpb25hcnk7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdCk7XG5cbiAgICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICAgIH1cblxuICAgIHRoaXMuX2RpY3Rfc2V0ID0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIERlZmxhdGUjcHVzaChkYXRhWywgbW9kZV0pIC0+IEJvb2xlYW5cbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxBcnJheUJ1ZmZlcnxTdHJpbmcpOiBpbnB1dCBkYXRhLiBTdHJpbmdzIHdpbGwgYmVcbiAqICAgY29udmVydGVkIHRvIHV0ZjggYnl0ZSBzZXF1ZW5jZS5cbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFuc2ggWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBkZWZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tEZWZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBjb21wcmVzc2VkIGNodW5rcy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4gVGhlIGxhc3QgZGF0YSBibG9jayBtdXN0IGhhdmVcbiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nIGJ1ZmZlcnMgYW5kIGNhbGxcbiAqIFtbRGVmbGF0ZSNvbkVuZF1dLiBGb3IgaW50ZXJpbSBleHBsaWNpdCBmbHVzaGVzICh3aXRob3V0IGVuZGluZyB0aGUgc3RyZWFtKSB5b3VcbiAqIGNhbiB1c2UgbW9kZSBaX1NZTkNfRkxVU0gsIGtlZXBpbmcgdGhlIGNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbRGVmbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGFycmF5IGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIKTtcblxuICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBJZiB3ZSBuZWVkIHRvIGNvbXByZXNzIHRleHQsIGNoYW5nZSBlbmNvZGluZyB0byB1dGY4LlxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZShzdHJtLCBfbW9kZSk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgIT09IFpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBaX0ZJTklTSCB8fCBfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSkpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMub25EYXRhKHN0cmluZ3MuYnVmMmJpbnN0cmluZyh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gd2hpbGUgKChzdHJtLmF2YWlsX2luID4gMCB8fCBzdHJtLmF2YWlsX291dCA9PT0gMCkgJiYgc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQpO1xuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IFpfRklOSVNIKSB7XG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChaX09LKTtcbiAgICBzdHJtLmF2YWlsX291dCA9IDA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBvdXB1dCBkYXRhLiBUeXBlIG9mIGFycmF5IGRlcGVuZHNcbiAqICAgb24ganMgZW5naW5lIHN1cHBvcnQuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsIGVhY2ggY2h1bmtcbiAqICAgd2lsbCBiZSBzdHJpbmcuXG4gKlxuICogQnkgZGVmYXVsdCwgc3RvcmVzIGRhdGEgYmxvY2tzIGluIGBjaHVua3NbXWAgcHJvcGVydHkgYW5kIGdsdWVcbiAqIHRob3NlIGluIGBvbkVuZGAuIE92ZXJyaWRlIHRoaXMgaGFuZGxlciwgaWYgeW91IG5lZWQgYW5vdGhlciBiZWhhdmlvdXIuXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG59O1xuXG5cbi8qKlxuICogRGVmbGF0ZSNvbkVuZChzdGF0dXMpIC0+IFZvaWRcbiAqIC0gc3RhdHVzIChOdW1iZXIpOiBkZWZsYXRlIHN0YXR1cy4gMCAoWl9PSykgb24gc3VjY2VzcyxcbiAqICAgb3RoZXIgaWYgbm90LlxuICpcbiAqIENhbGxlZCBvbmNlIGFmdGVyIHlvdSB0ZWxsIGRlZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHV0aWxzLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpO1xuICAgIH1cbiAgfVxuICB0aGlzLmNodW5rcyA9IFtdO1xuICB0aGlzLmVyciA9IHN0YXR1cztcbiAgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnO1xufTtcblxuXG4vKipcbiAqIGRlZmxhdGUoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENvbXByZXNzIGBkYXRhYCB3aXRoIGRlZmxhdGUgYWxnb3JpdGhtIGFuZCBgb3B0aW9uc2AuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gbGV2ZWxcbiAqIC0gd2luZG93Qml0c1xuICogLSBtZW1MZXZlbFxuICogLSBzdHJhdGVneVxuICogLSBkaWN0aW9uYXJ5XG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgZGF0YSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSk7XG4gKlxuICogY29uc29sZS5sb2cocGFrby5kZWZsYXRlKGRhdGEpKTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgZGVmbGF0b3IgPSBuZXcgRGVmbGF0ZShvcHRpb25zKTtcblxuICBkZWZsYXRvci5wdXNoKGlucHV0LCB0cnVlKTtcblxuICAvLyBUaGF0IHdpbGwgbmV2ZXIgaGFwcGVucywgaWYgeW91IGRvbid0IGNoZWF0IHdpdGggb3B0aW9ucyA6KVxuICBpZiAoZGVmbGF0b3IuZXJyKSB7IHRocm93IGRlZmxhdG9yLm1zZzsgfVxuXG4gIHJldHVybiBkZWZsYXRvci5yZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBkZWZsYXRlUmF3KGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gZGVmbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiBnemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCBvZlxuICogZGVmbGF0ZSBvbmUuXG4gKiovXG5mdW5jdGlvbiBnemlwKGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLmd6aXAgPSB0cnVlO1xuICByZXR1cm4gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuZXhwb3J0cy5EZWZsYXRlID0gRGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZSA9IGRlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGVSYXcgPSBkZWZsYXRlUmF3O1xuZXhwb3J0cy5nemlwID0gZ3ppcDtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9pbmZsYXRlID0gcmVxdWlyZSgnLi96bGliL2luZmxhdGUnKTtcbnZhciB1dGlscyAgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL2NvbW1vbicpO1xudmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIGMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9jb25zdGFudHMnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xudmFyIEdaaGVhZGVyICAgICA9IHJlcXVpcmUoJy4vemxpYi9nemhlYWRlcicpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIGNsYXNzIEluZmxhdGVcbiAqXG4gKiBHZW5lcmljIEpTLXN0eWxlIHdyYXBwZXIgZm9yIHpsaWIgY2FsbHMuIElmIHlvdSBkb24ndCBuZWVkXG4gKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNlIG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tpbmZsYXRlXV1cbiAqIGFuZCBbW2luZmxhdGVSYXddXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIGluZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0luZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRlbi5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICpcbiAqIFVuY29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbSW5mbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbSW5mbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBpbmZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogU2hvdWxkIGJlIGNoZWNrZWQgaWYgYnJva2VuIGRhdGEgcG9zc2libGUuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tJbmZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBJbmZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGluZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgd2luZG93Qml0c2BcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGluZmxhdGVcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICogQnkgZGVmYXVsdCwgd2hlbiBubyBvcHRpb25zIHNldCwgYXV0b2RldGVjdCBkZWZsYXRlL2d6aXAgZGF0YSBmb3JtYXQgdmlhXG4gKiB3cmFwcGVyIGhlYWRlci5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGluZmxhdGUgPSBuZXcgcGFrby5JbmZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBpbmZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBpbmZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChpbmZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoaW5mbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coaW5mbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBJbmZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGUpKSByZXR1cm4gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDAsXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgLy8gRm9yY2Ugd2luZG93IHNpemUgZm9yIGByYXdgIGRhdGEsIGlmIG5vdCBzZXQgZGlyZWN0bHksXG4gIC8vIGJlY2F1c2Ugd2UgaGF2ZSBubyBoZWFkZXIgZm9yIGF1dG9kZXRlY3QuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgICBpZiAob3B0LndpbmRvd0JpdHMgPT09IDApIHsgb3B0LndpbmRvd0JpdHMgPSAtMTU7IH1cbiAgfVxuXG4gIC8vIElmIGB3aW5kb3dCaXRzYCBub3QgZGVmaW5lZCAoYW5kIG1vZGUgbm90IHJhdykgLSBzZXQgYXV0b2RldGVjdCBmbGFnIGZvciBnemlwL2RlZmxhdGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikgJiZcbiAgICAgICEob3B0aW9ucyAmJiBvcHRpb25zLndpbmRvd0JpdHMpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgKz0gMzI7XG4gIH1cblxuICAvLyBHemlwIGhlYWRlciBoYXMgbm8gaW5mbyBhYm91dCB3aW5kb3dzIHNpemUsIHdlIGNhbiBkbyBhdXRvZGV0ZWN0IG9ubHlcbiAgLy8gZm9yIGRlZmxhdGUuIFNvLCBpZiB3aW5kb3cgc2l6ZSBub3Qgc2V0LCBmb3JjZSBpdCB0byBtYXggd2hlbiBnemlwIHBvc3NpYmxlXG4gIGlmICgob3B0LndpbmRvd0JpdHMgPiAxNSkgJiYgKG9wdC53aW5kb3dCaXRzIDwgNDgpKSB7XG4gICAgLy8gYml0IDMgKDE2KSAtPiBnemlwcGVkIGRhdGFcbiAgICAvLyBiaXQgNCAoMzIpIC0+IGF1dG9kZXRlY3QgZ3ppcC9kZWZsYXRlXG4gICAgaWYgKChvcHQud2luZG93Qml0cyAmIDE1KSA9PT0gMCkge1xuICAgICAgb3B0LndpbmRvd0JpdHMgfD0gMTU7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtICAgPSBuZXcgWlN0cmVhbSgpO1xuICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDtcblxuICB2YXIgc3RhdHVzICA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC53aW5kb3dCaXRzXG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIHRoaXMuaGVhZGVyID0gbmV3IEdaaGVhZGVyKCk7XG5cbiAgemxpYl9pbmZsYXRlLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLCB0aGlzLmhlYWRlcik7XG59XG5cbi8qKlxuICogSW5mbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGFcbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFuc2ggWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBpbmZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tJbmZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBvdXRwdXQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZVxuICogbW9kZSBaX0ZJTklTSCAob3IgYHRydWVgKS4gVGhhdCB3aWxsIGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tJbmZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdVxuICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgZGVjb21wcmVzc2lvbiBjb250ZXh0LlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0luZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIGBVaW50OEFycmF5YCBvbiBpbnB1dCBmb3IgYmVzdCBzcGVlZCAob3V0cHV0XG4gKiBmb3JtYXQgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSkuIEFsc28sIGRvbid0IHNraXAgbGFzdCBwYXJhbSBhbmQgYWx3YXlzXG4gKiB1c2UgdGhlIHNhbWUgdHlwZSBpbiB5b3VyIGNvZGUgKGJvb2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuXG4gKlxuICogRm9yIHJlZ3VsYXIgYEFycmF5YC1zIG1ha2Ugc3VyZSBhbGwgZWxlbWVudHMgYXJlIFswLi4yNTVdLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBwdXNoKGNodW5rLCBmYWxzZSk7IC8vIHB1c2ggb25lIG9mIGRhdGEgY2h1bmtzXG4gKiAuLi5cbiAqIHB1c2goY2h1bmssIHRydWUpOyAgLy8gcHVzaCBsYXN0IGNodW5rXG4gKiBgYGBcbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkge1xuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgdmFyIGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7XG4gIHZhciBkaWN0aW9uYXJ5ID0gdGhpcy5vcHRpb25zLmRpY3Rpb25hcnk7XG4gIHZhciBzdGF0dXMsIF9tb2RlO1xuICB2YXIgbmV4dF9vdXRfdXRmOCwgdGFpbCwgdXRmOHN0cjtcbiAgdmFyIGRpY3Q7XG5cbiAgLy8gRmxhZyB0byBwcm9wZXJseSBwcm9jZXNzIFpfQlVGX0VSUk9SIG9uIHRlc3RpbmcgaW5mbGF0ZSBjYWxsXG4gIC8vIHdoZW4gd2UgY2hlY2sgdGhhdCBhbGwgb3V0cHV0IGRhdGEgd2FzIGZsdXNoZWQuXG4gIHZhciBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IGMuWl9GSU5JU0ggOiBjLlpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIE9ubHkgYmluYXJ5IHN0cmluZ3MgY2FuIGJlIGRlY29tcHJlc3NlZCBvbiBwcmFjdGljZVxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLmJpbnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cblxuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHN0cm0sIGMuWl9OT19GTFVTSCk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9ORUVEX0RJQ1QgJiYgZGljdGlvbmFyeSkge1xuICAgICAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICAgICAgaWYgKHR5cGVvZiBkaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBkaWN0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKGRpY3Rpb25hcnkpO1xuICAgICAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShkaWN0aW9uYXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpY3QgPSBkaWN0aW9uYXJ5O1xuICAgICAgfVxuXG4gICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9CVUZfRVJST1IgJiYgYWxsb3dCdWZFcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdHVzID0gYy5aX09LO1xuICAgICAgYWxsb3dCdWZFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RybS5uZXh0X291dCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBjLlpfRklOSVNIIHx8IF9tb2RlID09PSBjLlpfU1lOQ19GTFVTSCkpKSB7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcblxuICAgICAgICAgIG5leHRfb3V0X3V0ZjggPSBzdHJpbmdzLnV0Zjhib3JkZXIoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpO1xuXG4gICAgICAgICAgdGFpbCA9IHN0cm0ubmV4dF9vdXQgLSBuZXh0X291dF91dGY4O1xuICAgICAgICAgIHV0ZjhzdHIgPSBzdHJpbmdzLmJ1ZjJzdHJpbmcoc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgpO1xuXG4gICAgICAgICAgLy8gbW92ZSB0YWlsXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHRhaWw7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemUgLSB0YWlsO1xuICAgICAgICAgIGlmICh0YWlsKSB7IHV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LCBzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCwgdGFpbCwgMCk7IH1cblxuICAgICAgICAgIHRoaXMub25EYXRhKHV0ZjhzdHIpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXaGVuIG5vIG1vcmUgaW5wdXQgZGF0YSwgd2Ugc2hvdWxkIGNoZWNrIHRoYXQgaW50ZXJuYWwgaW5mbGF0ZSBidWZmZXJzXG4gICAgLy8gYXJlIGZsdXNoZWQuIFRoZSBvbmx5IHdheSB0byBkbyBpdCB3aGVuIGF2YWlsX291dCA9IDAgLSBydW4gb25lIG1vcmVcbiAgICAvLyBpbmZsYXRlIHBhc3MuIEJ1dCBpZiBvdXRwdXQgZGF0YSBub3QgZXhpc3RzLCBpbmZsYXRlIHJldHVybiBaX0JVRl9FUlJPUi5cbiAgICAvLyBIZXJlIHdlIHNldCBmbGFnIHRvIHByb2Nlc3MgdGhpcyBlcnJvciBwcm9wZXJseS5cbiAgICAvL1xuICAgIC8vIE5PVEUuIERlZmxhdGUgZG9lcyBub3QgcmV0dXJuIGVycm9yIGluIHRoaXMgY2FzZSBhbmQgZG9lcyBub3QgbmVlZHMgc3VjaFxuICAgIC8vIGxvZ2ljLlxuICAgIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gdHJ1ZTtcbiAgICB9XG5cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EKTtcblxuICBpZiAoc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCkge1xuICAgIF9tb2RlID0gYy5aX0ZJTklTSDtcbiAgfVxuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IGMuWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBjLlpfT0s7XG4gIH1cblxuICAvLyBjYWxsYmFjayBpbnRlcmltIHJlc3VsdHMgaWYgWl9TWU5DX0ZMVVNILlxuICBpZiAoX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChjLlpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGluZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIGVpdGhlciBhZnRlciB5b3UgdGVsbCBpbmZsYXRlIHRoYXQgdGhlIGlucHV0IHN0cmVhbSBpc1xuICogY29tcGxldGUgKFpfRklOSVNIKSBvciBzaG91bGQgYmUgZmx1c2hlZCAoWl9TWU5DX0ZMVVNIKVxuICogb3IgaWYgYW4gZXJyb3IgaGFwcGVuZWQuIEJ5IGRlZmF1bHQgLSBqb2luIGNvbGxlY3RlZCBjaHVua3MsXG4gKiBmcmVlIG1lbW9yeSBhbmQgZmlsbCBgcmVzdWx0c2AgLyBgZXJyYCBwcm9wZXJ0aWVzLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IGMuWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBHbHVlICYgY29udmVydCBoZXJlLCB1bnRpbCB3ZSB0ZWFjaCBwYWtvIHRvIHNlbmRcbiAgICAgIC8vIHV0ZjggYWxsaWduZWQgc3RyaW5ncyB0byBvbkRhdGFcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogaW5mbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBEZWNvbXByZXNzIGBkYXRhYCB3aXRoIGluZmxhdGUvdW5nemlwIGFuZCBgb3B0aW9uc2AuIEF1dG9kZXRlY3RcbiAqIGZvcm1hdCB2aWEgd3JhcHBlciBoZWFkZXIgYnkgZGVmYXVsdC4gVGhhdCdzIHdoeSB3ZSBkb24ndCBwcm92aWRlXG4gKiBzZXBhcmF0ZSBgdW5nemlwYCBtZXRob2QuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gd2luZG93Qml0c1xuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIFN1Z2FyIChvcHRpb25zKTpcbiAqXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5XG4gKiAgIG5lZ2F0aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS5cbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBpbnB1dCA9IHBha28uZGVmbGF0ZShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIG91dHB1dDtcbiAqXG4gKiB0cnkge1xuICogICBvdXRwdXQgPSBwYWtvLmluZmxhdGUoaW5wdXQpO1xuICogfSBjYXRjaCAoZXJyKVxuICogICBjb25zb2xlLmxvZyhlcnIpO1xuICogfVxuICogYGBgXG4gKiovXG5mdW5jdGlvbiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBpbmZsYXRvciA9IG5ldyBJbmZsYXRlKG9wdGlvbnMpO1xuXG4gIGluZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChpbmZsYXRvci5lcnIpIHsgdGhyb3cgaW5mbGF0b3IubXNnOyB9XG5cbiAgcmV0dXJuIGluZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGluZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tpbmZsYXRlXV0sIGJ1dCBjcmVhdGVzIHJhdyBkYXRhLCB3aXRob3V0IHdyYXBwZXJcbiAqIChoZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS5cbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMucmF3ID0gdHJ1ZTtcbiAgcmV0dXJuIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogdW5nemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIEp1c3Qgc2hvcnRjdXQgdG8gW1tpbmZsYXRlXV0sIGJlY2F1c2UgaXQgYXV0b2RldGVjdHMgZm9ybWF0XG4gKiBieSBoZWFkZXIuY29udGVudC4gRG9uZSBmb3IgY29udmVuaWVuY2UuXG4gKiovXG5cblxuZXhwb3J0cy5JbmZsYXRlID0gSW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVSYXcgPSBpbmZsYXRlUmF3O1xuZXhwb3J0cy51bmd6aXAgID0gaW5mbGF0ZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgVFlQRURfT0sgPSAgKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKTtcblxuXG5leHBvcnRzLmFzc2lnbiA9IGZ1bmN0aW9uIChvYmogLypmcm9tMSwgZnJvbTIsIGZyb20zLCAuLi4qLykge1xuICB2YXIgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHdoaWxlIChzb3VyY2VzLmxlbmd0aCkge1xuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7XG4gICAgaWYgKCFzb3VyY2UpIHsgY29udGludWU7IH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzb3VyY2UgKyAnbXVzdCBiZSBub24tb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcCBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgb2JqW3BdID0gc291cmNlW3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG5cbi8vIHJlZHVjZSBidWZmZXIgc2l6ZSwgYXZvaWRpbmcgbWVtIGNvcHlcbmV4cG9ydHMuc2hyaW5rQnVmID0gZnVuY3Rpb24gKGJ1Ziwgc2l6ZSkge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gc2l6ZSkgeyByZXR1cm4gYnVmOyB9XG4gIGlmIChidWYuc3ViYXJyYXkpIHsgcmV0dXJuIGJ1Zi5zdWJhcnJheSgwLCBzaXplKTsgfVxuICBidWYubGVuZ3RoID0gc2l6ZTtcbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxudmFyIGZuVHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBpZiAoc3JjLnN1YmFycmF5ICYmIGRlc3Quc3ViYXJyYXkpIHtcbiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNfb2Zmcywgc3JjX29mZnMgKyBsZW4pLCBkZXN0X29mZnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBvcmRpbmFyeSBhcnJheVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHZhciBpLCBsLCBsZW4sIHBvcywgY2h1bmssIHJlc3VsdDtcblxuICAgIC8vIGNhbGN1bGF0ZSBkYXRhIGxlbmd0aFxuICAgIGxlbiA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGxlbiArPSBjaHVua3NbaV0ubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIGpvaW4gY2h1bmtzXG4gICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICBwb3MgPSAwO1xuICAgIGZvciAoaSA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjaHVuayA9IGNodW5rc1tpXTtcbiAgICAgIHJlc3VsdC5zZXQoY2h1bmssIHBvcyk7XG4gICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBmblVudHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gICAgfVxuICB9LFxuICAvLyBKb2luIGFycmF5IG9mIGNodW5rcyB0byBzaW5nbGUgYXJyYXkuXG4gIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uIChjaHVua3MpIHtcbiAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBjaHVua3MpO1xuICB9XG59O1xuXG5cbi8vIEVuYWJsZS9EaXNhYmxlIHR5cGVkIGFycmF5cyB1c2UsIGZvciB0ZXN0aW5nXG4vL1xuZXhwb3J0cy5zZXRUeXBlZCA9IGZ1bmN0aW9uIChvbikge1xuICBpZiAob24pIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gVWludDhBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjE2ID0gVWludDE2QXJyYXk7XG4gICAgZXhwb3J0cy5CdWYzMiA9IEludDMyQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5UeXBlZCk7XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5CdWY4ICA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5VbnR5cGVkKTtcbiAgfVxufTtcblxuZXhwb3J0cy5zZXRUeXBlZChUWVBFRF9PSyk7XG4iLCIvLyBTdHJpbmcgZW5jb2RlL2RlY29kZSBoZWxwZXJzXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxuXG4vLyBRdWljayBjaGVjayBpZiB3ZSBjYW4gdXNlIGZhc3QgYXJyYXkgdG8gYmluIHN0cmluZyBjb252ZXJzaW9uXG4vL1xuLy8gLSBhcHBseShBcnJheSkgY2FuIGZhaWwgb24gQW5kcm9pZCAyLjJcbi8vIC0gYXBwbHkoVWludDhBcnJheSkgY2FuIGZhaWwgb24gaU9TIDUuMSBTYWZhcnlcbi8vXG52YXIgU1RSX0FQUExZX09LID0gdHJ1ZTtcbnZhciBTVFJfQVBQTFlfVUlBX09LID0gdHJ1ZTtcblxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBbIDAgXSk7IH0gY2F0Y2ggKF9fKSB7IFNUUl9BUFBMWV9PSyA9IGZhbHNlOyB9XG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KDEpKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX1VJQV9PSyA9IGZhbHNlOyB9XG5cblxuLy8gVGFibGUgd2l0aCB1dGY4IGxlbmd0aHMgKGNhbGN1bGF0ZWQgYnkgZmlyc3QgYnl0ZSBvZiBzZXF1ZW5jZSlcbi8vIE5vdGUsIHRoYXQgNSAmIDYtYnl0ZSB2YWx1ZXMgYW5kIHNvbWUgNC1ieXRlIHZhbHVlcyBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGluIEpTLFxuLy8gYmVjYXVzZSBtYXggcG9zc2libGUgY29kZXBvaW50IGlzIDB4MTBmZmZmXG52YXIgX3V0ZjhsZW4gPSBuZXcgdXRpbHMuQnVmOCgyNTYpO1xuZm9yICh2YXIgcSA9IDA7IHEgPCAyNTY7IHErKykge1xuICBfdXRmOGxlbltxXSA9IChxID49IDI1MiA/IDYgOiBxID49IDI0OCA/IDUgOiBxID49IDI0MCA/IDQgOiBxID49IDIyNCA/IDMgOiBxID49IDE5MiA/IDIgOiAxKTtcbn1cbl91dGY4bGVuWzI1NF0gPSBfdXRmOGxlblsyNTRdID0gMTsgLy8gSW52YWxpZCBzZXF1ZW5jZSBzdGFydFxuXG5cbi8vIGNvbnZlcnQgc3RyaW5nIHRvIGFycmF5ICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgLy8gY291bnQgYmluYXJ5IHNpemVcbiAgZm9yIChtX3BvcyA9IDA7IG1fcG9zIDwgc3RyX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgYnVmX2xlbiArPSBjIDwgMHg4MCA/IDEgOiBjIDwgMHg4MDAgPyAyIDogYyA8IDB4MTAwMDAgPyAzIDogNDtcbiAgfVxuXG4gIC8vIGFsbG9jYXRlIGJ1ZmZlclxuICBidWYgPSBuZXcgdXRpbHMuQnVmOChidWZfbGVuKTtcblxuICAvLyBjb252ZXJ0XG4gIGZvciAoaSA9IDAsIG1fcG9zID0gMDsgaSA8IGJ1Zl9sZW47IG1fcG9zKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHtcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTtcbiAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgIG1fcG9zKys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgIGJ1ZltpKytdID0gYztcbiAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgLyogdHdvIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4QzAgfCAoYyA+Pj4gNik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIC8qIHRocmVlIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4RTAgfCAoYyA+Pj4gMTIpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhmMCB8IChjID4+PiAxOCk7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gMTIgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWY7XG59O1xuXG4vLyBIZWxwZXIgKHVzZWQgaW4gMiBwbGFjZXMpXG5mdW5jdGlvbiBidWYyYmluc3RyaW5nKGJ1ZiwgbGVuKSB7XG4gIC8vIHVzZSBmYWxsYmFjayBmb3IgYmlnIGFycmF5cyB0byBhdm9pZCBzdGFjayBvdmVyZmxvd1xuICBpZiAobGVuIDwgNjU1MzcpIHtcbiAgICBpZiAoKGJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfVUlBX09LKSB8fCAoIWJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfT0spKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB1dGlscy5zaHJpbmtCdWYoYnVmLCBsZW4pKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuLy8gQ29udmVydCBieXRlIGFycmF5IHRvIGJpbmFyeSBzdHJpbmdcbmV4cG9ydHMuYnVmMmJpbnN0cmluZyA9IGZ1bmN0aW9uIChidWYpIHtcbiAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcoYnVmLCBidWYubGVuZ3RoKTtcbn07XG5cblxuLy8gQ29udmVydCBiaW5hcnkgc3RyaW5nICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuYmluc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KHN0ci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnVmLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYnVmW2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxuLy8gY29udmVydCBhcnJheSB0byBzdHJpbmdcbmV4cG9ydHMuYnVmMnN0cmluZyA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgaSwgb3V0LCBjLCBjX2xlbjtcbiAgdmFyIGxlbiA9IG1heCB8fCBidWYubGVuZ3RoO1xuXG4gIC8vIFJlc2VydmUgbWF4IHBvc3NpYmxlIGxlbmd0aCAoMiB3b3JkcyBwZXIgY2hhcilcbiAgLy8gTkI6IGJ5IHVua25vd24gcmVhc29ucywgQXJyYXkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZm9yXG4gIC8vICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5IHRoYW4gVWludDE2QXJyYXkuXG4gIHZhciB1dGYxNmJ1ZiA9IG5ldyBBcnJheShsZW4gKiAyKTtcblxuICBmb3IgKG91dCA9IDAsIGkgPSAwOyBpIDwgbGVuOykge1xuICAgIGMgPSBidWZbaSsrXTtcbiAgICAvLyBxdWljayBwcm9jZXNzIGFzY2lpXG4gICAgaWYgKGMgPCAweDgwKSB7IHV0ZjE2YnVmW291dCsrXSA9IGM7IGNvbnRpbnVlOyB9XG5cbiAgICBjX2xlbiA9IF91dGY4bGVuW2NdO1xuICAgIC8vIHNraXAgNSAmIDYgYnl0ZSBjb2Rlc1xuICAgIGlmIChjX2xlbiA+IDQpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBpICs9IGNfbGVuIC0gMTsgY29udGludWU7IH1cblxuICAgIC8vIGFwcGx5IG1hc2sgb24gZmlyc3QgYnl0ZVxuICAgIGMgJj0gY19sZW4gPT09IDIgPyAweDFmIDogY19sZW4gPT09IDMgPyAweDBmIDogMHgwNztcbiAgICAvLyBqb2luIHRoZSByZXN0XG4gICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuKSB7XG4gICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTtcbiAgICAgIGNfbGVuLS07XG4gICAgfVxuXG4gICAgLy8gdGVybWluYXRlZCBieSBlbmQgb2Ygc3RyaW5nP1xuICAgIGlmIChjX2xlbiA+IDEpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBjb250aW51ZTsgfVxuXG4gICAgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSBjO1xuICAgIH0gZWxzZSB7XG4gICAgICBjIC09IDB4MTAwMDA7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGQ4MDAgfCAoKGMgPj4gMTApICYgMHgzZmYpO1xuICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkYzAwIHwgKGMgJiAweDNmZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcodXRmMTZidWYsIG91dCk7XG59O1xuXG5cbi8vIENhbGN1bGF0ZSBtYXggcG9zc2libGUgcG9zaXRpb24gaW4gdXRmOCBidWZmZXIsXG4vLyB0aGF0IHdpbGwgbm90IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlXG4vLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLlxuLy9cbi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheVxuLy8gbWF4ICAgLSBsZW5ndGggbGltaXQgKG1hbmRhdG9yeSk7XG5leHBvcnRzLnV0Zjhib3JkZXIgPSBmdW5jdGlvbiAoYnVmLCBtYXgpIHtcbiAgdmFyIHBvcztcblxuICBtYXggPSBtYXggfHwgYnVmLmxlbmd0aDtcbiAgaWYgKG1heCA+IGJ1Zi5sZW5ndGgpIHsgbWF4ID0gYnVmLmxlbmd0aDsgfVxuXG4gIC8vIGdvIGJhY2sgZnJvbSBsYXN0IHBvc2l0aW9uLCB1bnRpbCBzdGFydCBvZiBzZXF1ZW5jZSBmb3VuZFxuICBwb3MgPSBtYXggLSAxO1xuICB3aGlsZSAocG9zID49IDAgJiYgKGJ1Zltwb3NdICYgMHhDMCkgPT09IDB4ODApIHsgcG9zLS07IH1cblxuICAvLyBGdWNrdXAgLSB2ZXJ5IHNtYWxsIGFuZCBicm9rZW4gc2VxdWVuY2UsXG4gIC8vIHJldHVybiBtYXgsIGJlY2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LlxuICBpZiAocG9zIDwgMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgLy8gSWYgd2UgY2FtZSB0byBzdGFydCBvZiBidWZmZXIgLSB0aGF0IG1lYW5zIHZ1ZmZlciBpcyB0b28gc21hbGwsXG4gIC8vIHJldHVybiBtYXggdG9vLlxuICBpZiAocG9zID09PSAwKSB7IHJldHVybiBtYXg7IH1cblxuICByZXR1cm4gKHBvcyArIF91dGY4bGVuW2J1Zltwb3NdXSA+IG1heCkgPyBwb3MgOiBtYXg7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiBhZGxlcjMyIHRha2VzIDEyJSBmb3IgbGV2ZWwgMCBhbmQgMiUgZm9yIGxldmVsIDYuXG4vLyBJdCBkb2Vzbid0IHdvcnRoIHRvIG1ha2UgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25hIGFzIGluIG9yaWdpbmFsLlxuLy8gU21hbGwgc2l6ZSBpcyBwcmVmZXJhYmxlLlxuXG5mdW5jdGlvbiBhZGxlcjMyKGFkbGVyLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciBzMSA9IChhZGxlciAmIDB4ZmZmZikgfDAsXG4gICAgICBzMiA9ICgoYWRsZXIgPj4+IDE2KSAmIDB4ZmZmZikgfDAsXG4gICAgICBuID0gMDtcblxuICB3aGlsZSAobGVuICE9PSAwKSB7XG4gICAgLy8gU2V0IGxpbWl0IH4gdHdpY2UgbGVzcyB0aGFuIDU1NTIsIHRvIGtlZXBcbiAgICAvLyBzMiBpbiAzMS1iaXRzLCBiZWNhdXNlIHdlIGZvcmNlIHNpZ25lZCBpbnRzLlxuICAgIC8vIGluIG90aGVyIGNhc2UgJT0gd2lsbCBmYWlsLlxuICAgIG4gPSBsZW4gPiAyMDAwID8gMjAwMCA6IGxlbjtcbiAgICBsZW4gLT0gbjtcblxuICAgIGRvIHtcbiAgICAgIHMxID0gKHMxICsgYnVmW3BvcysrXSkgfDA7XG4gICAgICBzMiA9IChzMiArIHMxKSB8MDtcbiAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgczEgJT0gNjU1MjE7XG4gICAgczIgJT0gNjU1MjE7XG4gIH1cblxuICByZXR1cm4gKHMxIHwgKHMyIDw8IDE2KSkgfDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBhZGxlcjMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbiAgWl9OT19GTFVTSDogICAgICAgICAwLFxuICBaX1BBUlRJQUxfRkxVU0g6ICAgIDEsXG4gIFpfU1lOQ19GTFVTSDogICAgICAgMixcbiAgWl9GVUxMX0ZMVVNIOiAgICAgICAzLFxuICBaX0ZJTklTSDogICAgICAgICAgIDQsXG4gIFpfQkxPQ0s6ICAgICAgICAgICAgNSxcbiAgWl9UUkVFUzogICAgICAgICAgICA2LFxuXG4gIC8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAgKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gICovXG4gIFpfT0s6ICAgICAgICAgICAgICAgMCxcbiAgWl9TVFJFQU1fRU5EOiAgICAgICAxLFxuICBaX05FRURfRElDVDogICAgICAgIDIsXG4gIFpfRVJSTk86ICAgICAgICAgICAtMSxcbiAgWl9TVFJFQU1fRVJST1I6ICAgIC0yLFxuICBaX0RBVEFfRVJST1I6ICAgICAgLTMsXG4gIC8vWl9NRU1fRVJST1I6ICAgICAtNCxcbiAgWl9CVUZfRVJST1I6ICAgICAgIC01LFxuICAvL1pfVkVSU0lPTl9FUlJPUjogLTYsXG5cbiAgLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4gIFpfTk9fQ09NUFJFU1NJT046ICAgICAgICAgMCxcbiAgWl9CRVNUX1NQRUVEOiAgICAgICAgICAgICAxLFxuICBaX0JFU1RfQ09NUFJFU1NJT046ICAgICAgIDksXG4gIFpfREVGQVVMVF9DT01QUkVTU0lPTjogICAtMSxcblxuXG4gIFpfRklMVEVSRUQ6ICAgICAgICAgICAgICAgMSxcbiAgWl9IVUZGTUFOX09OTFk6ICAgICAgICAgICAyLFxuICBaX1JMRTogICAgICAgICAgICAgICAgICAgIDMsXG4gIFpfRklYRUQ6ICAgICAgICAgICAgICAgICAgNCxcbiAgWl9ERUZBVUxUX1NUUkFURUdZOiAgICAgICAwLFxuXG4gIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbiAgWl9CSU5BUlk6ICAgICAgICAgICAgICAgICAwLFxuICBaX1RFWFQ6ICAgICAgICAgICAgICAgICAgIDEsXG4gIC8vWl9BU0NJSTogICAgICAgICAgICAgICAgMSwgLy8gPSBaX1RFWFQgKGRlcHJlY2F0ZWQpXG4gIFpfVU5LTk9XTjogICAgICAgICAgICAgICAgMixcblxuICAvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbiAgWl9ERUZMQVRFRDogICAgICAgICAgICAgICA4XG4gIC8vWl9OVUxMOiAgICAgICAgICAgICAgICAgbnVsbCAvLyBVc2UgLTEgb3IgbnVsbCBpbmxpbmUsIGRlcGVuZGluZyBvbiB2YXIgdHlwZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogd2UgY2FuJ3QgZ2V0IHNpZ25pZmljYW50IHNwZWVkIGJvb3N0IGhlcmUuXG4vLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzXG4vLyBhbmQgYXJyYXkgdG9vbHMgZGVwZW5kZW5jaWVzLlxuXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgMjU2OyBuKyspIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykge1xuICAgICAgYyA9ICgoYyAmIDEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciB0ID0gY3JjVGFibGUsXG4gICAgICBlbmQgPSBwb3MgKyBsZW47XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjcmMzMjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciB0cmVlcyAgID0gcmVxdWlyZSgnLi90cmVlcycpO1xudmFyIGFkbGVyMzIgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIG1zZyAgICAgPSByZXF1aXJlKCcuL21lc3NhZ2VzJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xudmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xuLy92YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG4vL3ZhciBaX05FRURfRElDVCAgICAgPSAyO1xuLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7XG52YXIgWl9TVFJFQU1fRVJST1IgID0gLTI7XG52YXIgWl9EQVRBX0VSUk9SICAgID0gLTM7XG4vL3ZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG5cbi8qIGNvbXByZXNzaW9uIGxldmVscyAqL1xuLy92YXIgWl9OT19DT01QUkVTU0lPTiAgICAgID0gMDtcbi8vdmFyIFpfQkVTVF9TUEVFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0JFU1RfQ09NUFJFU1NJT04gICAgPSA5O1xudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG5cbnZhciBaX0ZJTFRFUkVEICAgICAgICAgICAgPSAxO1xudmFyIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7XG52YXIgWl9STEUgICAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbi8vdmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG4vL3ZhciBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy92YXIgWl9BU0NJSSAgICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgTUFYX01FTV9MRVZFTCA9IDk7XG4vKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi9cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9NRU1fTEVWRUwgPSA4O1xuXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG52YXIgTF9DT0RFUyAgICAgICA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUztcbi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xudmFyIEhFQVBfU0laRSAgICAgPSAyICogTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xudmFyIE1BWF9CSVRTICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBNSU5fTUFUQ0ggPSAzO1xudmFyIE1BWF9NQVRDSCA9IDI1ODtcbnZhciBNSU5fTE9PS0FIRUFEID0gKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpO1xuXG52YXIgUFJFU0VUX0RJQ1QgPSAweDIwO1xuXG52YXIgSU5JVF9TVEFURSA9IDQyO1xudmFyIEVYVFJBX1NUQVRFID0gNjk7XG52YXIgTkFNRV9TVEFURSA9IDczO1xudmFyIENPTU1FTlRfU1RBVEUgPSA5MTtcbnZhciBIQ1JDX1NUQVRFID0gMTAzO1xudmFyIEJVU1lfU1RBVEUgPSAxMTM7XG52YXIgRklOSVNIX1NUQVRFID0gNjY2O1xuXG52YXIgQlNfTkVFRF9NT1JFICAgICAgPSAxOyAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi9cbnZhciBCU19CTE9DS19ET05FICAgICA9IDI7IC8qIGJsb2NrIGZsdXNoIHBlcmZvcm1lZCAqL1xudmFyIEJTX0ZJTklTSF9TVEFSVEVEID0gMzsgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi9cbnZhciBCU19GSU5JU0hfRE9ORSAgICA9IDQ7IC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi9cblxudmFyIE9TX0NPREUgPSAweDAzOyAvLyBVbml4IDopIC4gRG9uJ3QgZGV0ZWN0LCB1c2UgdGhpcyBkZWZhdWx0LlxuXG5mdW5jdGlvbiBlcnIoc3RybSwgZXJyb3JDb2RlKSB7XG4gIHN0cm0ubXNnID0gbXNnW2Vycm9yQ29kZV07XG4gIHJldHVybiBlcnJvckNvZGU7XG59XG5cbmZ1bmN0aW9uIHJhbmsoZikge1xuICByZXR1cm4gKChmKSA8PCAxKSAtICgoZikgPiA0ID8gOSA6IDApO1xufVxuXG5mdW5jdGlvbiB6ZXJvKGJ1ZikgeyB2YXIgbGVuID0gYnVmLmxlbmd0aDsgd2hpbGUgKC0tbGVuID49IDApIHsgYnVmW2xlbl0gPSAwOyB9IH1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzXG4gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0XG4gKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+b3V0cHV0IGJ1ZmZlciBhbmQgY29weWluZyBpbnRvIGl0LlxuICogKFNlZSBhbHNvIHJlYWRfYnVmKCkpLlxuICovXG5mdW5jdGlvbiBmbHVzaF9wZW5kaW5nKHN0cm0pIHtcbiAgdmFyIHMgPSBzdHJtLnN0YXRlO1xuXG4gIC8vX3RyX2ZsdXNoX2JpdHMocyk7XG4gIHZhciBsZW4gPSBzLnBlbmRpbmc7XG4gIGlmIChsZW4gPiBzdHJtLmF2YWlsX291dCkge1xuICAgIGxlbiA9IHN0cm0uYXZhaWxfb3V0O1xuICB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHMucGVuZGluZ19idWYsIHMucGVuZGluZ19vdXQsIGxlbiwgc3RybS5uZXh0X291dCk7XG4gIHN0cm0ubmV4dF9vdXQgKz0gbGVuO1xuICBzLnBlbmRpbmdfb3V0ICs9IGxlbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gbGVuO1xuICBzdHJtLmF2YWlsX291dCAtPSBsZW47XG4gIHMucGVuZGluZyAtPSBsZW47XG4gIGlmIChzLnBlbmRpbmcgPT09IDApIHtcbiAgICBzLnBlbmRpbmdfb3V0ID0gMDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocywgbGFzdCkge1xuICB0cmVlcy5fdHJfZmx1c2hfYmxvY2socywgKHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSksIHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0LCBsYXN0KTtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIGZsdXNoX3BlbmRpbmcocy5zdHJtKTtcbn1cblxuXG5mdW5jdGlvbiBwdXRfYnl0ZShzLCBiKSB7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci5cbiAqIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzdGF0ZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpblxuICogcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIHB1dFNob3J0TVNCKHMsIGIpIHtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7XG4vLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKGIgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiICYgMHhmZjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLCB1cGRhdGUgdGhlIGFkbGVyMzJcbiAqIGFuZCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIEFsbCBkZWZsYXRlKCkgaW5wdXQgZ29lcyB0aHJvdWdoXG4gKiB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdCB0byBhdm9pZFxuICogYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPmlucHV0IGJ1ZmZlciBhbmQgY29weWluZyBmcm9tIGl0LlxuICogKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRfYnVmKHN0cm0sIGJ1Ziwgc3RhcnQsIHNpemUpIHtcbiAgdmFyIGxlbiA9IHN0cm0uYXZhaWxfaW47XG5cbiAgaWYgKGxlbiA+IHNpemUpIHsgbGVuID0gc2l6ZTsgfVxuICBpZiAobGVuID09PSAwKSB7IHJldHVybiAwOyB9XG5cbiAgc3RybS5hdmFpbF9pbiAtPSBsZW47XG5cbiAgLy8gem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7XG4gIHV0aWxzLmFycmF5U2V0KGJ1Ziwgc3RybS5pbnB1dCwgc3RybS5uZXh0X2luLCBsZW4sIHN0YXJ0KTtcbiAgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMSkge1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBlbHNlIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDIpIHtcbiAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiArPSBsZW47XG4gIHN0cm0udG90YWxfaW4gKz0gbGVuO1xuXG4gIHJldHVybiBsZW47XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmRcbiAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCxcbiAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXNcbiAqIGdhcmJhZ2UuXG4gKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50XG4gKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLlxuICovXG5mdW5jdGlvbiBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkge1xuICB2YXIgY2hhaW5fbGVuZ3RoID0gcy5tYXhfY2hhaW5fbGVuZ3RoOyAgICAgIC8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqL1xuICB2YXIgc2NhbiA9IHMuc3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovXG4gIHZhciBtYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi9cbiAgdmFyIGJlc3RfbGVuID0gcy5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqL1xuICB2YXIgbmljZV9tYXRjaCA9IHMubmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqL1xuICB2YXIgbGltaXQgPSAocy5zdHJzdGFydCA+IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSA/XG4gICAgICBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwLypOSUwqLztcblxuICB2YXIgX3dpbiA9IHMud2luZG93OyAvLyBzaG9ydGN1dFxuXG4gIHZhciB3bWFzayA9IHMud19tYXNrO1xuICB2YXIgcHJldiAgPSBzLnByZXY7XG5cbiAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSxcbiAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC5cbiAgICovXG5cbiAgdmFyIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gIHZhciBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgdmFyIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG5cbiAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuXG4gICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICAvLyBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgXCJDb2RlIHRvbyBjbGV2ZXJcIik7XG5cbiAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi9cbiAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7XG4gICAgY2hhaW5fbGVuZ3RoID4+PSAyO1xuICB9XG4gIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnlcbiAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuXG4gICAqL1xuICBpZiAobmljZV9tYXRjaCA+IHMubG9va2FoZWFkKSB7IG5pY2VfbWF0Y2ggPSBzLmxvb2thaGVhZDsgfVxuXG4gIC8vIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsIFwibmVlZCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIC8vIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgXCJubyBmdXR1cmVcIik7XG4gICAgbWF0Y2ggPSBjdXJfbWF0Y2g7XG5cbiAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2VcbiAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyLiAgTm90ZSB0aGF0IHRoZSBjaGVja3MgYmVsb3dcbiAgICAgKiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IG9jY3VyIG9jY2FzaW9uYWxseSBmb3IgcGVyZm9ybWFuY2VcbiAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZFxuICAgICAqIGNvbmRpdGlvbmFsIGp1bXBzIHdpbGwgYmUgbWFkZSB0aGF0IGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMuXG4gICAgICogSG93ZXZlciB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBsaW1pdGVkIHRvIHRoZSBsb29rYWhlYWQsIHNvXG4gICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuXG4gICAgICovXG5cbiAgICBpZiAoX3dpblttYXRjaCArIGJlc3RfbGVuXSAgICAgIT09IHNjYW5fZW5kICB8fFxuICAgICAgICBfd2luW21hdGNoICsgYmVzdF9sZW4gLSAxXSAhPT0gc2Nhbl9lbmQxIHx8XG4gICAgICAgIF93aW5bbWF0Y2hdICAgICAgICAgICAgICAgICE9PSBfd2luW3NjYW5dIHx8XG4gICAgICAgIF93aW5bKyttYXRjaF0gICAgICAgICAgICAgICE9PSBfd2luW3NjYW4gKyAxXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGVcbiAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKVxuICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5XG4gICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdFxuICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LlxuICAgICAqL1xuICAgIHNjYW4gKz0gMjtcbiAgICBtYXRjaCsrO1xuICAgIC8vIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsIFwibWF0Y2hbMl0/XCIpO1xuXG4gICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjtcbiAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC5cbiAgICAgKi9cbiAgICBkbyB7XG4gICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICB9IHdoaWxlIChfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG5cbiAgICAvLyBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG5cbiAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDtcblxuICAgIGlmIChsZW4gPiBiZXN0X2xlbikge1xuICAgICAgcy5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDtcbiAgICAgIGJlc3RfbGVuID0gbGVuO1xuICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc2Nhbl9lbmQxICA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gICAgICBzY2FuX2VuZCAgID0gX3dpbltzY2FuICsgYmVzdF9sZW5dO1xuICAgIH1cbiAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0ICYmIC0tY2hhaW5fbGVuZ3RoICE9PSAwKTtcblxuICBpZiAoYmVzdF9sZW4gPD0gcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gYmVzdF9sZW47XG4gIH1cbiAgcmV0dXJuIHMubG9va2FoZWFkO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC5cbiAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC5cbiAqXG4gKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQURcbiAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFEXG4gKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmVcbiAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sXG4gKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS5cbiAqL1xuZnVuY3Rpb24gZmlsbF93aW5kb3cocykge1xuICB2YXIgX3dfc2l6ZSA9IHMud19zaXplO1xuICB2YXIgcCwgbiwgbSwgbW9yZSwgc3RyO1xuXG4gIC8vQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsIFwiYWxyZWFkeSBlbm91Z2ggbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICBtb3JlID0gcy53aW5kb3dfc2l6ZSAtIHMubG9va2FoZWFkIC0gcy5zdHJzdGFydDtcblxuICAgIC8vIEpTIGludHMgaGF2ZSAzMiBiaXQsIGJsb2NrIGJlbG93IG5vdCBuZWVkZWRcbiAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqL1xuICAgIC8vaWYgKHNpemVvZihpbnQpIDw9IDIpIHtcbiAgICAvLyAgICBpZiAobW9yZSA9PSAwICYmIHMtPnN0cnN0YXJ0ID09IDAgJiYgcy0+bG9va2FoZWFkID09IDApIHtcbiAgICAvLyAgICAgICAgbW9yZSA9IHdzaXplO1xuICAgIC8vXG4gICAgLy8gIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkge1xuICAgIC8vICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWZcbiAgICAvLyAgICAgICAgICogc3Ryc3RhcnQgPT0gMCAmJiBsb29rYWhlYWQgPT0gMSAoaW5wdXQgZG9uZSBhIGJ5dGUgYXQgdGltZSlcbiAgICAvLyAgICAgICAgICovXG4gICAgLy8gICAgICAgIG1vcmUtLTtcbiAgICAvLyAgICB9XG4gICAgLy99XG5cblxuICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsXG4gICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCA+PSBfd19zaXplICsgKF93X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuXG4gICAgICB1dGlscy5hcnJheVNldChzLndpbmRvdywgcy53aW5kb3csIF93X3NpemUsIF93X3NpemUsIDApO1xuICAgICAgcy5tYXRjaF9zdGFydCAtPSBfd19zaXplO1xuICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplO1xuICAgICAgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi9cbiAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTtcblxuICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzXG4gICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDBcbiAgICAgICB0byBrZWVwIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RlbnQgaWYgd2Ugc3dpdGNoIGJhY2sgdG8gbGV2ZWwgPiAwXG4gICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mXG4gICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLilcbiAgICAgICAqL1xuXG4gICAgICBuID0gcy5oYXNoX3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMuaGVhZFstLXBdO1xuICAgICAgICBzLmhlYWRbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG4gPSBfd19zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLnByZXZbLS1wXTtcbiAgICAgICAgcy5wcmV2W3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0XG4gICAgICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuXG4gICAgICAgICAqL1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbW9yZSArPSBfd19zaXplO1xuICAgIH1cbiAgICBpZiAocy5zdHJtLmF2YWlsX2luID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzpcbiAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJlxuICAgICAqICAgIG1vcmUgPT0gd2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydFxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKVxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMlxuICAgICAqIEluIHRoZSBCSUdfTUVNIG9yIE1NQVAgY2FzZSAobm90IHlldCBzdXBwb3J0ZWQpLFxuICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmXG4gICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC5cbiAgICAgKiBPdGhlcndpc2UsIHdpbmRvd19zaXplID09IDIqV1NJWkUgc28gbW9yZSA+PSAyLlxuICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi5cbiAgICAgKi9cbiAgICAvL0Fzc2VydChtb3JlID49IDIsIFwibW9yZSA8IDJcIik7XG4gICAgbiA9IHJlYWRfYnVmKHMuc3RybSwgcy53aW5kb3csIHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCwgbW9yZSk7XG4gICAgcy5sb29rYWhlYWQgKz0gbjtcblxuICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0ID49IE1JTl9NQVRDSCkge1xuICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0O1xuICAgICAgcy5pbnNfaCA9IHMud2luZG93W3N0cl07XG5cbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgMV0pICYgcy5oYXNoX21hc2s7XG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgIENhbGwgdXBkYXRlX2hhc2goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgd2hpbGUgKHMuaW5zZXJ0KSB7XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgICBzdHIrKztcbiAgICAgICAgcy5pbnNlcnQtLTtcbiAgICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPCBNSU5fTUFUQ0gpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsXG4gICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLlxuICAgICAqL1xuXG4gIH0gd2hpbGUgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLnN0cm0uYXZhaWxfaW4gIT09IDApO1xuXG4gIC8qIElmIHRoZSBXSU5fSU5JVCBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgaGF2ZSBuZXZlciBiZWVuXG4gICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZlxuICAgKiB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgKG9yIHVuaW5pdGlhbGlzZWQgYXMgSnVsaWFuIHdyaXRlcykgYnl0ZXMgYnlcbiAgICogdGhlIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMuICBVcGRhdGUgdGhlIGhpZ2ggd2F0ZXIgbWFyayBmb3IgdGhlIG5leHRcbiAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAqIHJvdXRpbmVzIGFsbG93IHNjYW5uaW5nIHRvIHN0cnN0YXJ0ICsgTUFYX01BVENILCBpZ25vcmluZyBsb29rYWhlYWQuXG4gICAqL1xuLy8gIGlmIChzLmhpZ2hfd2F0ZXIgPCBzLndpbmRvd19zaXplKSB7XG4vLyAgICB2YXIgY3VyciA9IHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZDtcbi8vICAgIHZhciBpbml0ID0gMDtcbi8vXG4vLyAgICBpZiAocy5oaWdoX3dhdGVyIDwgY3Vycikge1xuLy8gICAgICAvKiBQcmV2aW91cyBoaWdoIHdhdGVyIG1hcmsgYmVsb3cgY3VycmVudCBkYXRhIC0tIHplcm8gV0lOX0lOSVRcbi8vICAgICAgICogYnl0ZXMgb3IgdXAgdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gcy53aW5kb3dfc2l6ZSAtIGN1cnI7XG4vLyAgICAgIGlmIChpbml0ID4gV0lOX0lOSVQpXG4vLyAgICAgICAgaW5pdCA9IFdJTl9JTklUO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBjdXJyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgPSBjdXJyICsgaW5pdDtcbi8vICAgIH1cbi8vICAgIGVsc2UgaWYgKHMtPmhpZ2hfd2F0ZXIgPCAodWxnKWN1cnIgKyBXSU5fSU5JVCkge1xuLy8gICAgICAvKiBIaWdoIHdhdGVyIG1hcmsgYXQgb3IgYWJvdmUgY3VycmVudCBkYXRhLCBidXQgYmVsb3cgY3VycmVudCBkYXRhXG4vLyAgICAgICAqIHBsdXMgV0lOX0lOSVQgLS0gemVybyBvdXQgdG8gY3VycmVudCBkYXRhIHBsdXMgV0lOX0lOSVQsIG9yIHVwXG4vLyAgICAgICAqIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLlxuLy8gICAgICAgKi9cbi8vICAgICAgaW5pdCA9ICh1bGcpY3VyciArIFdJTl9JTklUIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgaWYgKGluaXQgPiBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXIpXG4vLyAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgcy0+aGlnaF93YXRlciwgKHVuc2lnbmVkKWluaXQpO1xuLy8gICAgICBzLT5oaWdoX3dhdGVyICs9IGluaXQ7XG4vLyAgICB9XG4vLyAgfVxuLy9cbi8vICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQsXG4vLyAgICBcIm5vdCBlbm91Z2ggcm9vbSBmb3Igc2VhcmNoXCIpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuXG4gKiB0aGUgY3VycmVudCBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IHNpbmNlXG4gKiB1bmNvbXByZXNzaWJsZSBkYXRhIGlzIHByb2JhYmx5IG5vdCB1c2VmdWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZFxuICogb25seSBmb3IgdGhlIGxldmVsPTAgY29tcHJlc3Npb24gb3B0aW9uLlxuICogTk9URTogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGF2b2lkIGV4dHJhIGNvcHlpbmcgZnJvbVxuICogd2luZG93IHRvIHBlbmRpbmdfYnVmLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3N0b3JlZChzLCBmbHVzaCkge1xuICAvKiBTdG9yZWQgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDB4ZmZmZiBieXRlcywgcGVuZGluZ19idWYgaXMgbGltaXRlZFxuICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjpcbiAgICovXG4gIHZhciBtYXhfYmxvY2tfc2l6ZSA9IDB4ZmZmZjtcblxuICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7XG4gICAgbWF4X2Jsb2NrX3NpemUgPSBzLnBlbmRpbmdfYnVmX3NpemUgLSA1O1xuICB9XG5cbiAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IDEpIHtcblxuICAgICAgLy9Bc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHxcbiAgICAgIC8vICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsIFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIGlmICghKHMuc3Ryc3RhcnQgPCBzLndfc2l6ZSArIChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHx8XG4vLyAgICAgICAgcy5ibG9ja19zdGFydCA+PSBzLndfc2l6ZSkpIHtcbi8vICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIH1cblxuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDAgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cblxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG4gICAgLy9Bc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsIFwiYmxvY2sgZ29uZVwiKTtcbi8vICAgIGlmIChzLmJsb2NrX3N0YXJ0IDwgMCkgdGhyb3cgbmV3IEVycm9yKFwiYmxvY2sgZ29uZVwiKTtcblxuICAgIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7XG4gICAgcy5sb29rYWhlYWQgPSAwO1xuXG4gICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovXG4gICAgdmFyIG1heF9zdGFydCA9IHMuYmxvY2tfc3RhcnQgKyBtYXhfYmxvY2tfc2l6ZTtcblxuICAgIGlmIChzLnN0cnN0YXJ0ID09PSAwIHx8IHMuc3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7XG4gICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqL1xuICAgICAgcy5sb29rYWhlYWQgPSBzLnN0cnN0YXJ0IC0gbWF4X3N0YXJ0O1xuICAgICAgcy5zdHJzdGFydCA9IG1heF9zdGFydDtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG5cblxuICAgIH1cbiAgICAvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWVcbiAgICAgKiBuZWdhdGl2ZSBhbmQgdGhlIGRhdGEgd2lsbCBiZSBnb25lOlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCA+PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cblxuICBzLmluc2VydCA9IDA7XG5cbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG5cbiAgaWYgKHMuc3Ryc3RhcnQgPiBzLmJsb2NrX3N0YXJ0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX05FRURfTU9SRTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wcmVzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSBjdXJyZW50XG4gKiBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBhbmQgaW5zZXJ0c1xuICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0cmluZ3Mgb3IgZm9yIHNob3J0XG4gKiBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfZmFzdChzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgLyogaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlXG4gICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSFxuICAgICAqL1xuICAgIGlmIChoYXNoX2hlYWQgIT09IDAvKk5JTCovICYmICgocy5zdHJzdGFydCAtIGhhc2hfaGVhZCkgPD0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cbiAgICB9XG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy8gY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGgpOyAvLyBmb3IgZGVidWcgb25seVxuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcblxuICAgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgICogaXMgbm90IHRvbyBsYXJnZS4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IHMubWF4X2xhenlfbWF0Y2gvKm1heF9pbnNlcnRfbGVuZ3RoKi8gJiYgcy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmVcbiAgICAgICAgICAgKiBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLlxuICAgICAgICAgICAqL1xuICAgICAgICB9IHdoaWxlICgtLXMubWF0Y2hfbGVuZ3RoICE9PSAwKTtcbiAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgfSBlbHNlXG4gICAgICB7XG4gICAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICAgICAgcy5pbnNfaCA9IHMud2luZG93W3Muc3Ryc3RhcnRdO1xuICAgICAgICAvKiBVUERBVEVfSEFTSChzLCBzLmluc19oLCBzLndpbmRvd1tzLnN0cnN0YXJ0KzFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICAgIC8qIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90XG4gICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMud2luZG93W3Muc3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gKChzLnN0cnN0YXJ0IDwgKE1JTl9NQVRDSCAtIDEpKSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxKTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenlcbiAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXNcbiAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgICAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIHZhciBtYXhfaW5zZXJ0O1xuXG4gIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICovXG4gICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoO1xuICAgIHMucHJldl9tYXRjaCA9IHMubWF0Y2hfc3RhcnQ7XG4gICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgcy5wcmV2X2xlbmd0aCA8IHMubWF4X2xhenlfbWF0Y2ggJiZcbiAgICAgICAgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKS8qTUFYX0RJU1QocykqLykge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG5cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSA1ICYmXG4gICAgICAgICAocy5zdHJhdGVneSA9PT0gWl9GSUxURVJFRCB8fCAocy5tYXRjaF9sZW5ndGggPT09IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCA+IDQwOTYvKlRPT19GQVIqLykpKSB7XG5cbiAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZVxuICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LlxuICAgICAgICAgKi9cbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBhdCB0aGUgcHJldmlvdXMgc3RlcCBhbmQgdGhlIGN1cnJlbnRcbiAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOlxuICAgICAqL1xuICAgIGlmIChzLnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLm1hdGNoX2xlbmd0aCA8PSBzLnByZXZfbGVuZ3RoKSB7XG4gICAgICBtYXhfaW5zZXJ0ID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkIC0gTUlOX01BVENIO1xuICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovXG5cbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydC0xLCBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGgpO1xuXG4gICAgICAvKioqX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7XG4gICAgICAvKiBJbnNlcnQgaW4gaGFzaCB0YWJsZSBhbGwgc3RyaW5ncyB1cCB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaC5cbiAgICAgICAqIHN0cnN0YXJ0LTEgYW5kIHN0cnN0YXJ0IGFyZSBhbHJlYWR5IGluc2VydGVkLiBJZiB0aGVyZSBpcyBub3RcbiAgICAgICAqIGVub3VnaCBsb29rYWhlYWQsIHRoZSBsYXN0IHR3byBzdHJpbmdzIGFyZSBub3QgaW5zZXJ0ZWQgaW5cbiAgICAgICAqIHRoZSBoYXNoIHRhYmxlLlxuICAgICAgICovXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLnByZXZfbGVuZ3RoIC0gMTtcbiAgICAgIHMucHJldl9sZW5ndGggLT0gMjtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKCsrcy5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICgtLXMucHJldl9sZW5ndGggIT09IDApO1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuXG4gICAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgICAgfVxuICAgICAgICAvKioqL1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkge1xuICAgICAgLyogSWYgdGhlcmUgd2FzIG5vIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvbiwgb3V0cHV0IGFcbiAgICAgICAqIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2hcbiAgICAgICAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhlIHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuXG4gICAgICAgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DS19PTkxZKHMsIDApICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIC8qKiovXG4gICAgICB9XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvclxuICAgICAgICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChmbHVzaCAhPSBaX05PX0ZMVVNILCBcIm5vIGZsdXNoP1wiKTtcbiAgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pO1xuXG4gICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICB9XG4gIHMuaW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSCAtIDEgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGb3IgWl9STEUsIHNpbXBseSBsb29rIGZvciBydW5zIG9mIGJ5dGVzLCBnZW5lcmF0ZSBtYXRjaGVzIG9ubHkgb2YgZGlzdGFuY2VcbiAqIG9uZS4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuICAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZlxuICogZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gWl9STEUuKVxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3JsZShzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuICB2YXIgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovXG4gIHZhciBzY2FuLCBzdHJlbmQ7ICAgICAgLyogc2NhbiBnb2VzIHVwIHRvIHN0cmVuZCBmb3IgbGVuZ3RoIG9mIHJ1biAqL1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7XG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBsb25nZXN0IHJ1biwgcGx1cyBvbmUgZm9yIHRoZSB1bnJvbGxlZCBsb29wLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8PSBNQVhfTUFUQ0gpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0ID4gMCkge1xuICAgICAgc2NhbiA9IHMuc3Ryc3RhcnQgLSAxO1xuICAgICAgcHJldiA9IF93aW5bc2Nhbl07XG4gICAgICBpZiAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0pIHtcbiAgICAgICAgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgICAgICB9IHdoaWxlIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID4gcy5sb29rYWhlYWQpIHtcbiAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IHMubG9va2FoZWFkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL0Fzc2VydChzY2FuIDw9IHMtPndpbmRvdysodUludCkocy0+d2luZG93X3NpemUtMSksIFwid2lsZCBzY2FuXCIpO1xuICAgIH1cblxuICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBlbWl0IGxpdGVyYWwgKi9cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMuc3Ryc3RhcnQgLSAxLCBzLm1hdGNoX2xlbmd0aCk7XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3QocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gMDtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX0hVRkZNQU5fT05MWSwgZG8gbm90IGxvb2sgZm9yIG1hdGNoZXMuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLlxuICogKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2YgZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gSHVmZm1hbi4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfaHVmZihzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGxpdGVyYWwgdG8gd3JpdGUuICovXG4gICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogT3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG4gICAgcy5sb29rYWhlYWQtLTtcbiAgICBzLnN0cnN0YXJ0Kys7XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvblxuICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvXG4gKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmVcbiAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy5cbiAqL1xuZnVuY3Rpb24gQ29uZmlnKGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbiwgZnVuYykge1xuICB0aGlzLmdvb2RfbGVuZ3RoID0gZ29vZF9sZW5ndGg7XG4gIHRoaXMubWF4X2xhenkgPSBtYXhfbGF6eTtcbiAgdGhpcy5uaWNlX2xlbmd0aCA9IG5pY2VfbGVuZ3RoO1xuICB0aGlzLm1heF9jaGFpbiA9IG1heF9jaGFpbjtcbiAgdGhpcy5mdW5jID0gZnVuYztcbn1cblxudmFyIGNvbmZpZ3VyYXRpb25fdGFibGU7XG5cbmNvbmZpZ3VyYXRpb25fdGFibGUgPSBbXG4gIC8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi9cbiAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksICAgICAgICAgIC8qIDAgc3RvcmUgb25seSAqL1xuICBuZXcgQ29uZmlnKDQsIDQsIDgsIDQsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAgLyogMSBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAgLyogMiAqL1xuICBuZXcgQ29uZmlnKDQsIDYsIDMyLCAzMiwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgLyogMyAqL1xuXG4gIG5ldyBDb25maWcoNCwgNCwgMTYsIDE2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAgICAvKiA0IGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAzMiwgMzIsIGRlZmxhdGVfc2xvdyksICAgICAgICAgLyogNSAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNiAqL1xuICBuZXcgQ29uZmlnKDgsIDMyLCAxMjgsIDI1NiwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNyAqL1xuICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwgICAgLyogOCAqL1xuICBuZXcgQ29uZmlnKDMyLCAyNTgsIDI1OCwgNDA5NiwgZGVmbGF0ZV9zbG93KSAgICAgLyogOSBtYXggY29tcHJlc3Npb24gKi9cbl07XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSBcImxvbmdlc3QgbWF0Y2hcIiByb3V0aW5lcyBmb3IgYSBuZXcgemxpYiBzdHJlYW1cbiAqL1xuZnVuY3Rpb24gbG1faW5pdChzKSB7XG4gIHMud2luZG93X3NpemUgPSAyICogcy53X3NpemU7XG5cbiAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOlxuICAgKi9cbiAgcy5tYXhfbGF6eV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2xhenk7XG4gIHMuZ29vZF9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZ29vZF9sZW5ndGg7XG4gIHMubmljZV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubmljZV9sZW5ndGg7XG4gIHMubWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2NoYWluO1xuXG4gIHMuc3Ryc3RhcnQgPSAwO1xuICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLmluc2VydCA9IDA7XG4gIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgcy5pbnNfaCA9IDA7XG59XG5cblxuZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCkge1xuICB0aGlzLnN0cm0gPSBudWxsOyAgICAgICAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovXG4gIHRoaXMuc3RhdHVzID0gMDsgICAgICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovXG4gIHRoaXMucGVuZGluZ19idWYgPSBudWxsOyAgICAgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovXG4gIHRoaXMucGVuZGluZ19idWZfc2l6ZSA9IDA7ICAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovXG4gIHRoaXMucGVuZGluZ19vdXQgPSAwOyAgICAgICAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqL1xuICB0aGlzLnBlbmRpbmcgPSAwOyAgICAgICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuZ3poZWFkID0gbnVsbDsgICAgICAgICAvKiBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiB0byB3cml0ZSAqL1xuICB0aGlzLmd6aW5kZXggPSAwOyAgICAgICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi9cbiAgdGhpcy5tZXRob2QgPSBaX0RFRkxBVEVEOyAvKiBjYW4gb25seSBiZSBERUZMQVRFRCAqL1xuICB0aGlzLmxhc3RfZmx1c2ggPSAtMTsgICAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovXG5cbiAgdGhpcy53X3NpemUgPSAwOyAgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovXG4gIHRoaXMud19iaXRzID0gMDsgIC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqL1xuICB0aGlzLndfbWFzayA9IDA7ICAvKiB3X3NpemUgLSAxICovXG5cbiAgdGhpcy53aW5kb3cgPSBudWxsO1xuICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdyxcbiAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemVcbiAgICogYnl0ZXMuIFdpdGggdGhpcyBvcmdhbml6YXRpb24sIG1hdGNoZXMgYXJlIGxpbWl0ZWQgdG8gYSBkaXN0YW5jZSBvZlxuICAgKiB3U2l6ZS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXNcbiAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuXG4gICAqL1xuXG4gIHRoaXMud2luZG93X3NpemUgPSAwO1xuICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlclxuICAgKiBpcyBkaXJlY3RseSB1c2VkIGFzIHNsaWRpbmcgd2luZG93LlxuICAgKi9cblxuICB0aGlzLnByZXYgPSBudWxsO1xuICAvKiBMaW5rIHRvIG9sZGVyIHN0cmluZyB3aXRoIHNhbWUgaGFzaCBpbmRleC4gVG8gbGltaXQgdGhlIHNpemUgb2YgdGhpc1xuICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLlxuICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy5cbiAgICovXG5cbiAgdGhpcy5oZWFkID0gbnVsbDsgICAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqL1xuXG4gIHRoaXMuaW5zX2ggPSAwOyAgICAgICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqL1xuICB0aGlzLmhhc2hfc2l6ZSA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi9cbiAgdGhpcy5oYXNoX2JpdHMgPSAwOyAgIC8qIGxvZzIoaGFzaF9zaXplKSAqL1xuICB0aGlzLmhhc2hfbWFzayA9IDA7ICAgLyogaGFzaF9zaXplLTEgKi9cblxuICB0aGlzLmhhc2hfc2hpZnQgPSAwO1xuICAvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dFxuICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3RcbiAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6XG4gICAqICAgaGFzaF9zaGlmdCAqIE1JTl9NQVRDSCA+PSBoYXNoX2JpdHNcbiAgICovXG5cbiAgdGhpcy5ibG9ja19zdGFydCA9IDA7XG4gIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0c1xuICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLlxuICAgKi9cblxuICB0aGlzLm1hdGNoX2xlbmd0aCA9IDA7ICAgICAgLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi9cbiAgdGhpcy5wcmV2X21hdGNoID0gMDsgICAgICAgIC8qIHByZXZpb3VzIG1hdGNoICovXG4gIHRoaXMubWF0Y2hfYXZhaWxhYmxlID0gMDsgICAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovXG4gIHRoaXMuc3Ryc3RhcnQgPSAwOyAgICAgICAgICAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovXG4gIHRoaXMubWF0Y2hfc3RhcnQgPSAwOyAgICAgICAvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi9cbiAgdGhpcy5sb29rYWhlYWQgPSAwOyAgICAgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi9cblxuICB0aGlzLnByZXZfbGVuZ3RoID0gMDtcbiAgLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzXG4gICAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLlxuICAgKi9cblxuICB0aGlzLm1heF9jaGFpbl9sZW5ndGggPSAwO1xuICAvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpc1xuICAgKiBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlXG4gICAqIHNwZWVkLlxuICAgKi9cblxuICB0aGlzLm1heF9sYXp5X21hdGNoID0gMDtcbiAgLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseVxuICAgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvblxuICAgKiBsZXZlbHMgPj0gNC5cbiAgICovXG4gIC8vIFRoYXQncyBhbGlhcyB0byBtYXhfbGF6eV9tYXRjaCwgZG9uJ3QgdXNlIGRpcmVjdGx5XG4gIC8vdGhpcy5tYXhfaW5zZXJ0X2xlbmd0aCA9IDA7XG4gIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90XG4gICAqIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy5cbiAgICovXG5cbiAgdGhpcy5sZXZlbCA9IDA7ICAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAoMS4uOSkgKi9cbiAgdGhpcy5zdHJhdGVneSA9IDA7ICAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovXG5cbiAgdGhpcy5nb29kX21hdGNoID0gMDtcbiAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovXG5cbiAgdGhpcy5uaWNlX21hdGNoID0gMDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqL1xuXG4gICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi9cblxuICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5nICovXG5cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fbHRyZWVbSEVBUF9TSVpFXTsgICAvKiBsaXRlcmFsIGFuZCBsZW5ndGggdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovXG5cbiAgLy8gVXNlIGZsYXQgYXJyYXkgb2YgRE9VQkxFIHNpemUsIHdpdGggaW50ZXJsZWF2ZWQgZmF0YSxcbiAgLy8gYmVjYXVzZSBKUyBkb2VzIG5vdCBzdXBwb3J0IGVmZmVjdGl2ZVxuICB0aGlzLmR5bl9sdHJlZSAgPSBuZXcgdXRpbHMuQnVmMTYoSEVBUF9TSVpFICogMik7XG4gIHRoaXMuZHluX2R0cmVlICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIERfQ09ERVMgKyAxKSAqIDIpO1xuICB0aGlzLmJsX3RyZWUgICAgPSBuZXcgdXRpbHMuQnVmMTYoKDIgKiBCTF9DT0RFUyArIDEpICogMik7XG4gIHplcm8odGhpcy5keW5fbHRyZWUpO1xuICB6ZXJvKHRoaXMuZHluX2R0cmVlKTtcbiAgemVybyh0aGlzLmJsX3RyZWUpO1xuXG4gIHRoaXMubF9kZXNjICAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi9cbiAgdGhpcy5kX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi9cbiAgdGhpcy5ibF9kZXNjICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGJpdCBsZW5ndGggdHJlZSAqL1xuXG4gIC8vdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdO1xuICB0aGlzLmJsX2NvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWF9CSVRTICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vaW50IGhlYXBbMipMX0NPREVTKzFdOyAgICAgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB0aGlzLmhlYXAgPSBuZXcgdXRpbHMuQnVmMTYoMiAqIExfQ09ERVMgKyAxKTsgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB6ZXJvKHRoaXMuaGVhcCk7XG5cbiAgdGhpcy5oZWFwX2xlbiA9IDA7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovXG4gIHRoaXMuaGVhcF9tYXggPSAwOyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi9cbiAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy5cbiAgICovXG5cbiAgdGhpcy5kZXB0aCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAvL3VjaCBkZXB0aFsyKkxfQ09ERVMrMV07XG4gIHplcm8odGhpcy5kZXB0aCk7XG4gIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3lcbiAgICovXG5cbiAgdGhpcy5sX2J1ZiA9IDA7ICAgICAgICAgIC8qIGJ1ZmZlciBpbmRleCBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqL1xuXG4gIHRoaXMubGl0X2J1ZnNpemUgPSAwO1xuICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yXG4gICAqIGxpbWl0aW5nIGxpdF9idWZzaXplIHRvIDY0SzpcbiAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVyc1xuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0XG4gICAqICAgICBkYXRhIGlzIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlblxuICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3JcbiAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKVxuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW5cbiAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS5cbiAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLlxuICAgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0XG4gICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yXG4gICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnlcbiAgICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlXG4gICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmdcbiAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS5cbiAgICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNFxuICAgKi9cblxuICB0aGlzLmxhc3RfbGl0ID0gMDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG5cbiAgdGhpcy5kX2J1ZiA9IDA7XG4gIC8qIEJ1ZmZlciBpbmRleCBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmVcbiAgICogdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUbyB1c2UgZGlmZmVyZW50IGxlbmd0aHMsIGFuIGV4dHJhIGZsYWdcbiAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LlxuICAgKi9cblxuICB0aGlzLm9wdF9sZW4gPSAwOyAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovXG4gIHRoaXMuc3RhdGljX2xlbiA9IDA7ICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqL1xuICB0aGlzLm1hdGNoZXMgPSAwOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqL1xuICB0aGlzLmluc2VydCA9IDA7ICAgICAgICAvKiBieXRlcyBhdCBlbmQgb2Ygd2luZG93IGxlZnQgdG8gaW5zZXJ0ICovXG5cblxuICB0aGlzLmJpX2J1ZiA9IDA7XG4gIC8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0XG4gICAqIHNpZ25pZmljYW50IGJpdHMpLlxuICAgKi9cbiAgdGhpcy5iaV92YWxpZCA9IDA7XG4gIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdFxuICAgKiBhcmUgYWx3YXlzIHplcm8uXG4gICAqL1xuXG4gIC8vIFVzZWQgZm9yIHdpbmRvdyBtZW1vcnkgaW5pdC4gV2Ugc2FmZWx5IGlnbm9yZSBpdCBmb3IgSlMuIFRoYXQgbWFrZXNcbiAgLy8gc2Vuc2Ugb25seSBmb3IgcG9pbnRlcnMgYW5kIG1lbW9yeSBjaGVjayB0b29scy5cbiAgLy90aGlzLmhpZ2hfd2F0ZXIgPSAwO1xuICAvKiBIaWdoIHdhdGVyIG1hcmsgb2Zmc2V0IGluIHdpbmRvdyBmb3IgaW5pdGlhbGl6ZWQgYnl0ZXMgLS0gYnl0ZXMgYWJvdmVcbiAgICogdGhpcyBhcmUgc2V0IHRvIHplcm8gaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHdhcm5pbmdzIHdoZW5cbiAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZW5cbiAgICogdXBkYXRlZCB0byB0aGUgbmV3IGhpZ2ggd2F0ZXIgbWFyay5cbiAgICovXG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gMDtcbiAgc3RybS5kYXRhX3R5cGUgPSBaX1VOS05PV047XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHMucGVuZGluZyA9IDA7XG4gIHMucGVuZGluZ19vdXQgPSAwO1xuXG4gIGlmIChzLndyYXAgPCAwKSB7XG4gICAgcy53cmFwID0gLXMud3JhcDtcbiAgICAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqL1xuICB9XG4gIHMuc3RhdHVzID0gKHMud3JhcCA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFKTtcbiAgc3RybS5hZGxlciA9IChzLndyYXAgPT09IDIpID9cbiAgICAwICAvLyBjcmMzMigwLCBaX05VTEwsIDApXG4gIDpcbiAgICAxOyAvLyBhZGxlcjMyKDAsIFpfTlVMTCwgMClcbiAgcy5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSDtcbiAgdHJlZXMuX3RyX2luaXQocyk7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciByZXQgPSBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuICBpZiAocmV0ID09PSBaX09LKSB7XG4gICAgbG1faW5pdChzdHJtLnN0YXRlKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVTZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIGlmIChzdHJtLnN0YXRlLndyYXAgIT09IDIpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0cm0uc3RhdGUuZ3poZWFkID0gaGVhZDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkge1xuICBpZiAoIXN0cm0pIHsgLy8gPT09IFpfTlVMTFxuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICB2YXIgd3JhcCA9IDE7XG5cbiAgaWYgKGxldmVsID09PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIHtcbiAgICBsZXZlbCA9IDY7XG4gIH1cblxuICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovXG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAod2luZG93Qml0cyA+IDE1KSB7XG4gICAgd3JhcCA9IDI7ICAgICAgICAgICAvKiB3cml0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCAqL1xuICAgIHdpbmRvd0JpdHMgLT0gMTY7XG4gIH1cblxuXG4gIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPT0gWl9ERUZMQVRFRCB8fFxuICAgIHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8XG4gICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cblxuICBpZiAod2luZG93Qml0cyA9PT0gOCkge1xuICAgIHdpbmRvd0JpdHMgPSA5O1xuICB9XG4gIC8qIHVudGlsIDI1Ni1ieXRlIHdpbmRvdyBidWcgZml4ZWQgKi9cblxuICB2YXIgcyA9IG5ldyBEZWZsYXRlU3RhdGUoKTtcblxuICBzdHJtLnN0YXRlID0gcztcbiAgcy5zdHJtID0gc3RybTtcblxuICBzLndyYXAgPSB3cmFwO1xuICBzLmd6aGVhZCA9IG51bGw7XG4gIHMud19iaXRzID0gd2luZG93Qml0cztcbiAgcy53X3NpemUgPSAxIDw8IHMud19iaXRzO1xuICBzLndfbWFzayA9IHMud19zaXplIC0gMTtcblxuICBzLmhhc2hfYml0cyA9IG1lbUxldmVsICsgNztcbiAgcy5oYXNoX3NpemUgPSAxIDw8IHMuaGFzaF9iaXRzO1xuICBzLmhhc2hfbWFzayA9IHMuaGFzaF9zaXplIC0gMTtcbiAgcy5oYXNoX3NoaWZ0ID0gfn4oKHMuaGFzaF9iaXRzICsgTUlOX01BVENIIC0gMSkgLyBNSU5fTUFUQ0gpO1xuXG4gIHMud2luZG93ID0gbmV3IHV0aWxzLkJ1Zjgocy53X3NpemUgKiAyKTtcbiAgcy5oZWFkID0gbmV3IHV0aWxzLkJ1ZjE2KHMuaGFzaF9zaXplKTtcbiAgcy5wcmV2ID0gbmV3IHV0aWxzLkJ1ZjE2KHMud19zaXplKTtcblxuICAvLyBEb24ndCBuZWVkIG1lbSBpbml0IG1hZ2ljIGZvciBKUy5cbiAgLy9zLmhpZ2hfd2F0ZXIgPSAwOyAgLyogbm90aGluZyB3cml0dGVuIHRvIHMtPndpbmRvdyB5ZXQgKi9cblxuICBzLmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi9cblxuICBzLnBlbmRpbmdfYnVmX3NpemUgPSBzLmxpdF9idWZzaXplICogNDtcblxuICAvL292ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpO1xuICAvL3MtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTtcbiAgcy5wZW5kaW5nX2J1ZiA9IG5ldyB1dGlscy5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSk7XG5cbiAgLy8gSXQgaXMgb2Zmc2V0IGZyb20gYHMucGVuZGluZ19idWZgIChzaXplIGlzIGBzLmxpdF9idWZzaXplICogMmApXG4gIC8vcy0+ZF9idWYgPSBvdmVybGF5ICsgcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7XG4gIHMuZF9idWYgPSAxICogcy5saXRfYnVmc2l6ZTtcblxuICAvL3MtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7XG4gIHMubF9idWYgPSAoMSArIDIpICogcy5saXRfYnVmc2l6ZTtcblxuICBzLmxldmVsID0gbGV2ZWw7XG4gIHMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgcy5tZXRob2QgPSBtZXRob2Q7XG5cbiAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIHtcbiAgcmV0dXJuIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgWl9ERUZMQVRFRCwgTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kpO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIG9sZF9mbHVzaCwgcztcbiAgdmFyIGJlZywgdmFsOyAvLyBmb3IgZ3ppcCBoZWFkZXIgd3JpdGUgb25seVxuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fFxuICAgIGZsdXNoID4gWl9CTE9DSyB8fCBmbHVzaCA8IDApIHtcbiAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUikgOiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuXG4gIGlmICghc3RybS5vdXRwdXQgfHxcbiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB8fFxuICAgICAgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT09IFpfRklOSVNIKSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IFpfQlVGX0VSUk9SIDogWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgcy5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovXG4gIG9sZF9mbHVzaCA9IHMubGFzdF9mbHVzaDtcbiAgcy5sYXN0X2ZsdXNoID0gZmx1c2g7XG5cbiAgLyogV3JpdGUgdGhlIGhlYWRlciAqL1xuICBpZiAocy5zdGF0dXMgPT09IElOSVRfU1RBVEUpIHtcblxuICAgIGlmIChzLndyYXAgPT09IDIpIHsgLy8gR1pJUCBoZWFkZXJcbiAgICAgIHN0cm0uYWRsZXIgPSAwOyAgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgIHB1dF9ieXRlKHMsIDMxKTtcbiAgICAgIHB1dF9ieXRlKHMsIDEzOSk7XG4gICAgICBwdXRfYnl0ZShzLCA4KTtcbiAgICAgIGlmICghcy5nemhlYWQpIHsgLy8gcy0+Z3poZWFkID09IFpfTlVMTFxuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGV4dCA/IDEgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzLmd6aGVhZC5oY3JjID8gMiA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5leHRyYSA/IDAgOiA0KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQubmFtZSA/IDAgOiA4KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQuY29tbWVudCA/IDAgOiAxNilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDgpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDE2KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAyNCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5vcyAmIDB4ZmYpO1xuICAgICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZik7XG4gICAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZywgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBFWFRSQV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSAvLyBERUZMQVRFIGhlYWRlclxuICAgIHtcbiAgICAgIHZhciBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy53X2JpdHMgLSA4KSA8PCA0KSkgPDwgODtcbiAgICAgIHZhciBsZXZlbF9mbGFncyA9IC0xO1xuXG4gICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPCA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA9PT0gNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDM7XG4gICAgICB9XG4gICAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpO1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHsgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOyB9XG4gICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpO1xuXG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpO1xuXG4gICAgICAvKiBTYXZlIHRoZSBhZGxlcjMyIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeTogKi9cbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gMTsgLy8gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTtcbiAgICB9XG4gIH1cblxuLy8jaWZkZWYgR1pJUFxuICBpZiAocy5zdGF0dXMgPT09IEVYVFJBX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmV4dHJhLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cblxuICAgICAgd2hpbGUgKHMuZ3ppbmRleCA8IChzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmZmYpKSB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmFbcy5nemluZGV4XSAmIDB4ZmYpO1xuICAgICAgICBzLmd6aW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3ppbmRleCA9PT0gcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gTkFNRV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5uYW1lLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBDT01NRU5UX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmNvbW1lbnQvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5jb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgaWYgKHMucGVuZGluZyArIDIgPiBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyIDw9IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgICAgIHN0cm0uYWRsZXIgPSAwOyAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgIH1cbiAgfVxuLy8jZW5kaWZcblxuICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovXG4gIGlmIChzLnBlbmRpbmcgIT09IDApIHtcbiAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aFxuICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmRcbiAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLFxuICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2VcbiAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZTpcbiAgICAgICAqL1xuICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICByZXR1cm4gWl9PSztcbiAgICB9XG5cbiAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmVcbiAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcFxuICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi5cbiAgICAgKi9cbiAgfSBlbHNlIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHJhbmsoZmx1c2gpIDw9IHJhbmsob2xkX2ZsdXNoKSAmJlxuICAgIGZsdXNoICE9PSBaX0ZJTklTSCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogVXNlciBtdXN0IG5vdCBwcm92aWRlIG1vcmUgaW5wdXQgYWZ0ZXIgdGhlIGZpcnN0IEZJTklTSDogKi9cbiAgaWYgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLlxuICAgKi9cbiAgaWYgKHN0cm0uYXZhaWxfaW4gIT09IDAgfHwgcy5sb29rYWhlYWQgIT09IDAgfHxcbiAgICAoZmx1c2ggIT09IFpfTk9fRkxVU0ggJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkpIHtcbiAgICB2YXIgYnN0YXRlID0gKHMuc3RyYXRlZ3kgPT09IFpfSFVGRk1BTl9PTkxZKSA/IGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgOlxuICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfUkxFID8gZGVmbGF0ZV9ybGUocywgZmx1c2gpIDpcbiAgICAgICAgY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5mdW5jKHMsIGZsdXNoKSk7XG5cbiAgICBpZiAoYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9ET05FKSB7XG4gICAgICBzLnN0YXR1cyA9IEZJTklTSF9TVEFURTtcbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfTkVFRF9NT1JFIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQpIHtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgICAgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICB9XG4gICAgICByZXR1cm4gWl9PSztcbiAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGxcbiAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlXG4gICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW5cbiAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvXG4gICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3RcbiAgICAgICAqIG9uZSBlbXB0eSBibG9jay5cbiAgICAgICAqL1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19CTE9DS19ET05FKSB7XG4gICAgICBpZiAoZmx1c2ggPT09IFpfUEFSVElBTF9GTFVTSCkge1xuICAgICAgICB0cmVlcy5fdHJfYWxpZ24ocyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChmbHVzaCAhPT0gWl9CTE9DSykgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi9cblxuICAgICAgICB0cmVlcy5fdHJfc3RvcmVkX2Jsb2NrKHMsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWRcbiAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZsYXRlX3N5bmMoKS5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9GVUxMX0ZMVVNIKSB7XG4gICAgICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovICAgICAgICAgICAgIC8qIGZvcmdldCBoaXN0b3J5ICovXG4gICAgICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5pbnNlcnQgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICAgIHJldHVybiBaX09LO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL0Fzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCBcImJ1ZzJcIik7XG4gIC8vaWYgKHN0cm0uYXZhaWxfb3V0IDw9IDApIHsgdGhyb3cgbmV3IEVycm9yKFwiYnVnMlwiKTt9XG5cbiAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCkgeyByZXR1cm4gWl9PSzsgfVxuICBpZiAocy53cmFwIDw9IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VORDsgfVxuXG4gIC8qIFdyaXRlIHRoZSB0cmFpbGVyICovXG4gIGlmIChzLndyYXAgPT09IDIpIHtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAyNCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLnRvdGFsX2luICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAyNCkgJiAweGZmKTtcbiAgfVxuICBlbHNlXG4gIHtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gIH1cblxuICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAvKiBJZiBhdmFpbF9vdXQgaXMgemVybywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCBkZWZsYXRlIGFnYWluXG4gICAqIHRvIGZsdXNoIHRoZSByZXN0LlxuICAgKi9cbiAgaWYgKHMud3JhcCA+IDApIHsgcy53cmFwID0gLXMud3JhcDsgfVxuICAvKiB3cml0ZSB0aGUgdHJhaWxlciBvbmx5IG9uY2UhICovXG4gIHJldHVybiBzLnBlbmRpbmcgIT09IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlRW5kKHN0cm0pIHtcbiAgdmFyIHN0YXR1cztcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSBJTklUX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBFWFRSQV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gTkFNRV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQ09NTUVOVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gSENSQ19TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQlVTWV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRklOSVNIX1NUQVRFXG4gICkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG5cbiAgcmV0dXJuIHN0YXR1cyA9PT0gQlVTWV9TVEFURSA/IGVycihzdHJtLCBaX0RBVEFfRVJST1IpIDogWl9PSztcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlXG4gKiBzZXF1ZW5jZSB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgcztcbiAgdmFyIHN0ciwgbjtcbiAgdmFyIHdyYXA7XG4gIHZhciBhdmFpbDtcbiAgdmFyIG5leHQ7XG4gIHZhciBpbnB1dDtcbiAgdmFyIHRtcERpY3Q7XG5cbiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzID0gc3RybS5zdGF0ZTtcbiAgd3JhcCA9IHMud3JhcDtcblxuICBpZiAod3JhcCA9PT0gMiB8fCAod3JhcCA9PT0gMSAmJiBzLnN0YXR1cyAhPT0gSU5JVF9TVEFURSkgfHwgcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiB3aGVuIHVzaW5nIHpsaWIgd3JhcHBlcnMsIGNvbXB1dGUgQWRsZXItMzIgZm9yIHByb3ZpZGVkIGRpY3Rpb25hcnkgKi9cbiAgaWYgKHdyYXAgPT09IDEpIHtcbiAgICAvKiBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBzdHJtLmFkbGVyID0gYWRsZXIzMihzdHJtLmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgfVxuXG4gIHMud3JhcCA9IDA7ICAgLyogYXZvaWQgY29tcHV0aW5nIEFkbGVyLTMyIGluIHJlYWRfYnVmICovXG5cbiAgLyogaWYgZGljdGlvbmFyeSB3b3VsZCBmaWxsIHdpbmRvdywganVzdCByZXBsYWNlIHRoZSBoaXN0b3J5ICovXG4gIGlmIChkaWN0TGVuZ3RoID49IHMud19zaXplKSB7XG4gICAgaWYgKHdyYXAgPT09IDApIHsgICAgICAgICAgICAvKiBhbHJlYWR5IGVtcHR5IG90aGVyd2lzZSAqL1xuICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG4gICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgcy5pbnNlcnQgPSAwO1xuICAgIH1cbiAgICAvKiB1c2UgdGhlIHRhaWwgKi9cbiAgICAvLyBkaWN0aW9uYXJ5ID0gZGljdGlvbmFyeS5zbGljZShkaWN0TGVuZ3RoIC0gcy53X3NpemUpO1xuICAgIHRtcERpY3QgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSk7XG4gICAgdXRpbHMuYXJyYXlTZXQodG1wRGljdCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCAtIHMud19zaXplLCBzLndfc2l6ZSwgMCk7XG4gICAgZGljdGlvbmFyeSA9IHRtcERpY3Q7XG4gICAgZGljdExlbmd0aCA9IHMud19zaXplO1xuICB9XG4gIC8qIGluc2VydCBkaWN0aW9uYXJ5IGludG8gd2luZG93IGFuZCBoYXNoICovXG4gIGF2YWlsID0gc3RybS5hdmFpbF9pbjtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBzdHJtLmF2YWlsX2luID0gZGljdExlbmd0aDtcbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5pbnB1dCA9IGRpY3Rpb25hcnk7XG4gIGZpbGxfd2luZG93KHMpO1xuICB3aGlsZSAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgc3RyID0gcy5zdHJzdGFydDtcbiAgICBuID0gcy5sb29rYWhlYWQgLSAoTUlOX01BVENIIC0gMSk7XG4gICAgZG8ge1xuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG5cbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjtcbiAgICAgIHN0cisrO1xuICAgIH0gd2hpbGUgKC0tbik7XG4gICAgcy5zdHJzdGFydCA9IHN0cjtcbiAgICBzLmxvb2thaGVhZCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgZmlsbF93aW5kb3cocyk7XG4gIH1cbiAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIHMuaW5zZXJ0ID0gcy5sb29rYWhlYWQ7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmlucHV0ID0gaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBhdmFpbDtcbiAgcy53cmFwID0gd3JhcDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZXhwb3J0cy5kZWZsYXRlSW5pdCA9IGRlZmxhdGVJbml0O1xuZXhwb3J0cy5kZWZsYXRlSW5pdDIgPSBkZWZsYXRlSW5pdDI7XG5leHBvcnRzLmRlZmxhdGVSZXNldCA9IGRlZmxhdGVSZXNldDtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0S2VlcCA9IGRlZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmRlZmxhdGVTZXRIZWFkZXIgPSBkZWZsYXRlU2V0SGVhZGVyO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZUVuZCA9IGRlZmxhdGVFbmQ7XG5leHBvcnRzLmRlZmxhdGVTZXREaWN0aW9uYXJ5ID0gZGVmbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmRlZmxhdGVJbmZvID0gJ3Bha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuZGVmbGF0ZUJvdW5kID0gZGVmbGF0ZUJvdW5kO1xuZXhwb3J0cy5kZWZsYXRlQ29weSA9IGRlZmxhdGVDb3B5O1xuZXhwb3J0cy5kZWZsYXRlUGFyYW1zID0gZGVmbGF0ZVBhcmFtcztcbmV4cG9ydHMuZGVmbGF0ZVBlbmRpbmcgPSBkZWZsYXRlUGVuZGluZztcbmV4cG9ydHMuZGVmbGF0ZVByaW1lID0gZGVmbGF0ZVByaW1lO1xuZXhwb3J0cy5kZWZsYXRlVHVuZSA9IGRlZmxhdGVUdW5lO1xuKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5mdW5jdGlvbiBHWmhlYWRlcigpIHtcbiAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqL1xuICB0aGlzLnRleHQgICAgICAgPSAwO1xuICAvKiBtb2RpZmljYXRpb24gdGltZSAqL1xuICB0aGlzLnRpbWUgICAgICAgPSAwO1xuICAvKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLnhmbGFncyAgICAgPSAwO1xuICAvKiBvcGVyYXRpbmcgc3lzdGVtICovXG4gIHRoaXMub3MgICAgICAgICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi9cbiAgdGhpcy5leHRyYSAgICAgID0gbnVsbDtcbiAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICh2YWxpZCBpZiBleHRyYSAhPSBaX05VTEwpICovXG4gIHRoaXMuZXh0cmFfbGVuICA9IDA7IC8vIEFjdHVhbGx5LCB3ZSBkb24ndCBuZWVkIGl0IGluIEpTLFxuICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbGVhdmUgZm9yIGZldyBjb2RlIG1vZGlmaWNhdGlvbnNcblxuICAvL1xuICAvLyBTZXR1cCBsaW1pdHMgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5XG4gIC8vIGZvciBpbmZsYXRlIHVzZSBjb25zdGFudCBsaW1pdCBpbiA2NTUzNiBieXRlc1xuICAvL1xuXG4gIC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMuZXh0cmFfbWF4ICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi9cbiAgdGhpcy5uYW1lICAgICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5uYW1lX21heCAgID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKi9cbiAgdGhpcy5jb21tZW50ICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5jb21tX21heCAgID0gMDtcbiAgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi9cbiAgdGhpcy5oY3JjICAgICAgID0gMDtcbiAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLmRvbmUgICAgICAgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHWmhlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gU2VlIHN0YXRlIGRlZnMgZnJvbSBpbmZsYXRlLmpzXG52YXIgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xuXG4vKlxuICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZ1xuICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzXG4gICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLlxuICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvclxuICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZVxuICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuXG5cbiAgIEVudHJ5IGFzc3VtcHRpb25zOlxuXG4gICAgICAgIHN0YXRlLm1vZGUgPT09IExFTlxuICAgICAgICBzdHJtLmF2YWlsX2luID49IDZcbiAgICAgICAgc3RybS5hdmFpbF9vdXQgPj0gMjU4XG4gICAgICAgIHN0YXJ0ID49IHN0cm0uYXZhaWxfb3V0XG4gICAgICAgIHN0YXRlLmJpdHMgPCA4XG5cbiAgIE9uIHJldHVybiwgc3RhdGUubW9kZSBpcyBvbmUgb2Y6XG5cbiAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0XG4gICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrXG4gICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhXG5cbiAgIE5vdGVzOlxuXG4gICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGVcbiAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLFxuICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy5cbiAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkXG4gICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLlxuXG4gICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4XG4gICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KClcbiAgICAgIHJlcXVpcmVzIHN0cm0uYXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvclxuICAgICAgb3V0cHV0IHNwYWNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkge1xuICB2YXIgc3RhdGU7XG4gIHZhciBfaW47ICAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmlucHV0ICovXG4gIHZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBoYXZlIGVub3VnaCBpbnB1dCB3aGlsZSBpbiA8IGxhc3QgKi9cbiAgdmFyIF9vdXQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBiZWc7ICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBvdXQgPCBlbmQsIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgKi9cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIHZhciBkbWF4OyAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gemxpYiBoZWFkZXIgKi9cbi8vI2VuZGlmXG4gIHZhciB3c2l6ZTsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdmFyIHdoYXZlOyAgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdmFyIHduZXh0OyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICAvLyBVc2UgYHNfd2luZG93YCBpbnN0ZWFkIGB3aW5kb3dgLCBhdm9pZCBjb25mbGljdCB3aXRoIGluc3RydW1lbnRhdGlvbiB0b29sc1xuICB2YXIgc193aW5kb3c7ICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovXG4gIHZhciBob2xkOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmhvbGQgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uYml0cyAqL1xuICB2YXIgbGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5sZW5jb2RlICovXG4gIHZhciBkY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmRpc3Rjb2RlICovXG4gIHZhciBsbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi9cbiAgdmFyIGRtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovXG4gIHZhciBoZXJlOyAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZWQgdGFibGUgZW50cnkgKi9cbiAgdmFyIG9wOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCwgdW51c2VkIGJ5dGVzICovXG4gIHZhciBkaXN0OyAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqL1xuICB2YXIgZnJvbTsgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovXG4gIHZhciBmcm9tX3NvdXJjZTtcblxuXG4gIHZhciBpbnB1dCwgb3V0cHV0OyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG5cbiAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi9cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICAvL2hlcmUgPSBzdGF0ZS5oZXJlO1xuICBfaW4gPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7XG4gIF9vdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTtcbiAgZW5kID0gX291dCArIChzdHJtLmF2YWlsX291dCAtIDI1Nyk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICBkbWF4ID0gc3RhdGUuZG1heDtcbi8vI2VuZGlmXG4gIHdzaXplID0gc3RhdGUud3NpemU7XG4gIHdoYXZlID0gc3RhdGUud2hhdmU7XG4gIHduZXh0ID0gc3RhdGUud25leHQ7XG4gIHNfd2luZG93ID0gc3RhdGUud2luZG93O1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIGxjb2RlID0gc3RhdGUubGVuY29kZTtcbiAgZGNvZGUgPSBzdGF0ZS5kaXN0Y29kZTtcbiAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7XG4gIGRtYXNrID0gKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMTtcblxuXG4gIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaFxuICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqL1xuXG4gIHRvcDpcbiAgZG8ge1xuICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgIH1cblxuICAgIGhlcmUgPSBsY29kZVtob2xkICYgbG1hc2tdO1xuXG4gICAgZG9sZW46XG4gICAgZm9yICg7OykgeyAvLyBHb3RvIGVtdWxhdGlvblxuICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICBob2xkID4+Pj0gb3A7XG4gICAgICBiaXRzIC09IG9wO1xuICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuICAgICAgaWYgKG9wID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIG91dHB1dFtfb3V0KytdID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqL1xuICAgICAgICBsZW4gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICBpZiAob3ApIHtcbiAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW4gKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBsZW4pKTtcbiAgICAgICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGhlcmUgPSBkY29kZVtob2xkICYgZG1hc2tdO1xuXG4gICAgICAgIGRvZGlzdDpcbiAgICAgICAgZm9yICg7OykgeyAvLyBnb3RvIGVtdWxhdGlvblxuICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcblxuICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi9cbiAgICAgICAgICAgIGRpc3QgPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgICAgIGlmIChkaXN0ID4gZG1heCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBkaXN0KSk7XG4gICAgICAgICAgICBvcCA9IF9vdXQgLSBiZWc7ICAgICAgICAgICAgICAgIC8qIG1heCBkaXN0YW5jZSBpbiBvdXRwdXQgKi9cbiAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgICAgICB9XG5cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gb3AgLSB3aGF2ZSkge1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgIGxlbiAtPSBvcCAtIHdoYXZlO1xuLy8gICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpO1xuLy8gICAgICAgICAgICAgICAgaWYgKG9wID09PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmcm9tID0gMDsgLy8gd2luZG93IGluZGV4XG4gICAgICAgICAgICAgIGZyb21fc291cmNlID0gc193aW5kb3c7XG4gICAgICAgICAgICAgIGlmICh3bmV4dCA9PT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24gY2FzZSAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHduZXh0IDwgb3ApIHsgICAgICAvKiB3cmFwIGFyb3VuZCB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gZW5kIG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSAwO1xuICAgICAgICAgICAgICAgICAgaWYgKHduZXh0IDwgbGVuKSB7ICAvKiBzb21lIGZyb20gc3RhcnQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICAgIG9wID0gd25leHQ7XG4gICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogY29udGlndW91cyBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgICAgIC8qIGNvcHkgZGlyZWN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGxlbmd0aCBpcyB0aHJlZSAqL1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTtcbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAvKiAybmQgbGV2ZWwgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICAgICAgaGVyZSA9IGRjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgICAgICBjb250aW51ZSBkb2Rpc3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgaGVyZSA9IGxjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgIGNvbnRpbnVlIGRvbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuXG4gICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgIH1cbiAgfSB3aGlsZSAoX2luIDwgbGFzdCAmJiBfb3V0IDwgZW5kKTtcblxuICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi9cbiAgbGVuID0gYml0cyA+PiAzO1xuICBfaW4gLT0gbGVuO1xuICBiaXRzIC09IGxlbiA8PCAzO1xuICBob2xkICY9ICgxIDw8IGJpdHMpIC0gMTtcblxuICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJldHVybiAqL1xuICBzdHJtLm5leHRfaW4gPSBfaW47XG4gIHN0cm0ubmV4dF9vdXQgPSBfb3V0O1xuICBzdHJtLmF2YWlsX2luID0gKF9pbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBfaW4pIDogNSAtIChfaW4gLSBsYXN0KSk7XG4gIHN0cm0uYXZhaWxfb3V0ID0gKF9vdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gX291dCkgOiAyNTcgLSAoX291dCAtIGVuZCkpO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIHJldHVybjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzICAgICAgICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciBhZGxlcjMyICAgICAgID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICAgICAgICA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciBpbmZsYXRlX2Zhc3QgID0gcmVxdWlyZSgnLi9pbmZmYXN0Jyk7XG52YXIgaW5mbGF0ZV90YWJsZSA9IHJlcXVpcmUoJy4vaW5mdHJlZXMnKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbi8vdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG4vL3ZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbi8vdmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xudmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbnZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cblxuLyogU1RBVEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyICAgIEhFQUQgPSAxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi9cbnZhciAgICBGTEFHUyA9IDI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi9cbnZhciAgICBUSU1FID0gMzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovXG52YXIgICAgT1MgPSA0OyAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqL1xudmFyICAgIEVYTEVOID0gNTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovXG52YXIgICAgRVhUUkEgPSA2OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqL1xudmFyICAgIE5BTUUgPSA3OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqL1xudmFyICAgIENPTU1FTlQgPSA4OyAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi9cbnZhciAgICBIQ1JDID0gOTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi9cbnZhciAgICBESUNUSUQgPSAxMDsgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqL1xudmFyICAgIERJQ1QgPSAxMTsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi9cbnZhciAgICAgICAgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cbnZhciAgICAgICAgVFlQRURPID0gMTM7ICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi9cbnZhciAgICAgICAgU1RPUkVEID0gMTQ7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG52YXIgICAgICAgIENPUFlfID0gMTU7ICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICBDT1BZID0gMTY7ICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi9cbnZhciAgICAgICAgVEFCTEUgPSAxNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBMRU5MRU5TID0gMTg7ICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgIENPREVMRU5TID0gMTk7ICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgICAgIExFTl8gPSAyMDsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICAgICAgTEVOID0gMjE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi9cbnZhciAgICAgICAgICAgIExFTkVYVCA9IDIyOyAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgRElTVCA9IDIzOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbnZhciAgICAgICAgICAgIERJU1RFWFQgPSAyNDsgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBNQVRDSCA9IDI1OyAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovXG52YXIgICAgICAgICAgICBMSVQgPSAyNjsgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbnZhciAgICBDSEVDSyA9IDI3OyAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovXG52YXIgICAgTEVOR1RIID0gMjg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovXG52YXIgICAgRE9ORSA9IDI5OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBNRU0gPSAzMTsgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBTWU5DID0gMzI7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7XG5cblxuZnVuY3Rpb24genN3YXAzMihxKSB7XG4gIHJldHVybiAgKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICAgICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAgICAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAgICAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufVxuXG5cbmZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5tb2RlID0gMDsgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7ICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi9cbiAgdGhpcy5mbGFncyA9IDA7ICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi9cbiAgdGhpcy5kbWF4ID0gMDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqL1xuXG4gIC8qIHNsaWRpbmcgd2luZG93ICovXG4gIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqL1xuICB0aGlzLndzaXplID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHRoaXMud2hhdmUgPSAwOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHRoaXMud25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdGhpcy53aW5kb3cgPSBudWxsOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7ICAgICAgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5iaXRzID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi9cbiAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmRpc3QgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG4gIHRoaXMuaGF2ZSA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyB1dGlscy5CdWYxNigzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyB1dGlscy5CdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuZHluID0gbnVsbDsgICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5kaXN0ZHluID0gbnVsbDsgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLnNhbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovXG4gIHRoaXMuYmFjayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi9cbiAgdGhpcy53YXMgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi9cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwO1xuICBzdHJtLm1zZyA9ICcnOyAvKlpfTlVMTCovXG4gIGlmIChzdGF0ZS53cmFwKSB7ICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi9cbiAgICBzdHJtLmFkbGVyID0gc3RhdGUud3JhcCAmIDE7XG4gIH1cbiAgc3RhdGUubW9kZSA9IEhFQUQ7XG4gIHN0YXRlLmxhc3QgPSAwO1xuICBzdGF0ZS5oYXZlZGljdCA9IDA7XG4gIHN0YXRlLmRtYXggPSAzMjc2ODtcbiAgc3RhdGUuaGVhZCA9IG51bGwvKlpfTlVMTCovO1xuICBzdGF0ZS5ob2xkID0gMDtcbiAgc3RhdGUuYml0cyA9IDA7XG4gIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9ESVNUUyk7XG5cbiAgc3RhdGUuc2FuZSA9IDE7XG4gIHN0YXRlLmJhY2sgPSAtMTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiByZXNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0YXRlLndzaXplID0gMDtcbiAgc3RhdGUud2hhdmUgPSAwO1xuICBzdGF0ZS53bmV4dCA9IDA7XG4gIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgd3JhcDtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGdldCB0aGUgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogZXh0cmFjdCB3cmFwIHJlcXVlc3QgZnJvbSB3aW5kb3dCaXRzIHBhcmFtZXRlciAqL1xuICBpZiAod2luZG93Qml0cyA8IDApIHtcbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgd3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTtcbiAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7XG4gICAgICB3aW5kb3dCaXRzICY9IDE1O1xuICAgIH1cbiAgfVxuXG4gIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqL1xuICBpZiAod2luZG93Qml0cyAmJiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHJldDtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgLy9zdHJtLm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovXG5cbiAgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7XG5cbiAgLy9pZiAoc3RhdGUgPT09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IGFsbG9jYXRlZFxcblwiKSk7XG4gIHN0cm0uc3RhdGUgPSBzdGF0ZTtcbiAgc3RhdGUud2luZG93ID0gbnVsbC8qWl9OVUxMKi87XG4gIHJldCA9IGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cyk7XG4gIGlmIChyZXQgIT09IFpfT0spIHtcbiAgICBzdHJtLnN0YXRlID0gbnVsbC8qWl9OVUxMKi87XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQoc3RybSkge1xuICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7XG59XG5cblxuLypcbiBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvXG4gZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLlxuIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGVcbiBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kXG4gdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW5cbiBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmVcbiB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luXG4gbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS5cbiAqL1xudmFyIHZpcmdpbiA9IHRydWU7XG5cbnZhciBsZW5maXgsIGRpc3RmaXg7IC8vIFdlIGhhdmUgbm8gcG9pbnRlcnMgaW4gSlMsIHNvIGtlZXAgdGFibGVzIHNlcGFyYXRlXG5cbmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7XG4gIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovXG4gIGlmICh2aXJnaW4pIHtcbiAgICB2YXIgc3ltO1xuXG4gICAgbGVuZml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyB1dGlscy5CdWYzMigzMik7XG5cbiAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gOTsgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cblxuICAgIGluZmxhdGVfdGFibGUoTEVOUywgIHN0YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAgIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTtcblxuICAgIC8qIGRpc3RhbmNlIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMzIpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA1OyB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgICBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7XG5cbiAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqL1xuICAgIHZpcmdpbiA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDtcbiAgc3RhdGUubGVuYml0cyA9IDk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gZGlzdGZpeDtcbiAgc3RhdGUuZGlzdGJpdHMgPSA1O1xufVxuXG5cbi8qXG4gVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZVxuIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWRcbiB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzXG4gaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LlxuIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5XG4gaXMgbG9hZGVkLlxuXG4gUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZFxuIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3dcbiB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZlxuIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci5cbiBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLlxuICovXG5mdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3JjLCBlbmQsIGNvcHkpIHtcbiAgdmFyIGRpc3Q7XG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqL1xuICBpZiAoc3RhdGUud2luZG93ID09PSBudWxsKSB7XG4gICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IDA7XG5cbiAgICBzdGF0ZS53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzdGF0ZS53c2l6ZSk7XG4gIH1cblxuICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi9cbiAgaWYgKGNvcHkgPj0gc3RhdGUud3NpemUpIHtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gc3RhdGUud3NpemUsIHN0YXRlLndzaXplLCAwKTtcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBkaXN0ID0gc3RhdGUud3NpemUgLSBzdGF0ZS53bmV4dDtcbiAgICBpZiAoZGlzdCA+IGNvcHkpIHtcbiAgICAgIGRpc3QgPSBjb3B5O1xuICAgIH1cbiAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7XG4gICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGRpc3QsIHN0YXRlLnduZXh0KTtcbiAgICBjb3B5IC09IGRpc3Q7XG4gICAgaWYgKGNvcHkpIHtcbiAgICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBjb3B5LCBjb3B5KTtcbiAgICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBjb3B5LCAwKTtcbiAgICAgIHN0YXRlLnduZXh0ID0gY29weTtcbiAgICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3RhdGUud25leHQgKz0gZGlzdDtcbiAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHsgc3RhdGUud25leHQgPSAwOyB9XG4gICAgICBpZiAoc3RhdGUud2hhdmUgPCBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53aGF2ZSArPSBkaXN0OyB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIGlucHV0LCBvdXRwdXQ7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBidWZmZXJzXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGlucHV0IElOREVYICovXG4gIHZhciBwdXQ7ICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG91dHB1dCBJTkRFWCAqL1xuICB2YXIgaGF2ZSwgbGVmdDsgICAgICAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqL1xuICB2YXIgX2luLCBfb3V0OyAgICAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgY29weTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuICB2YXIgaGVyZSA9IDA7ICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqL1xuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsgLy8gcGFrZWQgXCJoZXJlXCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgLy92YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovXG4gIHZhciBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOyAvLyBwYWtlZCBcImxhc3RcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqL1xuICB2YXIgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi9cbiAgdmFyIGhidWYgPSBuZXcgdXRpbHMuQnVmOCg0KTsgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi9cbiAgdmFyIG9wdHM7XG5cbiAgdmFyIG47IC8vIHRlbXBvcmFyeSB2YXIgZm9yIE5FRURfQklUU1xuXG4gIHZhciBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqL1xuICAgIFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdO1xuXG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgeyBzdGF0ZS5tb2RlID0gVFlQRURPOyB9ICAgIC8qIHNraXAgY2hlY2sgKi9cblxuXG4gIC8vLS0tIExPQUQoKSAtLS1cbiAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAvLy0tLVxuXG4gIF9pbiA9IGhhdmU7XG4gIF9vdXQgPSBsZWZ0O1xuICByZXQgPSBaX09LO1xuXG4gIGluZl9sZWF2ZTogLy8gZ290byBlbXVsYXRpb25cbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoc3RhdGUubW9kZSkge1xuICAgIGNhc2UgSEVBRDpcbiAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpO1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgJiYgaG9sZCA9PT0gMHg4YjFmKSB7ICAvKiBnemlwIGhlYWRlciAqL1xuICAgICAgICBzdGF0ZS5jaGVjayA9IDAvKmNyYzMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgLy89PT0vL1xuXG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRkxBR1M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZmxhZ3MgPSAwOyAgICAgICAgICAgLyogZXhwZWN0IHpsaWIgaGVhZGVyICovXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi9cbiAgICAgICAgKCgoaG9sZCAmIDB4ZmYpLypCSVRTKDgpKi8gPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgaGVhZGVyIGNoZWNrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICBiaXRzIC09IDQ7XG4gICAgICAvLy0tLS8vXG4gICAgICBsZW4gPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA4O1xuICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7XG4gICAgICAgIHN0YXRlLndiaXRzID0gbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUud2JpdHMpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCB3aW5kb3cgc2l6ZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuO1xuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXFxuXCIpKTtcbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgIHN0YXRlLm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBicmVhaztcbiAgICBjYXNlIEZMQUdTOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkO1xuICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweGUwMDApIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSAoKGhvbGQgPj4gOCkgJiAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUSU1FOlxuICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkM0KHN0YXRlLmNoZWNrLCBob2xkKVxuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBoYnVmWzJdID0gKGhvbGQgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhidWZbM10gPSAoaG9sZCA+Pj4gMjQpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgNCwgMCk7XG4gICAgICAgIC8vPT09XG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE9TOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICBzdGF0ZS5oZWFkLm9zID0gKGhvbGQgPj4gOCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIEVYTEVOOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkO1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbGVuID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbnVsbC8qWl9OVUxMKi87XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBFWFRSQTpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgLy8gVXNlIHVudHlwZWQgYXJyYXkgZm9yIG1vcmUgY29udmVuaWVuZCBwcm9jZXNzaW5nIGxhdGVyXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBuZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXRpbHMuYXJyYXlTZXQoXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsXG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCBpcyBsaW1pdGVkIHRvIDY1NTM2IGJ5dGVzXG4gICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgIGNvcHksXG4gICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovXG4gICAgICAgICAgICAgIGxlblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vem1lbWNweShzdGF0ZS5oZWFkLmV4dHJhICsgbGVuLCBuZXh0LFxuICAgICAgICAgICAgLy8gICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCA/XG4gICAgICAgICAgICAvLyAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gTkFNRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE5BTUU6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA4MDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLy8gVE9ETzogMiBvciAxIGJ5dGVzP1xuICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQubmFtZV9tYXgqLykpIHtcbiAgICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5uYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gQ09NTUVOVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPTU1FTlQ6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDEwMDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5jb21tX21heCovKSkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgSENSQzpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDB4ZmZmZikpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdoZWFkZXIgY3JjIG1pc21hdGNoJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gKChzdGF0ZS5mbGFncyA+PiA5KSAmIDEpO1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBESUNUSUQ6XG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSB6c3dhcDMyKGhvbGQpO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gRElDVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERJQ1Q6XG4gICAgICBpZiAoc3RhdGUuaGF2ZWRpY3QgPT09IDApIHtcbiAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgIC8vLS0tXG4gICAgICAgIHJldHVybiBaX05FRURfRElDVDtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgVFlQRTpcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9CTE9DSyB8fCBmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIFRZUEVETzpcbiAgICAgIGlmIChzdGF0ZS5sYXN0KSB7XG4gICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICBiaXRzIC09IGJpdHMgJiA3O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBDSEVDSztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLz09PSBORUVEQklUUygzKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubGFzdCA9IChob2xkICYgMHgwMSkvKkJJVFMoMSkqLztcbiAgICAgIC8vLS0tIERST1BCSVRTKDEpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gMTtcbiAgICAgIGJpdHMgLT0gMTtcbiAgICAgIC8vLS0tLy9cblxuICAgICAgc3dpdGNoICgoaG9sZCAmIDB4MDMpLypCSVRTKDIpKi8pIHtcbiAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkIGJsb2NrICovXG4gICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykge1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVEFCTEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJsb2NrIHR5cGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgfVxuICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgYml0cyAtPSAyO1xuICAgICAgLy8tLS0vL1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBTVE9SRUQ6XG4gICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi9cbiAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAvLy0tLS8vXG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9PSAoKGhvbGQgPj4+IDE2KSBeIDB4ZmZmZikpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3Rocyc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZCAmIDB4ZmZmZjtcbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxcblwiLFxuICAgICAgLy8gICAgICAgIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gQ09QWV87XG4gICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT1BZXzpcbiAgICAgIHN0YXRlLm1vZGUgPSBDT1BZO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgQ09QWTpcbiAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICBpZiAoY29weSkge1xuICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgIGlmIChjb3B5ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvLy0tLSB6bWVtY3B5KHB1dCwgbmV4dCwgY29weSk7IC0tLVxuICAgICAgICB1dGlscy5hcnJheVNldChvdXRwdXQsIGlucHV0LCBuZXh0LCBjb3B5LCBwdXQpO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgIHB1dCArPSBjb3B5O1xuICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcXG5cIikpO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFRBQkxFOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTQpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubmxlbiA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDI1NztcbiAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNTtcbiAgICAgIGJpdHMgLT0gNTtcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLm5kaXN0ID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMTtcbiAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNTtcbiAgICAgIGJpdHMgLT0gNTtcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgNDtcbiAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNDtcbiAgICAgIGJpdHMgLT0gNDtcbiAgICAgIC8vLS0tLy9cbi8vI2lmbmRlZiBQS1pJUF9CVUdfV09SS0FST1VORFxuICAgICAgaWYgKHN0YXRlLm5sZW4gPiAyODYgfHwgc3RhdGUubmRpc3QgPiAzMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICd0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuLy8jZW5kaWZcbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcXG5cIikpO1xuICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTkxFTlM6XG4gICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7XG4gICAgICAgIHN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV0gPSAwO1xuICAgICAgfVxuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICAgICAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcbiAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5bjtcbiAgICAgIHN0YXRlLmxlbmJpdHMgPSA3O1xuXG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS5sZW5zLCAwLCAxOSwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29kZSBsZW5ndGhzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcXG5cIikpO1xuICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gQ09ERUxFTlM7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT0RFTEVOUzpcbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGhlcmVfdmFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChoZXJlX3ZhbCA9PT0gMTYpIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDIpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDI7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxlbiA9IHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSAtIDFdO1xuICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDMpOy8vQklUUygyKTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaGVyZV92YWwgPT09IDE3KSB7XG4gICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTtcbiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzO1xuICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDcpOy8vQklUUygzKTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICAgIGJpdHMgLT0gMztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTtcbiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3O1xuICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgY29weSA9IDExICsgKGhvbGQgJiAweDdmKTsvL0JJVFMoNyk7XG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyg3KSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IDc7XG4gICAgICAgICAgICBiaXRzIC09IDc7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5oYXZlICsgY29weSA+IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlIChjb3B5LS0pIHtcbiAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGxlbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogaGFuZGxlIGVycm9yIGJyZWFrcyBpbiB3aGlsZSAqL1xuICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkgeyBicmVhazsgfVxuXG4gICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi9cbiAgICAgIGlmIChzdGF0ZS5sZW5zWzI1Nl0gPT09IDApIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzIC0tIG5vdGU6IGRvIG5vdCBjaGFuZ2UgdGhlIGxlbmJpdHMgb3IgZGlzdGJpdHNcbiAgICAgICAgIHZhbHVlcyBoZXJlICg5IGFuZCA2KSB3aXRob3V0IHJlYWRpbmcgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi9cbiAgICAgIHN0YXRlLmxlbmJpdHMgPSA5O1xuXG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLmxlbnMsIDAsIHN0YXRlLm5sZW4sIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5kaXN0Yml0cyA9IDY7XG4gICAgICAvL3N0YXRlLmRpc3Rjb2RlLmNvcHkoc3RhdGUuY29kZXMpO1xuICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW47XG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5kaXN0Yml0cyB9O1xuICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy8gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2VzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgJ2luZmxhdGU6ICAgICAgIGNvZGVzIG9rXFxuJykpO1xuICAgICAgc3RhdGUubW9kZSA9IExFTl87XG4gICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU5fOlxuICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTjpcbiAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHtcbiAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgIC8vLS0tXG4gICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBfb3V0KTtcbiAgICAgICAgLy8tLS0gTE9BRCgpIC0tLVxuICAgICAgICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICAgICAgICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgICAgICAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICAgICAgICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICAgICAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gICAgICAgIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICAgICAgICBob2xkID0gc3RhdGUuaG9sZDtcbiAgICAgICAgYml0cyA9IHN0YXRlLmJpdHM7XG4gICAgICAgIC8vLS0tXG5cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHtcbiAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5iYWNrID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsgIC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmJiAoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgfVxuICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICBzdGF0ZS5sZW5ndGggPSBoZXJlX3ZhbDtcbiAgICAgIGlmIChoZXJlX29wID09PSAwKSB7XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMSVQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhlcmVfb3AgJiAzMikge1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1O1xuICAgICAgc3RhdGUubW9kZSA9IExFTkVYVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTkVYVDpcbiAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxlbmd0aCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICB9XG4gICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgIHN0YXRlLndhcyA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIHN0YXRlLm1vZGUgPSBESVNUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElTVDpcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5kaXN0Yml0cykqL1xuICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5vZmZzZXQgPSBoZXJlX3ZhbDtcbiAgICAgIHN0YXRlLmV4dHJhID0gKGhlcmVfb3ApICYgMTU7XG4gICAgICBzdGF0ZS5tb2RlID0gRElTVEVYVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERJU1RFWFQ6XG4gICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5vZmZzZXQgKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgfVxuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBzdGF0ZS5kbWF4KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4vLyNlbmRpZlxuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBzdGF0ZS5vZmZzZXQpKTtcbiAgICAgIHN0YXRlLm1vZGUgPSBNQVRDSDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE1BVENIOlxuICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICBjb3B5ID0gX291dCAtIGxlZnQ7XG4gICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gY29weSkgeyAgICAgICAgIC8qIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgY29weSA9IHN0YXRlLm9mZnNldCAtIGNvcHk7XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgIFRyYWNlKChzdGRlcnIsIFwiaW5mbGF0ZS5jIHRvbyBmYXJcXG5cIikpO1xuLy8gICAgICAgICAgY29weSAtPSBzdGF0ZS53aGF2ZTtcbi8vICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbi8vICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuLy8gICAgICAgICAgbGVmdCAtPSBjb3B5O1xuLy8gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4vLyAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgIG91dHB1dFtwdXQrK10gPSAwO1xuLy8gICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbi8vICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuLy8gICAgICAgICAgYnJlYWs7XG4vLyNlbmRpZlxuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUud25leHQpIHtcbiAgICAgICAgICBjb3B5IC09IHN0YXRlLnduZXh0O1xuICAgICAgICAgIGZyb20gPSBzdGF0ZS53c2l6ZSAtIGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4gICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93O1xuICAgICAgfVxuICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqL1xuICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLm9mZnNldDtcbiAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICBkbyB7XG4gICAgICAgIG91dHB1dFtwdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbiAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBMSVQ6XG4gICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIG91dHB1dFtwdXQrK10gPSBzdGF0ZS5sZW5ndGg7XG4gICAgICBsZWZ0LS07XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBDSEVDSzpcbiAgICAgIGlmIChzdGF0ZS53cmFwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAvLyBVc2UgJ3wnIGluc2RlYWQgb2YgJysnIHRvIG1ha2Ugc3VyZSB0aGF0IHJlc3VsdCBpcyBzaWduZWRcbiAgICAgICAgICBob2xkIHw9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBfb3V0IC09IGxlZnQ7XG4gICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gICAgICAgIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gICAgICAgIGlmIChfb3V0KSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID1cbiAgICAgICAgICAgICAgLypVUERBVEUoc3RhdGUuY2hlY2ssIHB1dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAgICAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSk7XG5cbiAgICAgICAgfVxuICAgICAgICBfb3V0ID0gbGVmdDtcbiAgICAgICAgLy8gTkI6IGNyYzMyIHN0b3JlZCBhcyBzaWduZWQgMzItYml0IGludCwgenN3YXAzMiByZXR1cm5zIHNpZ25lZCB0b29cbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyA/IGhvbGQgOiB6c3dhcDMyKGhvbGQpKSAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgZGF0YSBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOR1RIO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOR1RIOlxuICAgICAgaWYgKHN0YXRlLndyYXAgJiYgc3RhdGUuZmxhZ3MpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUudG90YWwgJiAweGZmZmZmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBsZW5ndGggY2hlY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBsZW5ndGggbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBET05FO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRE9ORTpcbiAgICAgIHJldCA9IFpfU1RSRUFNX0VORDtcbiAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICBjYXNlIEJBRDpcbiAgICAgIHJldCA9IFpfREFUQV9FUlJPUjtcbiAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICBjYXNlIE1FTTpcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICBjYXNlIFNZTkM6XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgICB9XG4gIH1cblxuICAvLyBpbmZfbGVhdmUgPC0gaGVyZSBpcyByZWFsIHBsYWNlIGZvciBcImdvdG8gaW5mX2xlYXZlXCIsIGVtdWxhdGVkIHZpYSBcImJyZWFrIGluZl9sZWF2ZVwiXG5cbiAgLypcbiAgICAgUmV0dXJuIGZyb20gaW5mbGF0ZSgpLCB1cGRhdGluZyB0aGUgdG90YWwgY291bnRzIGFuZCB0aGUgY2hlY2sgdmFsdWUuXG4gICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXJcbiAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuXG4gICAgIE5vdGU6IGEgbWVtb3J5IGVycm9yIGZyb20gaW5mbGF0ZSgpIGlzIG5vbi1yZWNvdmVyYWJsZS5cbiAgICovXG5cbiAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIC8vLS0tXG5cbiAgaWYgKHN0YXRlLndzaXplIHx8IChfb3V0ICE9PSBzdHJtLmF2YWlsX291dCAmJiBzdGF0ZS5tb2RlIDwgQkFEICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPCBDSEVDSyB8fCBmbHVzaCAhPT0gWl9GSU5JU0gpKSkge1xuICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQsIF9vdXQgLSBzdHJtLmF2YWlsX291dCkpIHtcbiAgICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgfVxuICB9XG4gIF9pbiAtPSBzdHJtLmF2YWlsX2luO1xuICBfb3V0IC09IHN0cm0uYXZhaWxfb3V0O1xuICBzdHJtLnRvdGFsX2luICs9IF9pbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgaWYgKHN0YXRlLndyYXAgJiYgX291dCkge1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBzdHJtLm5leHRfb3V0IC0gX291dCwgX291dCk7Ki9cbiAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpKTtcbiAgfVxuICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IExFTl8gfHwgc3RhdGUubW9kZSA9PT0gQ09QWV8gPyAyNTYgOiAwKTtcbiAgaWYgKCgoX2luID09PSAwICYmIF9vdXQgPT09IDApIHx8IGZsdXNoID09PSBaX0ZJTklTSCkgJiYgcmV0ID09PSBaX09LKSB7XG4gICAgcmV0ID0gWl9CVUZfRVJST1I7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUVuZChzdHJtKSB7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIC8qfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUud2luZG93KSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuICBzdHJtLnN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICB2YXIgc3RhdGU7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmICgoc3RhdGUud3JhcCAmIDIpID09PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuXG4gIC8qIHNhdmUgaGVhZGVyIHN0cnVjdHVyZSAqL1xuICBzdGF0ZS5oZWFkID0gaGVhZDtcbiAgaGVhZC5kb25lID0gZmFsc2U7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHN0YXRlO1xuICB2YXIgZGljdGlkO1xuICB2YXIgcmV0O1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSAvKiA9PSBaX05VTEwgKi8gfHwgIXN0cm0uc3RhdGUgLyogPT0gWl9OVUxMICovKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKHN0YXRlLndyYXAgIT09IDAgJiYgc3RhdGUubW9kZSAhPT0gRElDVCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWRlbnRpZmllciAqL1xuICBpZiAoc3RhdGUubW9kZSA9PT0gRElDVCkge1xuICAgIGRpY3RpZCA9IDE7IC8qIGFkbGVyMzIoMCwgbnVsbCwgMCkqL1xuICAgIC8qIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7XG4gICAgfVxuICB9XG4gIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgdXNpbmcgdXBkYXRld2luZG93KCksIHdoaWNoIHdpbGwgYW1lbmQgdGhlXG4gICBleGlzdGluZyBkaWN0aW9uYXJ5IGlmIGFwcHJvcHJpYXRlICovXG4gIHJldCA9IHVwZGF0ZXdpbmRvdyhzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCBkaWN0TGVuZ3RoKTtcbiAgaWYgKHJldCkge1xuICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICB9XG4gIHN0YXRlLmhhdmVkaWN0ID0gMTtcbiAgLy8gVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBkaWN0aW9uYXJ5IHNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5leHBvcnRzLmluZmxhdGVSZXNldCA9IGluZmxhdGVSZXNldDtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0MiA9IGluZmxhdGVSZXNldDI7XG5leHBvcnRzLmluZmxhdGVSZXNldEtlZXAgPSBpbmZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5pbmZsYXRlSW5pdCA9IGluZmxhdGVJbml0O1xuZXhwb3J0cy5pbmZsYXRlSW5pdDIgPSBpbmZsYXRlSW5pdDI7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlRW5kID0gaW5mbGF0ZUVuZDtcbmV4cG9ydHMuaW5mbGF0ZUdldEhlYWRlciA9IGluZmxhdGVHZXRIZWFkZXI7XG5leHBvcnRzLmluZmxhdGVTZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVJbmZvID0gJ3Bha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuaW5mbGF0ZUNvcHkgPSBpbmZsYXRlQ29weTtcbmV4cG9ydHMuaW5mbGF0ZUdldERpY3Rpb25hcnkgPSBpbmZsYXRlR2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZU1hcmsgPSBpbmZsYXRlTWFyaztcbmV4cG9ydHMuaW5mbGF0ZVByaW1lID0gaW5mbGF0ZVByaW1lO1xuZXhwb3J0cy5pbmZsYXRlU3luYyA9IGluZmxhdGVTeW5jO1xuZXhwb3J0cy5pbmZsYXRlU3luY1BvaW50ID0gaW5mbGF0ZVN5bmNQb2ludDtcbmV4cG9ydHMuaW5mbGF0ZVVuZGVybWluZSA9IGluZmxhdGVVbmRlcm1pbmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xuXG52YXIgTUFYQklUUyA9IDE1O1xudmFyIEVOT1VHSF9MRU5TID0gODUyO1xudmFyIEVOT1VHSF9ESVNUUyA9IDU5Mjtcbi8vdmFyIEVOT1VHSCA9IChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxudmFyIGxiYXNlID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqL1xuICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLFxuICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMFxuXTtcblxudmFyIGxleHQgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCxcbiAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDcyLCA3OFxuXTtcblxudmFyIGRiYXNlID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovXG4gIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MyxcbiAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LFxuICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwXG5dO1xuXG52YXIgZGV4dCA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsXG4gIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LFxuICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0XG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfdGFibGUodHlwZSwgbGVucywgbGVuc19pbmRleCwgY29kZXMsIHRhYmxlLCB0YWJsZV9pbmRleCwgd29yaywgb3B0cylcbntcbiAgdmFyIGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvL2hlcmUgPSBvcHRzLmhlcmU7IC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqL1xuXG4gIHZhciBsZW4gPSAwOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovXG4gIHZhciBzeW0gPSAwOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqL1xuICB2YXIgbWluID0gMCwgbWF4ID0gMDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi9cbiAgdmFyIHJvb3QgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi9cbiAgdmFyIGN1cnIgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi9cbiAgdmFyIGRyb3AgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqL1xuICB2YXIgbGVmdCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovXG4gIHZhciB1c2VkID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovXG4gIHZhciBodWZmID0gMDsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqL1xuICB2YXIgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi9cbiAgdmFyIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqL1xuICB2YXIgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi9cbiAgdmFyIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqL1xuICB2YXIgYmFzZSA9IG51bGw7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgYmFzZV9pbmRleCA9IDA7XG4vLyAgdmFyIHNob2V4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi9cbiAgdmFyIGNvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovXG4gIHZhciBvZmZzID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovXG4gIHZhciBleHRyYSA9IG51bGw7XG4gIHZhciBleHRyYV9pbmRleCA9IDA7XG5cbiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7XG5cbiAgLypcbiAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGVcbiAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZVxuICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGVcbiAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyXG4gICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzXG4gICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlclxuICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGhcbiAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHNcbiAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzXG4gICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLlxuXG4gICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpblxuICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy5cbiAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0XG4gICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLlxuXG4gICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsXG4gICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGVcbiAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZFxuICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5XG4gICB0aGUgY2FsbGVyLlxuXG4gICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nXG4gICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnlcbiAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkXG4gICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcy5cbiAgICovXG5cbiAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovXG4gIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgY291bnRbbGVuXSA9IDA7XG4gIH1cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBjb3VudFtsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrO1xuICB9XG5cbiAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi9cbiAgcm9vdCA9IGJpdHM7XG4gIGZvciAobWF4ID0gTUFYQklUUzsgbWF4ID49IDE7IG1heC0tKSB7XG4gICAgaWYgKGNvdW50W21heF0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA+IG1heCkge1xuICAgIHJvb3QgPSBtYXg7XG4gIH1cbiAgaWYgKG1heCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi9cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7ICAvL2hlcmUub3AgPSAodmFyIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxOyAgIC8vaGVyZS5iaXRzID0gKHZhciBjaGFyKTE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7ICAgLy9oZXJlLnZhbCA9ICh2YXIgc2hvcnQpMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG5cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7XG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG4gICAgb3B0cy5iaXRzID0gMTtcbiAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi9cbiAgfVxuICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspIHtcbiAgICBpZiAoY291bnRbbWluXSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290IDwgbWluKSB7XG4gICAgcm9vdCA9IG1pbjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqL1xuICBsZWZ0ID0gMTtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBsZWZ0IDw8PSAxO1xuICAgIGxlZnQgLT0gY291bnRbbGVuXTtcbiAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi9cbiAgfVxuICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT09IENPREVTIHx8IG1heCAhPT0gMSkpIHtcbiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovXG4gIH1cblxuICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqL1xuICBvZmZzWzFdID0gMDtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykge1xuICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dO1xuICB9XG5cbiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqL1xuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGlmIChsZW5zW2xlbnNfaW5kZXggKyBzeW1dICE9PSAwKSB7XG4gICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZ1xuICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmZcbiAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcFxuICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLFxuICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0b1xuICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuXG5cbiAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHNcbiAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4XG4gICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYVxuICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzXG4gICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuXG5cbiAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlXG4gICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aFxuICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmVcbiAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy5cblxuICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGVcbiAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3RcbiAgIHRoZSBjb25zdGFudHMgRU5PVUdIX0xFTlMgYW5kIEVOT1VHSF9ESVNUUyB0byBndWFyZCBhZ2FpbnN0IGNoYW5nZXMgaW5cbiAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4gICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuXG4gICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzXG4gICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzXG4gICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuXG4gICAqL1xuXG4gIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovXG4gIC8vIHBvb3IgbWFuIG9wdGltaXphdGlvbiAtIHVzZSBpZi1lbHNlIGluc3RlYWQgb2Ygc3dpdGNoLFxuICAvLyB0byBhdm9pZCBkZW9wdHMgaW4gb2xkIHY4XG4gIGlmICh0eXBlID09PSBDT0RFUykge1xuICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqL1xuICAgIGVuZCA9IDE5O1xuXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTEVOUykge1xuICAgIGJhc2UgPSBsYmFzZTtcbiAgICBiYXNlX2luZGV4IC09IDI1NztcbiAgICBleHRyYSA9IGxleHQ7XG4gICAgZXh0cmFfaW5kZXggLT0gMjU3O1xuICAgIGVuZCA9IDI1NjtcblxuICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogRElTVFMgKi9cbiAgICBiYXNlID0gZGJhc2U7XG4gICAgZXh0cmEgPSBkZXh0O1xuICAgIGVuZCA9IC0xO1xuICB9XG5cbiAgLyogaW5pdGlhbGl6ZSBvcHRzIGZvciBsb29wICovXG4gIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovXG4gIHN5bSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqL1xuICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi9cbiAgbmV4dCA9IHRhYmxlX2luZGV4OyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovXG4gIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi9cbiAgZHJvcCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyB0byBkcm9wIGZyb20gY29kZSBmb3IgaW5kZXggKi9cbiAgbG93ID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi9cbiAgdXNlZCA9IDEgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqL1xuICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqL1xuXG4gIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqL1xuICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGkgPSAwO1xuICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovXG4gIGZvciAoOzspIHtcbiAgICBpKys7XG4gICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovXG4gICAgaGVyZV9iaXRzID0gbGVuIC0gZHJvcDtcbiAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7XG4gICAgICBoZXJlX29wID0gMDtcbiAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dO1xuICAgIH1cbiAgICBlbHNlIGlmICh3b3JrW3N5bV0gPiBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSBleHRyYVtleHRyYV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgICBoZXJlX3ZhbCA9IGJhc2VbYmFzZV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovXG4gICAgICBoZXJlX3ZhbCA9IDA7XG4gICAgfVxuXG4gICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gZHJvcCk7XG4gICAgZmlsbCA9IDEgPDwgY3VycjtcbiAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqL1xuICAgIGRvIHtcbiAgICAgIGZpbGwgLT0gaW5jcjtcbiAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gKGhlcmVfYml0cyA8PCAyNCkgfCAoaGVyZV9vcCA8PCAxNikgfCBoZXJlX3ZhbCB8MDtcbiAgICB9IHdoaWxlIChmaWxsICE9PSAwKTtcblxuICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIDEpO1xuICAgIHdoaWxlIChodWZmICYgaW5jcikge1xuICAgICAgaW5jciA+Pj0gMTtcbiAgICB9XG4gICAgaWYgKGluY3IgIT09IDApIHtcbiAgICAgIGh1ZmYgJj0gaW5jciAtIDE7XG4gICAgICBodWZmICs9IGluY3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh1ZmYgPSAwO1xuICAgIH1cblxuICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqL1xuICAgIHN5bSsrO1xuICAgIGlmICgtLWNvdW50W2xlbl0gPT09IDApIHtcbiAgICAgIGlmIChsZW4gPT09IG1heCkgeyBicmVhazsgfVxuICAgICAgbGVuID0gbGVuc1tsZW5zX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG5cbiAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi9cbiAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9PSBsb3cpIHtcbiAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqL1xuICAgICAgaWYgKGRyb3AgPT09IDApIHtcbiAgICAgICAgZHJvcCA9IHJvb3Q7XG4gICAgICB9XG5cbiAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi9cbiAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqL1xuXG4gICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi9cbiAgICAgIGN1cnIgPSBsZW4gLSBkcm9wO1xuICAgICAgbGVmdCA9IDEgPDwgY3VycjtcbiAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkge1xuICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkgeyBicmVhazsgfVxuICAgICAgICBjdXJyKys7XG4gICAgICAgIGxlZnQgPDw9IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi9cbiAgICAgIHVzZWQgKz0gMSA8PCBjdXJyO1xuICAgICAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAgICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqL1xuICAgICAgbG93ID0gaHVmZiAmIG1hc2s7XG4gICAgICAvKnRhYmxlLm9wW2xvd10gPSBjdXJyO1xuICAgICAgdGFibGUuYml0c1tsb3ddID0gcm9vdDtcbiAgICAgIHRhYmxlLnZhbFtsb3ddID0gbmV4dCAtIG9wdHMudGFibGVfaW5kZXg7Ki9cbiAgICAgIHRhYmxlW2xvd10gPSAocm9vdCA8PCAyNCkgfCAoY3VyciA8PCAxNikgfCAobmV4dCAtIHRhYmxlX2luZGV4KSB8MDtcbiAgICB9XG4gIH1cblxuICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZVxuICAgYXQgbW9zdCBvbmUgcmVtYWluaW5nIGVudHJ5LCBzaW5jZSBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlLCB0aGVcbiAgIG1heGltdW0gY29kZSBsZW5ndGggdGhhdCB3YXMgYWxsb3dlZCB0byBnZXQgdGhpcyBmYXIgaXMgb25lIGJpdCkgKi9cbiAgaWYgKGh1ZmYgIT09IDApIHtcbiAgICAvL3RhYmxlLm9wW25leHQgKyBodWZmXSA9IDY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbbmV4dCArIGh1ZmZdID0gbGVuIC0gZHJvcDtcbiAgICAvL3RhYmxlLnZhbFtuZXh0ICsgaHVmZl0gPSAwO1xuICAgIHRhYmxlW25leHQgKyBodWZmXSA9ICgobGVuIC0gZHJvcCkgPDwgMjQpIHwgKDY0IDw8IDE2KSB8MDtcbiAgfVxuXG4gIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqL1xuICAvL29wdHMudGFibGVfaW5kZXggKz0gdXNlZDtcbiAgb3B0cy5iaXRzID0gcm9vdDtcbiAgcmV0dXJuIDA7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgMjogICAgICAnbmVlZCBkaWN0aW9uYXJ5JywgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovXG4gIDE6ICAgICAgJ3N0cmVhbSBlbmQnLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqL1xuICAwOiAgICAgICcnLCAgICAgICAgICAgICAgICAgICAgLyogWl9PSyAgICAgICAgICAgICAgMCAgKi9cbiAgJy0xJzogICAnZmlsZSBlcnJvcicsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovXG4gICctMic6ICAgJ3N0cmVhbSBlcnJvcicsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqL1xuICAnLTMnOiAgICdkYXRhIGVycm9yJywgICAgICAgICAgLyogWl9EQVRBX0VSUk9SICAgICgtMykgKi9cbiAgJy00JzogICAnaW5zdWZmaWNpZW50IG1lbW9yeScsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovXG4gICctNSc6ICAgJ2J1ZmZlciBlcnJvcicsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqL1xuICAnLTYnOiAgICdpbmNvbXBhdGlibGUgdmVyc2lvbicgLyogWl9WRVJTSU9OX0VSUk9SICgtNikgKi9cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vdmFyIFpfRklMVEVSRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9IVUZGTUFOX09OTFkgICAgICA9IDI7XG4vL3ZhciBaX1JMRSAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xuLy92YXIgWl9ERUZBVUxUX1NUUkFURUdZICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbnZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xudmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG4vLyBGcm9tIHp1dGlsLmhcblxudmFyIFNUT1JFRF9CTE9DSyA9IDA7XG52YXIgU1RBVElDX1RSRUVTID0gMTtcbnZhciBEWU5fVFJFRVMgICAgPSAyO1xuLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi9cblxudmFyIE1JTl9NQVRDSCAgICA9IDM7XG52YXIgTUFYX01BVENIICAgID0gMjU4O1xuLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqL1xuXG4vLyBGcm9tIGRlZmxhdGUuaFxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS5cbiAqL1xuXG52YXIgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG5cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cblxudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xuXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG5cbnZhciBNQVhfQklUUyAgICAgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIEJ1Zl9zaXplICAgICAgPSAxNjtcbi8qIHNpemUgb2YgYml0IGJ1ZmZlciBpbiBiaV9idWYgKi9cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0YW50c1xuICovXG5cbnZhciBNQVhfQkxfQklUUyA9IDc7XG4vKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovXG5cbnZhciBFTkRfQkxPQ0sgICA9IDI1Njtcbi8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi9cblxudmFyIFJFUF8zXzYgICAgID0gMTY7XG4vKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzNfMTAgICA9IDE3O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzExXzEzOCA9IDE4O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxuLyogZXNsaW50LWRpc2FibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cbnZhciBleHRyYV9sYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXTtcblxudmFyIGV4dHJhX2RiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi9cbiAgWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdO1xuXG52YXIgZXh0cmFfYmxiaXRzID0gIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XTtcblxudmFyIGJsX29yZGVyID1cbiAgWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO1xuLyogZXNsaW50LWVuYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xuXG4vKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nXG4gKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy5cbiAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuXG4gKi9cblxuLy8gV2UgcHJlLWZpbGwgYXJyYXlzIHdpdGggMCB0byBhdm9pZCB1bmluaXRpYWxpemVkIGdhcHNcblxudmFyIERJU1RfQ09ERV9MRU4gPSA1MTI7IC8qIHNlZSBkZWZpbml0aW9uIG9mIGFycmF5IGRpc3RfY29kZSBiZWxvdyAqL1xuXG4vLyAhISEhIFVzZSBmbGF0IGFycmF5IGluc2RlYWQgb2Ygc3RydWN0dXJlLCBGcmVxID0gaSoyLCBMZW4gPSBpKjIrMVxudmFyIHN0YXRpY19sdHJlZSAgPSBuZXcgQXJyYXkoKExfQ09ERVMgKyAyKSAqIDIpO1xuemVybyhzdGF0aWNfbHRyZWUpO1xuLyogVGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUuIFNpbmNlIHRoZSBiaXQgbGVuZ3RocyBhcmUgaW1wb3NlZCwgdGhlcmUgaXMgbm9cbiAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyXG4gKiBUaGUgY29kZXMgMjg2IGFuZCAyODcgYXJlIG5lZWRlZCB0byBidWlsZCBhIGNhbm9uaWNhbCB0cmVlIChzZWUgX3RyX2luaXRcbiAqIGJlbG93KS5cbiAqL1xuXG52YXIgc3RhdGljX2R0cmVlICA9IG5ldyBBcnJheShEX0NPREVTICogMik7XG56ZXJvKHN0YXRpY19kdHJlZSk7XG4vKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlXG4gKiA1IGJpdHMuKVxuICovXG5cbnZhciBfZGlzdF9jb2RlICAgID0gbmV3IEFycmF5KERJU1RfQ09ERV9MRU4pO1xuemVybyhfZGlzdF9jb2RlKTtcbi8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXNcbiAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2ZcbiAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLlxuICovXG5cbnZhciBfbGVuZ3RoX2NvZGUgID0gbmV3IEFycmF5KE1BWF9NQVRDSCAtIE1JTl9NQVRDSCArIDEpO1xuemVybyhfbGVuZ3RoX2NvZGUpO1xuLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9sZW5ndGggICA9IG5ldyBBcnJheShMRU5HVEhfQ09ERVMpO1xuemVybyhiYXNlX2xlbmd0aCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9kaXN0ICAgICA9IG5ldyBBcnJheShEX0NPREVTKTtcbnplcm8oYmFzZV9kaXN0KTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZm9yIGVhY2ggY29kZSAoMCA9IGRpc3RhbmNlIG9mIDEpICovXG5cblxuZnVuY3Rpb24gU3RhdGljVHJlZURlc2Moc3RhdGljX3RyZWUsIGV4dHJhX2JpdHMsIGV4dHJhX2Jhc2UsIGVsZW1zLCBtYXhfbGVuZ3RoKSB7XG5cbiAgdGhpcy5zdGF0aWNfdHJlZSAgPSBzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iaXRzICAgPSBleHRyYV9iaXRzOyAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovXG4gIHRoaXMuZXh0cmFfYmFzZSAgID0gZXh0cmFfYmFzZTsgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovXG4gIHRoaXMuZWxlbXMgICAgICAgID0gZWxlbXM7ICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovXG4gIHRoaXMubWF4X2xlbmd0aCAgID0gbWF4X2xlbmd0aDsgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovXG5cbiAgLy8gc2hvdyBpZiBgc3RhdGljX3RyZWVgIGhhcyBkYXRhIG9yIGR1bW15IC0gbmVlZGVkIGZvciBtb25vbW9ycGhpYyBvYmplY3RzXG4gIHRoaXMuaGFzX3N0cmVlICAgID0gc3RhdGljX3RyZWUgJiYgc3RhdGljX3RyZWUubGVuZ3RoO1xufVxuXG5cbnZhciBzdGF0aWNfbF9kZXNjO1xudmFyIHN0YXRpY19kX2Rlc2M7XG52YXIgc3RhdGljX2JsX2Rlc2M7XG5cblxuZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsIHN0YXRfZGVzYykge1xuICB0aGlzLmR5bl90cmVlID0gZHluX3RyZWU7ICAgICAvKiB0aGUgZHluYW1pYyB0cmVlICovXG4gIHRoaXMubWF4X2NvZGUgPSAwOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsgICAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqL1xufVxuXG5cblxuZnVuY3Rpb24gZF9jb2RlKGRpc3QpIHtcbiAgcmV0dXJuIGRpc3QgPCAyNTYgPyBfZGlzdF9jb2RlW2Rpc3RdIDogX2Rpc3RfY29kZVsyNTYgKyAoZGlzdCA+Pj4gNyldO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uXG4gKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuXG4gKi9cbmZ1bmN0aW9uIHB1dF9zaG9ydChzLCB3KSB7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodykgJiAweGZmKSk7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodXNoKSh3KSA+PiA4KSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodyA+Pj4gOCkgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuXG4gKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy5cbiAqL1xuZnVuY3Rpb24gc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPiAoQnVmX3NpemUgLSBsZW5ndGgpKSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSB2YWx1ZSA+PiAoQnVmX3NpemUgLSBzLmJpX3ZhbGlkKTtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplO1xuICB9IGVsc2Uge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHNlbmRfY29kZShzLCBjLCB0cmVlKSB7XG4gIHNlbmRfYml0cyhzLCB0cmVlW2MgKiAyXS8qLkNvZGUqLywgdHJlZVtjICogMiArIDFdLyouTGVuKi8pO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXJcbiAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSlcbiAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTVcbiAqL1xuZnVuY3Rpb24gYmlfcmV2ZXJzZShjb2RlLCBsZW4pIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGRvIHtcbiAgICByZXMgfD0gY29kZSAmIDE7XG4gICAgY29kZSA+Pj49IDE7XG4gICAgcmVzIDw8PSAxO1xuICB9IHdoaWxlICgtLWxlbiA+IDApO1xuICByZXR1cm4gcmVzID4+PiAxO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuXG4gKi9cbmZ1bmN0aW9uIGJpX2ZsdXNoKHMpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPT09IDE2KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IDA7XG4gICAgcy5iaV92YWxpZCA9IDA7XG5cbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID49IDgpIHtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmICYgMHhmZjtcbiAgICBzLmJpX2J1ZiA+Pj0gODtcbiAgICBzLmJpX3ZhbGlkIC09IDg7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoXG4gKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZFxuICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGVcbiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC5cbiAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXNcbiAqICAgICBub3QgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2JpdGxlbihzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgICAgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIG1heF9jb2RlICAgICAgICA9IGRlc2MubWF4X2NvZGU7XG4gIHZhciBzdHJlZSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGV4dHJhICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2JpdHM7XG4gIHZhciBiYXNlICAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iYXNlO1xuICB2YXIgbWF4X2xlbmd0aCAgICAgID0gZGVzYy5zdGF0X2Rlc2MubWF4X2xlbmd0aDtcbiAgdmFyIGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovXG4gIHZhciBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqL1xuICB2YXIgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi9cbiAgdmFyIGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi9cbiAgdmFyIG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqL1xuXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIHMuYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXlcbiAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuXG4gICAqL1xuICB0cmVlW3MuaGVhcFtzLmhlYXBfbWF4XSAqIDIgKyAxXS8qLkxlbiovID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqL1xuXG4gIGZvciAoaCA9IHMuaGVhcF9tYXggKyAxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHtcbiAgICBuID0gcy5oZWFwW2hdO1xuICAgIGJpdHMgPSB0cmVlW3RyZWVbbiAqIDIgKyAxXS8qLkRhZCovICogMiArIDFdLyouTGVuKi8gKyAxO1xuICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkge1xuICAgICAgYml0cyA9IG1heF9sZW5ndGg7XG4gICAgICBvdmVyZmxvdysrO1xuICAgIH1cbiAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi9cblxuICAgIGlmIChuID4gbWF4X2NvZGUpIHsgY29udGludWU7IH0gLyogbm90IGEgbGVhZiBub2RlICovXG5cbiAgICBzLmJsX2NvdW50W2JpdHNdKys7XG4gICAgeGJpdHMgPSAwO1xuICAgIGlmIChuID49IGJhc2UpIHtcbiAgICAgIHhiaXRzID0gZXh0cmFbbiAtIGJhc2VdO1xuICAgIH1cbiAgICBmID0gdHJlZVtuICogMl0vKi5GcmVxKi87XG4gICAgcy5vcHRfbGVuICs9IGYgKiAoYml0cyArIHhiaXRzKTtcbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdLyouTGVuKi8gKyB4Yml0cyk7XG4gICAgfVxuICB9XG4gIGlmIChvdmVyZmxvdyA9PT0gMCkgeyByZXR1cm47IH1cblxuICAvLyBUcmFjZSgoc3RkZXJyLFwiXFxuYml0IGxlbmd0aCBvdmVyZmxvd1xcblwiKSk7XG4gIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovXG5cbiAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi9cbiAgZG8ge1xuICAgIGJpdHMgPSBtYXhfbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAocy5ibF9jb3VudFtiaXRzXSA9PT0gMCkgeyBiaXRzLS07IH1cbiAgICBzLmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovXG4gICAgcy5ibF9jb3VudFtiaXRzICsgMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqL1xuICAgIHMuYmxfY291bnRbbWF4X2xlbmd0aF0tLTtcbiAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLFxuICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXVxuICAgICAqL1xuICAgIG92ZXJmbG93IC09IDI7XG4gIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7XG5cbiAgLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsXG4gICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuXG4gICAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKVxuICAgKi9cbiAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPT0gMDsgYml0cy0tKSB7XG4gICAgbiA9IHMuYmxfY291bnRbYml0c107XG4gICAgd2hpbGUgKG4gIT09IDApIHtcbiAgICAgIG0gPSBzLmhlYXBbLS1oXTtcbiAgICAgIGlmIChtID4gbWF4X2NvZGUpIHsgY29udGludWU7IH1cbiAgICAgIGlmICh0cmVlW20gKiAyICsgMV0vKi5MZW4qLyAhPT0gYml0cykge1xuICAgICAgICAvLyBUcmFjZSgoc3RkZXJyLFwiY29kZSAlZCBiaXRzICVkLT4lZFxcblwiLCBtLCB0cmVlW21dLkxlbiwgYml0cykpO1xuICAgICAgICBzLm9wdF9sZW4gKz0gKGJpdHMgLSB0cmVlW20gKiAyICsgMV0vKi5MZW4qLykgKiB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICAgICAgdHJlZVttICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgICAgfVxuICAgICAgbi0tO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlXG4gKiBvcHRpbWFsKS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yXG4gKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub25cbiAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KVxuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuLy8gICAgdXNoZiAqYmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqL1xue1xuICB2YXIgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovXG4gIHZhciBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi9cbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqL1xuXG4gIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlc1xuICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC5cbiAgICovXG4gIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMgLSAxXSkgPDwgMTtcbiAgfVxuICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlXG4gICAqIG11c3QgYmUgYWxsIG9uZXMuXG4gICAqL1xuICAvL0Fzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSxcbiAgLy8gICAgICAgIFwiaW5jb25zaXN0ZW50IGJpdCBjb3VudHNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5nZW5fY29kZXM6IG1heF9jb2RlICVkIFwiLCBtYXhfY29kZSkpO1xuXG4gIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICB2YXIgbGVuID0gdHJlZVtuICogMiArIDFdLyouTGVuKi87XG4gICAgaWYgKGxlbiA9PT0gMCkgeyBjb250aW51ZTsgfVxuICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovXG4gICAgdHJlZVtuICogMl0vKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7XG5cbiAgICAvL1RyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsXCJcXG5uICUzZCAlYyBsICUyZCBjICU0eCAoJXgpIFwiLFxuICAgIC8vICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpO1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLlxuICovXG5mdW5jdGlvbiB0cl9zdGF0aWNfaW5pdCgpIHtcbiAgdmFyIG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqL1xuICB2YXIgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqL1xuICB2YXIgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqL1xuICB2YXIgYmxfY291bnQgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy8gZG8gY2hlY2sgaW4gX3RyX2luaXQoKVxuICAvL2lmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47XG5cbiAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqL1xuLyojaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlNcbiAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTtcbiAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7XG4gIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7XG4gIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzO1xuICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzO1xuI2VuZGlmKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovXG4gIGxlbmd0aCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMgLSAxOyBjb2RlKyspIHtcbiAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfbGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAobGVuZ3RoID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogbGVuZ3RoICE9IDI1NlwiKTtcbiAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWRcbiAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2VcbiAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOlxuICAgKi9cbiAgX2xlbmd0aF9jb2RlW2xlbmd0aCAtIDFdID0gY29kZTtcblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi9cbiAgZGlzdCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCAxNjsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTZcIik7XG4gIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqL1xuICBmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNztcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgKGV4dHJhX2RiaXRzW2NvZGVdIC0gNykpOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyXCIpO1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi9cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgbiA9IDA7XG4gIHdoaWxlIChuIDw9IDE0Mykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI1NSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA5O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs5XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI3OSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA3O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs3XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI4Nykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZVxuICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGVcbiAgICogYWxsIG9uZXMpXG4gICAqL1xuICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTICsgMSwgYmxfY291bnQpO1xuXG4gIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDU7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7XG4gIH1cblxuICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2FuIGluaXQgc3RhdGljIHRyZWVzXG4gIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMgKyAxLCBMX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19kX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfYmxfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgICAgICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMpO1xuXG4gIC8vc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLlxuICovXG5mdW5jdGlvbiBpbml0X2Jsb2NrKHMpIHtcbiAgdmFyIG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgeyBzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyAgbisrKSB7IHMuZHluX2R0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIHsgcy5ibF90cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cblxuICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXS8qLkZyZXEqLyA9IDE7XG4gIHMub3B0X2xlbiA9IHMuc3RhdGljX2xlbiA9IDA7XG4gIHMubGFzdF9saXQgPSBzLm1hdGNoZXMgPSAwO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5XG4gKi9cbmZ1bmN0aW9uIGJpX3dpbmR1cChzKVxue1xuICBpZiAocy5iaV92YWxpZCA+IDgpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPiAwKSB7XG4gICAgLy9wdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpO1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWY7XG4gIH1cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0c1xuICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcilcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAgICAqYnVmOyAgICAvKiB0aGUgaW5wdXQgZGF0YSAqL1xuLy91bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovXG4vL2ludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqL1xue1xuICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovXG5cbiAgaWYgKGhlYWRlcikge1xuICAgIHB1dF9zaG9ydChzLCBsZW4pO1xuICAgIHB1dF9zaG9ydChzLCB+bGVuKTtcbiAgfVxuLy8gIHdoaWxlIChsZW4tLSkge1xuLy8gICAgcHV0X2J5dGUocywgKmJ1ZisrKTtcbi8vICB9XG4gIHV0aWxzLmFycmF5U2V0KHMucGVuZGluZ19idWYsIHMud2luZG93LCBidWYsIGxlbiwgcy5wZW5kaW5nKTtcbiAgcy5wZW5kaW5nICs9IGxlbjtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlblxuICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIHtcbiAgdmFyIF9uMiA9IG4gKiAyO1xuICB2YXIgX20yID0gbSAqIDI7XG4gIHJldHVybiAodHJlZVtfbjJdLyouRnJlcSovIDwgdHJlZVtfbTJdLyouRnJlcSovIHx8XG4gICAgICAgICAodHJlZVtfbjJdLyouRnJlcSovID09PSB0cmVlW19tMl0vKi5GcmVxKi8gJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgayxcbiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nXG4gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzXG4gKiB0d28gc29ucykuXG4gKi9cbmZ1bmN0aW9uIHBxZG93bmhlYXAocywgdHJlZSwgaylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqL1xuLy8gICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi9cbntcbiAgdmFyIHYgPSBzLmhlYXBba107XG4gIHZhciBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqL1xuICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7XG4gICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi9cbiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiZcbiAgICAgIHNtYWxsZXIodHJlZSwgcy5oZWFwW2ogKyAxXSwgcy5oZWFwW2pdLCBzLmRlcHRoKSkge1xuICAgICAgaisrO1xuICAgIH1cbiAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqL1xuICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHsgYnJlYWs7IH1cblxuICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovXG4gICAgcy5oZWFwW2tdID0gcy5oZWFwW2pdO1xuICAgIGsgPSBqO1xuXG4gICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqL1xuICAgIGogPDw9IDE7XG4gIH1cbiAgcy5oZWFwW2tdID0gdjtcbn1cblxuXG4vLyBpbmxpbmVkIG1hbnVhbGx5XG4vLyB2YXIgU01BTExFU1QgPSAxO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlc1xuICovXG5mdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY29uc3QgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqL1xuLy8gICAgY29uc3QgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbntcbiAgdmFyIGRpc3Q7ICAgICAgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqL1xuICB2YXIgbHggPSAwOyAgICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cbiAgdmFyIGNvZGU7ICAgICAgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovXG4gIHZhciBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqL1xuXG4gIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7XG4gICAgZG8ge1xuICAgICAgZGlzdCA9IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDJdIDw8IDgpIHwgKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMiArIDFdKTtcbiAgICAgIGxjID0gcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgbHhdO1xuICAgICAgbHgrKztcblxuICAgICAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgICAgLy9UcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLFwiICclYycgXCIsIGxjKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdO1xuICAgICAgICBzZW5kX2NvZGUocywgY29kZSArIExJVEVSQUxTICsgMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTtcbiAgICAgICAgLy9Bc3NlcnQgKGNvZGUgPCBEX0NPREVTLCBcImJhZCBkX2NvZGVcIik7XG5cbiAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUsIGR0cmVlKTsgICAgICAgLyogc2VuZCB0aGUgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqL1xuXG4gICAgICAvKiBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmIGlzIG9rOiAqL1xuICAgICAgLy9Bc3NlcnQoKHVJbnQpKHMtPnBlbmRpbmcpIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LFxuICAgICAgLy8gICAgICAgXCJwZW5kaW5nQnVmIG92ZXJmbG93XCIpO1xuXG4gICAgfSB3aGlsZSAobHggPCBzLmxhc3RfbGl0KTtcbiAgfVxuXG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLlxuICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhcbiAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpc1xuICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfdHJlZShzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgc3RyZWUgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGVsZW1zICAgID0gZGVzYy5zdGF0X2Rlc2MuZWxlbXM7XG4gIHZhciBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqL1xuICB2YXIgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHZhciBub2RlOyAgICAgICAgICAvKiBuZXcgbm9kZSBiZWluZyBjcmVhdGVkICovXG5cbiAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpblxuICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS5cbiAgICogaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHMuaGVhcF9sZW4gPSAwO1xuICBzLmhlYXBfbWF4ID0gSEVBUF9TSVpFO1xuXG4gIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7XG4gICAgaWYgKHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IG1heF9jb2RlID0gbjtcbiAgICAgIHMuZGVwdGhbbl0gPSAwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gMDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLFxuICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmVcbiAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3RcbiAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS5cbiAgICovXG4gIHdoaWxlIChzLmhlYXBfbGVuIDwgMikge1xuICAgIG5vZGUgPSBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7XG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSAxO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAwO1xuICAgIHMub3B0X2xlbi0tO1xuXG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUgKiAyICsgMV0vKi5MZW4qLztcbiAgICB9XG4gICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovXG4gIH1cbiAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlO1xuXG4gIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSxcbiAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6XG4gICAqL1xuICBmb3IgKG4gPSAocy5oZWFwX2xlbiA+PiAxLyppbnQgLzIqLyk7IG4gPj0gMTsgbi0tKSB7IHBxZG93bmhlYXAocywgdHJlZSwgbik7IH1cblxuICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvXG4gICAqIGZyZXF1ZW50IG5vZGVzLlxuICAgKi9cbiAgbm9kZSA9IGVsZW1zOyAgICAgICAgICAgICAgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovXG4gIGRvIHtcbiAgICAvL3BxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovXG4gICAgLyoqKiBwcXJlbW92ZSAqKiovXG4gICAgbiA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBzLmhlYXBbcy5oZWFwX2xlbi0tXTtcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuICAgIC8qKiovXG5cbiAgICBtID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqL1xuXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBtO1xuXG4gICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi9cbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IHRyZWVbbiAqIDJdLyouRnJlcSovICsgdHJlZVttICogMl0vKi5GcmVxKi87XG4gICAgcy5kZXB0aFtub2RlXSA9IChzLmRlcHRoW25dID49IHMuZGVwdGhbbV0gPyBzLmRlcHRoW25dIDogcy5kZXB0aFttXSkgKyAxO1xuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkRhZCovID0gdHJlZVttICogMiArIDFdLyouRGFkKi8gPSBub2RlO1xuXG4gICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi9cbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBub2RlKys7XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcblxuICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpO1xuXG4gIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuXG4gIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3dcbiAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLlxuICAgKi9cbiAgZ2VuX2JpdGxlbihzLCBkZXNjKTtcblxuICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovXG4gIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgcy5ibF9jb3VudCk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzXG4gKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLlxuICovXG5mdW5jdGlvbiBzY2FuX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG4gIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0vKi5MZW4qLyA9IDB4ZmZmZjsgLyogZ3VhcmQgKi9cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8gKz0gY291bnQ7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuXG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7IHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLysrOyB9XG4gICAgICBzLmJsX3RyZWVbUkVQXzNfNiAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8zXzEwICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8xMV8xMzggKiAyXS8qLkZyZXEqLysrO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuXG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluXG4gKiBibF90cmVlLlxuICovXG5mdW5jdGlvbiBzZW5kX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBkbyB7IHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT09IDApO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTtcbiAgICAgICAgY291bnQtLTtcbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgXCIgM182P1wiKTtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMik7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMTEsIDcpO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpblxuICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX2JsX3RyZWUocykge1xuICB2YXIgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICBzY2FuX3RyZWUocywgcy5keW5fbHRyZWUsIHMubF9kZXNjLm1heF9jb2RlKTtcbiAgc2Nhbl90cmVlKHMsIHMuZHluX2R0cmVlLCBzLmRfZGVzYy5tYXhfY29kZSk7XG5cbiAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi9cbiAgYnVpbGRfdHJlZShzLCBzLmJsX2Rlc2MpO1xuICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0XG4gICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuXG4gICAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdFxuICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5c1xuICAgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pXG4gICAqL1xuICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7XG4gICAgaWYgKHMuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF0gKiAyICsgMV0vKi5MZW4qLyAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovXG4gIHMub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZFwiLFxuICAvLyAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpO1xuXG4gIHJldHVybiBtYXhfYmxpbmRleDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZVxuICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuXG4gKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfYWxsX3RyZWVzKHMsIGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi9cbntcbiAgdmFyIHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqL1xuXG4gIC8vQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgXCJub3QgZW5vdWdoIGNvZGVzXCIpO1xuICAvL0Fzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUyxcbiAgLy8gICAgICAgIFwidG9vIG1hbnkgY29kZXNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY291bnRzOiBcIikpO1xuICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCAgIDUpO1xuICBzZW5kX2JpdHMocywgYmxjb2RlcyAtIDQsICA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7XG4gICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb2RlICUyZCBcIiwgYmxfb3JkZXJbcmFua10pKTtcbiAgICBzZW5kX2JpdHMocywgcy5ibF90cmVlW2JsX29yZGVyW3JhbmtdICogMiArIDFdLyouTGVuKi8sIDMpO1xuICB9XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLyogbGl0ZXJhbCB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06XG4gKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6XG4gKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcImJsYWNrIGxpc3RcIiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLlxuICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJ3aGl0ZSBsaXN0XCIgKDkge1RBQn0sIDEwIHtMRn0sIDEzIHtDUn0sIDMyLi4yNTUpLlxuICogLSBCSU5BUlkgb3RoZXJ3aXNlLlxuICogLSBUaGUgZm9sbG93aW5nIHBhcnRpYWxseS1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgZm9ybSBhXG4gKiAgIFwiZ3JheSBsaXN0XCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobTpcbiAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LlxuICovXG5mdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHtcbiAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzXG4gICAqIHNldCBiaXRzIDAuLjYsIDE0Li4yNSwgYW5kIDI4Li4zMVxuICAgKiAweGYzZmZjMDdmID0gYmluYXJ5IDExMTEwMDExMTExMTExMTExMTAwMDAwMDAxMTExMTExXG4gICAqL1xuICB2YXIgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2Y7XG4gIHZhciBuO1xuXG4gIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoXCJibGFjay1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj49IDEpIHtcbiAgICBpZiAoKGJsYWNrX21hc2sgJiAxKSAmJiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSkge1xuICAgICAgcmV0dXJuIFpfQklOQVJZO1xuICAgIH1cbiAgfVxuXG4gIC8qIENoZWNrIGZvciB0ZXh0dWFsIChcIndoaXRlLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgaWYgKHMuZHluX2x0cmVlWzkgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fCBzLmR5bl9sdHJlZVsxMCAqIDJdLyouRnJlcSovICE9PSAwIHx8XG4gICAgICBzLmR5bl9sdHJlZVsxMyAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgcmV0dXJuIFpfVEVYVDtcbiAgfVxuICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTOyBuKyspIHtcbiAgICBpZiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICByZXR1cm4gWl9URVhUO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZXJlIGFyZSBubyBcImJsYWNrLWxpc3RlZFwiIG9yIFwid2hpdGUtbGlzdGVkXCIgYnl0ZXM6XG4gICAqIHRoaXMgc3RyZWFtIGVpdGhlciBpcyBlbXB0eSBvciBoYXMgdG9sZXJhdGVkIChcImdyYXktbGlzdGVkXCIpIGJ5dGVzIG9ubHkuXG4gICAqL1xuICByZXR1cm4gWl9CSU5BUlk7XG59XG5cblxudmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIF90cl9pbml0KHMpXG57XG5cbiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7XG4gICAgdHJfc3RhdGljX2luaXQoKTtcbiAgICBzdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbiAgfVxuXG4gIHMubF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7XG4gIHMuZF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7XG4gIHMuYmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmJsX3RyZWUsIHN0YXRpY19ibF9kZXNjKTtcblxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqL1xuICBpbml0X2Jsb2NrKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHN0b3JlZCBibG9ja1xuICovXG5mdW5jdGlvbiBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsgICAgLyogc2VuZCBibG9jayB0eXBlICovXG4gIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsgLyogd2l0aCBoZWFkZXIgKi9cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuXG4gKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gX3RyX2FsaWduKHMpIHtcbiAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUyA8PCAxLCAzKTtcbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTtcbiAgYmlfZmx1c2gocyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWNcbiAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS5cbiAqL1xuZnVuY3Rpb24gX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7ICAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovXG4gIHZhciBtYXhfYmxpbmRleCA9IDA7ICAgICAgICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqL1xuICBpZiAocy5sZXZlbCA+IDApIHtcblxuICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGJpbmFyeSBvciB0ZXh0ICovXG4gICAgaWYgKHMuc3RybS5kYXRhX3R5cGUgPT09IFpfVU5LTk9XTikge1xuICAgICAgcy5zdHJtLmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7XG4gICAgfVxuXG4gICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcbiAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2ZcbiAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLlxuICAgICAqL1xuXG4gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXhcbiAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7XG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovXG4gICAgb3B0X2xlbmIgPSAocy5vcHRfbGVuICsgMyArIDcpID4+PiAzO1xuICAgIHN0YXRpY19sZW5iID0gKHMuc3RhdGljX2xlbiArIDMgKyA3KSA+Pj4gMztcblxuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1IFwiLFxuICAgIC8vICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sXG4gICAgLy8gICAgICAgIHMtPmxhc3RfbGl0KSk7XG5cbiAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIHsgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsgfVxuXG4gIH0gZWxzZSB7XG4gICAgLy8gQXNzZXJ0KGJ1ZiAhPSAoY2hhciopMCwgXCJsb3N0IGJ1ZlwiKTtcbiAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovXG4gIH1cblxuICBpZiAoKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iKSAmJiAoYnVmICE9PSAtMSkpIHtcbiAgICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovXG5cbiAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLlxuICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2VcbiAgICAgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW5cbiAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG9cbiAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLlxuICAgICAqL1xuICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTtcblxuICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQgfHwgc3RhdGljX2xlbmIgPT09IG9wdF9sZW5iKSB7XG5cbiAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzLmR5bl9sdHJlZSwgcy5keW5fZHRyZWUpO1xuICB9XG4gIC8vIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCBcImJhZCBjb21wcmVzc2VkIHNpemVcIik7XG4gIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CXG4gICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLlxuICAgKi9cbiAgaW5pdF9ibG9jayhzKTtcblxuICBpZiAobGFzdCkge1xuICAgIGJpX3dpbmR1cChzKTtcbiAgfVxuICAvLyBUcmFjZXYoKHN0ZGVycixcIlxcbmNvbXBybGVuICVsdSglbHUpIFwiLCBzLT5jb21wcmVzc2VkX2xlbj4+MyxcbiAgLy8gICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNypsYXN0KSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmXG4gKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIF90cl90YWxseShzLCBkaXN0LCBsYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB1bnNpZ25lZCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbi8vICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqL1xue1xuICAvL3ZhciBvdXRfbGVuZ3RoLCBpbl9sZW5ndGgsIGRjb2RlO1xuXG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyXSAgICAgPSAoZGlzdCA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMiArIDFdID0gZGlzdCAmIDB4ZmY7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgcy5sYXN0X2xpdF0gPSBsYyAmIDB4ZmY7XG4gIHMubGFzdF9saXQrKztcblxuICBpZiAoZGlzdCA9PT0gMCkge1xuICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqL1xuICAgIHMuZHluX2x0cmVlW2xjICogMl0vKi5GcmVxKi8rKztcbiAgfSBlbHNlIHtcbiAgICBzLm1hdGNoZXMrKztcbiAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgLy9Bc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJlxuICAgIC8vICAgICAgICh1c2gpbGMgPD0gKHVzaCkoTUFYX01BVENILU1JTl9NQVRDSCkgJiZcbiAgICAvLyAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgIFwiX3RyX3RhbGx5OiBiYWQgbWF0Y2hcIik7XG5cbiAgICBzLmR5bl9sdHJlZVsoX2xlbmd0aF9jb2RlW2xjXSArIExJVEVSQUxTICsgMSkgKiAyXS8qLkZyZXEqLysrO1xuICAgIHMuZHluX2R0cmVlW2RfY29kZShkaXN0KSAqIDJdLyouRnJlcSovKys7XG4gIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcblxuLy8jaWZkZWYgVFJVTkNBVEVfQkxPQ0tcbi8vICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi9cbi8vICBpZiAoKHMubGFzdF9saXQgJiAweDFmZmYpID09PSAwICYmIHMubGV2ZWwgPiAyKSB7XG4vLyAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi9cbi8vICAgIG91dF9sZW5ndGggPSBzLmxhc3RfbGl0Kjg7XG4vLyAgICBpbl9sZW5ndGggPSBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydDtcbi8vXG4vLyAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7XG4vLyAgICAgIG91dF9sZW5ndGggKz0gcy5keW5fZHRyZWVbZGNvZGUqMl0vKi5GcmVxKi8gKiAoNSArIGV4dHJhX2RiaXRzW2Rjb2RlXSk7XG4vLyAgICB9XG4vLyAgICBvdXRfbGVuZ3RoID4+Pj0gMztcbi8vICAgIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgXCIsXG4vLyAgICAvLyAgICAgICBzLT5sYXN0X2xpdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLFxuLy8gICAgLy8gICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTtcbi8vICAgIGlmIChzLm1hdGNoZXMgPCAocy5sYXN0X2xpdD4+MSkvKmludCAvMiovICYmIG91dF9sZW5ndGggPCAoaW5fbGVuZ3RoPj4xKS8qaW50IC8yKi8pIHtcbi8vICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICB9XG4vLyAgfVxuLy8jZW5kaWZcblxuICByZXR1cm4gKHMubGFzdF9saXQgPT09IHMubGl0X2J1ZnNpemUgLSAxKTtcbiAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLXG4gICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvXG4gICAqIDY0Sy0xIGJ5dGVzLlxuICAgKi9cbn1cblxuZXhwb3J0cy5fdHJfaW5pdCAgPSBfdHJfaW5pdDtcbmV4cG9ydHMuX3RyX3N0b3JlZF9ibG9jayA9IF90cl9zdG9yZWRfYmxvY2s7XG5leHBvcnRzLl90cl9mbHVzaF9ibG9jayAgPSBfdHJfZmx1c2hfYmxvY2s7XG5leHBvcnRzLl90cl90YWxseSA9IF90cl90YWxseTtcbmV4cG9ydHMuX3RyX2FsaWduID0gX3RyX2FsaWduO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIFpTdHJlYW0oKSB7XG4gIC8qIG5leHQgaW5wdXQgYnl0ZSAqL1xuICB0aGlzLmlucHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfaW4gPSAwO1xuICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IGlucHV0ICovXG4gIHRoaXMuYXZhaWxfaW4gPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9pbiA9IDA7XG4gIC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqL1xuICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X291dCA9IDA7XG4gIC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG91dHB1dCAqL1xuICB0aGlzLmF2YWlsX291dCA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovXG4gIHRoaXMudG90YWxfb3V0ID0gMDtcbiAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovXG4gIHRoaXMubXNnID0gJycvKlpfTlVMTCovO1xuICAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi9cbiAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi9cbiAgdGhpcy5kYXRhX3R5cGUgPSAyLypaX1VOS05PV04qLztcbiAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi9cbiAgdGhpcy5hZGxlciA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gbGlnaHR3ZWlnaHQgQnVmZmVyIHNoaW0gZm9yIHBiZiBicm93c2VyIGJ1aWxkXG4vLyBiYXNlZCBvbiBjb2RlIGZyb20gZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyIChNSVQtbGljZW5zZWQpXG5cbm1vZHVsZS5leHBvcnRzID0gQnVmZmVyO1xuXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKTtcblxudmFyIEJ1ZmZlck1ldGhvZHM7XG5cbmZ1bmN0aW9uIEJ1ZmZlcihsZW5ndGgpIHtcbiAgICB2YXIgYXJyO1xuICAgIGlmIChsZW5ndGggJiYgbGVuZ3RoLmxlbmd0aCkge1xuICAgICAgICBhcnIgPSBsZW5ndGg7XG4gICAgICAgIGxlbmd0aCA9IGFyci5sZW5ndGg7XG4gICAgfVxuICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGggfHwgMCk7XG4gICAgaWYgKGFycikgYnVmLnNldChhcnIpO1xuXG4gICAgYnVmLnJlYWRVSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZFVJbnQzMkxFO1xuICAgIGJ1Zi53cml0ZVVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZVVJbnQzMkxFO1xuICAgIGJ1Zi5yZWFkSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZEludDMyTEU7XG4gICAgYnVmLndyaXRlSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVJbnQzMkxFO1xuICAgIGJ1Zi5yZWFkRmxvYXRMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZEZsb2F0TEU7XG4gICAgYnVmLndyaXRlRmxvYXRMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVGbG9hdExFO1xuICAgIGJ1Zi5yZWFkRG91YmxlTEUgPSBCdWZmZXJNZXRob2RzLnJlYWREb3VibGVMRTtcbiAgICBidWYud3JpdGVEb3VibGVMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVEb3VibGVMRTtcbiAgICBidWYudG9TdHJpbmcgPSBCdWZmZXJNZXRob2RzLnRvU3RyaW5nO1xuICAgIGJ1Zi53cml0ZSA9IEJ1ZmZlck1ldGhvZHMud3JpdGU7XG4gICAgYnVmLnNsaWNlID0gQnVmZmVyTWV0aG9kcy5zbGljZTtcbiAgICBidWYuY29weSA9IEJ1ZmZlck1ldGhvZHMuY29weTtcblxuICAgIGJ1Zi5faXNCdWZmZXIgPSB0cnVlO1xuICAgIHJldHVybiBidWY7XG59XG5cbnZhciBsYXN0U3RyLCBsYXN0U3RyRW5jb2RlZDtcblxuQnVmZmVyTWV0aG9kcyA9IHtcbiAgICByZWFkVUludDMyTEU6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICByZXR1cm4gKCh0aGlzW3Bvc10pIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDJdIDw8IDE2KSkgK1xuICAgICAgICAgICAgKHRoaXNbcG9zICsgM10gKiAweDEwMDAwMDApO1xuICAgIH0sXG5cbiAgICB3cml0ZVVJbnQzMkxFOiBmdW5jdGlvbih2YWwsIHBvcykge1xuICAgICAgICB0aGlzW3Bvc10gPSB2YWw7XG4gICAgICAgIHRoaXNbcG9zICsgMV0gPSAodmFsID4+PiA4KTtcbiAgICAgICAgdGhpc1twb3MgKyAyXSA9ICh2YWwgPj4+IDE2KTtcbiAgICAgICAgdGhpc1twb3MgKyAzXSA9ICh2YWwgPj4+IDI0KTtcbiAgICB9LFxuXG4gICAgcmVhZEludDMyTEU6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICByZXR1cm4gKCh0aGlzW3Bvc10pIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDJdIDw8IDE2KSkgK1xuICAgICAgICAgICAgKHRoaXNbcG9zICsgM10gPDwgMjQpO1xuICAgIH0sXG5cbiAgICByZWFkRmxvYXRMRTogIGZ1bmN0aW9uKHBvcykgeyByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIHBvcywgdHJ1ZSwgMjMsIDQpOyB9LFxuICAgIHJlYWREb3VibGVMRTogZnVuY3Rpb24ocG9zKSB7IHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgcG9zLCB0cnVlLCA1MiwgOCk7IH0sXG5cbiAgICB3cml0ZUZsb2F0TEU6ICBmdW5jdGlvbih2YWwsIHBvcykgeyByZXR1cm4gaWVlZTc1NC53cml0ZSh0aGlzLCB2YWwsIHBvcywgdHJ1ZSwgMjMsIDQpOyB9LFxuICAgIHdyaXRlRG91YmxlTEU6IGZ1bmN0aW9uKHZhbCwgcG9zKSB7IHJldHVybiBpZWVlNzU0LndyaXRlKHRoaXMsIHZhbCwgcG9zLCB0cnVlLCA1MiwgOCk7IH0sXG5cbiAgICB0b1N0cmluZzogZnVuY3Rpb24oZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdmFyIHN0ciA9ICcnLFxuICAgICAgICAgICAgdG1wID0gJyc7XG5cbiAgICAgICAgc3RhcnQgPSBzdGFydCB8fCAwO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbih0aGlzLmxlbmd0aCwgZW5kIHx8IHRoaXMubGVuZ3RoKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoID0gdGhpc1tpXTtcbiAgICAgICAgICAgIGlmIChjaCA8PSAweDdGKSB7XG4gICAgICAgICAgICAgICAgc3RyICs9IGRlY29kZVVSSUNvbXBvbmVudCh0bXApICsgU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICAgICAgICAgICAgdG1wID0gJyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRtcCArPSAnJScgKyBjaC50b1N0cmluZygxNik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdHIgKz0gZGVjb2RlVVJJQ29tcG9uZW50KHRtcCk7XG5cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9LFxuXG4gICAgd3JpdGU6IGZ1bmN0aW9uKHN0ciwgcG9zKSB7XG4gICAgICAgIHZhciBieXRlcyA9IHN0ciA9PT0gbGFzdFN0ciA/IGxhc3RTdHJFbmNvZGVkIDogZW5jb2RlU3RyaW5nKHN0cik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXNbcG9zICsgaV0gPSBieXRlc1tpXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzbGljZTogZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKTtcbiAgICB9LFxuXG4gICAgY29weTogZnVuY3Rpb24oYnVmLCBwb3MpIHtcbiAgICAgICAgcG9zID0gcG9zIHx8IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYnVmW3BvcyArIGldID0gdGhpc1tpXTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkJ1ZmZlck1ldGhvZHMud3JpdGVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZVVJbnQzMkxFO1xuXG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGZ1bmN0aW9uKHN0cikge1xuICAgIGxhc3RTdHIgPSBzdHI7XG4gICAgbGFzdFN0ckVuY29kZWQgPSBlbmNvZGVTdHJpbmcoc3RyKTtcbiAgICByZXR1cm4gbGFzdFN0ckVuY29kZWQubGVuZ3RoO1xufTtcblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24oYnVmKSB7XG4gICAgcmV0dXJuICEhKGJ1ZiAmJiBidWYuX2lzQnVmZmVyKTtcbn07XG5cbmZ1bmN0aW9uIGVuY29kZVN0cmluZyhzdHIpIHtcbiAgICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aCxcbiAgICAgICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBjLCBsZWFkOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpOyAvLyBjb2RlIHBvaW50XG5cbiAgICAgICAgaWYgKGMgPiAweEQ3RkYgJiYgYyA8IDB4RTAwMCkge1xuXG4gICAgICAgICAgICBpZiAobGVhZCkge1xuICAgICAgICAgICAgICAgIGlmIChjIDwgMHhEQzAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgICAgICAgICAgIGxlYWQgPSBjO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBsZWFkIC0gMHhEODAwIDw8IDEwIHwgYyAtIDB4REMwMCB8IDB4MTAwMDA7XG4gICAgICAgICAgICAgICAgICAgIGxlYWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA+IDB4REJGRiB8fCAoaSArIDEgPT09IGxlbmd0aCkpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgICAgICAgZWxzZSBsZWFkID0gYztcblxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAobGVhZCkge1xuICAgICAgICAgICAgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgIGxlYWQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSBieXRlcy5wdXNoKGMpO1xuICAgICAgICBlbHNlIGlmIChjIDwgMHg4MDApIGJ5dGVzLnB1c2goYyA+PiAweDYgfCAweEMwLCBjICYgMHgzRiB8IDB4ODApO1xuICAgICAgICBlbHNlIGlmIChjIDwgMHgxMDAwMCkgYnl0ZXMucHVzaChjID4+IDB4QyB8IDB4RTAsIGMgPj4gMHg2ICYgMHgzRiB8IDB4ODAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgICAgIGVsc2UgYnl0ZXMucHVzaChjID4+IDB4MTIgfCAweEYwLCBjID4+IDB4QyAmIDB4M0YgfCAweDgwLCBjID4+IDB4NiAmIDB4M0YgfCAweDgwLCBjICYgMHgzRiB8IDB4ODApO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGJmO1xuXG52YXIgQnVmZmVyID0gZ2xvYmFsLkJ1ZmZlciB8fCByZXF1aXJlKCcuL2J1ZmZlcicpO1xuXG5mdW5jdGlvbiBQYmYoYnVmKSB7XG4gICAgdGhpcy5idWYgPSAhQnVmZmVyLmlzQnVmZmVyKGJ1ZikgPyBuZXcgQnVmZmVyKGJ1ZiB8fCAwKSA6IGJ1ZjtcbiAgICB0aGlzLnBvcyA9IDA7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLmJ1Zi5sZW5ndGg7XG59XG5cblBiZi5WYXJpbnQgID0gMDsgLy8gdmFyaW50OiBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBzaW50MzIsIHNpbnQ2NCwgYm9vbCwgZW51bVxuUGJmLkZpeGVkNjQgPSAxOyAvLyA2NC1iaXQ6IGRvdWJsZSwgZml4ZWQ2NCwgc2ZpeGVkNjRcblBiZi5CeXRlcyAgID0gMjsgLy8gbGVuZ3RoLWRlbGltaXRlZDogc3RyaW5nLCBieXRlcywgZW1iZWRkZWQgbWVzc2FnZXMsIHBhY2tlZCByZXBlYXRlZCBmaWVsZHNcblBiZi5GaXhlZDMyID0gNTsgLy8gMzItYml0OiBmbG9hdCwgZml4ZWQzMiwgc2ZpeGVkMzJcblxudmFyIFNISUZUX0xFRlRfMzIgPSAoMSA8PCAxNikgKiAoMSA8PCAxNiksXG4gICAgU0hJRlRfUklHSFRfMzIgPSAxIC8gU0hJRlRfTEVGVF8zMixcbiAgICBQT1dfMl82MyA9IE1hdGgucG93KDIsIDYzKTtcblxuUGJmLnByb3RvdHlwZSA9IHtcblxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmJ1ZiA9IG51bGw7XG4gICAgfSxcblxuICAgIC8vID09PSBSRUFESU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICByZWFkRmllbGRzOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCwgZW5kKSB7XG4gICAgICAgIGVuZCA9IGVuZCB8fCB0aGlzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLnJlYWRWYXJpbnQoKSxcbiAgICAgICAgICAgICAgICB0YWcgPSB2YWwgPj4gMyxcbiAgICAgICAgICAgICAgICBzdGFydFBvcyA9IHRoaXMucG9zO1xuXG4gICAgICAgICAgICByZWFkRmllbGQodGFnLCByZXN1bHQsIHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgPT09IHN0YXJ0UG9zKSB0aGlzLnNraXAodmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICByZWFkTWVzc2FnZTogZnVuY3Rpb24ocmVhZEZpZWxkLCByZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZpZWxkcyhyZWFkRmllbGQsIHJlc3VsdCwgdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyk7XG4gICAgfSxcblxuICAgIHJlYWRGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkSW50MzJMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIC8vIDY0LWJpdCBpbnQgaGFuZGxpbmcgaXMgYmFzZWQgb24gZ2l0aHViLmNvbS9kcHcvbm9kZS1idWZmZXItbW9yZS1pbnRzIChNSVQtbGljZW5zZWQpXG5cbiAgICByZWFkRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpICsgdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKSArIHRoaXMuYnVmLnJlYWRJbnQzMkxFKHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkRmxvYXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZEZsb2F0TEUodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkRG91YmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWREb3VibGVMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYnVmID0gdGhpcy5idWYsXG4gICAgICAgICAgICB2YWwsIGIsIGIwLCBiMSwgYjIsIGIzO1xuXG4gICAgICAgIGIwID0gYnVmW3RoaXMucG9zKytdOyBpZiAoYjAgPCAweDgwKSByZXR1cm4gYjA7ICAgICAgICAgICAgICAgICBiMCA9IGIwICYgMHg3ZjtcbiAgICAgICAgYjEgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMSA8IDB4ODApIHJldHVybiBiMCB8IGIxIDw8IDc7ICAgICAgIGIxID0gKGIxICYgMHg3ZikgPDwgNztcbiAgICAgICAgYjIgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMiA8IDB4ODApIHJldHVybiBiMCB8IGIxIHwgYjIgPDwgMTQ7IGIyID0gKGIyICYgMHg3ZikgPDwgMTQ7XG4gICAgICAgIGIzID0gYnVmW3RoaXMucG9zKytdOyBpZiAoYjMgPCAweDgwKSByZXR1cm4gYjAgfCBiMSB8IGIyIHwgYjMgPDwgMjE7XG5cbiAgICAgICAgdmFsID0gYjAgfCBiMSB8IGIyIHwgKGIzICYgMHg3ZikgPDwgMjE7XG5cbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDEwMDAwMDAwOyAgICAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDgwMDAwMDAwMDsgICAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDQwMDAwMDAwMDAwOyAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDIwMDAwMDAwMDAwMDA7ICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDEwMDAwMDAwMDAwMDAwMDsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDgwMDAwMDAwMDAwMDAwMDA7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzJyk7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMucG9zLFxuICAgICAgICAgICAgdmFsID0gdGhpcy5yZWFkVmFyaW50KCk7XG5cbiAgICAgICAgaWYgKHZhbCA8IFBPV18yXzYzKSByZXR1cm4gdmFsO1xuXG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcyAtIDI7XG4gICAgICAgIHdoaWxlICh0aGlzLmJ1Zltwb3NdID09PSAweGZmKSBwb3MtLTtcbiAgICAgICAgaWYgKHBvcyA8IHN0YXJ0UG9zKSBwb3MgPSBzdGFydFBvcztcblxuICAgICAgICB2YWwgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvcyAtIHN0YXJ0UG9zICsgMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYiA9IH50aGlzLmJ1ZltzdGFydFBvcyArIGldICYgMHg3ZjtcbiAgICAgICAgICAgIHZhbCArPSBpIDwgNCA/IGIgPDwgaSAqIDcgOiBiICogTWF0aC5wb3coMiwgaSAqIDcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIC12YWwgLSAxO1xuICAgIH0sXG5cbiAgICByZWFkU1ZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBudW0gPSB0aGlzLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDIgPT09IDEgPyAobnVtICsgMSkgLyAtMiA6IG51bSAvIDI7IC8vIHppZ3phZyBlbmNvZGluZ1xuICAgIH0sXG5cbiAgICByZWFkQm9vbGVhbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKTtcbiAgICB9LFxuXG4gICAgcmVhZFN0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgc3RyID0gdGhpcy5idWYudG9TdHJpbmcoJ3V0ZjgnLCB0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfSxcblxuICAgIHJlYWRCeXRlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5idWYuc2xpY2UodGhpcy5wb3MsIGVuZCk7XG4gICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH0sXG5cbiAgICAvLyB2ZXJib3NlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOyBkb2Vzbid0IGFmZmVjdCBnemlwcGVkIHNpemVcblxuICAgIHJlYWRQYWNrZWRWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkVmFyaW50KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU1ZhcmludCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRmxvYXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRmxvYXQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRG91YmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG5cbiAgICBza2lwOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB2YWwgJiAweDc7XG4gICAgICAgIGlmICh0eXBlID09PSBQYmYuVmFyaW50KSB3aGlsZSAodGhpcy5idWZbdGhpcy5wb3MrK10gPiAweDdmKSB7fVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuQnl0ZXMpIHRoaXMucG9zID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcztcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkMzIpIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5GaXhlZDY0KSB0aGlzLnBvcyArPSA4O1xuICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcignVW5pbXBsZW1lbnRlZCB0eXBlOiAnICsgdHlwZSk7XG4gICAgfSxcblxuICAgIC8vID09PSBXUklUSU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICB3cml0ZVRhZzogZnVuY3Rpb24odGFnLCB0eXBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoKHRhZyA8PCAzKSB8IHR5cGUpO1xuICAgIH0sXG5cbiAgICByZWFsbG9jOiBmdW5jdGlvbihtaW4pIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDE2O1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGggPCB0aGlzLnBvcyArIG1pbikgbGVuZ3RoICo9IDI7XG5cbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKGxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLmJ1Zi5jb3B5KGJ1Zik7XG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnNsaWNlKDAsIHRoaXMubGVuZ3RoKTtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDMyOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZVVJbnQzMkxFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZVNGaXhlZDMyOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlVUludDMyTEUoTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkNjQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRSh2YWwgJiAtMSwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUoTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlVmFyaW50OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdmFsID0gK3ZhbDtcblxuICAgICAgICBpZiAodmFsIDw9IDB4N2YpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gdmFsO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodmFsIDw9IDB4M2ZmZikge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDIpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMCkgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiA3KSAmIDB4N2YpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodmFsIDw9IDB4MWZmZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMyk7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMTQpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHhmZmZmZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMTQpICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMjEpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgICAgIHdoaWxlICh2YWwgPj0gMHg4MCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICh2YWwgJiAweGZmKSB8IDB4ODA7XG4gICAgICAgICAgICAgICAgdmFsIC89IDB4ODA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMSk7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IHZhbCB8IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgLSBwb3MgPiAxMCkgdGhyb3cgbmV3IEVycm9yKCdHaXZlbiB2YXJpbnQgZG9lc25cXCd0IGZpdCBpbnRvIDEwIGJ5dGVzJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgd3JpdGVTVmFyaW50OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwgPCAwID8gLXZhbCAqIDIgLSAxIDogdmFsICogMik7XG4gICAgfSxcblxuICAgIHdyaXRlQm9vbGVhbjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoQm9vbGVhbih2YWwpKTtcbiAgICB9LFxuXG4gICAgd3JpdGVTdHJpbmc6IGZ1bmN0aW9uKHN0cikge1xuICAgICAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICAgICAgdmFyIGJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoc3RyKTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChieXRlcyk7XG4gICAgICAgIHRoaXMucmVhbGxvYyhieXRlcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlKHN0ciwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSBieXRlcztcbiAgICB9LFxuXG4gICAgd3JpdGVGbG9hdDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVGbG9hdExFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZURvdWJsZTogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVEb3VibGVMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVCeXRlczogZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICAgIHZhciBsZW4gPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucmVhbGxvYyhsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IGJ1ZmZlcltpXTtcbiAgICB9LFxuXG4gICAgd3JpdGVNZXNzYWdlOiBmdW5jdGlvbih0YWcsIGZuLCBvYmopIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG5cbiAgICAgICAgdGhpcy5wb3MrKzsgLy8gcmVzZXJ2ZSAxIGJ5dGUgZm9yIHNob3J0IG1lc3NhZ2UgbGVuZ3RoXG5cbiAgICAgICAgLy8gd3JpdGUgdGhlIG1lc3NhZ2UgZGlyZWN0bHkgdG8gdGhlIGJ1ZmZlciBhbmQgc2VlIGhvdyBtdWNoIHdhcyB3cml0dGVuXG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMucG9zO1xuICAgICAgICBmbihvYmosIHRoaXMpO1xuICAgICAgICB2YXIgbGVuID0gdGhpcy5wb3MgLSBzdGFydFBvcztcblxuICAgICAgICB2YXIgdmFyaW50TGVuID1cbiAgICAgICAgICAgIGxlbiA8PSAweDdmID8gMSA6XG4gICAgICAgICAgICBsZW4gPD0gMHgzZmZmID8gMiA6XG4gICAgICAgICAgICBsZW4gPD0gMHgxZmZmZmYgPyAzIDpcbiAgICAgICAgICAgIGxlbiA8PSAweGZmZmZmZmYgPyA0IDogTWF0aC5jZWlsKE1hdGgubG9nKGxlbikgLyAoTWF0aC5MTjIgKiA3KSk7XG5cbiAgICAgICAgLy8gaWYgMSBieXRlIGlzbid0IGVub3VnaCBmb3IgZW5jb2RpbmcgbWVzc2FnZSBsZW5ndGgsIHNoaWZ0IHRoZSBkYXRhIHRvIHRoZSByaWdodFxuICAgICAgICBpZiAodmFyaW50TGVuID4gMSkge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKHZhcmludExlbiAtIDEpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMucG9zIC0gMTsgaSA+PSBzdGFydFBvczsgaS0tKSB0aGlzLmJ1ZltpICsgdmFyaW50TGVuIC0gMV0gPSB0aGlzLmJ1ZltpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSBtZXNzYWdlIGxlbmd0aCBpbiB0aGUgcmVzZXJ2ZWQgcGxhY2UgYW5kIHJlc3RvcmUgdGhlIHBvc2l0aW9uXG4gICAgICAgIHRoaXMucG9zID0gc3RhcnRQb3MgLSAxO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICB9LFxuXG4gICAgd3JpdGVQYWNrZWRWYXJpbnQ6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFZhcmludCwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkU1ZhcmludDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTVmFyaW50LCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEJvb2xlYW46ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkQm9vbGVhbiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRGbG9hdDogICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZsb2F0LCBhcnIpOyAgICB9LFxuICAgIHdyaXRlUGFja2VkRG91YmxlOiAgIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWREb3VibGUsIGFycik7ICAgfSxcbiAgICB3cml0ZVBhY2tlZEZpeGVkMzI6ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRml4ZWQzMiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNGaXhlZDMyLCBhcnIpOyB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQ2NDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDY0LCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDY0OiBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkNjQsIGFycik7IH0sXG5cbiAgICB3cml0ZUJ5dGVzRmllbGQ6IGZ1bmN0aW9uKHRhZywgYnVmZmVyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlQnl0ZXMoYnVmZmVyKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkMzIodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkNjQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVNWYXJpbnQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU3RyaW5nRmllbGQ6IGZ1bmN0aW9uKHRhZywgc3RyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKHN0cik7XG4gICAgfSxcbiAgICB3cml0ZUZsb2F0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGbG9hdCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVEb3VibGVGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICAgICAgdGhpcy53cml0ZURvdWJsZSh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVCb29sZWFuRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnRGaWVsZCh0YWcsIEJvb2xlYW4odmFsKSk7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gd3JpdGVQYWNrZWRWYXJpbnQoYXJyLCBwYmYpICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlVmFyaW50KGFycltpXSk7ICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTVmFyaW50KGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU1ZhcmludChhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGbG9hdChhcnIsIHBiZikgICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRmxvYXQoYXJyW2ldKTsgICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWREb3VibGUoYXJyLCBwYmYpICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRG91YmxlKGFycltpXSk7ICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRCb29sZWFuKGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlQm9vbGVhbihhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDMyKGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRml4ZWQzMihhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQzMihhcnIsIHBiZikgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU0ZpeGVkMzIoYXJyW2ldKTsgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDY0KGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRml4ZWQ2NChhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQ2NChhcnIsIHBiZikgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU0ZpeGVkNjQoYXJyW2ldKTsgfVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50O1xuXG5mdW5jdGlvbiBQb2ludCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xufVxuXG5Qb2ludC5wcm90b3R5cGUgPSB7XG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IFBvaW50KHRoaXMueCwgdGhpcy55KTsgfSxcblxuICAgIGFkZDogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHApOyAgICAgfSxcbiAgICBzdWI6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3N1YihwKTsgICAgIH0sXG4gICAgbXVsdDogICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0KGspOyAgICB9LFxuICAgIGRpdjogICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2KGspOyAgICAgfSxcbiAgICByb3RhdGU6ICBmdW5jdGlvbihhKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZShhKTsgIH0sXG4gICAgbWF0TXVsdDogZnVuY3Rpb24obSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KG0pOyB9LFxuICAgIHVuaXQ6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCk7IH0sXG4gICAgcGVycDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3BlcnAoKTsgfSxcbiAgICByb3VuZDogICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKTsgfSxcblxuICAgIG1hZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55KTtcbiAgICB9LFxuXG4gICAgZXF1YWxzOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnggPT09IHAueCAmJlxuICAgICAgICAgICAgICAgdGhpcy55ID09PSBwLnk7XG4gICAgfSxcblxuICAgIGRpc3Q6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RTcXIocCkpO1xuICAgIH0sXG5cbiAgICBkaXN0U3FyOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHZhciBkeCA9IHAueCAtIHRoaXMueCxcbiAgICAgICAgICAgIGR5ID0gcC55IC0gdGhpcy55O1xuICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG4gICAgfSxcblxuICAgIGFuZ2xlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55LCB0aGlzLngpO1xuICAgIH0sXG5cbiAgICBhbmdsZVRvOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSAtIGIueSwgdGhpcy54IC0gYi54KTtcbiAgICB9LFxuXG4gICAgYW5nbGVXaXRoOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuZ2xlV2l0aFNlcChiLngsIGIueSk7XG4gICAgfSxcblxuICAgIC8vIEZpbmQgdGhlIGFuZ2xlIG9mIHRoZSB0d28gdmVjdG9ycywgc29sdmluZyB0aGUgZm9ybXVsYSBmb3IgdGhlIGNyb3NzIHByb2R1Y3QgYSB4IGIgPSB8YXx8YnxzaW4ozrgpIGZvciDOuC5cbiAgICBhbmdsZVdpdGhTZXA6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIoXG4gICAgICAgICAgICB0aGlzLnggKiB5IC0gdGhpcy55ICogeCxcbiAgICAgICAgICAgIHRoaXMueCAqIHggKyB0aGlzLnkgKiB5KTtcbiAgICB9LFxuXG4gICAgX21hdE11bHQ6IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgdmFyIHggPSBtWzBdICogdGhpcy54ICsgbVsxXSAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBtWzJdICogdGhpcy54ICsgbVszXSAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9hZGQ6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54ICs9IHAueDtcbiAgICAgICAgdGhpcy55ICs9IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9zdWI6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54IC09IHAueDtcbiAgICAgICAgdGhpcy55IC09IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9tdWx0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAqPSBrO1xuICAgICAgICB0aGlzLnkgKj0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kaXY6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54IC89IGs7XG4gICAgICAgIHRoaXMueSAvPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3VuaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9kaXYodGhpcy5tYWcoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcGVycDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xuICAgICAgICB0aGlzLnkgPSB0aGlzLng7XG4gICAgICAgIHRoaXMueCA9IC15O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdGF0ZTogZnVuY3Rpb24oYW5nbGUpIHtcbiAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIHggPSBjb3MgKiB0aGlzLnggLSBzaW4gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gc2luICogdGhpcy54ICsgY29zICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy54ID0gTWF0aC5yb3VuZCh0aGlzLngpO1xuICAgICAgICB0aGlzLnkgPSBNYXRoLnJvdW5kKHRoaXMueSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG5cbi8vIGNvbnN0cnVjdHMgUG9pbnQgZnJvbSBhbiBhcnJheSBpZiBuZWNlc3NhcnlcblBvaW50LmNvbnZlcnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIGlmIChhIGluc3RhbmNlb2YgUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoYVswXSwgYVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBhO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKCFwcm9jZXNzLnZlcnNpb24gfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjAuJykgPT09IDAgfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuJykgPT09IDAgJiYgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLjguJykgIT09IDApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBuZXh0VGljaztcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcHJvY2Vzcy5uZXh0VGljaztcbn1cblxuZnVuY3Rpb24gbmV4dFRpY2soZm4sIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiY2FsbGJhY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGFyZ3MsIGk7XG4gIHN3aXRjaCAobGVuKSB7XG4gIGNhc2UgMDpcbiAgY2FzZSAxOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZuKTtcbiAgY2FzZSAyOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja09uZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSk7XG4gICAgfSk7XG4gIGNhc2UgMzpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUd28oKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIpO1xuICAgIH0pO1xuICBjYXNlIDQ6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVGhyZWUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgIH0pO1xuICBkZWZhdWx0OlxuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBhcmdzLmxlbmd0aCkge1xuICAgICAgYXJnc1tpKytdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2soKSB7XG4gICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfXJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcblxudXRpbC5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxudmFyIGtleXMgPSBvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG5mb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcHJvY2Vzc05leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59IiwiLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB1bmRlZmluZWQ7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNraXBBZGQ7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgc2tpcEFkZCA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIGNodW5rLmxlbmd0aCA9PT0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhZGRUb0Zyb250KSBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIERvbid0IGFkZCB0byB0aGUgYnVmZmVyIGlmIHdlJ3ZlIGRlY29kZWQgdG8gYW4gZW1wdHkgc3RyaW5nIGNodW5rIGFuZFxuICAgICAgLy8gd2UncmUgbm90IGluIG9iamVjdCBtb2RlXG4gICAgICBpZiAoIXNraXBBZGQpIHtcbiAgICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5uZWVkUmVhZGFibGUgfHwgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgcmV0dXJuIDA7XG5cbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKG4gPT09IG51bGwgfHwgaXNOYU4obikpIHtcbiAgICAvLyBvbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyWzBdLmxlbmd0aDtlbHNlIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKSByZXR1cm4gMDtcblxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgdGFyZ2V0IGJ1ZmZlciBsZXZlbCxcbiAgLy8gdGhlbiByYWlzZSB0aGUgd2F0ZXIgbWFyay4gIEJ1bXAgdXAgdG8gdGhlIG5leHQgaGlnaGVzdFxuICAvLyBwb3dlciBvZiAyLCB0byBwcmV2ZW50IGluY3JlYXNpbmcgaXQgZXhjZXNzaXZlbHkgaW4gdGlueVxuICAvLyBhbW91bnRzLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcblxuICAvLyBkb24ndCBoYXZlIHRoYXQgbXVjaC4gIHJldHVybiBudWxsLCB1bmxlc3Mgd2UndmUgZW5kZWQuXG4gIGlmIChuID4gc3RhdGUubGVuZ3RoKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA+IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH1cblxuICBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICBpZiAoZG9SZWFkICYmICFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfVxuXG4gIHN0YXRlLmxlbmd0aCAtPSBuO1xuXG4gIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHByb2Nlc3NOZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwcm9jZXNzTmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0KSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXNbMF0gPT09IGRlc3QgJiYgc3JjLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA9PT0gMSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG4gIC8vIFRoaXMgaXMgYSBicnV0YWxseSB1Z2x5IGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXJcbiAgLy8gaXMgYXR0YWNoZWQgYmVmb3JlIGFueSB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy5cbiAgaWYgKCFkZXN0Ll9ldmVudHMgfHwgIWRlc3QuX2V2ZW50cy5lcnJvcikgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtlbHNlIGlmIChpc0FycmF5KGRlc3QuX2V2ZW50cy5lcnJvcikpIGRlc3QuX2V2ZW50cy5lcnJvci51bnNoaWZ0KG9uZXJyb3IpO2Vsc2UgZGVzdC5fZXZlbnRzLmVycm9yID0gW29uZXJyb3IsIGRlc3QuX2V2ZW50cy5lcnJvcl07XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgZGVzdHNbX2ldLmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgLy8gSWYgbGlzdGVuaW5nIHRvIGRhdGEsIGFuZCBpdCBoYXMgbm90IGV4cGxpY2l0bHkgYmVlbiBwYXVzZWQsXG4gIC8vIHRoZW4gY2FsbCByZXN1bWUgdG8gc3RhcnQgdGhlIGZsb3cgb2YgZGF0YSBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAoZXYgPT09ICdkYXRhJyAmJiBmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgdGhpcy5yZXN1bWUoKTtcbiAgfVxuXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyAmJiAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzc05leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICB9IHdoaWxlIChudWxsICE9PSBjaHVuayAmJiBzdGF0ZS5mbG93aW5nKTtcbiAgfVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbiAoZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICB2YXIgbGlzdCA9IHN0YXRlLmJ1ZmZlcjtcbiAgdmFyIGxlbmd0aCA9IHN0YXRlLmxlbmd0aDtcbiAgdmFyIHN0cmluZ01vZGUgPSAhIXN0YXRlLmRlY29kZXI7XG4gIHZhciBvYmplY3RNb2RlID0gISFzdGF0ZS5vYmplY3RNb2RlO1xuICB2YXIgcmV0O1xuXG4gIC8vIG5vdGhpbmcgaW4gdGhlIGxpc3QsIGRlZmluaXRlbHkgZW1wdHkuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0ID0gbnVsbDtlbHNlIGlmIChvYmplY3RNb2RlKSByZXQgPSBsaXN0LnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBsZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGFycmF5LlxuICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSBsaXN0LmpvaW4oJycpO2Vsc2UgaWYgKGxpc3QubGVuZ3RoID09PSAxKSByZXQgPSBsaXN0WzBdO2Vsc2UgcmV0ID0gQnVmZmVyLmNvbmNhdChsaXN0LCBsZW5ndGgpO1xuICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIGp1c3Qgc29tZSBvZiBpdC5cbiAgICBpZiAobiA8IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBqdXN0IHRha2UgYSBwYXJ0IG9mIHRoZSBmaXJzdCBsaXN0IGl0ZW0uXG4gICAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5ncy5cbiAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgcmV0ID0gYnVmLnNsaWNlKDAsIG4pO1xuICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShuKTtcbiAgICB9IGVsc2UgaWYgKG4gPT09IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBmaXJzdCBsaXN0IGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wbGV4IGNhc2UuXG4gICAgICAvLyB3ZSBoYXZlIGVub3VnaCB0byBjb3ZlciBpdCwgYnV0IGl0IHNwYW5zIHBhc3QgdGhlIGZpcnN0IGJ1ZmZlci5cbiAgICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSAnJztlbHNlIHJldCA9IG5ldyBCdWZmZXIobik7XG5cbiAgICAgIHZhciBjID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsICYmIGMgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICAgIHZhciBjcHkgPSBNYXRoLm1pbihuIC0gYywgYnVmLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHN0cmluZ01vZGUpIHJldCArPSBidWYuc2xpY2UoMCwgY3B5KTtlbHNlIGJ1Zi5jb3B5KHJldCwgYywgMCwgY3B5KTtcblxuICAgICAgICBpZiAoY3B5IDwgYnVmLmxlbmd0aCkgbGlzdFswXSA9IGJ1Zi5zbGljZShjcHkpO2Vsc2UgbGlzdC5zaGlmdCgpO1xuXG4gICAgICAgIGMgKz0gY3B5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoJ2VuZFJlYWRhYmxlIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCIvLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG5cbnZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhUcmFuc2Zvcm0sIER1cGxleCk7XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0aGlzLndyaXRlZW5jb2RpbmcgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MnKSk7XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICBzdHJlYW0uX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpO1xuXG4gIC8vIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaDtcbiAgfVxuXG4gIHRoaXMub25jZSgncHJlZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlcikge1xuICAgICAgZG9uZShzdHJlYW0sIGVyKTtcbiAgICB9KTtlbHNlIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICB2YXIgd3MgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHdzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAodHMudHJhbnNmb3JtaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmcnKTtcblxuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59IiwiLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHByb2Nlc3NOZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGNyZWF0ZSB0aGUgdHdvIG9iamVjdHMgbmVlZGVkIHRvIHN0b3JlIHRoZSBjb3JrZWQgcmVxdWVzdHNcbiAgLy8gdGhleSBhcmUgbm90IGEgbGlua2VkIGxpc3QsIGFzIG5vIG5ldyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlcmVcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiB3cml0YWJsZVN0YXRlR2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0aG91Z2ggdGhleSdyZSBub3RcbiAgLy8gaW5zdGFuY2VvZiBXcml0YWJsZSwgdGhleSdyZSBpbnN0YW5jZW9mIFJlYWRhYmxlLlxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV3JpdGFibGUpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW5ub3QgcGlwZS4gTm90IHJlYWRhYmxlLicpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIHZhciBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcbiAgaWYgKHN5bmMpIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO2Vsc2UgY2IoZXIpO1xuXG4gIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBhc3luY1dyaXRlKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQpIHtcbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3NOZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG5cbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIGVudHJ5ID0gX3RoaXMuZW50cnk7XG4gICAgX3RoaXMuZW50cnkgPSBudWxsO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICAgIGNiKGVycik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gX3RoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IF90aGlzO1xuICAgIH1cbiAgfTtcbn0iLCJ2YXIgU3RyZWFtID0gKGZ1bmN0aW9uICgpe1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdzdCcgKyAncmVhbScpOyAvLyBoYWNrIHRvIGZpeCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgaXNzdWUgd2hlbiB1c2VkIHdpdGggYnJvd3NlcmlmeVxuICB9IGNhdGNoKF8pe31cbn0oKSk7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5leHBvcnRzLlN0cmVhbSA9IFN0cmVhbSB8fCBleHBvcnRzO1xuZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG5leHBvcnRzLldyaXRhYmxlID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuZXhwb3J0cy5EdXBsZXggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nXG4gIHx8IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICBjYXNlICdoZXgnOiBjYXNlICd1dGY4JzogY2FzZSAndXRmLTgnOiBjYXNlICdhc2NpaSc6IGNhc2UgJ2JpbmFyeSc6IGNhc2UgJ2Jhc2U2NCc6IGNhc2UgJ3VjczInOiBjYXNlICd1Y3MtMic6IGNhc2UgJ3V0ZjE2bGUnOiBjYXNlICd1dGYtMTZsZSc6IGNhc2UgJ3Jhdyc6IHJldHVybiB0cnVlO1xuICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICAgfVxuXG5cbmZ1bmN0aW9uIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIH1cbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLiBDRVNVLTggaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZSBVVEYtOCBlbmNvZGluZy5cbi8vXG4vLyBAVE9ETyBIYW5kbGluZyBhbGwgZW5jb2RpbmdzIGluc2lkZSBhIHNpbmdsZSBvYmplY3QgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHRcbi8vIHRvIHJlYXNvbiBhYm91dCB0aGlzIGNvZGUsIHNvIGl0IHNob3VsZCBiZSBzcGxpdCB1cCBpbiB0aGUgZnV0dXJlLlxuLy8gQFRPRE8gVGhlcmUgc2hvdWxkIGJlIGEgdXRmOC1zdHJpY3QgZW5jb2RpbmcgdGhhdCByZWplY3RzIGludmFsaWQgVVRGLTggY29kZVxuLy8gcG9pbnRzIGFzIHVzZWQgYnkgQ0VTVS04LlxudmFyIFN0cmluZ0RlY29kZXIgPSBleHBvcnRzLlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5vdWdoIHNwYWNlIHRvIHN0b3JlIGFsbCBieXRlcyBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuIFVURi04IG5lZWRzIDRcbiAgLy8gYnl0ZXMsIGJ1dCBDRVNVLTggbWF5IHJlcXVpcmUgdXAgdG8gNiAoMyBieXRlcyBwZXIgc3Vycm9nYXRlKS5cbiAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IDA7XG4gIC8vIE51bWJlciBvZiBieXRlcyBleHBlY3RlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyTGVuZ3RoID0gMDtcbn07XG5cblxuLy8gd3JpdGUgZGVjb2RlcyB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0IGFzIEpTIHN0cmluZyB0aGF0IGlzXG4vLyBndWFyYW50ZWVkIHRvIG5vdCBjb250YWluIGFueSBwYXJ0aWFsIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gQW55IHBhcnRpYWxcbi8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgYnVmZmVyZWQgdXAsIGFuZCB3aWxsIGJlXG4vLyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgd3JpdGUgYWdhaW4gd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzLlxuLy9cbi8vIE5vdGU6IENvbnZlcnRpbmcgYSBCdWZmZXIgY29udGFpbmluZyBhbiBvcnBoYW4gc3Vycm9nYXRlIHRvIGEgU3RyaW5nXG4vLyBjdXJyZW50bHkgd29ya3MsIGJ1dCBjb252ZXJ0aW5nIGEgU3RyaW5nIHRvIGEgQnVmZmVyICh2aWEgYG5ldyBCdWZmZXJgLCBvclxuLy8gQnVmZmVyI3dyaXRlKSB3aWxsIHJlcGxhY2UgaW5jb21wbGV0ZSBzdXJyb2dhdGVzIHdpdGggdGhlIHVuaWNvZGVcbi8vIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4gU2VlIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMTIxMTczMDA5LyAuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgY2hhclN0ciA9ICcnO1xuICAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgIHZhciBhdmFpbGFibGUgPSAoYnVmZmVyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCkgP1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6XG4gICAgICAgIGJ1ZmZlci5sZW5ndGg7XG5cbiAgICAvLyBhZGQgdGhlIG5ldyBieXRlcyB0byB0aGUgY2hhciBidWZmZXJcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IGF2YWlsYWJsZTtcblxuICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgLy8gc3RpbGwgbm90IGVub3VnaCBjaGFycyBpbiB0aGlzIGJ1ZmZlcj8gd2FpdCBmb3IgbW9yZSAuLi5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXJcbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoYXZhaWxhYmxlLCBidWZmZXIubGVuZ3RoKTtcblxuICAgIC8vIGdldCB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHNwbGl0XG4gICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xuXG4gICAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoYXJTdHI7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIGFuZCBzZXQgY2hhckxlbmd0aCAvIGNoYXJSZWNlaXZlZFxuICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcik7XG5cbiAgdmFyIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG4gIGlmICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBidWZmZXIgdGhlIGluY29tcGxldGUgY2hhcmFjdGVyIGJ5dGVzIHdlIGdvdFxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkLCBlbmQpO1xuICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgfVxuXG4gIGNoYXJTdHIgKz0gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIGVuZCk7XG5cbiAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTtcbiAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGVuZCk7XG4gIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBzaXplO1xuICAgIHRoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgc2l6ZSwgMCwgc2l6ZSk7XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCAwLCBzaXplKTtcbiAgICByZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgfVxuXG4gIC8vIG9yIGp1c3QgZW1pdCB0aGUgY2hhclN0clxuICByZXR1cm4gY2hhclN0cjtcbn07XG5cbi8vIGRldGVjdEluY29tcGxldGVDaGFyIGRldGVybWluZXMgaWYgdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXIgYXRcbi8vIHRoZSBlbmQgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gSWYgc28sIGl0IHNldHMgdGhpcy5jaGFyTGVuZ3RoIHRvIHRoZSBieXRlXG4vLyBsZW5ndGggdGhhdCBjaGFyYWN0ZXIsIGFuZCBzZXRzIHRoaXMuY2hhclJlY2VpdmVkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXNcbi8vIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGFyYWN0ZXIuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gMykgPyAzIDogYnVmZmVyLmxlbmd0aDtcblxuICAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gIC8vIGluY29tcGxldGUgY2hhci5cbiAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07XG5cbiAgICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuXG4gICAgLy8gMTEwWFhYWFhcbiAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMFhYWFhcbiAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMTBYWFhcbiAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gaTtcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgcmVzID0gJyc7XG4gIGlmIChidWZmZXIgJiYgYnVmZmVyLmxlbmd0aClcbiAgICByZXMgPSB0aGlzLndyaXRlKGJ1ZmZlcik7XG5cbiAgaWYgKHRoaXMuY2hhclJlY2VpdmVkKSB7XG4gICAgdmFyIGNyID0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjtcbiAgICB2YXIgZW5jID0gdGhpcy5lbmNvZGluZztcbiAgICByZXMgKz0gYnVmLnNsaWNlKDAsIGNyKS50b1N0cmluZyhlbmMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIHBhc3NUaHJvdWdoV3JpdGUoYnVmZmVyKSB7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAzO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDMgOiAwO1xufVxuIiwiLyohXG4gKiBzdHJpcC1jb21tZW50cyA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvc3RyaXAtY29tbWVudHM+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IEpvbiBTY2hsaW5rZXJ0LCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpYyc7XG5cbnZhciByZUJsb2NrID0gJ1xcXFwvXFxcXConO1xudmFyIHJlQmxvY2tJZ25vcmUgPSAnXFxcXC9cXFxcKig/IVxcXFwqP1xcXFwhKSc7XG52YXIgcmVCbG9ja0VuZCA9ICcoLnxbXFxcXHJcXFxcbl18XFxcXG4pKj9cXFxcKlxcXFwvXFxcXG4/XFxcXG4/JztcbnZhciByZUxpbmUgPSAvKF58W15cXFNcXG5dKSg/OlxcL1xcLykoW1xcc1xcU10rPykkL2dtO1xudmFyIHJlTGluZUlnbm9yZSA9IC8oXnxbXlxcU1xcbl0pKD86XFwvXFwvW14hXSkoW1xcc1xcU10rPykkL2dtO1xuXG5cbi8qKlxuICogU3RyaXAgYWxsIGNvbW1lbnRzXG4gKlxuICogeyU9IGRvY3MoXCJzdHJpcFwiKSAlfVxuICpcbiAqIEBwYXJhbSAgIHtTdHJpbmd9IGBzdHJgICBmaWxlIGNvbnRlbnRzIG9yIHN0cmluZyB0byBzdHJpcC5cbiAqIEBwYXJhbSAgIHtPYmplY3R9IGBvcHRzYCAgb3B0aW9ucyBhcmUgcGFzc2VkIHRvIGAuYmxvY2tgLCBhbmQgYC5saW5lYFxuICogQHJldHVybiAge1N0cmluZ30gU3RyaW5nIHdpdGhvdXQgY29tbWVudHMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnZhciBzdHJpcCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3RyLCBvcHRzKSB7XG4gIHJldHVybiBzdHIgPyBzdHJpcC5ibG9jayhzdHJpcC5saW5lKHN0ciwgb3B0cyksIG9wdHMpIDogJyc7XG59O1xuXG5cbi8qKlxuICogU3RyaXAgb25seSBibG9jayBjb21tZW50cywgb3B0aW9uYWxseSBsZWF2aW5nIHByb3RlY3RlZCBjb21tZW50c1xuICogKGUuZy4gYC8qIWApIGludGFjdC5cbiAqXG4gKiB7JT0gZG9jcyhcImJsb2NrXCIpICV9XG4gKlxuICogQHBhcmFtICAge1N0cmluZ30gYHN0cmAgIGZpbGUgY29udGVudCBvciBzdHJpbmcgdG8gc3RyaXAgdG9cbiAqIEBwYXJhbSAgIHtPYmplY3R9IGBvcHRzYCAgaWYgYHNhZmU6dHJ1ZWAsIHN0cmlwIG9ubHkgY29tbWVudHMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBgLyohYCBvciBgLyoqIWBcbiAqIEByZXR1cm4gIHtTdHJpbmd9IFN0cmluZyB3aXRob3V0IGJsb2NrIGNvbW1lbnRzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5zdHJpcC5ibG9jayA9IGZ1bmN0aW9uKHN0ciwgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgdmFyIHJlID0gbmV3IFJlZ0V4cChyZUJsb2NrICsgcmVCbG9ja0VuZCwgJ2dtJyk7XG4gIGlmKG9wdHMuc2FmZSkge1xuICAgIHJlID0gbmV3IFJlZ0V4cChyZUJsb2NrSWdub3JlICsgcmVCbG9ja0VuZCwgJ2dtJyk7XG4gIH1cbiAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKHJlLCAnJykgOiAnJztcbn07XG5cblxuLyoqXG4gKiBTdHJpcCBvbmx5IGxpbmUgY29tbWVudHNcbiAqXG4gKiB7JT0gZG9jcyhcImxpbmVcIikgJX1cbiAqXG4gKiBAcGFyYW0gICB7U3RyaW5nfSBgc3RyYCAgZmlsZSBjb250ZW50IG9yIHN0cmluZyB0byBzdHJpcCB0b1xuICogQHBhcmFtICAge09iamVjdH0gYG9wdHNgICBpZiBgc2FmZTp0cnVlYCwgc3RyaXAgYWxsIHRoYXQgbm90IHN0YXJ0cyB3aXRoIGAvLyFgXG4gKiBAcmV0dXJuICB7U3RyaW5nfSBTdHJpbmcgd2l0aG91dCBsaW5lIGNvbW1lbnRzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5zdHJpcC5saW5lID0gZnVuY3Rpb24oc3RyLCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB2YXIgcmUgPSByZUxpbmU7XG4gIGlmKG9wdHMuc2FmZSkge1xuICAgIHJlID0gcmVMaW5lSWdub3JlO1xuICB9XG4gIHJldHVybiBzdHIgPyBzdHIucmVwbGFjZShyZSwgJycpIDogJyc7XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RvcG9qc29uL3RvcG9qc29uLWNsaWVudCBWZXJzaW9uIDIuMS4wLiBDb3B5cmlnaHQgMjAxNiBNaWtlIEJvc3RvY2suXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChmYWN0b3J5KChnbG9iYWwudG9wb2pzb24gPSBnbG9iYWwudG9wb2pzb24gfHwge30pKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbnZhciByZXZlcnNlID0gZnVuY3Rpb24oYXJyYXksIG4pIHtcbiAgdmFyIHQsIGogPSBhcnJheS5sZW5ndGgsIGkgPSBqIC0gbjtcbiAgd2hpbGUgKGkgPCAtLWopIHQgPSBhcnJheVtpXSwgYXJyYXlbaSsrXSA9IGFycmF5W2pdLCBhcnJheVtqXSA9IHQ7XG59O1xuXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4O1xufTtcblxudmFyIHRyYW5zZm9ybSA9IGZ1bmN0aW9uKHRvcG9sb2d5KSB7XG4gIGlmICgodHJhbnNmb3JtID0gdG9wb2xvZ3kudHJhbnNmb3JtKSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHk7XG4gIHZhciB0cmFuc2Zvcm0sXG4gICAgICB4MCxcbiAgICAgIHkwLFxuICAgICAga3ggPSB0cmFuc2Zvcm0uc2NhbGVbMF0sXG4gICAgICBreSA9IHRyYW5zZm9ybS5zY2FsZVsxXSxcbiAgICAgIGR4ID0gdHJhbnNmb3JtLnRyYW5zbGF0ZVswXSxcbiAgICAgIGR5ID0gdHJhbnNmb3JtLnRyYW5zbGF0ZVsxXTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHBvaW50LCBpKSB7XG4gICAgaWYgKCFpKSB4MCA9IHkwID0gMDtcbiAgICBwb2ludFswXSA9ICh4MCArPSBwb2ludFswXSkgKiBreCArIGR4O1xuICAgIHBvaW50WzFdID0gKHkwICs9IHBvaW50WzFdKSAqIGt5ICsgZHk7XG4gICAgcmV0dXJuIHBvaW50O1xuICB9O1xufTtcblxudmFyIGZlYXR1cmUgPSBmdW5jdGlvbih0b3BvbG9neSwgbykge1xuICByZXR1cm4gby50eXBlID09PSBcIkdlb21ldHJ5Q29sbGVjdGlvblwiXG4gICAgICA/IHt0eXBlOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsIGZlYXR1cmVzOiBvLmdlb21ldHJpZXMubWFwKGZ1bmN0aW9uKG8pIHsgcmV0dXJuIGZlYXR1cmUkMSh0b3BvbG9neSwgbyk7IH0pfVxuICAgICAgOiBmZWF0dXJlJDEodG9wb2xvZ3ksIG8pO1xufTtcblxuZnVuY3Rpb24gZmVhdHVyZSQxKHRvcG9sb2d5LCBvKSB7XG4gIHZhciBpZCA9IG8uaWQsXG4gICAgICBiYm94ID0gby5iYm94LFxuICAgICAgcHJvcGVydGllcyA9IG8ucHJvcGVydGllcyA9PSBudWxsID8ge30gOiBvLnByb3BlcnRpZXMsXG4gICAgICBnZW9tZXRyeSA9IG9iamVjdCh0b3BvbG9neSwgbyk7XG4gIHJldHVybiBpZCA9PSBudWxsICYmIGJib3ggPT0gbnVsbCA/IHt0eXBlOiBcIkZlYXR1cmVcIiwgcHJvcGVydGllczogcHJvcGVydGllcywgZ2VvbWV0cnk6IGdlb21ldHJ5fVxuICAgICAgOiBiYm94ID09IG51bGwgPyB7dHlwZTogXCJGZWF0dXJlXCIsIGlkOiBpZCwgcHJvcGVydGllczogcHJvcGVydGllcywgZ2VvbWV0cnk6IGdlb21ldHJ5fVxuICAgICAgOiB7dHlwZTogXCJGZWF0dXJlXCIsIGlkOiBpZCwgYmJveDogYmJveCwgcHJvcGVydGllczogcHJvcGVydGllcywgZ2VvbWV0cnk6IGdlb21ldHJ5fTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0KHRvcG9sb2d5LCBvKSB7XG4gIHZhciB0cmFuc2Zvcm1Qb2ludCA9IHRyYW5zZm9ybSh0b3BvbG9neSksXG4gICAgICBhcmNzID0gdG9wb2xvZ3kuYXJjcztcblxuICBmdW5jdGlvbiBhcmMoaSwgcG9pbnRzKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGgpIHBvaW50cy5wb3AoKTtcbiAgICBmb3IgKHZhciBhID0gYXJjc1tpIDwgMCA/IH5pIDogaV0sIGsgPSAwLCBuID0gYS5sZW5ndGg7IGsgPCBuOyArK2spIHtcbiAgICAgIHBvaW50cy5wdXNoKHRyYW5zZm9ybVBvaW50KGFba10uc2xpY2UoKSwgaykpO1xuICAgIH1cbiAgICBpZiAoaSA8IDApIHJldmVyc2UocG9pbnRzLCBuKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvaW50KHApIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtUG9pbnQocC5zbGljZSgpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpbmUoYXJjcykge1xuICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFyY3MubGVuZ3RoOyBpIDwgbjsgKytpKSBhcmMoYXJjc1tpXSwgcG9pbnRzKTtcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpIHBvaW50cy5wdXNoKHBvaW50c1swXS5zbGljZSgpKTtcbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG5cbiAgZnVuY3Rpb24gcmluZyhhcmNzKSB7XG4gICAgdmFyIHBvaW50cyA9IGxpbmUoYXJjcyk7XG4gICAgd2hpbGUgKHBvaW50cy5sZW5ndGggPCA0KSBwb2ludHMucHVzaChwb2ludHNbMF0uc2xpY2UoKSk7XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvbHlnb24oYXJjcykge1xuICAgIHJldHVybiBhcmNzLm1hcChyaW5nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlb21ldHJ5KG8pIHtcbiAgICB2YXIgdHlwZSA9IG8udHlwZSwgY29vcmRpbmF0ZXM7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiR2VvbWV0cnlDb2xsZWN0aW9uXCI6IHJldHVybiB7dHlwZTogdHlwZSwgZ2VvbWV0cmllczogby5nZW9tZXRyaWVzLm1hcChnZW9tZXRyeSl9O1xuICAgICAgY2FzZSBcIlBvaW50XCI6IGNvb3JkaW5hdGVzID0gcG9pbnQoby5jb29yZGluYXRlcyk7IGJyZWFrO1xuICAgICAgY2FzZSBcIk11bHRpUG9pbnRcIjogY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLm1hcChwb2ludCk7IGJyZWFrO1xuICAgICAgY2FzZSBcIkxpbmVTdHJpbmdcIjogY29vcmRpbmF0ZXMgPSBsaW5lKG8uYXJjcyk7IGJyZWFrO1xuICAgICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOiBjb29yZGluYXRlcyA9IG8uYXJjcy5tYXAobGluZSk7IGJyZWFrO1xuICAgICAgY2FzZSBcIlBvbHlnb25cIjogY29vcmRpbmF0ZXMgPSBwb2x5Z29uKG8uYXJjcyk7IGJyZWFrO1xuICAgICAgY2FzZSBcIk11bHRpUG9seWdvblwiOiBjb29yZGluYXRlcyA9IG8uYXJjcy5tYXAocG9seWdvbik7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7dHlwZTogdHlwZSwgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzfTtcbiAgfVxuXG4gIHJldHVybiBnZW9tZXRyeShvKTtcbn1cblxuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIGJib3h9IGZyb20gXCIuL3NyYy9iYm94XCI7XG5cbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBtZXNoLCBtZXNoQXJjc30gZnJvbSBcIi4vc3JjL21lc2hcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBtZXJnZSwgbWVyZ2VBcmNzfSBmcm9tIFwiLi9zcmMvbWVyZ2VcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBuZWlnaGJvcnN9IGZyb20gXCIuL3NyYy9uZWlnaGJvcnNcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBxdWFudGl6ZX0gZnJvbSBcIi4vc3JjL3F1YW50aXplXCI7XG4vLyBleHBvcnQge2RlZmF1bHQgYXMgdHJhbnNmb3JtfSBmcm9tIFwiLi9zcmMvdHJhbnNmb3JtXCI7XG4vLyBleHBvcnQge2RlZmF1bHQgYXMgdW50cmFuc2Zvcm19IGZyb20gXCIuL3NyYy91bnRyYW5zZm9ybVwiO1xuXG5leHBvcnRzLmZlYXR1cmUgPSBmZWF0dXJlO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuIiwiXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGVwcmVjYXRlO1xuXG4vKipcbiAqIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2Uubm9EZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudGhyb3dEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCB0aHJvdyBhbiBFcnJvciB3aGVuIGludm9rZWQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50cmFjZURlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIGludm9rZSBgY29uc29sZS50cmFjZSgpYCBpbnN0ZWFkIG9mIGBjb25zb2xlLmVycm9yKClgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdGhlIGZ1bmN0aW9uIHRvIGRlcHJlY2F0ZVxuICogQHBhcmFtIHtTdHJpbmd9IG1zZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQgdG8gdGhlIGNvbnNvbGUgd2hlbiBgZm5gIGlzIGludm9rZWRcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBuZXcgXCJkZXByZWNhdGVkXCIgdmVyc2lvbiBvZiBgZm5gXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZSAoZm4sIG1zZykge1xuICBpZiAoY29uZmlnKCdub0RlcHJlY2F0aW9uJykpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChjb25maWcoJ3Rocm93RGVwcmVjYXRpb24nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnKCd0cmFjZURlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBgbG9jYWxTdG9yYWdlYCBmb3IgYm9vbGVhbiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBgbmFtZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29uZmlnIChuYW1lKSB7XG4gIC8vIGFjY2Vzc2luZyBnbG9iYWwubG9jYWxTdG9yYWdlIGNhbiB0cmlnZ2VyIGEgRE9NRXhjZXB0aW9uIGluIHNhbmRib3hlZCBpZnJhbWVzXG4gIHRyeSB7XG4gICAgaWYgKCFnbG9iYWwubG9jYWxTdG9yYWdlKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHZhbCA9IGdsb2JhbC5sb2NhbFN0b3JhZ2VbbmFtZV07XG4gIGlmIChudWxsID09IHZhbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWxheWVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZShwYmYsIGVuZCkge1xuICAgIHRoaXMubGF5ZXJzID0gcGJmLnJlYWRGaWVsZHMocmVhZFRpbGUsIHt9LCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkVGlsZSh0YWcsIGxheWVycywgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICB2YXIgbGF5ZXIgPSBuZXcgVmVjdG9yVGlsZUxheWVyKHBiZiwgcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MpO1xuICAgICAgICBpZiAobGF5ZXIubGVuZ3RoKSBsYXllcnNbbGF5ZXIubmFtZV0gPSBsYXllcjtcbiAgICB9XG59XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlRmVhdHVyZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUZlYXR1cmUocGJmLCBlbmQsIGV4dGVudCwga2V5cywgdmFsdWVzKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0ge307XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQ7XG4gICAgdGhpcy50eXBlID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fZ2VvbWV0cnkgPSAtMTtcbiAgICB0aGlzLl9rZXlzID0ga2V5cztcbiAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkRmVhdHVyZSwgdGhpcywgZW5kKTtcbn1cblxuZnVuY3Rpb24gcmVhZEZlYXR1cmUodGFnLCBmZWF0dXJlLCBwYmYpIHtcbiAgICBpZiAodGFnID09IDEpIGZlYXR1cmUuX2lkID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMikgcmVhZFRhZyhwYmYsIGZlYXR1cmUpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAzKSBmZWF0dXJlLnR5cGUgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSA0KSBmZWF0dXJlLl9nZW9tZXRyeSA9IHBiZi5wb3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWcocGJmLCBmZWF0dXJlKSB7XG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIGtleSA9IGZlYXR1cmUuX2tleXNbcGJmLnJlYWRWYXJpbnQoKV0sXG4gICAgICAgICAgICB2YWx1ZSA9IGZlYXR1cmUuX3ZhbHVlc1twYmYucmVhZFZhcmludCgpXTtcbiAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG59XG5cblZlY3RvclRpbGVGZWF0dXJlLnR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgbGluZXMgPSBbXSxcbiAgICAgICAgbGluZTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgY21kTGVuID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcbiAgICAgICAgICAgIGxlbmd0aCA9IGNtZExlbiA+PiAzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVuZ3RoLS07XG5cbiAgICAgICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcbiAgICAgICAgICAgIHggKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICB5ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuXG4gICAgICAgICAgICBpZiAoY21kID09PSAxKSB7IC8vIG1vdmVUb1xuICAgICAgICAgICAgICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGluZS5wdXNoKG5ldyBQb2ludCh4LCB5KSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgPT09IDcpIHtcbiAgICAgICAgICAgIGxpbmUucHVzaChsaW5lWzBdLmNsb25lKCkpOyAvLyBjbG9zZVBvbHlnb25cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcblxuICAgIHJldHVybiBsaW5lcztcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5iYm94ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgeDEgPSBJbmZpbml0eSxcbiAgICAgICAgeDIgPSAtSW5maW5pdHksXG4gICAgICAgIHkxID0gSW5maW5pdHksXG4gICAgICAgIHkyID0gLUluZmluaXR5O1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICBpZiAoeCA8IHgxKSB4MSA9IHg7XG4gICAgICAgICAgICBpZiAoeCA+IHgyKSB4MiA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IHkxKSB5MSA9IHk7XG4gICAgICAgICAgICBpZiAoeSA+IHkyKSB5MiA9IHk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgIT09IDcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml07XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICAgIHZhciBzaXplID0gdGhpcy5leHRlbnQgKiBNYXRoLnBvdygyLCB6KSxcbiAgICAgICAgeDAgPSB0aGlzLmV4dGVudCAqIHgsXG4gICAgICAgIHkwID0gdGhpcy5leHRlbnQgKiB5LFxuICAgICAgICBjb29yZHMgPSB0aGlzLmxvYWRHZW9tZXRyeSgpLFxuICAgICAgICB0eXBlID0gVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbdGhpcy50eXBlXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gY29vcmRzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBwID0gbGluZVtqXSwgeTIgPSAxODAgLSAocC55ICsgeTApICogMzYwIC8gc2l6ZTtcbiAgICAgICAgICAgIGxpbmVbal0gPSBbXG4gICAgICAgICAgICAgICAgKHAueCArIHgwKSAqIDM2MCAvIHNpemUgLSAxODAsXG4gICAgICAgICAgICAgICAgMzYwIC8gTWF0aC5QSSAqIE1hdGguYXRhbihNYXRoLmV4cCh5MiAqIE1hdGguUEkgLyAxODApKSAtIDkwXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgJiYgY29vcmRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb29yZHMgPSBjb29yZHNbMF1bMF07XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXTtcbiAgICAgICAgdHlwZSA9ICdNdWx0aVBvaW50JztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJyAmJiBjb29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICB0eXBlID0gJ011bHRpTGluZVN0cmluZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3Jkc1xuICAgICAgICB9LFxuICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXNcbiAgICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlZmVhdHVyZS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVMYXllcjtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUxheWVyKHBiZiwgZW5kKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy52ZXJzaW9uID0gMTtcbiAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgIHRoaXMuZXh0ZW50ID0gNDA5NjtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICB0aGlzLl9mZWF0dXJlcyA9IFtdO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZExheWVyLCB0aGlzLCBlbmQpO1xuXG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLl9mZWF0dXJlcy5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRMYXllcih0YWcsIGxheWVyLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxNSkgbGF5ZXIudmVyc2lvbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAxKSBsYXllci5uYW1lID0gcGJmLnJlYWRTdHJpbmcoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGxheWVyLmV4dGVudCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBsYXllci5fZmVhdHVyZXMucHVzaChwYmYucG9zKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDMpIGxheWVyLl9rZXlzLnB1c2gocGJmLnJlYWRTdHJpbmcoKSk7XG4gICAgZWxzZSBpZiAodGFnID09PSA0KSBsYXllci5fdmFsdWVzLnB1c2gocmVhZFZhbHVlTWVzc2FnZShwYmYpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhbHVlTWVzc2FnZShwYmYpIHtcbiAgICB2YXIgdmFsdWUgPSBudWxsLFxuICAgICAgICBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciB0YWcgPSBwYmYucmVhZFZhcmludCgpID4+IDM7XG5cbiAgICAgICAgdmFsdWUgPSB0YWcgPT09IDEgPyBwYmYucmVhZFN0cmluZygpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMiA/IHBiZi5yZWFkRmxvYXQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDMgPyBwYmYucmVhZERvdWJsZSgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNCA/IHBiZi5yZWFkVmFyaW50NjQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDUgPyBwYmYucmVhZFZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNiA/IHBiZi5yZWFkU1ZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNyA/IHBiZi5yZWFkQm9vbGVhbigpIDogbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIHJldHVybiBmZWF0dXJlIGBpYCBmcm9tIHRoaXMgbGF5ZXIgYXMgYSBgVmVjdG9yVGlsZUZlYXR1cmVgXG5WZWN0b3JUaWxlTGF5ZXIucHJvdG90eXBlLmZlYXR1cmUgPSBmdW5jdGlvbihpKSB7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2ZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kcycpO1xuXG4gICAgdGhpcy5fcGJmLnBvcyA9IHRoaXMuX2ZlYXR1cmVzW2ldO1xuXG4gICAgdmFyIGVuZCA9IHRoaXMuX3BiZi5yZWFkVmFyaW50KCkgKyB0aGlzLl9wYmYucG9zO1xuICAgIHJldHVybiBuZXcgVmVjdG9yVGlsZUZlYXR1cmUodGhpcy5fcGJmLCBlbmQsIHRoaXMuZXh0ZW50LCB0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMpO1xufTtcbiIsIi8vIEdlb21ldHJ5IGJ1aWxkaW5nIGZ1bmN0aW9uc1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5leHBvcnQgY29uc3QgdGlsZV9ib3VuZHMgPSBbXG4gICAgeyB4OiAwLCB5OiAwfSxcbiAgICB7IHg6IEdlby50aWxlX3NjYWxlLCB5OiAtR2VvLnRpbGVfc2NhbGUgfSAvLyBUT0RPOiBjb3JyZWN0IGZvciBmbGlwcGVkIHktYXhpcz9cbl07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0X3V2cyA9IFswLCAwLCAxLCAxXTtcblxuLy8gVGVzdHMgaWYgYSBsaW5lIHNlZ21lbnQgKGZyb20gcG9pbnQgQSB0byBCKSBpcyBvdXRzaWRlIHRoZSB0aWxlIGJvdW5kc1xuLy8gKHdpdGhpbiBhIGNlcnRhaW4gdG9sZXJhbmNlIHRvIGFjY291bnQgZm9yIGdlb21ldHJ5IG5lYXJseSBvbiB0aWxlIGVkZ2VzKVxuZXhwb3J0IGZ1bmN0aW9uIG91dHNpZGVUaWxlIChfYSwgX2IsIHRvbGVyYW5jZSkge1xuICAgIGxldCB0aWxlX21pbiA9IHRpbGVfYm91bmRzWzBdO1xuICAgIGxldCB0aWxlX21heCA9IHRpbGVfYm91bmRzWzFdO1xuXG4gICAgLy8gVE9ETzogZml4IGZsaXBwZWQgWSBjb29yZHMgaGVyZSwgY29uZnVzaW5nIHdpdGggJ21heCcgcmVmZXJlbmNlXG4gICAgaWYgKChfYVswXSA8PSB0aWxlX21pbi54ICsgdG9sZXJhbmNlICYmIF9iWzBdIDw9IHRpbGVfbWluLnggKyB0b2xlcmFuY2UpIHx8XG4gICAgICAgIChfYVswXSA+PSB0aWxlX21heC54IC0gdG9sZXJhbmNlICYmIF9iWzBdID49IHRpbGVfbWF4LnggLSB0b2xlcmFuY2UpIHx8XG4gICAgICAgIChfYVsxXSA+PSB0aWxlX21pbi55IC0gdG9sZXJhbmNlICYmIF9iWzFdID49IHRpbGVfbWluLnkgLSB0b2xlcmFuY2UpIHx8XG4gICAgICAgIChfYVsxXSA8PSB0aWxlX21heC55ICsgdG9sZXJhbmNlICYmIF9iWzFdIDw9IHRpbGVfbWF4LnkgKyB0b2xlcmFuY2UpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29vcmRPdXRzaWRlVGlsZSAoY29vcmQsIHRvbGVyYW5jZSkge1xuICAgIHRvbGVyYW5jZSA9IHRvbGVyYW5jZSB8fCAwO1xuICAgIGxldCB0aWxlX21pbiA9IHRpbGVfYm91bmRzWzBdO1xuICAgIGxldCB0aWxlX21heCA9IHRpbGVfYm91bmRzWzFdO1xuXG4gICAgcmV0dXJuIGNvb3JkWzBdIDw9IHRpbGVfbWluLnggKyB0b2xlcmFuY2UgfHxcbiAgICAgICAgICAgY29vcmRbMF0gPj0gdGlsZV9tYXgueCAtIHRvbGVyYW5jZSB8fFxuICAgICAgICAgICBjb29yZFsxXSA+PSB0aWxlX21pbi55IC0gdG9sZXJhbmNlIHx8XG4gICAgICAgICAgIGNvb3JkWzFdIDw9IHRpbGVfbWF4LnkgKyB0b2xlcmFuY2U7XG59XG4iLCIvLyBQb2ludCBidWlsZGVyc1xuaW1wb3J0IHsgZGVmYXVsdF91dnMgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8vIEJ1aWxkIGEgYmlsbGJvYXJkIHNwcml0ZSBxdWFkIGNlbnRlcmVkIG9uIGEgcG9pbnQuIFNwcml0ZXMgYXJlIGludGVuZGVkIHRvIGJlIGRyYXduIGluIHNjcmVlbnNwYWNlLCBhbmQgaGF2ZVxuLy8gcHJvcGVydGllcyBmb3Igd2lkdGgsIGhlaWdodCwgYW5nbGUsIGFuZCBhIHNjYWxlIGZhY3RvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVycG9sYXRlIHRoZSBzY3JlZW5zcGFjZSBzaXplXG4vLyBvZiBhIHNwcml0ZSBiZXR3ZWVuIHR3byB6b29tIGxldmVscy5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFF1YWRzRm9yUG9pbnRzIChwb2ludHMsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgeyB0ZXhjb29yZF9pbmRleCwgcG9zaXRpb25faW5kZXgsIHNoYXBlX2luZGV4LCBvZmZzZXRfaW5kZXggfSxcbiAgICB7IHF1YWQsIHF1YWRfbm9ybWFsaXplLCBvZmZzZXQsIGFuZ2xlLCBzaGFwZV93LCB0ZXhjb29yZF9zY2FsZSwgdGV4Y29vcmRfbm9ybWFsaXplIH0pIHtcbiAgICBxdWFkX25vcm1hbGl6ZSA9IHF1YWRfbm9ybWFsaXplIHx8IDE7XG4gICAgbGV0IHcyID0gcXVhZFswXSAvIDIgKiBxdWFkX25vcm1hbGl6ZTtcbiAgICBsZXQgaDIgPSBxdWFkWzFdIC8gMiAqIHF1YWRfbm9ybWFsaXplO1xuICAgIGxldCBzY2FsaW5nID0gW1xuICAgICAgICBbLXcyLCAtaDJdLFxuICAgICAgICBbdzIsIC1oMl0sXG4gICAgICAgIFt3MiwgaDJdLFxuICAgICAgICBbLXcyLCBoMl1cbiAgICBdO1xuXG4gICAgbGV0IHZlcnRleF9lbGVtZW50cyA9IHZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcbiAgICBsZXQgZWxlbWVudF9vZmZzZXQgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICBsZXQgdGV4Y29vcmRzO1xuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgMTtcblxuICAgICAgICB2YXIgW21pbl91LCBtaW5fdiwgbWF4X3UsIG1heF92XSA9IHRleGNvb3JkX3NjYWxlIHx8IGRlZmF1bHRfdXZzO1xuICAgICAgICB0ZXhjb29yZHMgPSBbXG4gICAgICAgICAgICBbbWluX3UsIG1pbl92XSxcbiAgICAgICAgICAgIFttYXhfdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtYXhfdl0sXG4gICAgICAgICAgICBbbWluX3UsIG1heF92XVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGxldCBudW1fcG9pbnRzID0gcG9pbnRzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBwPTA7IHAgPCBudW1fcG9pbnRzOyBwKyspIHtcbiAgICAgICAgbGV0IHBvaW50ID0gcG9pbnRzW3BdO1xuXG4gICAgICAgIGZvciAobGV0IHBvcz0wOyBwb3MgPCA0OyBwb3MrKykge1xuICAgICAgICAgICAgLy8gQWRkIHRleGNvb3Jkc1xuICAgICAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMF0gPSB0ZXhjb29yZHNbcG9zXVswXSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAxXSA9IHRleGNvb3Jkc1twb3NdWzFdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbcG9zaXRpb25faW5kZXggKyAwXSA9IHBvaW50WzBdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3Bvc2l0aW9uX2luZGV4ICsgMV0gPSBwb2ludFsxXTtcblxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3NoYXBlX2luZGV4ICsgMF0gPSBzY2FsaW5nW3Bvc11bMF07XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAxXSA9IHNjYWxpbmdbcG9zXVsxXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDJdID0gYW5nbGU7XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAzXSA9IHNoYXBlX3c7XG5cbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtvZmZzZXRfaW5kZXggKyAwXSA9IG9mZnNldFswXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtvZmZzZXRfaW5kZXggKyAxXSA9IG9mZnNldFsxXTtcblxuICAgICAgICAgICAgdmVydGV4X2RhdGEuYWRkVmVydGV4KHZlcnRleF90ZW1wbGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDEpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDMpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuXG4gICAgICAgIGVsZW1lbnRfb2Zmc2V0ICs9IDQ7XG4gICAgfVxufVxuIiwiLy8gUG9seWdvbiBidWlsZGVyc1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuLi92ZWN0b3InO1xuaW1wb3J0IHsgZGVmYXVsdF91dnMsIG91dHNpZGVUaWxlIH0gZnJvbSAnLi9jb21tb24nO1xuXG5pbXBvcnQgZWFyY3V0IGZyb20gJ2VhcmN1dCc7XG5cbmNvbnN0IHVwX3ZlYzMgPSBbMCwgMCwgMV07XG5cbi8vIFRlc3NlbGF0ZSBhIGZsYXQgMkQgcG9seWdvblxuLy8geCAmIHkgY29vcmRpbmF0ZXMgd2lsbCBiZSBzZXQgYXMgZmlyc3QgdHdvIGVsZW1lbnRzIG9mIHByb3ZpZGVkIHZlcnRleF90ZW1wbGF0ZVxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9seWdvbnMgKFxuICAgIHBvbHlnb25zLFxuICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgeyB0ZXhjb29yZF9pbmRleCwgdGV4Y29vcmRfc2NhbGUsIHRleGNvb3JkX25vcm1hbGl6ZSB9KSB7XG5cbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gdmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuXG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCAxO1xuICAgICAgICB2YXIgW21pbl91LCBtaW5fdiwgbWF4X3UsIG1heF92XSA9IHRleGNvb3JkX3NjYWxlIHx8IGRlZmF1bHRfdXZzO1xuICAgIH1cblxuICAgIHZhciBudW1fcG9seWdvbnMgPSBwb2x5Z29ucy5sZW5ndGg7XG4gICAgZm9yICh2YXIgcD0wOyBwIDwgbnVtX3BvbHlnb25zOyBwKyspIHtcbiAgICAgICAgdmFyIGVsZW1lbnRfb2Zmc2V0ID0gdmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuXG4gICAgICAgIHZhciBwb2x5Z29uID0gcG9seWdvbnNbcF07XG5cbiAgICAgICAgLy8gRmluZCBwb2x5Z29uIGV4dGVudHMgdG8gY2FsY3VsYXRlIFVWcywgZml0IHRoZW0gdG8gdGhlIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3hcbiAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICB2YXIgW21pbl94LCBtaW5feSwgbWF4X3gsIG1heF95XSA9IEdlby5maW5kQm91bmRpbmdCb3gocG9seWdvbik7XG4gICAgICAgICAgICB2YXIgc3Bhbl94ID0gbWF4X3ggLSBtaW5feDtcbiAgICAgICAgICAgIHZhciBzcGFuX3kgPSBtYXhfeSAtIG1pbl95O1xuICAgICAgICAgICAgdmFyIHNjYWxlX3UgPSAobWF4X3UgLSBtaW5fdSkgLyBzcGFuX3g7XG4gICAgICAgICAgICB2YXIgc2NhbGVfdiA9IChtYXhfdiAtIG1pbl92KSAvIHNwYW5feTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHJpbmdfaW5kZXggPSAwOyByaW5nX2luZGV4IDwgcG9seWdvbi5sZW5ndGg7IHJpbmdfaW5kZXgrKyl7XG4gICAgICAgICAgICAvLyBBZGQgdmVydGV4IGRhdGFcbiAgICAgICAgICAgIHZhciBwb2x5Z29uX3JpbmcgPSBwb2x5Z29uW3JpbmdfaW5kZXhdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29uX3JpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdmVydGV4ID0gcG9seWdvbl9yaW5nW2ldO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVswXSA9IHZlcnRleFswXTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMV0gPSB2ZXJ0ZXhbMV07XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgVVZzXG4gICAgICAgICAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDBdID0gKCh2ZXJ0ZXhbMF0gLSBtaW5feCkgKiBzY2FsZV91ICsgbWluX3UpICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAxXSA9ICgodmVydGV4WzFdIC0gbWluX3kpICogc2NhbGVfdiArIG1pbl92KSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBlbGVtZW50IGluZGljZXNcbiAgICAgICAgdmFyIGluZGljZXMgPSB0cmlhbmd1bGF0ZVBvbHlnb24oZWFyY3V0LmZsYXR0ZW4ocG9seWdvbikpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyBpbmRpY2VzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gVGVzc2VsYXRlIGFuZCBleHRydWRlIGEgZmxhdCAyRCBwb2x5Z29uIGludG8gYSBzaW1wbGUgM0QgbW9kZWwgd2l0aCBmaXhlZCBoZWlnaHQgYW5kIGFkZCB0byBHTCB2ZXJ0ZXggYnVmZmVyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFeHRydWRlZFBvbHlnb25zIChcbiAgICBwb2x5Z29ucyxcbiAgICB6LCBoZWlnaHQsIG1pbl9oZWlnaHQsXG4gICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICBub3JtYWxfaW5kZXgsXG4gICAgbm9ybWFsX25vcm1hbGl6ZSxcbiAgICB7XG4gICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlLFxuICAgICAgICB0ZXhjb29yZF9pbmRleCxcbiAgICAgICAgdGV4Y29vcmRfc2NhbGUsXG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSxcbiAgICAgICAgd2luZGluZ1xuICAgIH0pIHtcblxuICAgIC8vIFRvcFxuICAgIHZhciBtaW5feiA9IHogKyAobWluX2hlaWdodCB8fCAwKTtcbiAgICB2YXIgbWF4X3ogPSB6ICsgaGVpZ2h0O1xuICAgIHZlcnRleF90ZW1wbGF0ZVsyXSA9IG1heF96O1xuICAgIGJ1aWxkUG9seWdvbnMocG9seWdvbnMsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsIHsgdGV4Y29vcmRfaW5kZXgsIHRleGNvb3JkX3NjYWxlLCB0ZXhjb29yZF9ub3JtYWxpemUgfSk7XG5cbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gdmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuICAgIHZhciBlbGVtZW50X29mZnNldCA9IHZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgIC8vIFdhbGxzXG4gICAgLy8gRml0IFVWcyB0byB3YWxsIHF1YWRcbiAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplID0gdGV4Y29vcmRfbm9ybWFsaXplIHx8IDE7XG4gICAgICAgIHZhciBbbWluX3UsIG1pbl92LCBtYXhfdSwgbWF4X3ZdID0gdGV4Y29vcmRfc2NhbGUgfHwgZGVmYXVsdF91dnM7XG4gICAgICAgIHZhciB0ZXhjb29yZHMgPSBbXG4gICAgICAgICAgICBbbWluX3UsIG1heF92XSxcbiAgICAgICAgICAgIFttaW5fdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1heF92XVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHZhciBudW1fcG9seWdvbnMgPSBwb2x5Z29ucy5sZW5ndGg7XG4gICAgZm9yICh2YXIgcD0wOyBwIDwgbnVtX3BvbHlnb25zOyBwKyspIHtcbiAgICAgICAgdmFyIHBvbHlnb24gPSBwb2x5Z29uc1twXTtcblxuICAgICAgICBmb3IgKHZhciBxPTA7IHEgPCBwb2x5Z29uLmxlbmd0aDsgcSsrKSB7XG4gICAgICAgICAgICB2YXIgY29udG91ciA9IHBvbHlnb25bcV07XG5cbiAgICAgICAgICAgIGZvciAodmFyIHc9MDsgdyA8IGNvbnRvdXIubGVuZ3RoIC0gMTsgdysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZV90aWxlX2VkZ2VzICYmIG91dHNpZGVUaWxlKGNvbnRvdXJbd10sIGNvbnRvdXJbdysxXSwgdGlsZV9lZGdlX3RvbGVyYW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGRvbid0IGV4dHJ1ZGUgdGlsZSBlZGdlc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFdhbGwgb3JkZXIgaXMgZGVwZW5kZW50IG9uIHdpbmRpbmcgb3JkZXIsIHNvIHRoYXQgbm9ybWFscyBmYWNlIG91dHdhcmRcbiAgICAgICAgICAgICAgICBsZXQgdzAsIHcxO1xuICAgICAgICAgICAgICAgIGlmICh3aW5kaW5nID09PSAnQ0NXJykge1xuICAgICAgICAgICAgICAgICAgICB3MCA9IHc7XG4gICAgICAgICAgICAgICAgICAgIHcxID0gdysxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdzAgPSB3KzE7XG4gICAgICAgICAgICAgICAgICAgIHcxID0gdztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBUd28gdHJpYW5nbGVzIGZvciB0aGUgcXVhZCBmb3JtZWQgYnkgZWFjaCB2ZXJ0ZXggcGFpciwgZ29pbmcgZnJvbSBib3R0b20gdG8gdG9wIGhlaWdodFxuICAgICAgICAgICAgICAgIHZhciB3YWxsX3ZlcnRpY2VzID0gW1xuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MV1bMF0sIGNvbnRvdXJbdzFdWzFdLCBtYXhfel0sXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cxXVswXSwgY29udG91clt3MV1bMV0sIG1pbl96XSxcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRvdXJbdzBdWzBdLCBjb250b3VyW3cwXVsxXSwgbWluX3pdLFxuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MF1bMF0sIGNvbnRvdXJbdzBdWzFdLCBtYXhfel1cbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2FsYyB0aGUgbm9ybWFsIG9mIHRoZSB3YWxsIGZyb20gdXAgdmVjdG9yIGFuZCBvbmUgc2VnbWVudCBvZiB0aGUgd2FsbCB0cmlhbmdsZXNcbiAgICAgICAgICAgICAgICBsZXQgd2FsbF92ZWMgPSBWZWN0b3Iubm9ybWFsaXplKFtjb250b3VyW3cxXVswXSAtIGNvbnRvdXJbdzBdWzBdLCBjb250b3VyW3cxXVsxXSAtIGNvbnRvdXJbdzBdWzFdLCAwXSk7XG4gICAgICAgICAgICAgICAgbGV0IG5vcm1hbCA9IFZlY3Rvci5jcm9zcyh1cF92ZWMzLCB3YWxsX3ZlYyk7XG5cbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdmVydGV4IHRlbXBsYXRlIHdpdGggY3VycmVudCBzdXJmYWNlIG5vcm1hbFxuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtub3JtYWxfaW5kZXggKyAwXSA9IG5vcm1hbFswXSAqIG5vcm1hbF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW25vcm1hbF9pbmRleCArIDFdID0gbm9ybWFsWzFdICogbm9ybWFsX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbbm9ybWFsX2luZGV4ICsgMl0gPSBub3JtYWxbMl0gKiBub3JtYWxfbm9ybWFsaXplO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgd3Y9MDsgd3YgPCB3YWxsX3ZlcnRpY2VzLmxlbmd0aDsgd3YrKykge1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMF0gPSB3YWxsX3ZlcnRpY2VzW3d2XVswXTtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzFdID0gd2FsbF92ZXJ0aWNlc1t3dl1bMV07XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVsyXSA9IHdhbGxfdmVydGljZXNbd3ZdWzJdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMF0gPSB0ZXhjb29yZHNbd3ZdWzBdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMV0gPSB0ZXhjb29yZHNbd3ZdWzFdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X2RhdGEuYWRkVmVydGV4KHZlcnRleF90ZW1wbGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAwKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDEpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAyKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDMpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50X29mZnNldCArPSA0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBUcmlhbmd1bGF0aW9uIHVzaW5nIGVhcmN1dFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9lYXJjdXRcbmV4cG9ydCBmdW5jdGlvbiB0cmlhbmd1bGF0ZVBvbHlnb24gKGRhdGEpIHtcbiAgICByZXR1cm4gZWFyY3V0KGRhdGEudmVydGljZXMsIGRhdGEuaG9sZXMsIGRhdGEuZGltZW5zaW9ucyk7XG59XG4iLCIvLyBHZW9tZXRyeSBidWlsZGluZyBmdW5jdGlvbnNcblxuaW1wb3J0IFZlY3RvciBmcm9tICcuLi92ZWN0b3InO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IHtvdXRzaWRlVGlsZSwgaXNDb29yZE91dHNpZGVUaWxlfSBmcm9tICcuL2NvbW1vbic7XG5cbmNvbnN0IHplcm9fdmVjMiA9IFswLCAwXTtcblxuLy8gQnVpbGQgdGVzc2VsbGF0ZWQgdHJpYW5nbGVzIGZvciBhIHBvbHlsaW5lXG5jb25zdCBDQVBfVFlQRSA9IHtcbiAgICBidXR0OiAwLFxuICAgIHNxdWFyZTogMSxcbiAgICByb3VuZDogMlxufTtcblxuY29uc3QgSk9JTl9UWVBFID0ge1xuICAgIG1pdGVyOiAwLFxuICAgIGJldmVsOiAxLFxuICAgIHJvdW5kOiAyXG59O1xuXG5jb25zdCBERUZBVUxUID0ge1xuICAgIE1JVEVSX0xJTUlUOiAzLFxuICAgIFRFWENPT1JEX05PUk1BTElaRTogMSxcbiAgICBURVhDT09SRF9SQVRJTzogMSxcbiAgICBNSU5fRkFOX1dJRFRIOiA1ICAgICAgICAvLyBXaWR0aCBvZiBsaW5lIGluIHRpbGUgdW5pdHMgdG8gcGxhY2UgMSB0cmlhbmdsZSBwZXIgZmFuXG59O1xuXG4vLyBTY2FsaW5nIGZhY3RvciB0byBhZGQgcHJlY2lzaW9uIHRvIGxpbmUgdGV4dHVyZSBWIGNvb3JkaW5hdGUgcGFja2VkIGFzIG5vcm1hbGl6ZWQgc2hvcnRcbmNvbnN0IHZfc2NhbGVfYWRqdXN0ID0gR2VvLnRpbGVfc2NhbGU7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvbHlsaW5lcyAobGluZXMsIHdpZHRoLCB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgIHtcbiAgICAgICAgY2xvc2VkX3BvbHlnb24sXG4gICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlLFxuICAgICAgICB0ZXhjb29yZF9pbmRleCxcbiAgICAgICAgdGV4Y29vcmRfc2NhbGUsXG4gICAgICAgIHRleGNvb3JkX3dpZHRoLFxuICAgICAgICB0ZXhjb29yZF9yYXRpbyxcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplLFxuICAgICAgICBzY2FsaW5nX2luZGV4LFxuICAgICAgICBzY2FsaW5nX25vcm1hbGl6ZSxcbiAgICAgICAgam9pbiwgY2FwLFxuICAgICAgICBtaXRlcl9saW1pdFxuICAgIH0pIHtcblxuICAgIHZhciBjYXBfdHlwZSA9IGNhcCA/IENBUF9UWVBFW2NhcF0gOiBDQVBfVFlQRS5idXR0O1xuICAgIHZhciBqb2luX3R5cGUgPSBqb2luID8gSk9JTl9UWVBFW2pvaW5dIDogSk9JTl9UWVBFLm1pdGVyO1xuXG4gICAgLy8gQ29uZmlndXJlIG1pdGVyIGxpbWl0XG4gICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgIG1pdGVyX2xpbWl0ID0gbWl0ZXJfbGltaXQgfHwgREVGQVVMVC5NSVRFUl9MSU1JVDsgLy8gZGVmYXVsdCBtaXRlciBsaW1pdFxuICAgICAgICB2YXIgbWl0ZXJfbGVuX3NxID0gbWl0ZXJfbGltaXQgKiBtaXRlcl9saW1pdDtcbiAgICB9XG5cbiAgICAvLyBUZXh0dXJlIFZhcmlhYmxlc1xuICAgIHZhciB2X3NjYWxlO1xuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgREVGQVVMVC5URVhDT09SRF9OT1JNQUxJWkU7XG4gICAgICAgIHRleGNvb3JkX3JhdGlvID0gdGV4Y29vcmRfcmF0aW8gfHwgREVGQVVMVC5URVhDT09SRF9SQVRJTztcbiAgICAgICAgdl9zY2FsZSA9IDEgLyAodGV4Y29vcmRfd2lkdGggKiB0ZXhjb29yZF9yYXRpbyAqIHZfc2NhbGVfYWRqdXN0KTsgLy8gc2NhbGVzIGxpbmUgdGV4dHVyZSBhcyBhIHJhdGlvIG9mIHRoZSBsaW5lJ3Mgd2lkdGhcbiAgICB9XG5cbiAgICAvLyBWYWx1ZXMgdGhhdCBhcmUgY29uc3RhbnQgZm9yIGVhY2ggbGluZSBhbmQgYXJlIHBhc3NlZCB0byBoZWxwZXIgZnVuY3Rpb25zXG4gICAgdmFyIGNvbnRleHQgPSB7XG4gICAgICAgIGNsb3NlZF9wb2x5Z29uLFxuICAgICAgICByZW1vdmVfdGlsZV9lZGdlcyxcbiAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZSxcbiAgICAgICAgbWl0ZXJfbGVuX3NxLFxuICAgICAgICBqb2luX3R5cGUsXG4gICAgICAgIGNhcF90eXBlLFxuICAgICAgICB2ZXJ0ZXhfZGF0YSxcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICBoYWxmX3dpZHRoOiB3aWR0aCAvIDIsXG4gICAgICAgIHNjYWxpbmdfaW5kZXgsXG4gICAgICAgIHNjYWxpbmdfbm9ybWFsaXplLFxuICAgICAgICB2X3NjYWxlLFxuICAgICAgICB0ZXhjb29yZF9pbmRleCxcbiAgICAgICAgdGV4Y29vcmRfd2lkdGgsXG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZVxuICAgIH07XG5cbiAgICAvLyBCdWZmZXIgZm9yIGV4dHJhIGxpbmVzIHRvIHByb2Nlc3NcbiAgICB2YXIgZXh0cmFfbGluZXMgPSBbXTtcblxuICAgIC8vIFByb2Nlc3MgbGluZXNcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGluZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGJ1aWxkUG9seWxpbmUobGluZXNbaW5kZXhdLCBjb250ZXh0LCBleHRyYV9saW5lcyk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBleHRyYSBsaW5lc1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHRyYV9saW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgYnVpbGRQb2x5bGluZShleHRyYV9saW5lc1tpbmRleF0sIGNvbnRleHQsIGV4dHJhX2xpbmVzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUG9seWxpbmUobGluZSwgY29udGV4dCwgZXh0cmFfbGluZXMpe1xuICAgIC8vIFNraXAgaWYgbGluZSBpcyBub3QgdmFsaWRcbiAgICBpZiAobGluZS5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY29vcmRDdXJyLCBjb29yZE5leHQsIG5vcm1QcmV2LCBub3JtTmV4dDtcbiAgICB2YXIge2pvaW5fdHlwZSwgY2FwX3R5cGUsIGNsb3NlZF9wb2x5Z29uLCByZW1vdmVfdGlsZV9lZGdlcywgdGlsZV9lZGdlX3RvbGVyYW5jZSwgdl9zY2FsZSwgbWl0ZXJfbGVuX3NxfSA9IGNvbnRleHQ7XG4gICAgdmFyIHYgPSAwOyAvLyBUZXh0dXJlIHYtY29vcmRpbmF0ZVxuXG4gICAgLy8gTG9vcCBiYWNrd2FyZHMgdGhyb3VnaCBsaW5lIHRvIGEgdGlsZSBib3VuZGFyeSBpZiBmb3VuZFxuICAgIGlmIChjbG9zZWRfcG9seWdvbiAmJiBqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICB2YXIgYm91bmRhcnlJbmRleCA9IGdldFRpbGVCb3VuZGFyeUluZGV4KGxpbmUpO1xuICAgICAgICBpZiAoYm91bmRhcnlJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBsaW5lIHRoYXQgaXMgYSBjeWNsaWMgcGVybXV0YXRpb24gb2YgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICB2YXIgcGVybXV0ZWRMaW5lID0gcGVybXV0ZUxpbmUobGluZSwgYm91bmRhcnlJbmRleCk7XG4gICAgICAgICAgICBleHRyYV9saW5lcy5wdXNoKHBlcm11dGVkTGluZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGSVJTVCBQT0lOVFxuICAgIGNvb3JkQ3VyciA9IGxpbmVbMF07XG4gICAgY29vcmROZXh0ID0gbGluZVsxXTtcblxuICAgIC8vIElmIGZpcnN0IHBhaXIgb2YgcG9pbnRzIGlzIHJlZHVuZGFudCwgc2xpY2UgYW5kIHB1c2ggdG8gdGhlIGxpbmVzIGFycmF5XG4gICAgaWYgKFZlY3Rvci5pc0VxdWFsKGNvb3JkQ3VyciwgY29vcmROZXh0KSkge1xuICAgICAgICBpZiAobGluZS5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICBleHRyYV9saW5lcy5wdXNoKGxpbmUuc2xpY2UoMSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBub3JtTmV4dCA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAoY29vcmRDdXJyLCBjb29yZE5leHQpKTtcblxuICAgIC8vIFNraXAgdGlsZSBib3VuZGFyeSBsaW5lcyBhbmQgYXBwZW5kIGEgbmV3IGxpbmUgaWYgbmVlZGVkXG4gICAgaWYgKHJlbW92ZV90aWxlX2VkZ2VzICYmIG91dHNpZGVUaWxlKGNvb3JkQ3VyciwgY29vcmROZXh0LCB0aWxlX2VkZ2VfdG9sZXJhbmNlKSkge1xuICAgICAgICB2YXIgbm9uQm91bmRhcnlTZWdtZW50ID0gZ2V0TmV4dE5vbkJvdW5kYXJ5U2VnbWVudChsaW5lLCAwLCB0aWxlX2VkZ2VfdG9sZXJhbmNlKTtcbiAgICAgICAgaWYgKG5vbkJvdW5kYXJ5U2VnbWVudCkge1xuICAgICAgICAgICAgZXh0cmFfbGluZXMucHVzaChub25Cb3VuZGFyeVNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2xvc2VkX3BvbHlnb24pe1xuICAgICAgICAvLyBCZWdpbiB0aGUgcG9seWdvbiB3aXRoIGEgam9pbiAoY29ubmVjdGluZyB0aGUgZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMpXG4gICAgICAgIG5vcm1QcmV2ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChsaW5lW2xpbmUubGVuZ3RoIC0gMl0sIGNvb3JkQ3VycikpO1xuICAgICAgICBzdGFydFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJZiBsaW5lIGJlZ2lucyBhdCBlZGdlLCBkb24ndCBhZGQgYSBjYXBcbiAgICAgICAgaWYgKCFpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICAgICAgYWRkQ2FwKGNvb3JkQ3Vyciwgdiwgbm9ybU5leHQsIGNhcF90eXBlLCB0cnVlLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChjYXBfdHlwZSAhPT0gQ0FQX1RZUEUuYnV0dCkge1xuICAgICAgICAgICAgICAgIHYgKz0gMC41ICogdl9zY2FsZSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgZmlyc3QgcGFpciBvZiBwb2ludHMgZm9yIHRoZSBsaW5lIHN0cmlwXG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1OZXh0KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBJTlRFUk1FRElBUlkgUE9JTlRTXG4gICAgdiArPSB2X3NjYWxlICogVmVjdG9yLmxlbmd0aChWZWN0b3Iuc3ViKGNvb3JkTmV4dCwgY29vcmRDdXJyKSk7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICB2YXIgY3VyckluZGV4ID0gaTtcbiAgICAgICAgdmFyIG5leHRJbmRleCA9IGkgKyAxO1xuICAgICAgICBjb29yZEN1cnIgPSBsaW5lW2N1cnJJbmRleF07XG4gICAgICAgIGNvb3JkTmV4dCA9IGxpbmVbbmV4dEluZGV4XTtcblxuICAgICAgICAvLyBTa2lwIHJlZHVuZGFudCB2ZXJ0aWNlc1xuICAgICAgICBpZiAoVmVjdG9yLmlzRXF1YWwoY29vcmRDdXJyLCBjb29yZE5leHQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aWxlIGJvdW5kYXJpZXNcbiAgICAgICAgaWYgKHJlbW92ZV90aWxlX2VkZ2VzICYmIG91dHNpZGVUaWxlKGNvb3JkQ3VyciwgY29vcmROZXh0LCB0aWxlX2VkZ2VfdG9sZXJhbmNlKSkge1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1OZXh0KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIHZhciBub25Cb3VuZGFyeUxpbmVzID0gZ2V0TmV4dE5vbkJvdW5kYXJ5U2VnbWVudChsaW5lLCBjdXJySW5kZXggKyAxLCB0aWxlX2VkZ2VfdG9sZXJhbmNlKTtcbiAgICAgICAgICAgIGlmIChub25Cb3VuZGFyeUxpbmVzKSB7XG4gICAgICAgICAgICAgICAgZXh0cmFfbGluZXMucHVzaChub25Cb3VuZGFyeUxpbmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vcm1QcmV2ID0gbm9ybU5leHQ7XG4gICAgICAgIG5vcm1OZXh0ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChjb29yZEN1cnIsIGNvb3JkTmV4dCkpO1xuXG4gICAgICAgIC8vIEFkZCBqb2luXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICAgICAgYWRkTWl0ZXIodiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIG1pdGVyX2xlbl9zcSwgZmFsc2UsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWRkSm9pbihqb2luX3R5cGUsIHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBmYWxzZSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICB2ICs9IHZfc2NhbGUgKiBWZWN0b3IubGVuZ3RoKFZlY3Rvci5zdWIoY29vcmROZXh0LCBjb29yZEN1cnIpKTtcbiAgICB9XG5cbiAgICAvLyBMQVNUIFBPSU5UXG4gICAgY29vcmRDdXJyID0gY29vcmROZXh0O1xuICAgIG5vcm1QcmV2ID0gbm9ybU5leHQ7XG5cbiAgICBpZiAoY2xvc2VkX3BvbHlnb24pIHtcbiAgICAgICAgLy8gQ2xvc2UgdGhlIHBvbHlnb24gd2l0aCBhIG1pdGVyIGpvaW50IG9yIGJ1dHQgY2FwIGlmIG9uIGEgdGlsZSBib3VuZGFyeVxuICAgICAgICBub3JtTmV4dCA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAoY29vcmRDdXJyLCBsaW5lWzFdKSk7XG4gICAgICAgIGVuZFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgdiwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBGaW5pc2ggdGhlIGxpbmUgc3RyaXBcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIElmIGxpbmUgZW5kcyBhdCBlZGdlLCBkb24ndCBhZGQgYSBjYXBcbiAgICAgICAgaWYgKCFpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICAgICAgYWRkQ2FwKGNvb3JkQ3Vyciwgdiwgbm9ybVByZXYsIGNhcF90eXBlLCBmYWxzZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFRpbGVCb3VuZGFyeUluZGV4KGxpbmUpe1xuICAgIGlmIChpc0Nvb3JkT3V0c2lkZVRpbGUobGluZVswXSkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgYmFja0luZGV4ID0gMDsgYmFja0luZGV4IDwgbGluZS5sZW5ndGg7IGJhY2tJbmRleCsrKSB7XG4gICAgICAgIHZhciBjb29yZEN1cnIgPSBsaW5lW2xpbmUubGVuZ3RoIC0gMSAtIGJhY2tJbmRleF07XG4gICAgICAgIGlmIChpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoIC0gMSAtIGJhY2tJbmRleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xufVxuXG4vLyBJdGVyYXRlIHRocm91Z2ggbGluZSBmcm9tIHN0YXJ0SW5kZXggdG8gZmluZCBhIHNlZ21lbnQgbm90IG9uIGEgdGlsZSBib3VuZGFyeSwgaWYgYW55LlxuZnVuY3Rpb24gZ2V0TmV4dE5vbkJvdW5kYXJ5U2VnbWVudCAobGluZSwgc3RhcnRJbmRleCwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGVuZEluZGV4ID0gc3RhcnRJbmRleDtcbiAgICB3aGlsZSAobGluZVtlbmRJbmRleCArIDFdICYmIG91dHNpZGVUaWxlKGxpbmVbZW5kSW5kZXhdLCBsaW5lW2VuZEluZGV4ICsgMV0sIHRvbGVyYW5jZSkpIHtcbiAgICAgICAgZW5kSW5kZXgrKztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIGxpbmUgc2VnbWVudCByZW1haW5pbmcgdGhhdCBpcyB3aXRoaW4gdGhlIHRpbGUsIHB1c2ggaXQgdG8gdGhlIGxpbmVzIGFycmF5XG4gICAgcmV0dXJuIChsaW5lLmxlbmd0aCAtIGVuZEluZGV4ID49IDIpID8gbGluZS5zbGljZShlbmRJbmRleCkgOiBmYWxzZTtcbn1cblxuLy8gQmVnaW4gYSBwb2x5Z29uIHdpdGggYSBqb2luIGNvbm5lY3RpbmcgdG8gdGhlIGxhc3Qgc2VnbWVudCAoaWYgdmFsaWQgam9pbi10eXBlIHNwZWNpZmllZClcbmZ1bmN0aW9uIHN0YXJ0UG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCBjb250ZXh0KXtcbiAgICAvLyBJZiBwb2x5Z29uIHN0YXJ0cyBvbiBhIHRpbGUgYm91bmRhcnksIGRvbid0IGFkZCBhIGpvaW5cbiAgICBpZiAoam9pbl90eXBlID09PSB1bmRlZmluZWQgfHwgaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCAwXSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgMF0sIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgcG9seWdvbiBzdGFydHMgd2l0aGluIGEgdGlsZSwgYWRkIGEgam9pblxuICAgICAgICB2YXIgdiA9IDA7XG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICAgICAgYWRkTWl0ZXIodiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGNvbnRleHQubWl0ZXJfbGVuX3NxLCB0cnVlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZEpvaW4oam9pbl90eXBlLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgdHJ1ZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIEVuZCBhIHBvbHlnb24gYXBwcm9wcmlhdGVseVxuZnVuY3Rpb24gZW5kUG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCB2LCBjb250ZXh0KSB7XG4gICAgLy8gSWYgcG9seWdvbiBlbmRzIG9uIGEgdGlsZSBib3VuZGFyeSwgZG9uJ3QgYWRkIGEgam9pblxuICAgIGlmIChpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtUHJldiksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJZiBwb2x5Z29uIGVuZHMgd2l0aGluIGEgdGlsZSwgYWRkIE1pdGVyIG9yIG5vIGpvaW50IChqb2luIGFkZGVkIG9uIHN0YXJ0UG9seWdvbilcbiAgICAgICAgdmFyIG1pdGVyVmVjID0gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KTtcblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIgJiYgVmVjdG9yLmxlbmd0aFNxKG1pdGVyVmVjKSA+IGNvbnRleHQubWl0ZXJfbGVuX3NxKSB7XG4gICAgICAgICAgICBqb2luX3R5cGUgPSBKT0lOX1RZUEUuYmV2ZWw7IC8vIHN3aXRjaCB0byBiZXZlbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1QcmV2LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtUHJldiksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpIHtcbiAgICB2YXIgbWl0ZXJWZWMgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5hZGQobm9ybVByZXYsIG5vcm1OZXh0KSk7XG4gICAgdmFyIHNjYWxlID0gMiAvICgxICsgTWF0aC5hYnMoVmVjdG9yLmRvdChub3JtUHJldiwgbWl0ZXJWZWMpKSk7XG4gICAgcmV0dXJuIFZlY3Rvci5tdWx0KG1pdGVyVmVjLCBzY2FsZSAqIHNjYWxlKTtcbn1cblxuLy8gQWRkIGEgbWl0ZXIgdmVjdG9yIG9yIGEgam9pbiBpZiB0aGUgbWl0ZXIgaXMgdG9vIHNoYXJwXG5mdW5jdGlvbiBhZGRNaXRlciAodiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIG1pdGVyX2xlbl9zcSwgaXNCZWdpbm5pbmcsIGNvbnRleHQpIHtcbiAgICB2YXIgbWl0ZXJWZWMgPSBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpO1xuXG4gICAgLy8gIE1pdGVyIGxpbWl0OiBpZiBtaXRlciBqb2luIGlzIHRvbyBzaGFycCwgY29udmVydCB0byBiZXZlbCBpbnN0ZWFkXG4gICAgaWYgKFZlY3Rvci5sZW5ndGhTcShtaXRlclZlYykgPiBtaXRlcl9sZW5fc3EpIHtcbiAgICAgICAgYWRkSm9pbihKT0lOX1RZUEUubWl0ZXIsIHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBpc0JlZ2lubmluZywgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGlmICghaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIEFkZCBhIGJldmVsIG9yIHJvdW5kIGpvaW5cbmZ1bmN0aW9uIGFkZEpvaW4oam9pbl90eXBlLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgaXNCZWdpbm5pbmcsIGNvbnRleHQpIHtcbiAgICB2YXIgbWl0ZXJWZWMgPSBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpO1xuICAgIHZhciBpc0Nsb2Nrd2lzZSA9IChub3JtTmV4dFswXSAqIG5vcm1QcmV2WzFdIC0gbm9ybU5leHRbMV0gKiBub3JtUHJldlswXSA+IDApO1xuXG4gICAgaWYgKGlzQ2xvY2t3aXNlKXtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICghaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUuYmV2ZWwpIHtcbiAgICAgICAgICAgIGFkZEJldmVsKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBWZWN0b3IubmVnKG5vcm1QcmV2KSwgbWl0ZXJWZWMsIFZlY3Rvci5uZWcobm9ybU5leHQpLFxuICAgICAgICAgICAgICAgIFswLCB2XSwgWzEsIHZdLCBbMCwgdl0sXG4gICAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5yb3VuZCkge1xuICAgICAgICAgICAgYWRkRmFuKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBWZWN0b3IubmVnKG5vcm1QcmV2KSwgbWl0ZXJWZWMsIFZlY3Rvci5uZWcobm9ybU5leHQpLFxuICAgICAgICAgICAgICAgIFswLCB2XSwgWzEsIHZdLCBbMCwgdl0sXG4gICAgICAgICAgICAgICAgZmFsc2UsIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKCFpc0JlZ2lubmluZykge1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5iZXZlbCkge1xuICAgICAgICAgICAgYWRkQmV2ZWwoY29vcmRDdXJyLFxuICAgICAgICAgICAgICAgIG5vcm1QcmV2LCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgbm9ybU5leHQsXG4gICAgICAgICAgICAgICAgWzEsIHZdLCBbMCwgdl0sIFsxLCB2XSxcbiAgICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLnJvdW5kKSB7XG4gICAgICAgICAgICBhZGRGYW4oY29vcmRDdXJyLFxuICAgICAgICAgICAgICAgIG5vcm1QcmV2LCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgbm9ybU5leHQsXG4gICAgICAgICAgICAgICAgWzEsIHZdLCBbMCwgdl0sIFsxLCB2XSxcbiAgICAgICAgICAgICAgICBmYWxzZSwgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICB9XG59XG5cbi8vIEFkZCBpbmRpY2VzIHRvIHZlcnRleF9lbGVtZW50c1xuZnVuY3Rpb24gaW5kZXhQYWlycyhudW1fcGFpcnMsIGNvbnRleHQpe1xuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcbiAgICB2YXIgbnVtX3ZlcnRpY2VzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG4gICAgdmFyIG9mZnNldCA9IG51bV92ZXJ0aWNlcyAtIDIgKiBudW1fcGFpcnMgLSAyO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fcGFpcnM7IGkrKyl7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMyk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhZGRWZXJ0ZXgoY29vcmRpbmF0ZSwgbm9ybWFsLCB1diwgY29udGV4dCkge1xuICAgIHZhciB2ZXJ0ZXhfdGVtcGxhdGUgPSBjb250ZXh0LnZlcnRleF90ZW1wbGF0ZTtcbiAgICB2YXIgdmVydGV4X2RhdGEgPSBjb250ZXh0LnZlcnRleF9kYXRhO1xuXG4gICAgYnVpbGRWZXJ0ZXhUZW1wbGF0ZSh2ZXJ0ZXhfdGVtcGxhdGUsIGNvb3JkaW5hdGUsIHV2LCBub3JtYWwsIGNvbnRleHQpO1xuICAgIHZlcnRleF9kYXRhLmFkZFZlcnRleCh2ZXJ0ZXhfdGVtcGxhdGUpO1xufVxuXG5mdW5jdGlvbiBidWlsZFZlcnRleFRlbXBsYXRlICh2ZXJ0ZXhfdGVtcGxhdGUsIHZlcnRleCwgdGV4dHVyZV9jb29yZCwgc2NhbGUsIGNvbnRleHQpIHtcbiAgICAvLyBzZXQgdmVydGV4IHBvc2l0aW9uXG4gICAgdmVydGV4X3RlbXBsYXRlWzBdID0gdmVydGV4WzBdO1xuICAgIHZlcnRleF90ZW1wbGF0ZVsxXSA9IHZlcnRleFsxXTtcblxuICAgIC8vIHNldCBVVnNcbiAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAmJiB0ZXh0dXJlX2Nvb3JkKSB7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnRleGNvb3JkX2luZGV4ICsgMF0gPSB0ZXh0dXJlX2Nvb3JkWzBdICogY29udGV4dC50ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnRleGNvb3JkX2luZGV4ICsgMV0gPSB0ZXh0dXJlX2Nvb3JkWzFdICogY29udGV4dC50ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgfVxuXG4gICAgLy8gc2V0IFNjYWxpbmcgdmVydGV4IChYLCBZIG5vcm1hbCBkaXJlY3Rpb24gKyBaIGhhbGZfd2lkdGggYXMgYXR0cmlidXRlKVxuICAgIGlmIChjb250ZXh0LnNjYWxpbmdfaW5kZXgpIHtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQuc2NhbGluZ19pbmRleCArIDBdID0gc2NhbGVbMF0gKiBjb250ZXh0LnNjYWxpbmdfbm9ybWFsaXplO1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC5zY2FsaW5nX2luZGV4ICsgMV0gPSBzY2FsZVsxXSAqIGNvbnRleHQuc2NhbGluZ19ub3JtYWxpemU7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnNjYWxpbmdfaW5kZXggKyAyXSA9IGNvbnRleHQuaGFsZl93aWR0aDtcbiAgICB9XG59XG5cbi8vICBUZXNzYWxhdGUgYSBGQU4gZ2VvbWV0cnkgYmV0d2VlbiBwb2ludHMgQSAgICAgICBCXG4vLyAgdXNpbmcgdGhlaXIgbm9ybWFscyBmcm9tIGEgY2VudGVyICAgICAgICBcXCAuIC4gL1xuLy8gIGFuZCBpbnRlcnBvbGF0aW5nIHRoZWlyIFVWcyAgICAgICAgICAgICAgIFxcIHAgL1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXC4vXG5mdW5jdGlvbiBhZGRGYW4gKGNvb3JkLCBuQSwgbkMsIG5CLCB1dkEsIHV2QywgdXZCLCBpc0NhcCwgY29udGV4dCkge1xuICAgIHZhciBjcm9zcyA9IG5BWzBdICogbkJbMV0gLSBuQVsxXSAqIG5CWzBdO1xuICAgIHZhciBkb3QgPSBWZWN0b3IuZG90KG5BLCBuQik7XG5cbiAgICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKGNyb3NzLCBkb3QpO1xuICAgIHdoaWxlIChhbmdsZSA+PSBNYXRoLlBJKSB7XG4gICAgICAgIGFuZ2xlIC09IDIqTWF0aC5QSTtcbiAgICB9XG5cbiAgICB2YXIgbnVtVHJpYW5nbGVzID0gdHJpYW5nbGVzUGVyQXJjKGFuZ2xlLCBjb250ZXh0LmhhbGZfd2lkdGgpO1xuICAgIGlmIChudW1UcmlhbmdsZXMgPCAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcGl2b3RJbmRleCA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcblxuICAgIGFkZFZlcnRleChjb29yZCwgbkMsIHV2QywgY29udGV4dCk7XG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQSwgdXZBLCBjb250ZXh0KTtcblxuICAgIHZhciBibGFkZSA9IG5BO1xuXG4gICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgdXZDdXJyO1xuICAgICAgICBpZiAoaXNDYXApe1xuICAgICAgICAgICAgdXZDdXJyID0gW107XG4gICAgICAgICAgICB2YXIgYWZmaW5lX3V2Q3VyciA9IFZlY3Rvci5zdWIodXZBLCB1dkMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdXZDdXJyID0gVmVjdG9yLnNldCh1dkEpO1xuICAgICAgICAgICAgdmFyIHV2X2RlbHRhID0gVmVjdG9yLmRpdihWZWN0b3Iuc3ViKHV2QiwgdXZBKSwgbnVtVHJpYW5nbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhbmdsZV9zdGVwID0gYW5nbGUgLyBudW1UcmlhbmdsZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1UcmlhbmdsZXM7IGkrKykge1xuICAgICAgICBibGFkZSA9IFZlY3Rvci5yb3QoYmxhZGUsIGFuZ2xlX3N0ZXApO1xuXG4gICAgICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChpc0NhcCl7XG4gICAgICAgICAgICAgICAgLy8gVVYgdGV4dHVyZXMgZ28gXCJ0aHJvdWdoXCIgdGhlIGNhcFxuICAgICAgICAgICAgICAgIGFmZmluZV91dkN1cnIgPSBWZWN0b3Iucm90KGFmZmluZV91dkN1cnIsIGFuZ2xlX3N0ZXApO1xuICAgICAgICAgICAgICAgIHV2Q3VyclswXSA9IGFmZmluZV91dkN1cnJbMF0gKyB1dkNbMF07XG4gICAgICAgICAgICAgICAgdXZDdXJyWzFdID0gYWZmaW5lX3V2Q3VyclsxXSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGUgKyB1dkNbMV07IC8vIHNjYWxlIHRoZSB2LWNvb3JkaW5hdGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVWIHRleHR1cmVzIGdvIFwiYXJvdW5kXCIgdGhlIGpvaW5cbiAgICAgICAgICAgICAgICB1dkN1cnIgPSBWZWN0b3IuYWRkKHV2Q3VyciwgdXZfZGVsdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBibGFkZSwgdXZDdXJyLCBjb250ZXh0KTtcblxuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgaSArICgoY3Jvc3MgPiAwKSA/IDIgOiAxKSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXgpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgaSArICgoY3Jvc3MgPiAwKSA/IDEgOiAyKSk7XG4gICAgfVxufVxuXG4vLyAgYWRkQmV2ZWwgICAgQSAtLS0tLSBCXG4vLyAgICAgICAgICAgICAvIFxcICAgICAvIFxcXG4vLyAgICAgICAgICAgLyAgIC9cXCAgIC9cXCAgXFxcbi8vICAgICAgICAgICAgICAvICBcXCAvICBcXCAgXFxcbi8vICAgICAgICAgICAgICAgIC8gQyBcXFxuZnVuY3Rpb24gYWRkQmV2ZWwgKGNvb3JkLCBuQSwgbkMsIG5CLCB1QSwgdUMsIHVCLCBjb250ZXh0KSB7XG4gICAgdmFyIHBpdm90SW5kZXggPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgIGFkZFZlcnRleChjb29yZCwgbkMsIHVDLCBjb250ZXh0KTtcbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5BLCB1QSwgY29udGV4dCk7XG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQiwgdUIsIGNvbnRleHQpO1xuXG4gICAgdmFyIG9yaWVudGF0aW9uID0gbkFbMF0gKiBuQlsxXSAtIG5BWzFdICogbkJbMF0gPiAwO1xuXG4gICAgdmFyIHZlcnRleF9lbGVtZW50cyA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuXG4gICAgaWYgKG9yaWVudGF0aW9uKSB7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAyKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDEpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAyKTtcbiAgICB9XG59XG5cbi8vICBGdW5jdGlvbiB0byBhZGQgdGhlIHZlcnRleCBuZWVkIGZvciBsaW5lIGNhcHMsXG4vLyAgYmVjYXVzZSByZS11c2UgdGhlIGJ1ZmZlcnMgbmVlZHMgdG8gYmUgYXQgdGhlIGVuZFxuZnVuY3Rpb24gYWRkQ2FwIChjb29yZCwgdiwgbm9ybWFsLCB0eXBlLCBpc0JlZ2lubmluZywgY29udGV4dCkge1xuICAgIHZhciBuZWdfbm9ybWFsID0gVmVjdG9yLm5lZyhub3JtYWwpO1xuXG4gICAgc3dpdGNoICh0eXBlKXtcbiAgICAgICAgY2FzZSBDQVBfVFlQRS5zcXVhcmU6XG4gICAgICAgICAgICB2YXIgdGFuZ2VudDtcbiAgICAgICAgICAgIGlmIChpc0JlZ2lubmluZyl7XG4gICAgICAgICAgICAgICAgdGFuZ2VudCA9IFtub3JtYWxbMV0sIC1ub3JtYWxbMF1dO1xuXG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5vcm1hbCwgdGFuZ2VudCksIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5lZ19ub3JtYWwsIHRhbmdlbnQpLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIGxlbmd0aCBvZiBzcXVhcmUgY2FwIHRvIHRleHR1cmUgY29vcmRpbmF0ZVxuICAgICAgICAgICAgICAgIHYgKz0gMC41ICogY29udGV4dC50ZXhjb29yZF93aWR0aCAqIGNvbnRleHQudl9zY2FsZTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbm9ybWFsLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbmVnX25vcm1hbCwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhbmdlbnQgPSBbLW5vcm1hbFsxXSwgbm9ybWFsWzBdXTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbm9ybWFsLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbmVnX25vcm1hbCwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBsZW5ndGggb2Ygc3F1YXJlIGNhcCB0byB0ZXh0dXJlIGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGU7XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIFZlY3Rvci5hZGQobm9ybWFsLCB0YW5nZW50KSwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIFZlY3Rvci5hZGQobmVnX25vcm1hbCwgdGFuZ2VudCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDQVBfVFlQRS5yb3VuZDpcbiAgICAgICAgICAgIHZhciBuQSwgbkIsIHV2QSwgdXZCLCB1dkM7XG4gICAgICAgICAgICBpZiAoaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgICAgICBuQSA9IG5vcm1hbDtcbiAgICAgICAgICAgICAgICBuQiA9IG5lZ19ub3JtYWw7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAhPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICAgICAgICAgICAgdiArPSAwLjUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlO1xuICAgICAgICAgICAgICAgICAgICB1dkEgPSBbMSwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QiA9IFswLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZDID0gWzAuNSwgdl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbkEgPSBuZWdfbm9ybWFsO1xuICAgICAgICAgICAgICAgIG5CID0gbm9ybWFsO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgIHV2QSA9IFswLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZCID0gWzEsIHZdO1xuICAgICAgICAgICAgICAgICAgICB1dkMgPSBbMC41LCB2XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFkZEZhbihjb29yZCxcbiAgICAgICAgICAgICAgICBuQSwgemVyb192ZWMyLCBuQixcbiAgICAgICAgICAgICAgICB1dkEsIHV2QywgdXZCLFxuICAgICAgICAgICAgICAgIHRydWUsIGNvbnRleHRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENBUF9UWVBFLmJ1dHQ6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgfVxufVxuXG4vLyBDYWxjdWxhdGUgbnVtYmVyIG9mIHRyaWFuZ2xlcyBmb3IgYSBmYW4gZ2l2ZW4gYW4gYW5nbGUgYW5kIGxpbmUgd2lkdGhcbmZ1bmN0aW9uIHRyaWFuZ2xlc1BlckFyYyAoYW5nbGUsIHdpZHRoKSB7XG4gICAgaWYgKGFuZ2xlIDwgMCkge1xuICAgICAgICBhbmdsZSA9IC1hbmdsZTtcbiAgICB9XG5cbiAgICB2YXIgbnVtVHJpYW5nbGVzID0gKHdpZHRoID4gMiAqIERFRkFVTFQuTUlOX0ZBTl9XSURUSCkgPyBNYXRoLmxvZzIod2lkdGggLyBERUZBVUxULk1JTl9GQU5fV0lEVEgpIDogMTtcbiAgICByZXR1cm4gTWF0aC5jZWlsKGFuZ2xlIC8gTWF0aC5QSSAqIG51bVRyaWFuZ2xlcyk7XG59XG5cbi8vIEN5Y2xpY2FsbHkgcGVybXV0ZSBjbG9zZWQgbGluZSBzdGFydGluZyBhdCBhbiBpbmRleFxuZnVuY3Rpb24gcGVybXV0ZUxpbmUobGluZSwgc3RhcnRJbmRleCl7XG4gICAgdmFyIG5ld0xpbmUgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgaW5kZXggPSAoaSArIHN0YXJ0SW5kZXgpICUgbGluZS5sZW5ndGg7XG4gICAgICAgIC8vIHNraXAgdGhlIGZpcnN0IChyZXBlYXRlZCkgaW5kZXhcbiAgICAgICAgaWYgKGluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICBuZXdMaW5lLnB1c2gobGluZVtpbmRleF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5ld0xpbmUucHVzaChuZXdMaW5lWzBdKTtcbiAgICByZXR1cm4gbmV3TGluZTtcbn0iLCJpbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCB7bWF0NCwgbWF0MywgdmVjM30gZnJvbSAnLi91dGlscy9nbC1tYXRyaXgnO1xuXG4vLyBBYnN0cmFjdCBiYXNlIGNsYXNzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYW1lcmEge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdmlldywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uO1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgY2FtZXJhIGJ5IHR5cGUgbmFtZSwgZmFjdG9yeS1zdHlsZVxuICAgIHN0YXRpYyBjcmVhdGUobmFtZSwgdmlldywgY29uZmlnKSB7XG4gICAgICAgIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2lzb21ldHJpYyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJc29tZXRyaWNDYW1lcmEobmFtZSwgdmlldywgY29uZmlnKTtcbiAgICAgICAgICAgIGNhc2UgJ2ZsYXQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxhdENhbWVyYShuYW1lLCB2aWV3LCBjb25maWcpO1xuICAgICAgICAgICAgY2FzZSAncGVyc3BlY3RpdmUnOlxuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKG5hbWUsIHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbWV0aG9kIGNhbGxlZCBvbmNlIHBlciBmcmFtZVxuICAgIHVwZGF0ZSgpIHtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgb25jZSBwZXIgZnJhbWUgcGVyIHByb2dyYW0gKGUuZy4gZm9yIG1haW4gcmVuZGVyIHBhc3MsIHRoZW4gZm9yIGVhY2ggYWRkaXRpb25hbCBwYXNzIGZvciBmZWF0dXJlIHNlbGVjdGlvbiwgZXRjLilcbiAgICBzZXR1cFByb2dyYW0ocHJvZ3JhbSkge1xuICAgIH1cblxuICAgIC8vIFN5bmMgY2FtZXJhIHBvc2l0aW9uL3pvb20gdG8gc2NlbmUgdmlld1xuICAgIHVwZGF0ZVZpZXcgKCkge1xuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiB8fCB0aGlzLnpvb20pIHtcbiAgICAgICAgICAgIHZhciB2aWV3ID0ge307XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHZpZXcgPSB7IGxuZzogdGhpcy5wb3NpdGlvblswXSwgbGF0OiB0aGlzLnBvc2l0aW9uWzFdLCB6b29tOiB0aGlzLnBvc2l0aW9uWzJdIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy56b29tKSB7XG4gICAgICAgICAgICAgICAgdmlldy56b29tID0gdGhpcy56b29tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aWV3LnNldFZpZXcodmlldyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgbW9kZWwtdmlldyBhbmQgbm9ybWFsIG1hdHJpY2VzXG4gICAgc2V0dXBNYXRyaWNlcyAobWF0cmljZXMsIHByb2dyYW0pIHtcbiAgICAgICAgLy8gTW9kZWwgdmlldyBtYXRyaXggLSB0cmFuc2Zvcm0gdGlsZSBzcGFjZSBpbnRvIHZpZXcgc3BhY2UgKG1ldGVycywgcmVsYXRpdmUgdG8gY2FtZXJhKVxuICAgICAgICBtYXQ0Lm11bHRpcGx5KG1hdHJpY2VzLm1vZGVsX3ZpZXczMiwgdGhpcy52aWV3X21hdHJpeCwgbWF0cmljZXMubW9kZWwpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDRmdicsICd1X21vZGVsVmlldycsIG1hdHJpY2VzLm1vZGVsX3ZpZXczMik7XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hdHJpY2VzIC0gdHJhbnNmb3JtcyBzdXJmYWNlIG5vcm1hbHMgaW50byB2aWV3IHNwYWNlXG4gICAgICAgIG1hdDMubm9ybWFsRnJvbU1hdDQobWF0cmljZXMubm9ybWFsMzIsIG1hdHJpY2VzLm1vZGVsX3ZpZXczMik7XG4gICAgICAgIG1hdDMuaW52ZXJ0KG1hdHJpY2VzLmludmVyc2Vfbm9ybWFsMzIsIG1hdHJpY2VzLm5vcm1hbDMyKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXgzZnYnLCAndV9ub3JtYWxNYXRyaXgnLCBtYXRyaWNlcy5ub3JtYWwzMik7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4M2Z2JywgJ3VfaW52ZXJzZU5vcm1hbE1hdHJpeCcsIG1hdHJpY2VzLmludmVyc2Vfbm9ybWFsMzIpO1xuICAgIH1cblxufVxuXG4vKipcbiAgICBQZXJzcGVjdGl2ZSBtYXRyaXggcHJvamVjdGlvblxuXG4gICAgVGhpcyBpcyBhIHNwZWNpYWxpemVkIHBlcnNwZWN0aXZlIGNhbWVyYSB0aGF0LCBnaXZlbiBhIGRlc2lyZWQgY2FtZXJhIGZvY2FsIGxlbmd0aCAod2hpY2ggY2FuIGFsc28gdmFyeSBieSB6b29tIGxldmVsKSxcbiAgICBjb25zdHJhaW5zIHRoZSBjYW1lcmEgaGVpZ2h0IGFib3ZlIHRoZSBncm91bmQgcGxhbmUgc3VjaCB0aGF0IHRoZSBkaXNwbGF5ZWQgZ3JvdW5kIGFyZWEgb2YgdGhlIG1hcCBtYXRjaGVzIHRoYXQgb2ZcbiAgICBhIHRyYWRpdGlvbmFsIHdlYiBtZXJjYXRvciBtYXAuIFRoaXMgbWVhbnMgeW91IGNhbiBzZXQgdGhlIGNhbWVyYSBsb2NhdGlvbiBieSBbbGF0LCBsbmcsIHpvb21dIGFzIHlvdSB3b3VsZCBhIHR5cGljYWxcbiAgICB3ZWIgbWVyY2F0b3IgbWFwLCB0aGVuIGFkanVzdCB0aGUgZm9jYWwgbGVuZ3RoIGFzIG5lZWRlZC5cblxuICAgIFZhbmlzaGluZyBwb2ludCBjYW4gYWxzbyBiZSBhZGp1c3RlZCB0byBhY2hpZXZlIGRpZmZlcmVudCBcInZpZXdpbmcgYW5nbGVzXCIsIGUuZy4gaW5zdGVhZCBvZiBsb29raW5nIHN0cmFpZ2h0IGRvd24gaW50b1xuICAgIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXdwb3J0LCB0aGUgY2FtZXJhIGFwcGVhcnMgdG8gYmUgdGlsdGVkIGF0IGFuIGFuZ2xlLiBGb3IgZXhhbXBsZTpcblxuICAgIFswLCAwXSA9IGxvb2tpbmcgdG93YXJkcyBjZW50ZXIgb2Ygdmlld3BvcnRcbiAgICBbLTI1MCwgLTI1MF0gPSBsb29raW5nIDI1MCBwaXhlbHMgZnJvbSB0aGUgdmlld3BvcnQgY2VudGVyIHRvIHRoZSBsb3dlci1sZWZ0IGNvcm5lclxuICAgIFs0MDAsIDBdID0gbG9va2luZyA0MDAgcGl4ZWxzIHRvIHRoZSByaWdodCBvZiB0aGUgdmlld3BvcnQgY2VudGVyXG4qL1xuY2xhc3MgUGVyc3BlY3RpdmVDYW1lcmEgZXh0ZW5kcyBDYW1lcmEge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdmlldywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG5hbWUsIHZpZXcsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAncGVyc3BlY3RpdmUnO1xuXG4gICAgICAgIC8vIGEgc2luZ2xlIHNjYWxhciwgb3IgcGFpcnMgb2Ygc3RvcHMgbWFwcGluZyB6b29tIGxldmVscywgZS5nLiBbem9vbSwgZm9jYWwgbGVuZ3RoXVxuICAgICAgICB0aGlzLmZvY2FsX2xlbmd0aCA9IG9wdGlvbnMuZm9jYWxfbGVuZ3RoO1xuICAgICAgICB0aGlzLmZvdiA9IG9wdGlvbnMuZm92O1xuICAgICAgICBpZiAoIXRoaXMuZm9jYWxfbGVuZ3RoICYmICF0aGlzLmZvdikge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCBmb2NhbCBsZW5ndGggcmFuZ2VzIGJ5IHpvb21cbiAgICAgICAgICAgIHRoaXMuZm9jYWxfbGVuZ3RoID0gW1sxNiwgMl0sIFsxNywgMi41XSwgWzE4LCAzXSwgWzE5LCA0XSwgWzIwLCA2XV07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludCA9IG9wdGlvbnMudmFuaXNoaW5nX3BvaW50IHx8IFswLCAwXTsgLy8gW3gsIHldXG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50ID0gdGhpcy52YW5pc2hpbmdfcG9pbnQubWFwKHBhcnNlRmxvYXQpOyAvLyB3ZSBpbXBsaWNpdGx5IG9ubHkgc3VwcG9ydCBweCB1bml0cyBoZXJlXG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXcgPSBbXTtcblxuICAgICAgICB0aGlzLnBvc2l0aW9uX21ldGVycyA9IG51bGw7XG4gICAgICAgIHRoaXMudmlld19tYXRyaXggPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuXG4gICAgICAgIC8vICdjYW1lcmEnIGlzIHRoZSBuYW1lIG9mIHRoZSBzaGFkZXIgYmxvY2ssIGUuZy4gZGV0ZXJtaW5lcyB3aGVyZSBpbiB0aGUgc2hhZGVyIHRoaXMgY29kZSBpcyBpbmplY3RlZFxuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlcGxhY2VCbG9jaygnY2FtZXJhJywgYFxuICAgICAgICAgICAgdW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbjtcbiAgICAgICAgICAgIHVuaWZvcm0gdmVjMyB1X2V5ZTtcbiAgICAgICAgICAgIHVuaWZvcm0gdmVjMiB1X3ZhbmlzaGluZ19wb2ludDtcblxuICAgICAgICAgICAgdm9pZCBjYW1lcmFQcm9qZWN0aW9uIChpbm91dCB2ZWM0IHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSB1X3Byb2plY3Rpb24gKiBwb3NpdGlvbjtcbiAgICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ29uc3RyYWlucyB0aGUgY2FtZXJhIHNvIHRoYXQgdGhlIHZpZXdhYmxlIGFyZWEgbWF0Y2hlcyBnaXZlbiB0aGUgdmlld3BvcnQgaGVpZ2h0XG4gICAgLy8gKGluIHdvcmxkIHNwYWNlLCBlLmcuIG1ldGVycyksIGdpdmVuIGVpdGhlciBhIGNhbWVyYSBmb2NhbCBsZW5ndGggb3IgZmllbGQtb2Ytdmlld1xuICAgIC8vIChmb2NhbCBsZW5ndGggaXMgdXNlZCBpZiBib3RoIGFyZSBwYXNzZWQpLlxuICAgIGNvbnN0cmFpbkNhbWVyYSh7IHZpZXdfaGVpZ2h0LCBoZWlnaHQsIGZvY2FsX2xlbmd0aCwgZm92IH0pIHtcbiAgICAgICAgLy8gU29sdmUgZm9yIGNhbWVyYSBoZWlnaHRcbiAgICAgICAgaWYgKCFoZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgZm9jYWwgbGVuZ3RoLCBjYWxjdWxhdGUgRk9WXG4gICAgICAgICAgICBpZiAoZm9jYWxfbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm92ID0gTWF0aC5hdGFuKDEgLyBmb2NhbF9sZW5ndGgpICogMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGhhdmUgRk9WLCBjYWxjdWxhdGUgZm9jYWwgbGVuZ3RoXG4gICAgICAgICAgICBlbHNlIGlmIChmb3YpIHtcbiAgICAgICAgICAgICAgICBmb3YgPSBmb3YgKiBNYXRoLlBJIC8gMTgwOyAvLyBjb252ZXJ0IEZPViBkZWdyZWVzIHRvIHJhZGlhbnNcbiAgICAgICAgICAgICAgICBmb2NhbF9sZW5ndGggPSAxIC8gTWF0aC50YW4oZm92IC8gMik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERpc3RhbmNlIHRoYXQgY2FtZXJhIHNob3VsZCBiZSBmcm9tIGdyb3VuZCBzdWNoIHRoYXQgaXQgZml0cyB0aGUgZmllbGQgb2YgdmlldyBleHBlY3RlZFxuICAgICAgICAgICAgLy8gZm9yIGEgY29udmVudGlvbmFsIHdlYiBtZXJjYXRvciBtYXAgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBhbmQgY2FtZXJhIGZvY2FsIGxlbmd0aFxuICAgICAgICAgICAgaGVpZ2h0ID0gdmlld19oZWlnaHQgLyAyICogZm9jYWxfbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvbHZlIGZvciBjYW1lcmEgZm9jYWwgbGVuZ3RoIC8gZmllbGQtb2Ytdmlld1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvY2FsX2xlbmd0aCA9IDIgKiBoZWlnaHQgLyB2aWV3X2hlaWdodDtcbiAgICAgICAgICAgIGZvdiA9IE1hdGguYXRhbigxIC8gZm9jYWxfbGVuZ3RoKSAqIDI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyB2aWV3X2hlaWdodCwgaGVpZ2h0LCBmb2NhbF9sZW5ndGgsIGZvdiB9O1xuICAgIH1cblxuICAgIHVwZGF0ZU1hdHJpY2VzKCkge1xuICAgICAgICAvLyBUT0RPOiBvbmx5IHJlLWNhbGN1bGF0ZSB0aGVzZSB2YXJzIHdoZW4gbmVjZXNzYXJ5XG5cbiAgICAgICAgLy8gSGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCBpbiBtZXRlcnMgYXQgY3VycmVudCB6b29tXG4gICAgICAgIHZhciB2aWV3cG9ydF9oZWlnaHQgPSB0aGlzLnZpZXcuc2l6ZS5jc3MuaGVpZ2h0ICogdGhpcy52aWV3Lm1ldGVyc19wZXJfcGl4ZWw7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBjYW1lcmEgcHJvcGVydGllcyB0byBmaXQgZGVzaXJlZCB2aWV3XG4gICAgICAgIHZhciB7IGhlaWdodCwgZm92IH0gPSB0aGlzLmNvbnN0cmFpbkNhbWVyYSh7XG4gICAgICAgICAgICB2aWV3X2hlaWdodDogdmlld3BvcnRfaGVpZ2h0LFxuICAgICAgICAgICAgZm9jYWxfbGVuZ3RoOiBVdGlscy5pbnRlcnBvbGF0ZSh0aGlzLnZpZXcuem9vbSwgdGhpcy5mb2NhbF9sZW5ndGgpLFxuICAgICAgICAgICAgZm92OiBVdGlscy5pbnRlcnBvbGF0ZSh0aGlzLnZpZXcuem9vbSwgdGhpcy5mb3YpXG4gICAgICAgICB9KTtcblxuICAgICAgICAvLyBWaWV3IG1hdHJpeFxuICAgICAgICB2YXIgcG9zaXRpb24gPSBbdGhpcy52aWV3LmNlbnRlci5tZXRlcnMueCwgdGhpcy52aWV3LmNlbnRlci5tZXRlcnMueSwgaGVpZ2h0XTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBwb3NpdGlvbjtcblxuICAgICAgICAvLyBtYXQ0Lmxvb2tBdCh0aGlzLnZpZXdfbWF0cml4LFxuICAgICAgICAvLyAgICAgdmVjMy5mcm9tVmFsdWVzKC4uLnBvc2l0aW9uKSxcbiAgICAgICAgLy8gICAgIHZlYzMuZnJvbVZhbHVlcyhwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIGhlaWdodCAtIDEpLFxuICAgICAgICAvLyAgICAgdmVjMy5mcm9tVmFsdWVzKDAsIDEsIDApKTtcbiAgICAgICAgLy8gRXhjbHVkZSBjYW1lcmEgaGVpZ2h0IGZyb20gdmlldyBtYXRyaXhcbiAgICAgICAgbWF0NC5sb29rQXQodGhpcy52aWV3X21hdHJpeCxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcyhwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIDApLFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgLTEpLFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKDAsIDEsIDApKTtcblxuICAgICAgICAvLyBQcm9qZWN0aW9uIG1hdHJpeFxuICAgICAgICBtYXQ0LnBlcnNwZWN0aXZlKHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIGZvdiwgdGhpcy52aWV3LmFzcGVjdCwgMSwgaGVpZ2h0ICogMik7XG5cbiAgICAgICAgLy8gQ29udmVydCB2YW5pc2hpbmcgcG9pbnQgZnJvbSBwaXhlbHMgdG8gdmlld3BvcnQgc3BhY2VcbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1swXSA9IHRoaXMudmFuaXNoaW5nX3BvaW50WzBdIC8gdGhpcy52aWV3LnNpemUuY3NzLndpZHRoO1xuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzFdID0gdGhpcy52YW5pc2hpbmdfcG9pbnRbMV0gLyB0aGlzLnZpZXcuc2l6ZS5jc3MuaGVpZ2h0O1xuXG4gICAgICAgIC8vIEFkanVzdCBwcm9qZWN0aW9uIG1hdHJpeCB0byBpbmNsdWRlIHZhbmlzaGluZyBwb2ludCBza2V3XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXhbOF0gPSAtdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1swXSAqIDI7IC8vIHogY29sdW1uIG9mIHggcm93LCBlLmcuIGFtb3VudCB6IHNrZXdzIHhcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeFs5XSA9IC10aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzFdICogMjsgLy8geiBjb2x1bW4gb2YgeSByb3csIGUuZy4gYW1vdW50IHogc2tld3MgeVxuXG4gICAgICAgIC8vIFRyYW5zbGF0ZSBnZW9tZXRyeSBpbnRvIHRoZSBkaXN0YW5jZSBzbyB0aGF0IGNhbWVyYSBpcyBhcHByb3ByaWF0ZSBoZWlnaHQgYWJvdmUgZ3JvdW5kXG4gICAgICAgIC8vIEFkZGl0aW9uYWxseSwgYWRqdXN0IHh5IHRvIGNvbXBlbnNhdGUgZm9yIGFueSB2YW5pc2hpbmcgcG9pbnQgc2tldywgZS5nLiBtb3ZlIGdlb21ldHJ5IHNvIHRoYXQgdGhlIGRpc3BsYXllZCBnXG4gICAgICAgIC8vIHBsYW5lIG9mIHRoZSBtYXAgbWF0Y2hlcyB0aGF0IGV4cGVjdGVkIGJ5IGEgdHJhZGl0aW9uYWwgd2ViIG1lcmNhdG9yIG1hcCBhdCB0aGlzIFtsYXQsIGxuZywgem9vbV0uXG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgsXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMoXG4gICAgICAgICAgICAgICAgdmlld3BvcnRfaGVpZ2h0LzIgKiB0aGlzLnZpZXcuYXNwZWN0ICogKC10aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzBdICogMiksXG4gICAgICAgICAgICAgICAgdmlld3BvcnRfaGVpZ2h0LzIgKiAoLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMV0gKiAyKSxcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSW5jbHVkZSBjYW1lcmEgaGVpZ2h0IGluIHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIHZlYzMuZnJvbVZhbHVlcygwLCAwLCAtaGVpZ2h0KSk7XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICAgICAgdGhpcy51cGRhdGVNYXRyaWNlcygpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfcHJvamVjdGlvbicsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzNmJywgJ3VfZXllJywgWzAsIDAsIHRoaXMucG9zaXRpb25fbWV0ZXJzWzJdXSk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMmZ2JywgJ3VfdmFuaXNoaW5nX3BvaW50JywgdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tldyk7XG4gICAgfVxuXG59XG5cbi8vIElzb21ldHJpYy1zdHlsZSBwcm9qZWN0aW9uXG4vLyBOb3RlOiB0aGlzIGlzIGFjdHVhbGx5IGFuIFwiYXhvbm9tZXRyaWNcIiBwcm9qZWN0aW9uLCBidXQgSSdtIHVzaW5nIHRoZSBjb2xsb3F1aWFsIHRlcm0gaXNvbWV0cmljIGJlY2F1c2UgaXQgaXMgbW9yZSByZWNvZ25pemFibGUuXG4vLyBBbiBpc29tZXRyaWMgcHJvamVjdGlvbiBpcyBhIHNwZWNpZmljIHN1YnNldCBvZiBheG9ub21ldHJpYyBwcm9qZWN0aW9ucy5cbi8vICdheGlzJyBkZXRlcm1pbmVzIHRoZSB4eSBza2V3IGFwcGxpZWQgdG8gYSB2ZXJ0ZXggYmFzZWQgb24gaXRzIHogY29vcmRpbmF0ZSwgZS5nLiBbMCwgMV0gYXhpcyBjYXVzZXMgYnVpbGRpbmdzIHRvIGJlIGRyYXduXG4vLyBzdHJhaWdodCB1cHdhcmRzIG9uIHNjcmVlbiBhdCB0aGVpciB0cnVlIGhlaWdodCwgWzAsIC41XSB3b3VsZCBkcmF3IHRoZW0gdXAgYXQgaGFsZi1oZWlnaHQsIFsxLCAwXSB3b3VsZCBiZSBzaWRld2F5cywgZXRjLlxuY2xhc3MgSXNvbWV0cmljQ2FtZXJhIGV4dGVuZHMgQ2FtZXJhIHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZpZXcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihuYW1lLCB2aWV3LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2lzb21ldHJpYyc7XG4gICAgICAgIHRoaXMuYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCB7IHg6IDAsIHk6IDEgfTtcbiAgICAgICAgaWYgKHRoaXMuYXhpcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHRoaXMuYXhpcyA9IHsgeDogdGhpcy5heGlzWzBdLCB5OiB0aGlzLmF4aXNbMV0gfTsgLy8gYWxsb3cgYXhpcyB0byBhbHNvIGJlIHBhc3NlZCBhcyAyLWVsZW0gYXJyYXlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zaXRpb25fbWV0ZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3cG9ydF9oZWlnaHQgPSBudWxsO1xuXG4gICAgICAgIHRoaXMudmlld19tYXRyaXggPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuXG4gICAgICAgIC8vICdjYW1lcmEnIGlzIHRoZSBuYW1lIG9mIHRoZSBzaGFkZXIgYmxvY2ssIGUuZy4gZGV0ZXJtaW5lcyB3aGVyZSBpbiB0aGUgc2hhZGVyIHRoaXMgY29kZSBpcyBpbmplY3RlZFxuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlcGxhY2VCbG9jaygnY2FtZXJhJywgYFxuICAgICAgICAgICAgdW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbjtcbiAgICAgICAgICAgIHVuaWZvcm0gdmVjMyB1X2V5ZTtcbiAgICAgICAgICAgIHVuaWZvcm0gdmVjMiB1X3ZhbmlzaGluZ19wb2ludDtcblxuICAgICAgICAgICAgdm9pZCBjYW1lcmFQcm9qZWN0aW9uIChpbm91dCB2ZWM0IHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSB1X3Byb2plY3Rpb24gKiBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbi54eSArPSBwb3NpdGlvbi56ICogdV9pc29tZXRyaWNfYXhpcztcblxuICAgICAgICAgICAgICAgIC8vIFJldmVyc2UgeiBmb3IgZGVwdGggYnVmZmVyIHNvIHVwIGlzIG5lZ2F0aXZlLFxuICAgICAgICAgICAgICAgIC8vIGFuZCBzY2FsZSBkb3duIHZhbHVlcyBzbyBvYmplY3RzIGhpZ2hlciB0aGFuIG9uZSBzY3JlZW4gaGVpZ2h0IHdpbGwgbm90IGdldCBjbGlwcGVkXG4gICAgICAgICAgICAgICAgLy8gcHVsbCBmb3J3YXJkIHNsaWdodGx5IHRvIGF2b2lkIGdvaW5nIHBhc3QgZmFyIGNsaXBwaW5nIHBsYW5lXG4gICAgICAgICAgICAgICAgcG9zaXRpb24ueiA9IC1wb3NpdGlvbi56IC8gMTAwLiArIDEuIC0gMC4wMDE7XG4gICAgICAgICAgICB9YFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG5cbiAgICAgICAgdGhpcy52aWV3cG9ydF9oZWlnaHQgPSB0aGlzLnZpZXcuc2l6ZS5jc3MuaGVpZ2h0ICogdGhpcy52aWV3Lm1ldGVyc19wZXJfcGl4ZWw7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IFt0aGlzLnZpZXcuY2VudGVyLm1ldGVycy54LCB0aGlzLnZpZXcuY2VudGVyLm1ldGVycy55LCB0aGlzLnZpZXdwb3J0X2hlaWdodF07XG4gICAgICAgIHRoaXMucG9zaXRpb25fbWV0ZXJzID0gcG9zaXRpb247XG5cbiAgICAgICAgLy8gVmlld1xuICAgICAgICBtYXQ0LmlkZW50aXR5KHRoaXMudmlld19tYXRyaXgpO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0aGlzLnZpZXdfbWF0cml4LCB0aGlzLnZpZXdfbWF0cml4LCB2ZWMzLmZyb21WYWx1ZXMoLXBvc2l0aW9uWzBdLCAtcG9zaXRpb25bMV0sIDApKTtcblxuICAgICAgICAvLyBQcm9qZWN0aW9uXG4gICAgICAgIG1hdDQuaWRlbnRpdHkodGhpcy5wcm9qZWN0aW9uX21hdHJpeCk7XG5cbiAgICAgICAgLy8gYXBwbHkgaXNvbWV0cmljIHNrZXdcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeFs4XSA9IHRoaXMuYXhpcy54IC8gdGhpcy52aWV3LmFzcGVjdDsgLy8geiBjb2x1bW4gb2YgeCByb3csIGUuZy4gYW1vdW50IHogc2tld3MgeFxuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzldID0gdGhpcy5heGlzLnk7ICAgICAgICAgICAgICAgICAgICAvLyB6IGNvbHVtbiBvZiB4IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB5XG5cbiAgICAgICAgLy8gY29udmVydCBtZXRlcnMgdG8gdmlld3BvcnRcbiAgICAgICAgbWF0NC5zY2FsZSh0aGlzLnByb2plY3Rpb25fbWF0cml4LCB0aGlzLnByb2plY3Rpb25fbWF0cml4LFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKFxuICAgICAgICAgICAgICAgIDIgLyB0aGlzLnZpZXcuc2l6ZS5tZXRlcnMueCxcbiAgICAgICAgICAgICAgICAyIC8gdGhpcy52aWV3LnNpemUubWV0ZXJzLnksXG4gICAgICAgICAgICAgICAgMiAvIHRoaXMudmlldy5zaXplLm1ldGVycy55XG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtKHByb2dyYW0pIHtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9wcm9qZWN0aW9uJywgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCk7XG5cbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9leWUnLCBbMCwgMCwgdGhpcy52aWV3cG9ydF9oZWlnaHRdKTtcbiAgICAgICAgLy8gcHJvZ3JhbS51bmlmb3JtKCczZicsICd1X2V5ZScsIHRoaXMudmlld3BvcnRfaGVpZ2h0ICogdGhpcy5heGlzLngsIHRoaXMudmlld3BvcnRfaGVpZ2h0ICogdGhpcy5heGlzLnksIHRoaXMudmlld3BvcnRfaGVpZ2h0KTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcyZnYnLCAndV92YW5pc2hpbmdfcG9pbnQnLCBbMCwgMF0pO1xuICAgIH1cblxufVxuXG4vLyBGbGF0IHByb2plY3Rpb24gKGUuZy4ganVzdCB0b3AtZG93biwgbm8gcGVyc3BlY3RpdmUpIC0gYSBkZWdlbmVyYXRlIGlzb21ldHJpYyBjYW1lcmFcbmNsYXNzIEZsYXRDYW1lcmEgZXh0ZW5kcyBJc29tZXRyaWNDYW1lcmEge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdmlldywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG5hbWUsIHZpZXcsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnZmxhdCc7XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICAvLyBBeGlzIGlzIGZpeGVkIHRvICgwLCAwKSBmb3IgZmxhdCBjYW1lcmFcbiAgICAgICAgdGhpcy5heGlzLnggPSAwO1xuICAgICAgICB0aGlzLmF4aXMueSA9IDA7XG5cbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgfVxuXG59XG4iLCIvLyBNaXNjZWxsYW5lb3VzIGdlbyBmdW5jdGlvbnNcblxudmFyIEdlbztcbmV4cG9ydCBkZWZhdWx0IEdlbyA9IHt9O1xuXG4vLyBQcm9qZWN0aW9uIGNvbnN0YW50c1xuR2VvLmRlZmF1bHRfc291cmNlX21heF96b29tID0gMTg7XG5HZW8uZGVmYXVsdF92aWV3X21heF96b29tID0gMjA7XG5HZW8udGlsZV9zaXplID0gMjU2O1xuR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMgPSAyMDAzNzUwOC4zNDI3ODkyNDQ7XG5HZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycyAqIDI7XG5HZW8ubWluX3pvb21fbWV0ZXJzX3Blcl9waXhlbCA9IEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIEdlby50aWxlX3NpemU7IC8vIG1pbiB6b29tIGRyYXdzIHdvcmxkIGFzIDIgdGlsZXMgd2lkZVxuXG5sZXQgbWV0ZXJzX3Blcl9waXhlbCA9IFtdO1xuR2VvLm1ldGVyc1BlclBpeGVsID0gZnVuY3Rpb24gKHopIHtcbiAgICBtZXRlcnNfcGVyX3BpeGVsW3pdID0gbWV0ZXJzX3Blcl9waXhlbFt6XSB8fCBHZW8ubWluX3pvb21fbWV0ZXJzX3Blcl9waXhlbCAvIE1hdGgucG93KDIsIHopO1xuICAgIHJldHVybiBtZXRlcnNfcGVyX3BpeGVsW3pdO1xufTtcblxubGV0IG1ldGVyc19wZXJfdGlsZSA9IFtdO1xuR2VvLm1ldGVyc1BlclRpbGUgPSBmdW5jdGlvbiAoeikge1xuICAgIG1ldGVyc19wZXJfdGlsZVt6XSA9IG1ldGVyc19wZXJfdGlsZVt6XSB8fCBHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB6KTtcbiAgICByZXR1cm4gbWV0ZXJzX3Blcl90aWxlW3pdO1xufTtcblxuLy8gQ29udmVyc2lvbiBmdW5jdGlvbnMgYmFzZWQgb24gYW4gZGVmaW5lZCB0aWxlIHNjYWxlXG5HZW8udGlsZV9zY2FsZSA9IDQwOTY7IC8vIGNvb3JkaW5hdGVzIGFyZSBsb2NhbGx5IHNjYWxlZCB0byB0aGUgcmFuZ2UgWzAsIHRpbGVfc2NhbGVdXG5HZW8udW5pdHNfcGVyX3BpeGVsID0gR2VvLnRpbGVfc2NhbGUgLyBHZW8udGlsZV9zaXplO1xuR2VvLmhlaWdodF9zY2FsZSA9IDE2OyAgLy8gcHJvdmlkZXMgc3ViLW1ldGVyIHByZWNpc2lvbiBmb3IgaGVpZ2h0IHZhbHVlcyAoMTZ0aHMgb2YgYSBtZXRlcnMpXG5cbmxldCB1bml0c19wZXJfbWV0ZXIgPSBbXTtcbkdlby51bml0c1Blck1ldGVyID0gZnVuY3Rpb24gKHopIHtcbiAgICB1bml0c19wZXJfbWV0ZXJbel0gPSB1bml0c19wZXJfbWV0ZXJbel0gfHwgR2VvLnRpbGVfc2NhbGUgLyAoR2VvLnRpbGVfc2l6ZSAqIEdlby5tZXRlcnNQZXJQaXhlbCh6KSk7XG4gICAgcmV0dXJuIHVuaXRzX3Blcl9tZXRlclt6XTtcbn07XG5cbi8vIENvbnZlcnQgdGlsZSBsb2NhdGlvbiB0byBtZXJjYXRvciBtZXRlcnMgLSBtdWx0aXBseSBieSBwaXhlbHMgcGVyIHRpbGUsIHRoZW4gYnkgbWV0ZXJzIHBlciBwaXhlbCwgYWRqdXN0IGZvciBtYXAgb3JpZ2luXG5HZW8ubWV0ZXJzRm9yVGlsZSA9IGZ1bmN0aW9uICh0aWxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogdGlsZS54ICogR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgdGlsZS56KSAtIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzLFxuICAgICAgICB5OiAtKHRpbGUueSAqIEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHRpbGUueikgLSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycylcbiAgICB9O1xufTtcblxuLyoqXG4gICBHaXZlbiBhIHBvaW50IGluIG1lcmNhdG9yIG1ldGVycyBhbmQgYSB6b29tIGxldmVsLCByZXR1cm4gdGhlIHRpbGUgWC9ZL1ogdGhhdCB0aGUgcG9pbnQgbGllcyBpblxuKi9cbkdlby50aWxlRm9yTWV0ZXJzID0gZnVuY3Rpb24gKFt4LCB5XSwgem9vbSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IE1hdGguZmxvb3IoKHggKyBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycykgLyAoR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgem9vbSkpKSxcbiAgICAgICAgeTogTWF0aC5mbG9vcigoLXkgKyBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycykgLyAoR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgem9vbSkpKSxcbiAgICAgICAgejogem9vbVxuICAgIH07XG59O1xuXG4vLyBXcmFwIGEgdGlsZSB0byBwb3NpdGl2ZSAjcyBmb3Igem9vbVxuLy8gT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBheGVzIHRvIHdyYXBcbkdlby53cmFwVGlsZSA9IGZ1bmN0aW9uKHsgeCwgeSwgeiB9LCBtYXNrID0geyB4OiB0cnVlLCB5OiBmYWxzZSB9KSB7XG4gICAgdmFyIG0gPSAoMSA8PCB6KSAtIDE7XG4gICAgaWYgKG1hc2sueCkge1xuICAgICAgICB4ID0geCAmIG07XG4gICAgfVxuICAgIGlmIChtYXNrLnkpIHtcbiAgICAgICAgeSA9IHkgJiBtO1xuICAgIH1cbiAgICByZXR1cm4geyB4LCB5LCB6IH07XG59O1xuXG4vKipcbiAgIENvbnZlcnQgbWVyY2F0b3IgbWV0ZXJzIHRvIGxhdC1sbmdcbiovXG5HZW8ubWV0ZXJzVG9MYXRMbmcgPSBmdW5jdGlvbiAoW3gsIHldKSB7XG5cbiAgICB4IC89IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzO1xuICAgIHkgLz0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnM7XG5cbiAgICB5ID0gKDIgKiBNYXRoLmF0YW4oTWF0aC5leHAoeSAqIE1hdGguUEkpKSAtIChNYXRoLlBJIC8gMikpIC8gTWF0aC5QSTtcblxuICAgIHggKj0gMTgwO1xuICAgIHkgKj0gMTgwO1xuXG4gICAgcmV0dXJuIFt4LCB5XTtcbn07XG5cbi8qKlxuICBDb252ZXJ0IGxhdC1sbmcgdG8gbWVyY2F0b3IgbWV0ZXJzXG4qL1xuR2VvLmxhdExuZ1RvTWV0ZXJzID0gZnVuY3Rpb24oW3gsIHldKSB7XG5cbiAgICAvLyBMYXRpdHVkZVxuICAgIHkgPSBNYXRoLmxvZyhNYXRoLnRhbih5Kk1hdGguUEkvMzYwICsgTWF0aC5QSS80KSkgLyBNYXRoLlBJO1xuICAgIHkgKj0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnM7XG5cbiAgICAvLyBMb25naXR1ZGVcbiAgICB4ICo9IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gMTgwO1xuXG4gICAgcmV0dXJuIFt4LCB5XTtcbn07XG5cbkdlby53cmFwTG5nID0gZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID4gMTgwIHx8IHggPCAtMTgwKSB7XG4gICAgICAgIHggPSAoKHggKyAxODApICUgMzYwICsgMzYwKSAlIDM2MCAtIDE4MDtcbiAgICB9XG4gICAgcmV0dXJuIHg7XG59O1xuXG4vLyBSdW4gYW4gaW4tcGxhY2UgdHJhbnNmb3JtIGZ1bmN0aW9uIG9uIGVhY2ggY29vb3JkaW5hdGUgaW4gYSBHZW9KU09OIGdlb21ldHJ5XG5HZW8udHJhbnNmb3JtR2VvbWV0cnkgPSBmdW5jdGlvbiAoZ2VvbWV0cnksIHRyYW5zZm9ybSkge1xuICAgIGlmIChnZW9tZXRyeSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjsgLy8gc2tpcCBpZiBtaXNzaW5nIGdlb21ldHJ5ICh2YWxpZCBHZW9KU09OKVxuICAgIH1cblxuICAgIGlmIChnZW9tZXRyeS50eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIHRyYW5zZm9ybShnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMuZm9yRWFjaCh0cmFuc2Zvcm0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnUG9seWdvbicgfHwgZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMuZm9yRWFjaChjb29yZGluYXRlcyA9PiBjb29yZGluYXRlcy5mb3JFYWNoKHRyYW5zZm9ybSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKHBvbHlnb24gPT4ge1xuICAgICAgICAgICAgcG9seWdvbi5mb3JFYWNoKGNvb3JkaW5hdGVzID0+IGNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUT0RPOiBzdXBwb3J0IEdlb21ldHJ5Q29sbGVjdGlvblxufTtcblxuR2VvLmJveEludGVyc2VjdCA9IGZ1bmN0aW9uIChiMSwgYjIpIHtcbiAgICByZXR1cm4gIShcbiAgICAgICAgYjIuc3cueCA+IGIxLm5lLnggfHxcbiAgICAgICAgYjIubmUueCA8IGIxLnN3LnggfHxcbiAgICAgICAgYjIuc3cueSA+IGIxLm5lLnkgfHxcbiAgICAgICAgYjIubmUueSA8IGIxLnN3LnlcbiAgICApO1xufTtcblxuLy8gRmluZHMgdGhlIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggZm9yIGEgcG9seWdvblxuR2VvLmZpbmRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIChwb2x5Z29uKSB7XG4gICAgdmFyIG1pbl94ID0gSW5maW5pdHksXG4gICAgICAgIG1heF94ID0gLUluZmluaXR5LFxuICAgICAgICBtaW5feSA9IEluZmluaXR5LFxuICAgICAgICBtYXhfeSA9IC1JbmZpbml0eTtcblxuICAgIC8vIE9ubHkgbmVlZCB0byBleGFtaW5lIG91dGVyIHJpbmcgKHBvbHlnb25bMF0pXG4gICAgdmFyIG51bV9jb29yZHMgPSBwb2x5Z29uWzBdLmxlbmd0aDtcbiAgICBmb3IgKHZhciBjPTA7IGMgPCBudW1fY29vcmRzOyBjKyspIHtcbiAgICAgICAgdmFyIGNvb3JkID0gcG9seWdvblswXVtjXTtcblxuICAgICAgICBpZiAoY29vcmRbMF0gPCBtaW5feCkge1xuICAgICAgICAgICAgbWluX3ggPSBjb29yZFswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29vcmRbMV0gPCBtaW5feSkge1xuICAgICAgICAgICAgbWluX3kgPSBjb29yZFsxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29vcmRbMF0gPiBtYXhfeCkge1xuICAgICAgICAgICAgbWF4X3ggPSBjb29yZFswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29vcmRbMV0gPiBtYXhfeSkge1xuICAgICAgICAgICAgbWF4X3kgPSBjb29yZFsxXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbbWluX3gsIG1pbl95LCBtYXhfeCwgbWF4X3ldO1xufTtcblxuLy8gQ29udmVydCBnZW9tZXRyeSB0eXBlIHRvIG9uZSBvZjogJ3BvaW50JywgJ2xpbmUnLCAncG9seWdvbidcbkdlby5nZW9tZXRyeVR5cGUgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT09ICdQb2x5Z29uJyB8fCB0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICByZXR1cm4gJ3BvbHlnb24nO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICdsaW5lJztcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIHJldHVybiAncG9pbnQnO1xuICAgIH1cbn07XG5cbkdlby5jZW50cm9pZCA9IGZ1bmN0aW9uIChwb2x5Z29uKSB7XG4gICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQvYmxvYi9jMTBmNDA1YTExMjE0MmIxOTc4NTk2N2NlMGUxNDIxMzJhNjA5NWFkL3NyYy9sYXllci92ZWN0b3IvUG9seWdvbi5qcyNMNTdcbiAgICBsZXQgeCA9IDAsIHkgPSAwLCBhcmVhID0gMDtcbiAgICBsZXQgcmluZyA9IHBvbHlnb25bMF07IC8vIG9ubHkgdXNlIGZpcnN0IHJpbmcgZm9yIG5vd1xuICAgIGxldCBsZW4gPSByaW5nLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBqID0gbGVuIC0gMTsgaSA8IGxlbjsgaiA9IGksIGkrKykge1xuICAgICAgICBsZXQgcDAgPSByaW5nW2ldO1xuICAgICAgICBsZXQgcDEgPSByaW5nW2pdO1xuICAgICAgICBsZXQgZiA9IHAwWzFdICogcDFbMF0gLSBwMVsxXSAqIHAwWzBdO1xuXG4gICAgICAgIHggKz0gKHAwWzBdICsgcDFbMF0pICogZjtcbiAgICAgICAgeSArPSAocDBbMV0gKyBwMVsxXSkgKiBmO1xuICAgICAgICBhcmVhICs9IGYgKiAzO1xuICAgIH1cblxuICAgIHJldHVybiBbeCAvIGFyZWEsIHkgLyBhcmVhXTtcbn07XG5cbkdlby5tdWx0aUNlbnRyb2lkID0gZnVuY3Rpb24gKHBvbHlnb25zKSB7XG4gICAgbGV0IG4gPSBwb2x5Z29ucy5sZW5ndGg7XG4gICAgbGV0IGNlbnRyb2lkID0gWzAsIDBdO1xuXG4gICAgZm9yIChsZXQgcD0wOyBwIDwgcG9seWdvbnMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgbGV0IGMgPSBHZW8uY2VudHJvaWQocG9seWdvbnNbcF0pO1xuICAgICAgICBjZW50cm9pZFswXSArPSBjWzBdO1xuICAgICAgICBjZW50cm9pZFsxXSArPSBjWzFdO1xuICAgIH1cblxuICAgIGNlbnRyb2lkWzBdIC89IG47XG4gICAgY2VudHJvaWRbMV0gLz0gbjtcblxuICAgIHJldHVybiBjZW50cm9pZDtcbn07XG5cbkdlby5zaWduZWRQb2x5Z29uUmluZ0FyZWFTdW0gPSBmdW5jdGlvbiAocmluZykge1xuICAgIGxldCBhcmVhID0gMDtcbiAgICBsZXQgbiA9IHJpbmcubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7XG4gICAgICAgIGxldCBwMCA9IHJpbmdbaV07XG4gICAgICAgIGxldCBwMSA9IHJpbmdbaSsxXTtcblxuICAgICAgICBhcmVhICs9IHAwWzBdICogcDFbMV0gLSBwMVswXSAqIHAwWzFdO1xuICAgIH1cblxuICAgIGFyZWEgKz0gcmluZ1tuIC0gMV1bMF0gKiByaW5nWzBdWzFdIC0gcmluZ1swXVswXSAqIHJpbmdbbiAtIDFdWzFdO1xuICAgIHJldHVybiBhcmVhO1xufTtcblxuR2VvLnBvbHlnb25SaW5nQXJlYSA9IGZ1bmN0aW9uIChyaW5nKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKEdlby5zaWduZWRQb2x5Z29uUmluZ0FyZWFTdW0ocmluZykpIC8gMjtcbn07XG5cbi8vIFRPRE86IHN1YnRyYWN0IGlubmVyIHJpbmdzXG5HZW8ucG9seWdvbkFyZWEgPSBmdW5jdGlvbiAocG9seWdvbikge1xuICAgIHJldHVybiBHZW8ucG9seWdvblJpbmdBcmVhKHBvbHlnb25bMF0pO1xufTtcblxuR2VvLm11bHRpUG9seWdvbkFyZWEgPSBmdW5jdGlvbiAocG9seWdvbnMpIHtcbiAgICBsZXQgYXJlYSA9IDA7XG5cbiAgICBmb3IgKGxldCBwPTA7IHAgPCBwb2x5Z29ucy5sZW5ndGg7IHArKykge1xuICAgICAgICBhcmVhICs9IEdlby5wb2x5Z29uQXJlYShwb2x5Z29uc1twXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZWE7XG59O1xuXG5HZW8ucmluZ1dpbmRpbmcgPSBmdW5jdGlvbiAocmluZykge1xuICAgIGxldCBhcmVhID0gR2VvLnNpZ25lZFBvbHlnb25SaW5nQXJlYVN1bShyaW5nKTtcbiAgICBpZiAoYXJlYSA+IDApIHtcbiAgICAgICAgcmV0dXJuICdDVyc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZWEgPCAwKSB7XG4gICAgICAgIHJldHVybiAnQ0NXJztcbiAgICB9XG4gICAgLy8gcmV0dXJuIHVuZGVmaW5lZCBvbiB6ZXJvIGFyZWEgcG9seWdvblxufTtcbiIsIi8vIFdlYkdMIGNvbnN0YW50cyAtIG5lZWQgdG8gaW1wb3J0IHRoZXNlIHNlcGFyYXRlbHkgdG8gbWFrZSB0aGVtIGF2YWlsYWJsZSBpbiB0aGUgd2ViIHdvcmtlclxuXG52YXIgZ2w7XG5leHBvcnQgZGVmYXVsdCBnbCA9IHt9O1xuXG4vKiBEYXRhVHlwZSAqL1xuZ2wuQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAwO1xuZ2wuVU5TSUdORURfQllURSAgICAgICAgICAgICAgICAgID0gMHgxNDAxO1xuZ2wuU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAyO1xuZ2wuVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgID0gMHgxNDAzO1xuZ2wuSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDA0O1xuZ2wuVU5TSUdORURfSU5UICAgICAgICAgICAgICAgICAgID0gMHgxNDA1O1xuZ2wuRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDA2O1xuIiwiLy8gV2ViR0wgY29udGV4dCB3cmFwcGVyXG5cbnZhciBDb250ZXh0O1xuZXhwb3J0IGRlZmF1bHQgQ29udGV4dCA9IHt9O1xuXG4vLyBTZXR1cCBhIFdlYkdMIGNvbnRleHRcbi8vIElmIG5vIGNhbnZhcyBlbGVtZW50IGlzIHByb3ZpZGVkLCBvbmUgaXMgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlIGRvY3VtZW50IGJvZHlcbkNvbnRleHQuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uIGdldENvbnRleHQgKGNhbnZhcywgb3B0aW9ucylcbntcbiAgICB2YXIgZnVsbHNjcmVlbiA9IGZhbHNlO1xuICAgIGlmIChjYW52YXMgPT0gbnVsbCkge1xuICAgICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgY2FudmFzLnN0eWxlLnRvcCA9IDA7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5sZWZ0ID0gMDtcbiAgICAgICAgY2FudmFzLnN0eWxlLnpJbmRleCA9IC0xO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgICAgIGZ1bGxzY3JlZW4gPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIG9wdGlvbnMpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBvcHRpb25zKTtcbiAgICBpZiAoIWdsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGNyZWF0ZSBXZWJHTCBjb250ZXh0LlwiKTtcbiAgICB9XG5cbiAgICBpZiAoIWZ1bGxzY3JlZW4pIHtcbiAgICAgICAgQ29udGV4dC5yZXNpemUoZ2wsIHBhcnNlRmxvYXQoY2FudmFzLnN0eWxlLndpZHRoKSwgcGFyc2VGbG9hdChjYW52YXMuc3R5bGUuaGVpZ2h0KSwgb3B0aW9ucy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgQ29udGV4dC5yZXNpemUoZ2wsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQsIG9wdGlvbnMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIENvbnRleHQucmVzaXplKGdsLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0LCBvcHRpb25zLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBnbDtcbn07XG5cbkNvbnRleHQucmVzaXplID0gZnVuY3Rpb24gKGdsLCB3aWR0aCwgaGVpZ2h0LCBkZXZpY2VfcGl4ZWxfcmF0aW8pXG57XG4gICAgZGV2aWNlX3BpeGVsX3JhdGlvID0gZGV2aWNlX3BpeGVsX3JhdGlvIHx8IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgZ2wuY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICAgIGdsLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICAgIGdsLmNhbnZhcy53aWR0aCA9IE1hdGgucm91bmQod2lkdGggKiBkZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgIGdsLmNhbnZhcy5oZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCAqIGRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICBnbC52aWV3cG9ydCgwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQpO1xufTtcbiIsIi8vIFdlYkdMIGV4dGVuc2lvbiB3cmFwcGVyXG4vLyBTdG9yZXMgZXh0ZW5zaW9ucyBieSBuYW1lIGFuZCBHTCBjb250ZXh0XG5cbi8vIGxpc3Qgb2YgZXh0ZW5zaW9uIGFycmF5cywgZm9yIGVhY2ggZW50cnksIDFzdCBlbGVtZW50IEdMIGNvbnRleHQsIDJuZCBtYXAgb2YgZXh0ZW5zaW9ucyBieSBuYW1lXG5sZXQgZXh0ZW5zaW9ucyA9IFtdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRFeHRlbnNpb24gKGdsLCBuYW1lKSB7XG4gICAgbGV0IGV4dHMgPSBleHRlbnNpb25zLmZpbHRlcihlID0+IGVbMF0gPT09IGdsKVswXTtcbiAgICBleHRzID0gZXh0cyAmJiBleHRzWzFdO1xuXG4gICAgaWYgKCFleHRzKSB7XG4gICAgICAgIGV4dGVuc2lvbnMucHVzaChbZ2wsIHt9XSk7XG4gICAgICAgIGV4dHMgPSBleHRlbnNpb25zW2V4dGVuc2lvbnMubGVuZ3RoLTFdWzFdO1xuICAgIH1cblxuICAgIGlmICghZXh0c1tuYW1lXSkge1xuICAgICAgICBleHRzW25hbWVdID0gZ2wuZ2V0RXh0ZW5zaW9uKG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gZXh0c1tuYW1lXTtcbn1cbiIsInZhciBHTFNMID0ge307XG5leHBvcnQgZGVmYXVsdCBHTFNMO1xuXG4vKipcbiAgICBQYXJzZSB1bmlmb3JtcyBmcm9tIGEgSlMgb2JqZWN0LCBpbmZlcnMgdHlwZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZVxuICAgIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBzZXQgdW5pZm9ybSB2YWx1ZXMgb24gYSBHTCBwcm9ncmFtLiBFYWNoIG9iamVjdCBpbiB0aGUgcmV0dXJuZWRcbiAgICBhcnJheSBoYXMgdGhlIGZvcm06XG4gICAgeyB0eXBlLCBtZXRob2QsIG5hbWUsIHZhbHVlIH1cblxuICAgIHR5cGU6IHRoZSBHTCB1bmlmb3JtIHR5cGUsIHN1Y2ggYXMgJ3ZlYzMnLCAnZmxvYXQnLCBldGMuXG4gICAgbWV0aG9kOiB0aGUgR0wgdW5pZm9ybSBzZXR0ZXIgbWV0aG9kIHRvIHVzZSwgc3VjaCBhcyAnMWYnLCAnM2Z2JywgZXRjLlxuICAgIG5hbWU6IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgR0wgdW5pZm9ybSBsb2NhdGlvbiwgZS5nLiAnYXJyYXlbMF0uZmllbGQnLCBldGMuXG4gICAgdmFsdWU6IHRoZSB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gdGhlIEdMIHVuaWZvcm0gc2V0dGVyIGZvciB0aGF0IHR5cGUsIGUuZy4gWzEsIDIsIDNdIGZvciBhIHZlYzNcblxuICAgIFRleHR1cmVzIGhhdmUgc3BlY2lhbCBiZWhhdmlvcjogdW5pZm9ybXMgd2l0aCBzdHJpbmcgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIHRleHR1cmVzLCBhbmRcbiAgICB0aGUgc3RyaW5nIGlzIHVzZWQgYXMgYSB1bmlxdWUgdGV4dHVyZSAna2V5JyB0byBiZSBpbnRlcnByZXRlZCBieSB0aGUgY2FsbGVyICh3aGljaCBpcyByZXNwb25zaWJsZVxuICAgIGZvciBhY3R1YWxseSBzZXR0aW5nIHRoZSB1bmlmb3JtcykuIEZvciBleGFtcGxlLCB0aGlzIGNvdWxkIGJlIHVzZWQgYXMgYSBrZXkgaW50byBhIGRpY3Rpb25hcnkgb2ZcbiAgICBrbm93biB0ZXh0dXJlIG5hbWVzLCBvciBpdCBjb3VsZCBzaW1wbHkgYmUgdXNlZCBhcyBhIFVSTCB0byBkeW5hbWljYWxseSBsb2FkIHRoZSB0ZXh0dXJlIGZyb20uXG4qL1xuR0xTTC5wYXJzZVVuaWZvcm1zID0gZnVuY3Rpb24gKHVuaWZvcm1zKSB7XG4gICAgdmFyIHBhcnNlZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgbmFtZSBpbiB1bmlmb3Jtcykge1xuICAgICAgICB2YXIga2V5ID0gbmFtZTsgLy8gc2F2ZSB0aGUgb3JpZ2luYWwgbmFtZVxuICAgICAgICB2YXIgdW5pZm9ybSA9IHVuaWZvcm1zW25hbWVdO1xuICAgICAgICB2YXIgdTtcblxuICAgICAgICAvLyBTaW5nbGUgZmxvYXRcbiAgICAgICAgaWYgKHR5cGVvZiB1bmlmb3JtID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWYnLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheTogdmVjdG9yLCBhcnJheSBvZiBmbG9hdHMsIGFycmF5IG9mIHRleHR1cmVzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodW5pZm9ybSkpIHtcbiAgICAgICAgICAgIC8vIE51bWVyaWMgdmFsdWVzXG4gICAgICAgICAgICBpZiAodHlwZW9mIHVuaWZvcm1bMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgLy8gZmxvYXQgdmVjdG9ycyAodmVjMiwgdmVjMywgdmVjNClcbiAgICAgICAgICAgICAgICBpZiAodW5pZm9ybS5sZW5ndGggPj0gMiAmJiB1bmlmb3JtLmxlbmd0aCA8PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2ZWMnICsgdW5pZm9ybS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHVuaWZvcm0ubGVuZ3RoICsgJ2Z2JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmbG9hdCBhcnJheVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVuaWZvcm0ubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxvYXRbXScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICcxZnYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSArICdbMF0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYXNzdW1lIG1hdHJpeCBmb3IgKHR5cGVvZiA9PSBGbG9hdDMyQXJyYXkgJiYgbGVuZ3RoID09IDE2KT9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFycmF5IG9mIHRleHR1cmVzXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdW5pZm9ybVswXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHU9MDsgdSA8IHVuaWZvcm0ubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NhbXBsZXIyRCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lICsgJ1snICsgdSArICddJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtW3VdLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB1LFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXJyYXkgb2YgYXJyYXlzIC0gYnV0IG9ubHkgYXJyYXlzIG9mIHZlY3RvcnMgYXJlIGFsbG93ZWQgaW4gdGhpcyBjYXNlXG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHVuaWZvcm1bMF0pICYmIHR5cGVvZiB1bmlmb3JtWzBdWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIC8vIGZsb2F0IHZlY3RvcnMgKHZlYzIsIHZlYzMsIHZlYzQpXG4gICAgICAgICAgICAgICAgaWYgKHVuaWZvcm1bMF0ubGVuZ3RoID49IDIgJiYgdW5pZm9ybVswXS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICAgICAgICAgIGZvciAodT0wOyB1IDwgdW5pZm9ybS5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2ZWMnICsgdW5pZm9ybVswXS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiB1bmlmb3JtW3VdLmxlbmd0aCArICdmdicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSArICdbJyArIHUgKyAnXScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm1bdV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zOiB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE86IGVsc2Ugd2FybmluZ1xuICAgICAgICB9XG4gICAgICAgIC8vIEJvb2xlYW5cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm0gPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib29sJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRleHR1cmVcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3NhbXBsZXIyRCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWknLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJzZWQ7XG59O1xuXG4vKipcbiAgICBHZW5lcmF0ZSBhIEdMU0wgdmFyaWFibGUgZGVmaW5pdGlvbiBmcm9tIGEgSlMgb2JqZWN0XG4qL1xuR0xTTC5kZWZpbmVWYXJpYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciB0eXBlLCBhcnJheTtcblxuICAgIC8vIFNpbmdsZSBmbG9hdFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHR5cGUgPSAnZmxvYXQnO1xuICAgIH1cbiAgICAvLyBNdWx0aXBsZSBmbG9hdHMgLSB2ZWN0b3Igb3IgYXJyYXlcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAvLyBOdW1lcmljIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgLy8gZmxvYXQgdmVjdG9ycyAodmVjMiwgdmVjMywgdmVjNClcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMiAmJiB2YWx1ZS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAndmVjJyArIHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZsb2F0IGFycmF5XG4gICAgICAgICAgICBlbHNlIHsgLy9pZiAodmFsdWUubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAnZmxvYXQnO1xuICAgICAgICAgICAgICAgIGFycmF5ID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVE9ETzogYXNzdW1lIG1hdHJpeCBmb3IgKHR5cGVvZiA9PSBGbG9hdDMyQXJyYXkgJiYgbGVuZ3RoID09IDE2KT9cbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB0ZXh0dXJlc1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWVbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0eXBlID0gJ3NhbXBsZXIyRCc7XG4gICAgICAgICAgICBhcnJheSA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCb29sZWFuXG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdHlwZSA9ICdib29sJztcbiAgICB9XG4gICAgLy8gVGV4dHVyZVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHlwZSA9ICdzYW1wbGVyMkQnO1xuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCB2YXJpYWJsZSBkZWZpbml0aW9uXG4gICAgdmFyIHZhcmlhYmxlID0gJyc7XG4gICAgdmFyaWFibGUgKz0gYCR7dHlwZX0gJHtuYW1lfWA7XG4gICAgaWYgKGFycmF5KSB7XG4gICAgICAgIHZhcmlhYmxlICs9IGBbJHthcnJheX1dYDtcbiAgICB9XG4gICAgdmFyaWFibGUgKz0gJztcXG4nO1xuXG4gICAgcmV0dXJuIHZhcmlhYmxlO1xufTtcblxuLyoqXG4gICAgR2VuZXJhdGUgYSBHTFNMIHVuaWZvcm0gZGVmaW5pdGlvbiBmcm9tIGEgSlMgb2JqZWN0XG4qL1xuR0xTTC5kZWZpbmVVbmlmb3JtID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgcmV0dXJuICd1bmlmb3JtICcgKyBHTFNMLmRlZmluZVZhcmlhYmxlKG5hbWUsIHZhbHVlKTtcbn07XG5cbi8qKlxuICAgIENoZWNrIGZvciBhIHVuaWZvcm0gZGVmaW5pdGlvbiBvZiAnbmFtZScgaW4gdGhlIHByb3ZpZGVkIEdMU0wgc291cmNlXG4gICAgU2ltcGxlIHJlZ2V4IGNoZWNrIGZvciAndW5pZm9ybScga2V5d29yZCBhbmQgdmFyIG5hbWUsIGRvZXMgbm90IGF0dGVtcHQgdG8gcGFyc2UvZXh0cmFjdCBHTFNMXG4gICAgTk9URTogYXNzdW1lcyBjb21tZW50cyBoYXZlIGJlZW4gc3RyaXBwZWQgZnJvbSBzb3VyY2VcbiovXG5HTFNMLmlzVW5pZm9ybURlZmluZWQgPSBmdW5jdGlvbiAobmFtZSwgc291cmNlKSB7XG4gICAgLy8gTWF0Y2gsIGluIG9yZGVyOlxuICAgIC8vIC0gdGhlIGtleXdvcmQgJ3VuaWZvcm0nXG4gICAgLy8gLSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIHRoYXQgaXMgYW55dGhpbmcgZXhjZXB0IGEgc2VtaWNvbG9uLCA7XG4gICAgLy8gLSBvcHRpb25hbGx5LCBhbnl0aGluZyBlbmNsb3NlZCBpbiBjdXJseSBicmFjZXMsIHsgLi4uIH0gKGFuIGlubGluZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBjYW4gZ28gaGVyZSlcbiAgICAvLyAtIG9wdGlvbmFsbHksIGFueSAjIG9mIGNoYXJhY3RlcnMgdGhhdCBpcyBub3QgYSBzZW1pY29sb24sIDtcbiAgICAvLyAtIHRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtXG5cbiAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCd1bmlmb3JtW147XSsoPzp7W1xcXFxzXFxcXFNdKn0pP1teO10qXFxcXGInICsgbmFtZSArICdcXFxcYicsICdnJyk7XG4gICAgaWYgKHNvdXJjZS5tYXRjaChyZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICAgIENoZWNrIHRoYXQgYSBzeW1ib2wgaXMgcmVmZXJlbmNlZCBpbiB0aGUgR0xTTCBzb3VyY2VcbiAgICBOT1RFOiBhc3N1bWVzIGNvbW1lbnRzIGhhdmUgYmVlbiBzdHJpcHBlZCBmcm9tIHNvdXJjZVxuKi9cbkdMU0wuaXNTeW1ib2xSZWZlcmVuY2VkID0gZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSkge1xuICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ1xcXFxiJyArIG5hbWUgKyAnXFxcXGInLCAnZycpO1xuICAgIGlmIChzb3VyY2Uuc2VhcmNoKHJlKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAgICBFeHBhbmQgYSBzaW5nbGUgdmFsdWUgb3IgMi1lbGVtZW50IGFycmF5IGludG8gYSAzLWVsZW1lbnQgYXJyYXksIHdpdGggdGhlIGxhc3QgKCB6IClcbiAgICBjb29yZGluYXRlIGRlZmF1bHRpbmcgdG8gMSAod2l0aCBvcHRpb24gdG8gc3BlY2lmeSkuIEFsc28gcnVucyBwYXJzZUZsb2F0IHRvIHRyeSB0byBtYWludGFpblxuICAgIGRhdGEgaW50ZWdyaXR5LiBSZXR1cm5zIG51bGwgaWYgaW5wdXQgY291bGRuJ3QgYmUgcGFyc2VkLlxuKi9cbkdMU0wuZXhwYW5kVmVjMyA9IGZ1bmN0aW9uICh2LCB6ID0gMSkge1xuICAgIGxldCB4O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIGlmICh2Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgeCA9IFsuLi52LCB6XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgeCA9IFt2LCB2LCB2XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgfVxuXG4gICAgaWYgKHggJiYgeC5ldmVyeShuID0+IHR5cGVvZiBuID09PSAnbnVtYmVyJyAmJiAhaXNOYU4obikpKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbn07XG5cbi8qKlxuICAgIEV4cGFuZCBhIHNpbmdsZSB2YWx1ZSBvciAzLWVsZW1lbnQgYXJyYXkgaW50byBhIDQtZWxlbWVudCBhcnJheSwgd2l0aCB0aGUgbGFzdCAoZS5nLiB3IG9yIGEpXG4gICAgY29vcmRpbmF0ZSBkZWZhdWx0aW5nIHRvIDEgKHdpdGggb3B0aW9uIHRvIHNwZWNpZnkpLiBBbHNvIHJ1bnMgcGFyc2VGbG9hdCB0byB0cnkgdG8gbWFpbnRhaW5cbiAgICBkYXRhIGludGVncml0eS4gUmV0dXJucyBudWxsIGlmIGlucHV0IGNvdWxkbid0IGJlIHBhcnNlZC5cbiovXG5HTFNMLmV4cGFuZFZlYzQgPSBmdW5jdGlvbiAodiwgdyA9IDEpIHtcbiAgICBsZXQgeDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICBpZiAodi5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIHggPSBbLi4udiwgd10ubWFwKHBhcnNlRmxvYXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHggPSBbdiwgdiwgdiwgd10ubWFwKHBhcnNlRmxvYXQpO1xuICAgIH1cblxuICAgIGlmICh4ICYmIHguZXZlcnkobiA9PiB0eXBlb2YgbiA9PT0gJ251bWJlcicgJiYgIWlzTmFOKG4pKSkge1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG59O1xuXG5cbiIsIlxuZXhwb3J0IGNsYXNzIFJlbmRlclN0YXRlIHtcblx0Y29uc3RydWN0b3IgKHZhbHVlLCBzZXR1cCkge1xuICAgICAgICBzZXR1cCh2YWx1ZSk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zZXR1cCA9IHNldHVwO1xuICAgIH1cblxuICAgIHNldCAodmFsdWUpIHtcbiAgICBcdC8vIGlmIHRoZSBzdGF0ZXMgYXJlIGRpZmZlcmVudCwgY2FsbCB0aGUgR0wgY29udGV4dCBmb3IgYSBzdGF0ZSBjaGFuZ2VcbiAgICBcdGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSB7XG4gICAgXHRcdHRoaXMuc2V0dXAodmFsdWUpO1xuICAgIFx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgXHR9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJTdGF0ZU1hbmFnZXIge1xuXG4gICAgY29uc3RydWN0b3IgKGdsKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMgPSB7fTtcblxuICAgICAgICAvLyBDdWxsaW5nXG4gICAgICAgIHRoaXMuZGVmYXVsdHMuY3VsbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuY3VsbGluZ19mYWNlID0gZ2wuQkFDSztcblxuICAgICAgICAvLyBCbGVuZGluZ1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfc3JjID0gZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3QgPSBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyY19hbHBoYSA9IGdsLk9ORTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3RfYWxwaGEgPSBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuXG4gICAgICAgIC8vIERlcHRoIHRlc3Qvd3JpdGVcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5kZXB0aF93cml0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuZGVwdGhfdGVzdCA9IHRydWU7XG4gICAgICAgIGdsLmRlcHRoRnVuYyhnbC5MRVNTKTsgLy8gZGVwdGggZnVuY3Rpb24gb25seSBuZWVkcyB0byBiZSBzZXQgb25jZVxuXG4gICAgXHQvLyBDdWxsaW5nXG4gICAgICAgIHRoaXMuY3VsbGluZyA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgY3VsbDogdGhpcy5kZWZhdWx0cy5jdWxsaW5nLCBmYWNlOiB0aGlzLmRlZmF1bHRzLmN1bGxpbmdfZmFjZSB9LFxuICAgIFx0XHQodmFsdWUpID0+IHtcbiAgICBcdFx0XHRpZiAodmFsdWUuY3VsbCkge1xuICAgIFx0XHRcdFx0Z2wuZW5hYmxlKGdsLkNVTExfRkFDRSk7XG4gICAgICAgICAgICBcdFx0Z2wuY3VsbEZhY2UodmFsdWUuZmFjZSk7XG4gICAgXHRcdFx0fSBlbHNlIHtcbiAgICBcdFx0XHRcdGdsLmRpc2FibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdCk7XG5cbiAgICBcdC8vIEJsZW5kaW5nIG1vZGVcbiAgICAgICAgdGhpcy5ibGVuZGluZyA9IG5ldyBSZW5kZXJTdGF0ZSh7XG4gICAgICAgICAgICAgICAgYmxlbmQ6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmcsXG4gICAgICAgICAgICAgICAgc3JjOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyYyxcbiAgICAgICAgICAgICAgICBkc3Q6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfZHN0LFxuICAgICAgICAgICAgICAgIHNyY19hbHBoYTogdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19zcmNfYWxwaGEsXG4gICAgICAgICAgICAgICAgZHN0X2FscGhhOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX2RzdF9hbHBoYVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICh2YWx1ZSkgPT4ge1xuICAgIFx0XHRcdGlmICh2YWx1ZS5ibGVuZCkge1xuICAgICAgICAgICAgXHRcdGdsLmVuYWJsZShnbC5CTEVORCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnNyY19hbHBoYSAmJiB2YWx1ZS5kc3RfYWxwaGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmJsZW5kRnVuY1NlcGFyYXRlKHZhbHVlLnNyYywgdmFsdWUuZHN0LCB2YWx1ZS5zcmNfYWxwaGEsIHZhbHVlLmRzdF9hbHBoYSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmModmFsdWUuc3JjLCB2YWx1ZS5kc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXHRcdFx0fSBlbHNlIHtcbiAgICBcdFx0XHRcdGdsLmRpc2FibGUoZ2wuQkxFTkQpO1xuICAgIFx0XHRcdH1cbiAgICBcdFx0fVxuICAgIFx0KTtcblxuICAgIFx0Ly8gRGVwdGggd3JpdGVcbiAgICAgICAgdGhpcy5kZXB0aF93cml0ZSA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgZGVwdGhfd3JpdGU6IHRoaXMuZGVmYXVsdHMuZGVwdGhfd3JpdGUgfSxcbiAgICBcdFx0KHZhbHVlKSA9PiB7XG4gICAgICAgIFx0XHRnbC5kZXB0aE1hc2sodmFsdWUuZGVwdGhfd3JpdGUpO1xuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgXHQvLyBEZXB0aCB0ZXN0XG4gICAgICAgIHRoaXMuZGVwdGhfdGVzdCA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgZGVwdGhfdGVzdDogdGhpcy5kZWZhdWx0cy5kZXB0aF90ZXN0IH0sXG4gICAgICAgICAgICAodmFsdWUpID0+IHtcbiAgICBcdFx0XHRpZiAodmFsdWUuZGVwdGhfdGVzdCkge1xuICAgICAgICAgICAgXHRcdGdsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICBcdFx0XHR9IGVsc2Uge1xuICAgICAgICAgICAgXHRcdGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgXHRcdFx0fVxuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgfVxuXG59XG4iLCIvLyBHTCBwcm9ncmFtIHdyYXBwZXIgdG8gY2FjaGUgdW5pZm9ybSBsb2NhdGlvbnMvdmFsdWVzLCBkbyBjb21waWxlLXRpbWUgcHJlLXByb2Nlc3Npbmdcbi8vIChpbmplY3RpbmcgI2RlZmluZXMgYW5kICNwcmFnbWEgYmxvY2tzIGludG8gc2hhZGVycyksIGV0Yy5cblxuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbHNsJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZSc7XG5pbXBvcnQgZ2V0RXh0ZW5zaW9uIGZyb20gJy4vZXh0ZW5zaW9ucyc7XG5cbmltcG9ydCBzdHJpcCBmcm9tICdzdHJpcC1jb21tZW50cyc7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHBhcnNlU2hhZGVyRXJyb3JzIH0gZnJvbSAnZ2wtc2hhZGVyLWVycm9ycyc7XG5cbi8vIFJlZ2V4IHBhdHRlcm5zXG5jb25zdCByZV9wcmFnbWEgPSAvXlxccyojcHJhZ21hLiokL2dtOyAgIC8vIGZvciByZW1vdmluZyB1bnVzZWQgcHJhZ21hcyBhZnRlciBzaGFkZXIgYmxvY2sgaW5qZWN0aW9uXG5jb25zdCByZV9jb250aW51ZV9saW5lID0gL1xcXFxcXHMqXFxuL21nOyAgIC8vIGZvciByZW1vdmluZyBiYWNrc2xhc2ggbGluZSBjb250aW51YXRpb25zXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYWRlclByb2dyYW0ge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIHZlcnRleF9zb3VyY2UsIGZyYWdtZW50X3NvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgLy8ga2V5L3ZhbHVlcyBpbnNlcnRlZCBhcyAjZGVmaW5lcyBpbnRvIHNoYWRlcnMgYXQgY29tcGlsZS10aW1lXG4gICAgICAgIHRoaXMuZGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuZGVmaW5lc3x8e30pO1xuXG4gICAgICAgIC8vIGtleS92YWx1ZXMgZm9yIGJsb2NrcyB0aGF0IGNhbiBiZSBpbmplY3RlZCBpbnRvIHNoYWRlcnMgYXQgY29tcGlsZS10aW1lXG4gICAgICAgIHRoaXMuYmxvY2tzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5ibG9ja3N8fHt9KTtcbiAgICAgICAgdGhpcy5ibG9ja19zY29wZXMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmJsb2NrX3Njb3Blc3x8e30pO1xuXG4gICAgICAgIC8vIGxpc3Qgb2YgZXh0ZW5zaW9ucyB0byBhY3RpdmF0ZVxuICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBvcHRpb25zLmV4dGVuc2lvbnMgfHwgW107XG5cbiAgICAgICAgLy8gSlMtb2JqZWN0IHVuaWZvcm1zIHRoYXQgYXJlIGV4cGVjdGVkIGJ5IHRoaXMgcHJvZ3JhbVxuICAgICAgICAvLyBJZiB0aGV5IGFyZSBub3QgZm91bmQgaW4gdGhlIGV4aXN0aW5nIHNoYWRlciBzb3VyY2UsIHRoZWlyIHR5cGVzIHdpbGwgYmUgaW5mZXJyZWQgYW5kIGRlZmluaXRpb25zXG4gICAgICAgIC8vIGZvciBlYWNoIHdpbGwgYmUgaW5qZWN0ZWQuXG4gICAgICAgIHRoaXMuZGVwZW5kZW50X3VuaWZvcm1zID0gb3B0aW9ucy51bmlmb3JtcztcblxuICAgICAgICB0aGlzLnVuaWZvcm1zID0ge307IC8vIHByb2dyYW0gbG9jYXRpb25zIG9mIHVuaWZvcm1zLCBsYXppbHkgYWRkZWQgYXMgZWFjaCB1bmlmb3JtIGlzIHNldFxuICAgICAgICB0aGlzLmF0dHJpYnMgPSB7fTsgLy8gcHJvZ3JhbSBsb2NhdGlvbnMgb2YgdmVydGV4IGF0dHJpYnV0ZXMsIGxhemlseSBhZGRlZCBhcyBlYWNoIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZFxuXG4gICAgICAgIHRoaXMudmVydGV4X3NvdXJjZSA9IHZlcnRleF9zb3VyY2U7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRfc291cmNlID0gZnJhZ21lbnRfc291cmNlO1xuXG4gICAgICAgIHRoaXMuaWQgPSBTaGFkZXJQcm9ncmFtLmlkKys7XG4gICAgICAgIFNoYWRlclByb2dyYW0ucHJvZ3JhbXNbdGhpcy5pZF0gPSB0aGlzO1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7IC8vIGNhbiBwcm92aWRlIGEgcHJvZ3JhbSBuYW1lICh1c2VmdWwgZm9yIGRlYnVnZ2luZylcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0obnVsbCk7XG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLnVuaWZvcm1zID0ge307XG4gICAgICAgIHRoaXMuYXR0cmlicyA9IHt9O1xuICAgICAgICBkZWxldGUgU2hhZGVyUHJvZ3JhbS5wcm9ncmFtc1t0aGlzLmlkXTtcbiAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFVzZSBwcm9ncmFtIHdyYXBwZXIgd2l0aCBzaW1wbGUgc3RhdGUgY2FjaGVcbiAgICB1c2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFNoYWRlclByb2dyYW0uY3VycmVudCAhPT0gdGhpcykge1xuICAgICAgICAgICAgdGhpcy5nbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gICAgICAgIH1cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5jdXJyZW50ID0gdGhpcztcbiAgICB9XG5cbiAgICBjb21waWxlKCkge1xuICAgICAgICBpZiAodGhpcy5jb21waWxpbmcpIHtcbiAgICAgICAgICAgIHRocm93KG5ldyBFcnJvcihgU2hhZGVyUHJvZ3JhbS5jb21waWxlKCk6IHNraXBwaW5nIGZvciAke3RoaXMuaWR9ICgke3RoaXMubmFtZX0pIGJlY2F1c2UgYWxyZWFkeSBjb21waWxpbmdgKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21waWxpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuXG4gICAgICAgIC8vIENvcHkgc291cmNlcyBmcm9tIHByZS1tb2RpZmllZCB0ZW1wbGF0ZVxuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLnZlcnRleF9zb3VyY2U7XG4gICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gdGhpcy5mcmFnbWVudF9zb3VyY2U7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGV4dGVuc2lvbiBhdmFpbGFiaWxpdHlcbiAgICAgICAgbGV0IGV4dGVuc2lvbnMgPSB0aGlzLmNoZWNrRXh0ZW5zaW9ucygpO1xuXG4gICAgICAgIC8vIE1ha2UgbGlzdCBvZiBkZWZpbmVzIHRvIGJlIGluamVjdGVkIGxhdGVyXG4gICAgICAgIHZhciBkZWZpbmVzID0gdGhpcy5idWlsZERlZmluZUxpc3QoKTtcblxuICAgICAgICAvLyBJbmplY3QgdXNlci1kZWZpbmVkIGJsb2NrcyAoYXJiaXRyYXJ5IGNvZGUgcG9pbnRzIG1hdGNoaW5nIG5hbWVkICNwcmFnbWFzKVxuICAgICAgICAvLyBSZXBsYWNlIGFjY29yZGluZyB0byB0aGlzIHBhdHRlcm46XG4gICAgICAgIC8vICNwcmFnbWEgdGFuZ3JhbTogW2tleV1cbiAgICAgICAgLy8gZS5nLiAjcHJhZ21hIHRhbmdyYW06IGdsb2JhbFxuXG4gICAgICAgIC8vIEdhdGhlciBhbGwgYmxvY2sgY29kZSBzbmlwcGV0c1xuICAgICAgICB2YXIgYmxvY2tzID0gdGhpcy5idWlsZFNoYWRlckJsb2NrTGlzdCgpO1xuICAgICAgICB2YXIgcmVnZXhwO1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBibG9ja3MpIHtcbiAgICAgICAgICAgIHZhciBibG9jayA9IGJsb2Nrc1trZXldO1xuICAgICAgICAgICAgaWYgKCFibG9jayB8fCAoQXJyYXkuaXNBcnJheShibG9jaykgJiYgYmxvY2subGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaXJzdCBmaW5kIGNvZGUgcmVwbGFjZSBwb2ludHMgaW4gc2hhZGVyc1xuICAgICAgICAgICAgcmVnZXhwID0gbmV3IFJlZ0V4cCgnXlxcXFxzKiNwcmFnbWFcXFxccyt0YW5ncmFtOlxcXFxzKycgKyBrZXkgKyAnXFxcXHMqJCcsICdtJyk7XG4gICAgICAgICAgICB2YXIgaW5qZWN0X3ZlcnRleCA9IHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZS5tYXRjaChyZWdleHApO1xuICAgICAgICAgICAgdmFyIGluamVjdF9mcmFnbWVudCA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLm1hdGNoKHJlZ2V4cCk7XG5cbiAgICAgICAgICAgIC8vIEF2b2lkIG5ldHdvcmsgcmVxdWVzdCBpZiBub3RoaW5nIHRvIHJlcGxhY2VcbiAgICAgICAgICAgIGlmIChpbmplY3RfdmVydGV4ID09IG51bGwgJiYgaW5qZWN0X2ZyYWdtZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ29tYmluZSBhbGwgYmxvY2tzIGludG8gb25lIHN0cmluZ1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9ICcnO1xuICAgICAgICAgICAgYmxvY2suZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE1hcmsgc3RhcnQgYW5kIGVuZCBvZiBlYWNoIGJsb2NrIHdpdGggbWV0YWRhdGEgKHdoaWNoIGNhbiBiZSBleHRyYWN0ZWQgZnJvbVxuICAgICAgICAgICAgICAgIC8vIGZpbmFsIHNvdXJjZSBmb3IgZXJyb3IgaGFuZGxpbmcsIGRlYnVnZ2luZywgZXRjLilcbiAgICAgICAgICAgICAgICBsZXQgbWFyayA9IGAke3ZhbC5zY29wZX0sICR7dmFsLmtleX0sICR7dmFsLm51bX1gO1xuICAgICAgICAgICAgICAgIHNvdXJjZSArPSBgXFxuLy8gdGFuZ3JhbS1ibG9jay1zdGFydDogJHttYXJrfVxcbmA7XG4gICAgICAgICAgICAgICAgc291cmNlICs9IHZhbC5zb3VyY2U7XG4gICAgICAgICAgICAgICAgc291cmNlICs9IGBcXG4vLyB0YW5ncmFtLWJsb2NrLWVuZDogJHttYXJrfVxcbmA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gSW5qZWN0XG4gICAgICAgICAgICBpZiAoaW5qZWN0X3ZlcnRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLnJlcGxhY2UocmVnZXhwLCBzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluamVjdF9mcmFnbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZS5yZXBsYWNlKHJlZ2V4cCwgc291cmNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIGEgI2RlZmluZSBmb3IgdGhpcyBpbmplY3Rpb24gcG9pbnRcbiAgICAgICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fQkxPQ0tfJyArIGtleS5yZXBsYWNlKC9bXFxzLV0rL2csICdfJykudG9VcHBlckNhc2UoKV0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYW4tdXAgYW55ICNwcmFnbWFzIHRoYXQgd2VyZW4ndCByZXBsYWNlZCAodG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncylcbiAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLnJlcGxhY2UocmVfcHJhZ21hLCAnJyk7XG4gICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UucmVwbGFjZShyZV9wcmFnbWEsICcnKTtcblxuICAgICAgICAvLyBEZXRlY3QgdW5pZm9ybSBkZWZpbml0aW9ucywgaW5qZWN0IGFueSBtaXNzaW5nIG9uZXNcbiAgICAgICAgdGhpcy5lbnN1cmVVbmlmb3Jtcyh0aGlzLmRlcGVuZGVudF91bmlmb3Jtcyk7XG5cbiAgICAgICAgLy8gQnVpbGQgJiBpbmplY3QgZXh0ZW5zaW9ucyAmIGRlZmluZXNcbiAgICAgICAgLy8gVGhpcyBpcyBkb25lICphZnRlciogY29kZSBpbmplY3Rpb24gc28gdGhhdCB3ZSBjYW4gYWRkIGRlZmluZXMgZm9yIHdoaWNoIGNvZGUgcG9pbnRzIHdlcmUgaW5qZWN0ZWRcbiAgICAgICAgbGV0IGluZm8gPSAodGhpcy5uYW1lID8gKHRoaXMubmFtZSArICcgLyBpZCAnICsgdGhpcy5pZCkgOiAoJ2lkICcgKyB0aGlzLmlkKSk7XG4gICAgICAgIGxldCBoZWFkZXIgPSBgLy8gUHJvZ3JhbTogJHtpbmZvfVxcbmA7XG4gICAgICAgIGxldCBwcmVjaXNpb24gPSAnJztcbiAgICAgICAgbGV0IGhpZ2ggPSB0aGlzLmdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCh0aGlzLmdsLkZSQUdNRU5UX1NIQURFUiwgdGhpcy5nbC5ISUdIX0ZMT0FUKTtcbiAgICAgICAgaWYgKGhpZ2ggJiYgaGlnaC5wcmVjaXNpb24gPiAwKSB7XG4gICAgICAgICAgICBwcmVjaXNpb24gPSAncHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmVjaXNpb24gPSAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuJztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fVkVSVEVYX1NIQURFUiddID0gdHJ1ZTtcbiAgICAgICAgZGVmaW5lc1snVEFOR1JBTV9GUkFHTUVOVF9TSEFERVInXSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPVxuICAgICAgICAgICAgaGVhZGVyICtcbiAgICAgICAgICAgIHByZWNpc2lvbiArXG4gICAgICAgICAgICBTaGFkZXJQcm9ncmFtLmJ1aWxkRGVmaW5lU3RyaW5nKGRlZmluZXMpICtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZTtcblxuICAgICAgICAvLyBQcmVjaXNpb24gcXVhbGlmaWVyIG9ubHkgdmFsaWQgaW4gZnJhZ21lbnQgc2hhZGVyXG4gICAgICAgIC8vIE5COiAnI2V4dGVuc2lvbicgc3RhdGVtZW50cyBhZGRlZCB0byBmcmFnbWVudCBzaGFkZXIgb25seSwgYXMgSUUxMSB0aHJvd3MgZXJyb3Igd2hlbiB0aGV5IGFwcGVhciBpblxuICAgICAgICAvLyB2ZXJ0ZXggc2hhZGVyIChldmVuIHdoZW4gZ3VhcmRlZCBieSAjaWZkZWYpLCBhbmQgbm8gV2ViR0wgZXh0ZW5zaW9ucyByZXF1aXJlICcjZXh0ZW5zaW9uJyBpbiB2ZXJ0ZXggc2hhZGVyc1xuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX1ZFUlRFWF9TSEFERVInXSA9IGZhbHNlO1xuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX0ZSQUdNRU5UX1NIQURFUiddID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPVxuICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbS5idWlsZEV4dGVuc2lvblN0cmluZyhleHRlbnNpb25zKSArXG4gICAgICAgICAgICBoZWFkZXIgK1xuICAgICAgICAgICAgcHJlY2lzaW9uICtcbiAgICAgICAgICAgIFNoYWRlclByb2dyYW0uYnVpbGREZWZpbmVTdHJpbmcoZGVmaW5lcykgK1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2U7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBtdWx0aS1saW5lIGJhY2tzbGFzaGVzXG4gICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZS5yZXBsYWNlKHJlX2NvbnRpbnVlX2xpbmUsICcnKTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZS5yZXBsYWNlKHJlX2NvbnRpbnVlX2xpbmUsICcnKTtcblxuICAgICAgICAvLyBDb21waWxlICYgc2V0IHVuaWZvcm1zIHRvIGNhY2hlZCB2YWx1ZXNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbSA9IFNoYWRlclByb2dyYW0udXBkYXRlUHJvZ3JhbSh0aGlzLmdsLCB0aGlzLnByb2dyYW0sIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSwgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcblxuICAgICAgICAgICAgLy8gc2hhZGVyIGVycm9yIGluZm9cbiAgICAgICAgICAgIGlmIChlcnJvci50eXBlID09PSAndmVydGV4JyB8fCBlcnJvci50eXBlID09PSAnZnJhZ21lbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkZXJfZXJyb3JzID0gZXJyb3IuZXJyb3JzO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hhZGVyX2Vycm9ycy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlLnR5cGUgPSBlcnJvci50eXBlO1xuICAgICAgICAgICAgICAgICAgICBlLmJsb2NrID0gdGhpcy5ibG9jayhlcnJvci50eXBlLCBlLmxpbmUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyhuZXcgRXJyb3IoYFNoYWRlclByb2dyYW0uY29tcGlsZSgpOiBwcm9ncmFtICR7dGhpcy5pZH0gKCR7dGhpcy5uYW1lfSkgZXJyb3I6YCwgZXJyb3IpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXNlKCk7XG4gICAgICAgIHRoaXMucmVmcmVzaFVuaWZvcm1zKCk7XG4gICAgICAgIHRoaXMucmVmcmVzaEF0dHJpYnV0ZXMoKTtcbiAgICB9XG5cbiAgICAvLyBNYWtlIGxpc3Qgb2YgZGVmaW5lcyAoZ2xvYmFsLCB0aGVuIHByb2dyYW0tc3BlY2lmaWMpXG4gICAgYnVpbGREZWZpbmVMaXN0KCkge1xuICAgICAgICB2YXIgZCwgZGVmaW5lcyA9IHt9O1xuICAgICAgICBmb3IgKGQgaW4gU2hhZGVyUHJvZ3JhbS5kZWZpbmVzKSB7XG4gICAgICAgICAgICBkZWZpbmVzW2RdID0gU2hhZGVyUHJvZ3JhbS5kZWZpbmVzW2RdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoZCBpbiB0aGlzLmRlZmluZXMpIHtcbiAgICAgICAgICAgIGRlZmluZXNbZF0gPSB0aGlzLmRlZmluZXNbZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZXM7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBsaXN0IG9mIHNoYWRlciBibG9ja3MgKGdsb2JhbCwgdGhlbiBwcm9ncmFtLXNwZWNpZmljKVxuICAgIGJ1aWxkU2hhZGVyQmxvY2tMaXN0KCkge1xuICAgICAgICBsZXQga2V5LCBibG9ja3MgPSB7fTtcblxuICAgICAgICAvLyBHbG9iYWwgYmxvY2tzXG4gICAgICAgIGZvciAoa2V5IGluIFNoYWRlclByb2dyYW0uYmxvY2tzKSB7XG4gICAgICAgICAgICBibG9ja3Nba2V5XSA9IFtdO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldKSkge1xuICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIC4uLlNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0ubWFwKChzb3VyY2UsIG51bSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5LCBzb3VyY2UsIG51bSwgc2NvcGU6ICdTaGFkZXJQcm9ncmFtJyB9O1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBibG9ja3Nba2V5XSA9IFt7IGtleSwgc291cmNlOiBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldLCBudW06IDAsIHNjb3BlOiAnU2hhZGVyUHJvZ3JhbScgfV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9ncmFtLXNwZWNpZmljIGJsb2Nrc1xuICAgICAgICBmb3IgKGtleSBpbiB0aGlzLmJsb2Nrcykge1xuICAgICAgICAgICAgYmxvY2tzW2tleV0gPSBibG9ja3Nba2V5XSB8fCBbXTtcblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5ibG9ja3Nba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2NvcGVzID0gKHRoaXMuYmxvY2tfc2NvcGVzICYmIHRoaXMuYmxvY2tfc2NvcGVzW2tleV0pIHx8IFtdO1xuICAgICAgICAgICAgICAgIGxldCBjdXJfc2NvcGUgPSBudWxsLCBudW0gPSAwO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYj0wOyBiIDwgdGhpcy5ibG9ja3Nba2V5XS5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDb3VudCBibG9ja3MgcmVsYXRpdmUgdG8gY3VycmVudCBzY29wZVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGVzW2JdICE9PSBjdXJfc2NvcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9zY29wZSA9IHNjb3Blc1tiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBibG9ja3Nba2V5XS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5ibG9ja3Nba2V5XVtiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlOiBjdXJfc2NvcGUgfHwgdGhpcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIG51bSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZHJlc3MgZGlzY3JlcGFuY3kgaW4gYXJyYXkgdnMuIHNpbmdsZS12YWx1ZSBibG9ja3NcbiAgICAgICAgICAgICAgICAvLyBzdHlsZXMgYXNzdW1lIGFycmF5IHdoZW4gdHJhY2tpbmcgYmxvY2sgc2NvcGVzXG4gICAgICAgICAgICAgICAgYmxvY2tzW2tleV0ucHVzaCh7IGtleSwgc291cmNlOiB0aGlzLmJsb2Nrc1trZXldLCBudW06IDAsIHNjb3BlOiB0aGlzLm5hbWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJsb2NrcztcbiAgICB9XG5cbiAgICAvLyBEZXRlY3QgdW5pZm9ybSBkZWZpbml0aW9ucywgaW5qZWN0IGFueSBtaXNzaW5nIG9uZXNcbiAgICBlbnN1cmVVbmlmb3Jtcyh1bmlmb3Jtcykge1xuICAgICAgICBpZiAoIXVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdnMgPSBzdHJpcCh0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UpO1xuICAgICAgICB2YXIgZnMgPSBzdHJpcCh0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSk7XG4gICAgICAgIHZhciBpbmplY3QsIHZzX2luamVjdGlvbnMgPSBbXSwgZnNfaW5qZWN0aW9ucyA9IFtdO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBtaXNzaW5nIHVuaWZvcm0gZGVmaW5pdGlvbnNcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB1bmlmb3Jtcykge1xuICAgICAgICAgICAgaW5qZWN0ID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdmVydGV4IHNoYWRlclxuICAgICAgICAgICAgaWYgKCFHTFNMLmlzVW5pZm9ybURlZmluZWQobmFtZSwgdnMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0ID0gR0xTTC5kZWZpbmVVbmlmb3JtKG5hbWUsIHVuaWZvcm1zW25hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBQcm9ncmFtICR7dGhpcy5uYW1lfTogJHtuYW1lfSBub3QgZGVmaW5lZCBpbiB2ZXJ0ZXggc2hhZGVyLCBpbmplY3Rpbmc6ICcke2luamVjdH0nYCk7XG4gICAgICAgICAgICAgICAgdnNfaW5qZWN0aW9ucy5wdXNoKGluamVjdCk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrIGZyYWdtZW50IHNoYWRlclxuICAgICAgICAgICAgaWYgKCFHTFNMLmlzVW5pZm9ybURlZmluZWQobmFtZSwgZnMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0ID0gR0xTTC5kZWZpbmVVbmlmb3JtKG5hbWUsIHVuaWZvcm1zW25hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBQcm9ncmFtICR7dGhpcy5uYW1lfTogJHtuYW1lfSBub3QgZGVmaW5lZCBpbiBmcmFnbWVudCBzaGFkZXIsIGluamVjdGluZzogJyR7aW5qZWN0fSdgKTtcbiAgICAgICAgICAgICAgICBmc19pbmplY3Rpb25zLnB1c2goaW5qZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluamVjdCBtaXNzaW5nIHVuaWZvcm1zXG4gICAgICAgIC8vIE5PVEU6IHRoZXNlIGFyZSBpbmplY3RlZCBhdCB0aGUgdmVyeSB0b3Agb2YgdGhlIHNoYWRlcnMsIGV2ZW4gYmVmb3JlIGFueSAjZGVmaW5lcyBvciAjcHJhZ21hcyBhcmUgYWRkZWRcbiAgICAgICAgLy8gdGhpcyBjb3VsZCBjYXVzZSBzb21lIGlzc3VlcyB3aXRoIGNlcnRhaW4gI3ByYWdtYXMsIG9yIG90aGVyIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0IGV4cGVjdCAjZGVmaW5lc1xuICAgICAgICBpZiAodnNfaW5qZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB2c19pbmplY3Rpb25zLmpvaW4oJ1xcbicpICsgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZzX2luamVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSBmc19pbmplY3Rpb25zLmpvaW4oJ1xcbicpICsgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdW5pZm9ybXMgZnJvbSBhIEpTIG9iamVjdCwgd2l0aCBpbmZlcnJlZCB0eXBlc1xuICAgIHNldFVuaWZvcm1zKHVuaWZvcm1zLCByZXNldF90ZXh0dXJlX3VuaXQgPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogb25seSB1cGRhdGUgdW5pZm9ybXMgd2hlbiBjaGFuZ2VkXG5cbiAgICAgICAgLy8gVGV4dHVyZSB1bml0cyBtdXN0IGJlIHRyYWNrZWQgYW5kIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIHRleHR1cmUgc2FtcGxlciB1bmlmb3JtIGlzIHNldC5cbiAgICAgICAgLy8gQnkgZGVmYXVsdCwgdGhlIHRleHR1cmUgdW5pdCBpcyByZXNldCB0byAwIGVhY2ggdGltZSBzZXRVbmlmb3JtcyBpcyBjYWxsZWQsIGJ1dCB0aGV5IGNhblxuICAgICAgICAvLyBhbHNvIGJlIHByZXNlcnZlZCwgZm9yIGV4YW1wbGUgaW4gY2FzZXMgd2hlcmUgbXVsdGlwbGUgY2FsbHMgdG8gc2V0VW5pZm9ybXMgYXJlIGV4cGVjdGVkXG4gICAgICAgIC8vIChlLmcuIHByb2dyYW0tc3BlY2lmaWMgdW5pZm9ybXMgZm9sbG93ZWQgYnkgbWVzaC1zcGVjaWZpYyBvbmVzKS5cbiAgICAgICAgaWYgKHJlc2V0X3RleHR1cmVfdW5pdCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlX3VuaXQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2UgdW5pZm9ybSB0eXBlcyBhbmQgdmFsdWVzIGZyb20gdGhlIEpTIG9iamVjdFxuICAgICAgICBjb25zdCBwYXJzZWQgPSBHTFNMLnBhcnNlVW5pZm9ybXModW5pZm9ybXMpO1xuXG4gICAgICAgIC8vIFNldCBlYWNoIHVuaWZvcm1cbiAgICAgICAgZm9yIChsZXQgdT0wOyB1IDwgcGFyc2VkLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICBjb25zdCB1bmlmb3JtID0gcGFyc2VkW3VdO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm0udHlwZSA9PT0gJ3NhbXBsZXIyRCcpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgdGV4dHVyZXMsIHdlIG5lZWQgdG8gdHJhY2sgdGV4dHVyZSB1bml0cywgc28gd2UgaGF2ZSBhIHNwZWNpYWwgc2V0dGVyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRUZXh0dXJlVW5pZm9ybSh1bmlmb3JtLm5hbWUsIHVuaWZvcm0udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bmlmb3JtKHVuaWZvcm0ubWV0aG9kLCB1bmlmb3JtLm5hbWUsIHVuaWZvcm0udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FjaGUgc29tZSBvciBhbGwgdW5pZm9ybSB2YWx1ZXMgc28gdGhleSBjYW4gYmUgcmVzdG9yZWRcbiAgICBzYXZlVW5pZm9ybXMoc3Vic2V0KSB7XG4gICAgICAgIGxldCB1bmlmb3JtcyA9IHN1YnNldCB8fCB0aGlzLnVuaWZvcm1zO1xuICAgICAgICBmb3IgKGxldCB1IGluIHVuaWZvcm1zKSB7XG4gICAgICAgICAgICBsZXQgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICBpZiAodW5pZm9ybSkge1xuICAgICAgICAgICAgICAgIHVuaWZvcm0uc2F2ZWRfdmFsdWUgPSB1bmlmb3JtLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2F2ZWRfdGV4dHVyZV91bml0ID0gdGhpcy50ZXh0dXJlX3VuaXQgfHwgMDtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHNvbWUgb3IgYWxsIHVuaWZvcm1zIHRvIHNhdmVkIHZhbHVlc1xuICAgIHJlc3RvcmVVbmlmb3JtcyhzdWJzZXQpIHtcbiAgICAgICAgbGV0IHVuaWZvcm1zID0gc3Vic2V0IHx8IHRoaXMudW5pZm9ybXM7XG4gICAgICAgIGZvciAobGV0IHUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1t1XTtcbiAgICAgICAgICAgIGlmICh1bmlmb3JtICYmIHVuaWZvcm0uc2F2ZWRfdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB1bmlmb3JtLnZhbHVlID0gdW5pZm9ybS5zYXZlZF92YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVVuaWZvcm0odW5pZm9ybSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXh0dXJlX3VuaXQgPSB0aGlzLnNhdmVkX3RleHR1cmVfdW5pdCB8fCAwO1xuICAgIH1cblxuICAgIC8vIFNldCBhIHRleHR1cmUgdW5pZm9ybSwgZmluZHMgdGV4dHVyZSBieSBuYW1lIG9yIGNyZWF0ZXMgYSBuZXcgb25lXG4gICAgc2V0VGV4dHVyZVVuaWZvcm0odW5pZm9ybV9uYW1lLCB0ZXh0dXJlX25hbWUpIHtcbiAgICAgICAgdmFyIHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW3RleHR1cmVfbmFtZV07XG4gICAgICAgIGlmICh0ZXh0dXJlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZygnd2FybicsIGBDYW5ub3QgZmluZCB0ZXh0dXJlICcke3RleHR1cmVfbmFtZX0nYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0ZXh0dXJlLmJpbmQodGhpcy50ZXh0dXJlX3VuaXQpO1xuICAgICAgICB0aGlzLnVuaWZvcm0oJzFpJywgdW5pZm9ybV9uYW1lLCB0aGlzLnRleHR1cmVfdW5pdCk7XG4gICAgICAgIHRoaXMudGV4dHVyZV91bml0Kys7IC8vIFRPRE86IHRyYWNrIG1heCB0ZXh0dXJlIHVuaXRzIGFuZCBsb2cvdGhyb3cgZXJyb3JzXG4gICAgfVxuXG4gICAgLy8gZXg6IHByb2dyYW0udW5pZm9ybSgnM2Z2JywgJ3Bvc2l0aW9uJywgW3gsIHksIHpdKTtcbiAgICAvLyBUT0RPOiBvbmx5IHVwZGF0ZSB1bmlmb3JtcyB3aGVuIGNoYW5nZWRcbiAgICB1bmlmb3JtKG1ldGhvZCwgbmFtZSwgdmFsdWUpIHsgLy8gJ3ZhbHVlJyBpcyBhIG1ldGhvZC1hcHByb3ByaWF0ZSBhcmd1bWVudHMgbGlzdFxuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudW5pZm9ybXNbbmFtZV0gPSB0aGlzLnVuaWZvcm1zW25hbWVdIHx8IHt9O1xuICAgICAgICBsZXQgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbbmFtZV07XG4gICAgICAgIHVuaWZvcm0ubmFtZSA9IG5hbWU7XG4gICAgICAgIGlmICh1bmlmb3JtLmxvY2F0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHVuaWZvcm0ubG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHVuaWZvcm0ubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB1bmlmb3JtLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlVW5pZm9ybSh1bmlmb3JtKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgYSBzaW5nbGUgdW5pZm9ybVxuICAgIHVwZGF0ZVVuaWZvcm0odW5pZm9ybSkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdW5pZm9ybSB8fCB1bmlmb3JtLmxvY2F0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXNlKCk7XG4gICAgICAgIHRoaXMuY29tbWl0VW5pZm9ybSh1bmlmb3JtKTtcbiAgICB9XG5cbiAgICAvLyBDb21taXRzIHRoZSB1bmlmb3JtIHRvIHRoZSBHUFVcbiAgICBjb21taXRVbmlmb3JtKHVuaWZvcm0pe1xuICAgICAgICBsZXQgbG9jYXRpb24gPSB1bmlmb3JtLmxvY2F0aW9uO1xuICAgICAgICBsZXQgdmFsdWUgPSB1bmlmb3JtLnZhbHVlO1xuXG4gICAgICAgIHN3aXRjaCAodW5pZm9ybS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgJzFpJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xaShsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFmKGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcyZic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMmYobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczZic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtM2YobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSwgdmFsdWVbMl0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnNGYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTRmKGxvY2F0aW9uLCB2YWx1ZVswXSwgdmFsdWVbMV0sIHZhbHVlWzJdLCB2YWx1ZVszXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxaXYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnM2l2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0zaXYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzFmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWZ2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcyZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTJmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnM2Z2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0zZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzRmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtNGZ2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdNYXRyaXgzZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDNmdihsb2NhdGlvbiwgZmFsc2UsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ01hdHJpeDRmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4NGZ2KGxvY2F0aW9uLCBmYWxzZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVmcmVzaCB1bmlmb3JtIGxvY2F0aW9ucyBhbmQgc2V0IHRvIGxhc3QgY2FjaGVkIHZhbHVlc1xuICAgIHJlZnJlc2hVbmlmb3JtcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciB1IGluIHRoaXMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1t1XTtcbiAgICAgICAgICAgIHVuaWZvcm0ubG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sIHUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVbmlmb3JtKHVuaWZvcm0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVmcmVzaEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIC8vIHZhciBsZW4gPSB0aGlzLmdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5wcm9ncmFtLCB0aGlzLmdsLkFDVElWRV9BVFRSSUJVVEVTKTtcbiAgICAgICAgLy8gZm9yICh2YXIgaT0wOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgLy8gICAgIHZhciBhID0gdGhpcy5nbC5nZXRBY3RpdmVBdHRyaWIodGhpcy5wcm9ncmFtLCBpKTtcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLmF0dHJpYnMgPSB7fTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGxvY2F0aW9uIG9mIGEgdmVydGV4IGF0dHJpYnV0ZVxuICAgIGF0dHJpYnV0ZShuYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGF0dHJpYiA9ICh0aGlzLmF0dHJpYnNbbmFtZV0gPSB0aGlzLmF0dHJpYnNbbmFtZV0gfHwge30pO1xuICAgICAgICBpZiAoYXR0cmliLmxvY2F0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhdHRyaWI7XG4gICAgICAgIH1cblxuICAgICAgICBhdHRyaWIubmFtZSA9IG5hbWU7XG4gICAgICAgIGF0dHJpYi5sb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCBuYW1lKTtcblxuICAgICAgICAvLyB2YXIgaW5mbyA9IHRoaXMuZ2wuZ2V0QWN0aXZlQXR0cmliKHRoaXMucHJvZ3JhbSwgYXR0cmliLmxvY2F0aW9uKTtcbiAgICAgICAgLy8gYXR0cmliLnR5cGUgPSBpbmZvLnR5cGU7XG4gICAgICAgIC8vIGF0dHJpYi5zaXplID0gaW5mby5zaXplO1xuXG4gICAgICAgIHJldHVybiBhdHRyaWI7XG4gICAgfVxuXG4gICAgLy8gR2V0IHNoYWRlciBzb3VyY2UgYXMgc3RyaW5nXG4gICAgc291cmNlKHR5cGUpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICd2ZXJ0ZXgnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdmcmFnbWVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCBzaGFkZXIgc291cmNlIGFzIGFycmF5IG9mIGxpbmUgc3RyaW5nc1xuICAgIGxpbmVzKHR5cGUpIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuc291cmNlKHR5cGUpO1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gR2V0IGEgc3BlY2lmaWMgbGluZSBmcm9tIHNoYWRlciBzb3VyY2VcbiAgICBsaW5lKHR5cGUsIG51bSkge1xuICAgICAgICBsZXQgc291cmNlID0gdGhpcy5saW5lcyh0eXBlKTtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZVtudW1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IGluZm8gb24gd2hpY2ggc2hhZGVyIGJsb2NrIChpZiBhbnkpIGEgcGFydGljdWxhciBsaW5lIG51bWJlciBpbiBhIHNoYWRlciBpcyBpblxuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBpbmZvIGlmIGEgYmxvY2sgaXMgZm91bmQ6IHsgbmFtZSwgbGluZSwgc291cmNlIH1cbiAgICAvLyAgc2NvcGU6IHdoZXJlIHRoZSBzaGFkZXIgYmxvY2sgb3JpZ2luYXRlZCwgZWl0aGVyIGEgc3R5bGUgbmFtZSwgb3IgZ2xvYmFsIHN1Y2ggYXMgU2hhZGVyUHJvZ3JhbVxuICAgIC8vICBuYW1lOiBzaGFkZXIgYmxvY2sgbmFtZSAoZS5nLiAnY29sb3InLCAncG9zaXRpb24nLCAnZ2xvYmFsJylcbiAgICAvLyAgbnVtOiB0aGUgYmxvY2sgbnVtYmVyICp3aXRoaW4qIGxvY2FsIHNjb3BlIChlLmcuIGlmIGEgc3R5bGUgaGFzIG11bHRpcGxlICdjb2xvcicgYmxvY2tzKVxuICAgIC8vICBsaW5lOiBsaW5lIG51bWJlciAqd2l0aGluKiB0aGUgc2hhZGVyIGJsb2NrIChub3QgdGhlIHdob2xlIHNoYWRlciBwcm9ncmFtKSwgdXNlZnVsIGZvciBlcnJvciBoaWdobGlnaHRpbmdcbiAgICAvLyAgc291cmNlOiB0aGUgY29kZSBmb3IgdGhlIGxpbmVcbiAgICAvLyBOT1RFOiB0aGlzIGRvZXMgYSBicnV0ZWZvcmNlIGxvb3Agb3ZlciB0aGUgc2hhZGVyIHNvdXJjZSBhbmQgbG9va3MgZm9yIHNoYWRlciBibG9jayBzdGFydC9lbmQgbWFya2Vyc1xuICAgIC8vIFdlIGNvdWxkIHRyYWNrIGxpbmUgcmFuZ2VzIGZvciBzaGFkZXIgYmxvY2tzIGFzIHRoZXkgYXJlIGluc2VydGVkLCBidXQgYXMgdGhpcyBjb2RlIGlzIG9ubHkgdXNlZCBmb3JcbiAgICAvLyBlcnJvciBoYW5kbGluZyBvbiBjb21waWxhdGlvbiBmYWlsdXJlLCBpdCB3YXMgc2ltcGxlciB0byBrZWVwIGl0IHNlcGFyYXRlIHRoYW4gdG8gYnVyZGVuIHRoZSBjb3JlXG4gICAgLy8gY29tcGlsYXRpb24gcGF0aC5cbiAgICBibG9jayh0eXBlLCBudW0pIHtcbiAgICAgICAgbGV0IGxpbmVzID0gdGhpcy5saW5lcyh0eXBlKTtcbiAgICAgICAgbGV0IGJsb2NrO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBudW0gJiYgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICAgICAgbGV0IG1hdGNoID0gbGluZS5tYXRjaCgvXFwvXFwvIHRhbmdyYW0tYmxvY2stc3RhcnQ6IChbQS1aYS16MC05Xy1dKyksIChbQS1aYS16MC05Xy1dKyksIChcXGQrKS8pO1xuICAgICAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgYmxvY2tcbiAgICAgICAgICAgICAgICBibG9jayA9IHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtYXRjaFsyXSxcbiAgICAgICAgICAgICAgICAgICAgbnVtOiBtYXRjaFszXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXRjaCA9IGxpbmUubWF0Y2goL1xcL1xcLyB0YW5ncmFtLWJsb2NrLWVuZDogKFtBLVphLXowLTlfLV0rKSwgKFtBLVphLXowLTlfLV0rKSwgKFxcZCspLyk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBudWxsOyAvLyBjbGVhciBjdXJyZW50IGJsb2NrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB1cGRhdGUgbGluZSAjIGFuZCBjb250ZW50XG4gICAgICAgICAgICBpZiAoYmxvY2spIHtcbiAgICAgICAgICAgICAgICAvLyBpbml0IHRvIC0xIHNvIHRoYXQgbGluZSAwIGlzIGZpcnN0IGFjdHVhbCBsaW5lIG9mIGJsb2NrIGNvZGUsIGFmdGVyIGNvbW1lbnQgbWFya2VyXG4gICAgICAgICAgICAgICAgYmxvY2subGluZSA9IChibG9jay5saW5lID09IG51bGwpID8gLTEgOiBibG9jay5saW5lICsgMTtcbiAgICAgICAgICAgICAgICBibG9jay5zb3VyY2UgPSBsaW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBibG9jaztcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGxpc3Qgb2YgYXZhaWxhYmxlIGV4dGVuc2lvbnMgZnJvbSB0aG9zZSByZXF1ZXN0ZWRcbiAgICAvLyBTZXRzIGludGVybmFsICNkZWZpbmVzIGluZGljYXRpbmcgYXZhaWxhYmlsaXR5IG9mIGVhY2ggcmVxdWVzdGVkIGV4dGVuc2lvblxuICAgIGNoZWNrRXh0ZW5zaW9ucygpIHtcbiAgICAgICAgbGV0IGV4dHMgPSBbXTtcbiAgICAgICAgdGhpcy5leHRlbnNpb25zLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgICAgICBsZXQgZXh0ID0gZ2V0RXh0ZW5zaW9uKHRoaXMuZ2wsIG5hbWUpO1xuICAgICAgICAgICAgbGV0IGRlZiA9IGBUQU5HUkFNX0VYVEVOU0lPTl8ke25hbWV9YDtcblxuICAgICAgICAgICAgdGhpcy5kZWZpbmVzW2RlZl0gPSAoZXh0ICE9IG51bGwpO1xuXG4gICAgICAgICAgICBpZiAoZXh0KSB7XG4gICAgICAgICAgICAgICAgZXh0cy5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBDb3VsZCBub3QgZW5hYmxlIGV4dGVuc2lvbiAnJHtuYW1lfSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBleHRzO1xuICAgIH1cblxufVxuXG5cbi8vIFN0YXRpYyBtZXRob2RzIGFuZCBzdGF0ZVxuXG5TaGFkZXJQcm9ncmFtLmlkID0gMDsgICAgICAgICAgIC8vIGFzc2lnbiBlYWNoIHByb2dyYW0gYSB1bmlxdWUgaWRcblNoYWRlclByb2dyYW0ucHJvZ3JhbXMgPSB7fTsgICAgLy8gcHJvZ3JhbXMsIGJ5IGlkXG5TaGFkZXJQcm9ncmFtLmN1cnJlbnQgPSBudWxsOyAgIC8vIGN1cnJlbnRseSBib3VuZCBwcm9ncmFtXG5cbi8vIEdsb2JhbCBjb25maWcgYXBwbGllZCB0byBhbGwgcHJvZ3JhbXMgKGR1cGxpY2F0ZSBwcm9wZXJ0aWVzIGZvciBhIHNwZWNpZmljIHByb2dyYW0gd2lsbCB0YWtlIHByZWNlZGVuY2UpXG5TaGFkZXJQcm9ncmFtLmRlZmluZXMgPSB7fTtcblNoYWRlclByb2dyYW0uYmxvY2tzID0ge307XG5cbi8vIFR1cm4gYW4gb2JqZWN0IG9mIGtleS92YWx1ZSBwYWlycyBpbnRvIHNpbmdsZSBzdHJpbmcgb2YgI2RlZmluZSBzdGF0ZW1lbnRzXG5TaGFkZXJQcm9ncmFtLmJ1aWxkRGVmaW5lU3RyaW5nID0gZnVuY3Rpb24gKGRlZmluZXMpIHtcbiAgICB2YXIgZGVmaW5lX3N0ciA9IFwiXCI7XG4gICAgZm9yICh2YXIgZCBpbiBkZWZpbmVzKSB7XG4gICAgICAgIGlmIChkZWZpbmVzW2RdID09IG51bGwgfHwgZGVmaW5lc1tkXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmVzW2RdID09PSAnYm9vbGVhbicgJiYgZGVmaW5lc1tkXSA9PT0gdHJ1ZSkgeyAvLyBib29sZWFucyBhcmUgc2ltcGxlIGRlZmluZXMgd2l0aCBubyB2YWx1ZVxuICAgICAgICAgICAgZGVmaW5lX3N0ciArPSBcIiNkZWZpbmUgXCIgKyBkICsgXCJcXG5cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lc1tkXSA9PT0gJ251bWJlcicgJiYgTWF0aC5mbG9vcihkZWZpbmVzW2RdKSA9PT0gZGVmaW5lc1tkXSkgeyAvLyBpbnQgdG8gZmxvYXQgY29udmVyc2lvbiB0byBzYXRpc2Z5IEdMU0wgZmxvYXRzXG4gICAgICAgICAgICBkZWZpbmVfc3RyICs9IFwiI2RlZmluZSBcIiArIGQgKyBcIiBcIiArIGRlZmluZXNbZF0udG9GaXhlZCgxKSArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIGFueSBvdGhlciBmbG9hdCBvciBzdHJpbmcgdmFsdWVcbiAgICAgICAgICAgIGRlZmluZV9zdHIgKz0gXCIjZGVmaW5lIFwiICsgZCArIFwiIFwiICsgZGVmaW5lc1tkXSArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlZmluZV9zdHI7XG59O1xuXG4vLyBUdXJuIGEgbGlzdCBvZiBleHRlbnNpb24gbmFtZXMgaW50byBzaW5nbGUgc3RyaW5nIG9mICNleHRlbnNpb24gc3RhdGVtZW50c1xuU2hhZGVyUHJvZ3JhbS5idWlsZEV4dGVuc2lvblN0cmluZyA9IGZ1bmN0aW9uIChleHRlbnNpb25zKSB7XG4gICAgZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgfHwgW107XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZXh0ZW5zaW9ucy5mb3JFYWNoKGV4dCA9PiB7XG4gICAgICAgIHN0ciArPSBgI2lmZGVmIEdMXyR7ZXh0fVxcbiNleHRlbnNpb24gR0xfJHtleHR9IDogZW5hYmxlXFxuI2VuZGlmXFxuYDtcbiAgICB9KTtcbiAgICByZXR1cm4gc3RyO1xufTtcblxuU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayA9IGZ1bmN0aW9uIChrZXksIC4uLmJsb2Nrcykge1xuICAgIFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0gPSBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldIHx8IFtdO1xuICAgIFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0ucHVzaCguLi5ibG9ja3MpO1xufTtcblxuLy8gUmVtb3ZlIGFsbCBnbG9iYWwgc2hhZGVyIGJsb2NrcyBmb3IgYSBnaXZlbiBrZXlcblNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2sgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSA9IFtdO1xufTtcblxuU2hhZGVyUHJvZ3JhbS5yZXBsYWNlQmxvY2sgPSBmdW5jdGlvbiAoa2V5LCAuLi5ibG9ja3MpIHtcbiAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKGtleSk7XG4gICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhrZXksIC4uLmJsb2Nrcyk7XG59O1xuXG4vLyBDb21waWxlICYgbGluayBhIFdlYkdMIHByb2dyYW0gZnJvbSBwcm92aWRlZCB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlciBzb3VyY2VzXG4vLyB1cGRhdGUgYSBwcm9ncmFtIGlmIG9uZSBpcyBwYXNzZWQgaW4uIENyZWF0ZSBvbmUgaWYgbm90LiBBbGVydCBhbmQgZG9uJ3QgdXBkYXRlIGFueXRoaW5nIGlmIHRoZSBzaGFkZXJzIGRvbid0IGNvbXBpbGUuXG5TaGFkZXJQcm9ncmFtLnVwZGF0ZVByb2dyYW0gPSBmdW5jdGlvbiAoZ2wsIHByb2dyYW0sIHZlcnRleF9zaGFkZXJfc291cmNlLCBmcmFnbWVudF9zaGFkZXJfc291cmNlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHZlcnRleF9zaGFkZXIgPSBTaGFkZXJQcm9ncmFtLmNyZWF0ZVNoYWRlcihnbCwgdmVydGV4X3NoYWRlcl9zb3VyY2UsIGdsLlZFUlRFWF9TSEFERVIpO1xuICAgICAgICB2YXIgZnJhZ21lbnRfc2hhZGVyID0gU2hhZGVyUHJvZ3JhbS5jcmVhdGVTaGFkZXIoZ2wsIGZyYWdtZW50X3NoYWRlcl9zb3VyY2UsIGdsLkZSQUdNRU5UX1NIQURFUik7XG4gICAgfVxuICAgIGNhdGNoKGVycikge1xuICAgICAgICBsb2coJ2Vycm9yJywgZXJyLm1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgZ2wudXNlUHJvZ3JhbShudWxsKTtcbiAgICBpZiAocHJvZ3JhbSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBvbGRfc2hhZGVycyA9IGdsLmdldEF0dGFjaGVkU2hhZGVycyhwcm9ncmFtKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG9sZF9zaGFkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBnbC5kZXRhY2hTaGFkZXIocHJvZ3JhbSwgb2xkX3NoYWRlcnNbaV0pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcbiAgICB9XG5cbiAgICBpZiAodmVydGV4X3NoYWRlciA9PSBudWxsIHx8IGZyYWdtZW50X3NoYWRlciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH1cblxuICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhfc2hhZGVyKTtcbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRfc2hhZGVyKTtcblxuICAgIGdsLmRlbGV0ZVNoYWRlcih2ZXJ0ZXhfc2hhZGVyKTtcbiAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRfc2hhZGVyKTtcblxuICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xuXG4gICAgaWYgKCFnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBXZWJHTCBwcm9ncmFtIGVycm9yOlxuICAgICAgICAgICAgVkFMSURBVEVfU1RBVFVTOiAke2dsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuVkFMSURBVEVfU1RBVFVTKX1cbiAgICAgICAgICAgIEVSUk9SOiAke2dsLmdldEVycm9yKCl9XG4gICAgICAgICAgICAtLS0gVmVydGV4IFNoYWRlciAtLS1cbiAgICAgICAgICAgICR7dmVydGV4X3NoYWRlcl9zb3VyY2V9XG4gICAgICAgICAgICAtLS0gRnJhZ21lbnQgU2hhZGVyIC0tLVxuICAgICAgICAgICAgJHtmcmFnbWVudF9zaGFkZXJfc291cmNlfWApO1xuXG4gICAgICAgIGxldCBlcnJvciA9IHsgdHlwZTogJ3Byb2dyYW0nLCBtZXNzYWdlIH07XG4gICAgICAgIGxvZygnZXJyb3InLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2dyYW07XG59O1xuXG4vLyBDb21waWxlIGEgdmVydGV4IG9yIGZyYWdtZW50IHNoYWRlciBmcm9tIHByb3ZpZGVkIHNvdXJjZVxuU2hhZGVyUHJvZ3JhbS5jcmVhdGVTaGFkZXIgPSBmdW5jdGlvbiAoZ2wsIHNvdXJjZSwgc3R5cGUpIHtcbiAgICBsZXQgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHN0eXBlKTtcblxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZSk7XG4gICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpO1xuXG4gICAgaWYgKCFnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykpIHtcbiAgICAgICAgbGV0IHR5cGUgPSAoc3R5cGUgPT09IGdsLlZFUlRFWF9TSEFERVIgPyAndmVydGV4JyA6ICdmcmFnbWVudCcpO1xuICAgICAgICBsZXQgbWVzc2FnZSA9IGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKTtcbiAgICAgICAgbGV0IGVycm9ycyA9IHBhcnNlU2hhZGVyRXJyb3JzKG1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyB7IHR5cGUsIG1lc3NhZ2UsIGVycm9ycyB9O1xuICAgIH1cblxuICAgIHJldHVybiBzaGFkZXI7XG59O1xuIiwiLy8gVGV4dHVyZSBtYW5hZ2VtZW50XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHN1YnNjcmliZU1peGluIGZyb20gJy4uL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG4vLyBHTCB0ZXh0dXJlIHdyYXBwZXIgb2JqZWN0IGZvciBrZWVwaW5nIHRyYWNrIG9mIGEgZ2xvYmFsIHNldCBvZiB0ZXh0dXJlcywga2V5ZWQgYnkgYSB1bmlxdWUgdXNlci1kZWZpbmVkIG5hbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRleHR1cmUge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIG5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy52YWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iaW5kKCk7XG5cbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5yZXRhaW5fY291bnQgPSAwO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc291cmNlX3R5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbnVsbDsgICAgLy8gYSBQcm9taXNlIG9iamVjdCB0byB0cmFjayB0aGUgbG9hZGluZyBzdGF0ZSBvZiB0aGlzIHRleHR1cmVcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTsgICAgLy8gc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhcyBleHBlY3RlZFxuICAgICAgICB0aGlzLmZpbHRlcmluZyA9IG9wdGlvbnMuZmlsdGVyaW5nO1xuICAgICAgICB0aGlzLnNwcml0ZXMgPSBvcHRpb25zLnNwcml0ZXM7XG4gICAgICAgIHRoaXMudGV4Y29vcmRzID0ge307ICAgIC8vIHNwcml0ZSBVVnMgKFswLCAxXSByYW5nZSlcbiAgICAgICAgdGhpcy5zaXplcyA9IHt9OyAgICAgICAgLy8gc3ByaXRlIHNpemVzIChwaXhlbCBzaXplKVxuXG4gICAgICAgIC8vIERlZmF1bHQgdG8gYSAxLXBpeGVsIGJsYWNrIHRleHR1cmUgc28gd2UgY2FuIHNhZmVseSByZW5kZXIgd2hpbGUgd2Ugd2FpdCBmb3IgYW4gaW1hZ2UgdG8gbG9hZFxuICAgICAgICAvLyBTZWU6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk3MjIyNDcvd2ViZ2wtd2FpdC1mb3ItdGV4dHVyZS10by1sb2FkXG4gICAgICAgIHRoaXMuc2V0RGF0YSgxLCAxLCBuZXcgVWludDhBcnJheShbMCwgMCwgMCwgMjU1XSksIHsgZmlsdGVyaW5nOiAnbmVhcmVzdCcgfSk7XG5cbiAgICAgICAgLy8gRGVzdHJveSBwcmV2aW91cyB0ZXh0dXJlIGlmIHByZXNlbnRcbiAgICAgICAgaWYgKFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXSkge1xuICAgICAgICAgICAgLy8gUHJlc2VydmUgcHJldmlvdXMgcmV0YWluIGNvdW50XG4gICAgICAgICAgICB0aGlzLnJldGFpbl9jb3VudCA9IFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXS5yZXRhaW5fY291bnQ7XG4gICAgICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0ucmV0YWluX2NvdW50ID0gMDsgLy8gYWxsb3cgdG8gYmUgZnJlZWRcbiAgICAgICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB0ZXh0dXJlIGluc3RhbmNlIGFuZCBkZWZpbml0aW9uXG4gICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gICAgICAgIFRleHR1cmUudGV4dHVyZV9jb25maWdzW3RoaXMubmFtZV0gPSBPYmplY3QuYXNzaWduKHsgbmFtZSB9LCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmxvYWQob3B0aW9ucyk7XG4gICAgICAgIGxvZygndHJhY2UnLCBgY3JlYXRpbmcgVGV4dHVyZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG5cbiAgICAvLyBEZXN0cm95IGEgc2luZ2xlIHRleHR1cmUgaW5zdGFuY2VcbiAgICBkZXN0cm95KHsgZm9yY2UgfSA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLnJldGFpbl9jb3VudCA+IDAgJiYgIWZvcmNlKSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGRlc3Ryb3lpbmcgdGV4dHVyZSB3aXRoIHJldGFpbiBjb3VudCBvZiAnJHt0aGlzLnJldGFpbl9jb3VudH0nYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdsLmRlbGV0ZVRleHR1cmUodGhpcy50ZXh0dXJlKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGF0YTtcbiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXTtcbiAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlO1xuICAgICAgICBsb2coJ3RyYWNlJywgYGRlc3Ryb3lpbmcgVGV4dHVyZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG5cbiAgICByZXRhaW4gKCkge1xuICAgICAgICB0aGlzLnJldGFpbl9jb3VudCsrO1xuICAgIH1cblxuICAgIHJlbGVhc2UgKCkge1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5fY291bnQgPD0gMCkge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiByZWxlYXNpbmcgdGV4dHVyZSB3aXRoIHJldGFpbiBjb3VudCBvZiAnJHt0aGlzLnJldGFpbl9jb3VudH0nYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJldGFpbl9jb3VudC0tO1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5fY291bnQgPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kKHVuaXQgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFRleHR1cmUuYWN0aXZlVW5pdCAhPT0gdW5pdCkge1xuICAgICAgICAgICAgdGhpcy5nbC5hY3RpdmVUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRTAgKyB1bml0KTtcbiAgICAgICAgICAgIFRleHR1cmUuYWN0aXZlVW5pdCA9IHVuaXQ7XG4gICAgICAgICAgICBUZXh0dXJlLmJvdW5kVGV4dHVyZSA9IG51bGw7IC8vIHRleHR1cmUgbXVzdCBiZSByZS1ib3VuZCB3aGVuIHVuaXQgY2hhbmdlc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFRleHR1cmUuYm91bmRUZXh0dXJlICE9PSB0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZFRleHR1cmUodGhpcy5nbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuICAgICAgICAgICAgVGV4dHVyZS5ib3VuZFRleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nIHx8IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gJ3VybCc7XG4gICAgICAgICAgICB0aGlzLnNldFVybChvcHRpb25zLnVybCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gJ2VsZW1lbnQnO1xuICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50KG9wdGlvbnMuZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMud2lkdGggJiYgb3B0aW9ucy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3R5cGUgPSAnZGF0YSc7XG4gICAgICAgICAgICB0aGlzLnNldERhdGEob3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQsIG9wdGlvbnMuZGF0YSwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmcgPVxuICAgICAgICAgICAgKHRoaXMubG9hZGluZyAmJiB0aGlzLmxvYWRpbmcudGhlbigoKSA9PiB7IHRoaXMuY2FsY3VsYXRlU3ByaXRlcygpOyByZXR1cm4gdGhpczsgfSkpIHx8XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gU2V0cyB0ZXh0dXJlIGZyb20gYW4gdXJsXG4gICAgc2V0VXJsKHVybCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cmwgPSB1cmw7IC8vIHNhdmUgVVJMIHJlZmVyZW5jZSAod2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIGVsZW1lbnQgaXMgbG9hZGVkIGJlbG93KVxuICAgICAgICB0aGlzLnNvdXJjZSA9IHRoaXMudXJsO1xuICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ3VybCc7XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50KGltYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGZhaWxlZCB0byBsb2FkIHVybDogJyR7dGhpcy5zb3VyY2V9J2AsIGUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3dhcm5pbmcnLCB7IG1lc3NhZ2U6IGBGYWlsZWQgdG8gbG9hZCB0ZXh0dXJlIGZyb20gJHt0aGlzLnNvdXJjZX1gLCBlcnJvcjogZSwgdGV4dHVyZTogb3B0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2FybiBhbmQgcmVzb2x2ZSBvbiBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGZhaWxlZCB0byBsb2FkIHVybDogJyR7dGhpcy5zb3VyY2V9J2AsIGUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIFRleHR1cmUudHJpZ2dlcignd2FybmluZycsIHsgbWVzc2FnZTogYEZhaWxlZCB0byBsb2FkIHRleHR1cmUgZnJvbSAke3RoaXMuc291cmNlfWAsIGVycm9yOiBlLCB0ZXh0dXJlOiBvcHRpb25zIH0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBTYWZhcmkgaGFzIGEgYnVnIGxvYWRpbmcgZGF0YS1VUkwgaW1hZ2VzIHdpdGggQ09SUyBlbmFibGVkLCBzbyBpdCBtdXN0IGJlIGRpc2FibGVkIGluIHRoYXQgY2FzZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMzk3OFxuICAgICAgICAgICAgaWYgKCEoVXRpbHMuaXNTYWZhcmkoKSAmJiB0aGlzLnNvdXJjZS5zbGljZSgwLCA1KSA9PT0gJ2RhdGE6JykpIHtcbiAgICAgICAgICAgICAgICBpbWFnZS5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB0aGlzLnNvdXJjZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gU2V0cyB0ZXh0dXJlIHRvIGEgcmF3IGltYWdlIGJ1ZmZlclxuICAgIHNldERhdGEod2lkdGgsIGhlaWdodCwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhO1xuICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ2RhdGEnO1xuXG4gICAgICAgIC8vIENvbnZlcnQgcmVndWxhciBhcnJheSB0byB0eXBlZCBhcnJheVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGUob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVyaW5nKG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGhlIHRleHR1cmUgdG8gdHJhY2sgYSBlbGVtZW50IChjYW52YXMvaW1hZ2UpXG4gICAgc2V0RWxlbWVudChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBlbCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgLy8gYSBzdHJpbmcgZWxlbWVudCBpcyBpbnRlcnBldGVkIGFzIGEgQ1NTIHNlbGVjdG9yXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fFxuICAgICAgICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHxcbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ2VsZW1lbnQnO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZShvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyaW5nKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBtc2cgPSBgdGhlICdlbGVtZW50JyBwYXJhbWV0ZXIgKFxcYGVsZW1lbnQ6ICR7SlNPTi5zdHJpbmdpZnkoZWwpfVxcYCkgbXVzdCBiZSBhIENTUyBgO1xuICAgICAgICAgICAgbXNnICs9IGBzZWxlY3RvciBzdHJpbmcsIG9yIGEgPGNhbnZhcz4sIDxpbWFnZT4gb3IgPHZpZGVvPiBvYmplY3RgO1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6ICR7bXNnfWAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd3YXJuaW5nJywgeyBtZXNzYWdlOiBgRmFpbGVkIHRvIGxvYWQgdGV4dHVyZSBiZWNhdXNlICR7bXNnfWAsIHRleHR1cmU6IG9wdGlvbnMgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBVcGxvYWRzIGN1cnJlbnQgaW1hZ2Ugb3IgYnVmZmVyIHRvIHRoZSBHUFUgKGNhbiBiZSB1c2VkIHRvIHVwZGF0ZSBhbmltYXRlZCB0ZXh0dXJlcyBvbiB0aGUgZmx5KVxuICAgIHVwZGF0ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJpbmQoKTtcbiAgICAgICAgdGhpcy5nbC5waXhlbFN0b3JlaSh0aGlzLmdsLlVOUEFDS19GTElQX1lfV0VCR0wsIChvcHRpb25zLlVOUEFDS19GTElQX1lfV0VCR0wgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlKSk7XG4gICAgICAgIHRoaXMuZ2wucGl4ZWxTdG9yZWkodGhpcy5nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIG9wdGlvbnMuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMIHx8IGZhbHNlKTtcblxuICAgICAgICAvLyBJbWFnZSBvciBDYW52YXMgZWxlbWVudFxuICAgICAgICBpZiAodGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fCB0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgfHxcbiAgICAgICAgICAgICh0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgdGhpcy5zb3VyY2UuY29tcGxldGUpKSB7XG5cbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLnNvdXJjZS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5zb3VyY2UuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJhdyBpbWFnZSBidWZmZXJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zb3VyY2VfdHlwZSA9PT0gJ2RhdGEnKSB7XG4gICAgICAgICAgICB0aGlzLmdsLnRleEltYWdlMkQodGhpcy5nbC5URVhUVVJFXzJELCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd1cGRhdGUnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmVzIGFwcHJvcHJpYXRlIGZpbHRlcmluZyBtb2RlXG4gICAgc2V0RmlsdGVyaW5nKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuZmlsdGVyaW5nID0gb3B0aW9ucy5maWx0ZXJpbmcgfHwgJ2xpbmVhcic7XG5cbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcbiAgICAgICAgdGhpcy5iaW5kKCk7XG5cbiAgICAgICAgLy8gRm9yIHBvd2VyLW9mLTIgdGV4dHVyZXMsIHRoZSBmb2xsb3dpbmcgcHJlc2V0cyBhcmUgYXZhaWxhYmxlOlxuICAgICAgICAvLyBtaXBtYXA6IGxpbmVhciBibGVuZCBmcm9tIG5lYXJlc3QgbWlwXG4gICAgICAgIC8vIGxpbmVhcjogbGluZWFyIGJsZW5kIGZyb20gb3JpZ2luYWwgaW1hZ2UgKG5vIG1pcHMpXG4gICAgICAgIC8vIG5lYXJlc3Q6IG5lYXJlc3QgcGl4ZWwgZnJvbSBvcmlnaW5hbCBpbWFnZSAobm8gbWlwcywgJ2Jsb2NreScgbG9vaylcbiAgICAgICAgaWYgKFV0aWxzLmlzUG93ZXJPZjIodGhpcy53aWR0aCkgJiYgVXRpbHMuaXNQb3dlck9mMih0aGlzLmhlaWdodCkpIHtcbiAgICAgICAgICAgIHRoaXMucG93ZXJfb2ZfMiA9IHRydWU7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBvcHRpb25zLlRFWFRVUkVfV1JBUF9TIHx8IChvcHRpb25zLnJlcGVhdCAmJiBnbC5SRVBFQVQpIHx8IGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgb3B0aW9ucy5URVhUVVJFX1dSQVBfVCB8fCAob3B0aW9ucy5yZXBlYXQgJiYgZ2wuUkVQRUFUKSB8fCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbWlwbWFwJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ21pcG1hcCc7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUl9NSVBNQVBfTElORUFSKTsgLy8gVE9ETzogdXNlIHRyaWxpbmVhciBmaWx0ZXJpbmcgYnkgZGVmdWFsdCBpbnN0ZWFkP1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5maWx0ZXJpbmcgPT09ICdsaW5lYXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbGluZWFyJztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbmVhcmVzdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICduZWFyZXN0JztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV2ViR0wgaGFzIHN0cmljdCByZXF1aXJlbWVudHMgb24gbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXM6XG4gICAgICAgICAgICAvLyBObyBtaXBtYXBzIGFuZCBtdXN0IGNsYW1wIHRvIGVkZ2VcbiAgICAgICAgICAgIHRoaXMucG93ZXJfb2ZfMiA9IGZhbHNlO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbmVhcmVzdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICduZWFyZXN0JztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIGRlZmF1bHQgdG8gbGluZWFyIGZvciBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ2xpbmVhcic7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3VwZGF0ZScsIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIFByZS1jYWxjIHNwcml0ZSByZWdpb25zIGZvciBhIHRleHR1cmUgc3ByaXRlIGluIFVWIFswLCAxXSBzcGFjZVxuICAgIGNhbGN1bGF0ZVNwcml0ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnNwcml0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHMgaW4gdGhpcy5zcHJpdGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNwcml0ZSA9IHRoaXMuc3ByaXRlc1tzXTtcblxuICAgICAgICAgICAgICAgIC8vIE1hcCBbMCwgMF0gdG8gWzEsIDFdIGNvb3JkcyB0byB0aGUgYXBwcm9wcmlhdGUgc3ByaXRlIHN1Yi1hcmVhIG9mIHRoZSB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgdGhpcy50ZXhjb29yZHNbc10gPSBUZXh0dXJlLmdldFRleGNvb3Jkc0ZvclNwcml0ZShcbiAgICAgICAgICAgICAgICAgICAgW3Nwcml0ZVswXSwgc3ByaXRlWzFdXSxcbiAgICAgICAgICAgICAgICAgICAgW3Nwcml0ZVsyXSwgc3ByaXRlWzNdXSxcbiAgICAgICAgICAgICAgICAgICAgW3RoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAvLyBQaXhlbCBzaXplIG9mIHNwcml0ZVxuICAgICAgICAgICAgICAgIHRoaXMuc2l6ZXNbc10gPSBbc3ByaXRlWzJdLCBzcHJpdGVbM11dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59XG5cblxuLy8gU3RhdGljL2NsYXNzIG1ldGhvZHMgYW5kIHN0YXRlXG5cblRleHR1cmUuY3JlYXRlID0gZnVuY3Rpb24gKGdsLCBuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0dXJlKGdsLCBuYW1lLCBvcHRpb25zKTtcbn07XG5cblRleHR1cmUucmV0YWluID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoVGV4dHVyZS50ZXh0dXJlc1tuYW1lXSkge1xuICAgICAgICBUZXh0dXJlLnRleHR1cmVzW25hbWVdLnJldGFpbigpO1xuICAgIH1cbn07XG5cblRleHR1cmUucmVsZWFzZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRleHR1cmUudGV4dHVyZXNbbmFtZV0pIHtcbiAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1tuYW1lXS5yZWxlYXNlKCk7XG4gICAgfVxufTtcblxuLy8gRGVzdHJveSBhbGwgdGV4dHVyZSBpbnN0YW5jZXMgZm9yIGEgZ2l2ZW4gR0wgY29udGV4dFxuVGV4dHVyZS5kZXN0cm95ID0gZnVuY3Rpb24gKGdsKSB7XG4gICAgdmFyIHRleHR1cmVzID0gT2JqZWN0LmtleXMoVGV4dHVyZS50ZXh0dXJlcyk7XG4gICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgdmFyIHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW3RdO1xuICAgICAgICBpZiAodGV4dHVyZS5nbCA9PT0gZ2wpIHtcbiAgICAgICAgICAgIHRleHR1cmUuZGVzdHJveSh7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuXG4vLyBHZXQgc3ByaXRlIHBpeGVsIHNpemUgYW5kIFVWc1xuVGV4dHVyZS5nZXRTcHJpdGVJbmZvID0gZnVuY3Rpb24gKHRleG5hbWUsIHNwcml0ZSkge1xuICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1t0ZXhuYW1lXTtcbiAgICByZXR1cm4gdGV4dHVyZSAmJiB7IHNpemU6IHRleHR1cmUuc2l6ZXNbc3ByaXRlXSwgdGV4Y29vcmRzOiB0ZXh0dXJlLnRleGNvb3Jkc1tzcHJpdGVdIH07XG59O1xuXG4vLyBSZS1zY2FsZSBVVnMgZnJvbSBbMCwgMV0gcmFuZ2UgdG8gYSBzbWFsbGVyIGFyZWEgd2l0aGluIHRoZSBpbWFnZVxuVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUgPSBmdW5jdGlvbiAoYXJlYV9vcmlnaW4sIGFyZWFfc2l6ZSwgdGV4X3NpemUpIHtcbiAgICB2YXIgYXJlYV9vcmlnaW5feSA9IHRleF9zaXplWzFdIC0gYXJlYV9vcmlnaW5bMV0gLSBhcmVhX3NpemVbMV07XG5cbiAgICByZXR1cm4gW1xuICAgICAgICBhcmVhX29yaWdpblswXSAvIHRleF9zaXplWzBdLFxuICAgICAgICBhcmVhX29yaWdpbl95IC8gdGV4X3NpemVbMV0sXG4gICAgICAgIChhcmVhX3NpemVbMF0gKyBhcmVhX29yaWdpblswXSkgLyB0ZXhfc2l6ZVswXSxcbiAgICAgICAgKGFyZWFfc2l6ZVsxXSArIGFyZWFfb3JpZ2luX3kpIC8gdGV4X3NpemVbMV1cbiAgICBdO1xufTtcblxuLy8gQ3JlYXRlIGEgc2V0IG9mIHRleHR1cmVzIGtleWVkIGluIGFuIG9iamVjdFxuLy8gT3B0aW9uYWxseSBsb2FkIGVhY2ggaWYgaXQgaGFzIGEgVVJMIHNwZWNpZmllZFxuVGV4dHVyZS5jcmVhdGVGcm9tT2JqZWN0ID0gZnVuY3Rpb24gKGdsLCB0ZXh0dXJlcykge1xuICAgIGxldCBsb2FkaW5nID0gW107XG4gICAgaWYgKHRleHR1cmVzKSB7XG4gICAgICAgIGZvciAobGV0IHRleG5hbWUgaW4gdGV4dHVyZXMpIHtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSB0ZXh0dXJlc1t0ZXhuYW1lXTtcblxuICAgICAgICAgICAgLy8gSWYgdGV4dHVyZSBhbHJlYWR5IGV4aXN0cyBhbmQgZGVmaW5pdGlvbiBoYXNuJ3QgY2hhbmdlZCwgbm8gbmVlZCB0byByZS1jcmVhdGVcbiAgICAgICAgICAgIC8vIE5vdGU6IHRvIGF2b2lkIGZsaWNrZXIgd2hlbiBvdGhlciB0ZXh0dXJlcy9zY2VuZSBpdGVtcyBjaGFuZ2VcbiAgICAgICAgICAgIGlmICghVGV4dHVyZS5jaGFuZ2VkKHRleG5hbWUsIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRleHR1cmUgPSBUZXh0dXJlLmNyZWF0ZShnbCwgdGV4bmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIGxvYWRpbmcucHVzaCh0ZXh0dXJlLmxvYWRpbmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLmFsbChsb2FkaW5nKTtcbn07XG5cbi8vIENyZWF0ZSBhICdkZWZhdWx0JyB0ZXh0dXJlICgxeDEgcGl4ZWwpIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlclxuLy8gKGZvciBleGFtcGxlIHRvIHByZXZlbnQgR0wgZnJvbSBjb21wbGFpbmluZyBhYm91dCB1bmJvdW5kIHRleHR1cmVzKVxuVGV4dHVyZS5kZWZhdWx0ID0gJ19fZGVmYXVsdCc7XG5UZXh0dXJlLmNyZWF0ZURlZmF1bHQgPSBmdW5jdGlvbiAoZ2wpIHtcbiAgICByZXR1cm4gVGV4dHVyZS5jcmVhdGUoZ2wsIFRleHR1cmUuZGVmYXVsdCk7XG59O1xuXG4vLyBJbmRpY2F0ZSBpZiBhIHRleHR1cmUgZGVmaW5pdGlvbiB3b3VsZCBiZSBhIGNoYW5nZSBmcm9tIHRoZSBjdXJyZW50IGNhY2hlXG5UZXh0dXJlLmNoYW5nZWQgPSBmdW5jdGlvbiAobmFtZSwgY29uZmlnKSB7XG4gICAgbGV0IHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW25hbWVdO1xuICAgIGlmICh0ZXh0dXJlKSB7IC8vIGNhY2hlZCB0ZXh0dXJlXG4gICAgICAgIC8vIGNhbnZhcy9pbWFnZS1iYXNlZCB0ZXh0dXJlcyBhcmUgY29uc2lkZXJlZCBkeW5hbWljIGFuZCBhbHdheXMgcmVmcmVzaFxuICAgICAgICBpZiAodGV4dHVyZS5jb25maWdfdHlwZSA9PT0gJ2VsZW1lbnQnIHx8IGNvbmZpZy5lbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29tcGFyZSBkZWZpbml0aW9uc1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoVGV4dHVyZS50ZXh0dXJlX2NvbmZpZ3NbbmFtZV0pID09PVxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmFzc2lnbih7IG5hbWUgfSwgY29uZmlnKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIEdldCBtZXRhZGF0YSBmb3IgYSB0ZXh0dXJlIGJ5IG5hbWVcbi8vIFJldHVybnMgdmlhIHByb21pc2UsIGluIGNhc2UgdGV4dHVyZSBpcyBzdGlsbCBsb2FkaW5nXG4vLyBDYW4gYmUgY2FsbGVkIG9uIG1haW4gdGhyZWFkIGZyb20gd29ya2VyLCB0byBzeW5jIHRleHR1cmUgaW5mbyB0byB3b3JrZXJcblRleHR1cmUuZ2V0SW5mbyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgLy8gR2V0IGluZm8gZm9yIGFsbCB0ZXh0dXJlcyBieSBkZWZhdWx0XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIG5hbWUgPSBPYmplY3Qua2V5cyhUZXh0dXJlLnRleHR1cmVzKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgbXVsdGlwbGUgdGV4dHVyZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuYW1lKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobmFtZS5tYXAobiA9PiBUZXh0dXJlLmdldEluZm8obikpKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgc2luZ2xlIHRleHR1cmVcbiAgICB2YXIgdGV4ID0gVGV4dHVyZS50ZXh0dXJlc1tuYW1lXTtcbiAgICBpZiAodGV4KSB7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoaXMgdGV4dHVyZSB0byBmaW5pc2ggbG9hZGluZywgb3IgcmV0dXJuIGltbWVkaWF0ZWx5XG4gICAgICAgIHZhciBsb2FkaW5nID0gdGV4LmxvYWRpbmcgfHwgUHJvbWlzZS5yZXNvbHZlKHRleCk7XG4gICAgICAgIHJldHVybiBsb2FkaW5nLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmV0dXJuIGEgc3Vic2V0IG9mIHRleHR1cmUgaW5mb1xuICAgICAgICAgICAgLy8gKGNvbXBhdGlibGUgdy9zdHJ1Y3R1cmVkIGNsb25pbmcsIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIGEgd29ya2VyKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0ZXgubmFtZSxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGV4LndpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdGV4LmhlaWdodCxcbiAgICAgICAgICAgICAgICBzcHJpdGVzOiB0ZXguc3ByaXRlcyxcbiAgICAgICAgICAgICAgICB0ZXhjb29yZHM6IHRleC50ZXhjb29yZHMsXG4gICAgICAgICAgICAgICAgc2l6ZXM6IHRleC5zaXplcyxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6IHRleC5maWx0ZXJpbmcsXG4gICAgICAgICAgICAgICAgcG93ZXJfb2ZfMjogdGV4LnBvd2VyX29mXzIsXG4gICAgICAgICAgICAgICAgdmFsaWQ6IHRleC52YWxpZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBObyB0ZXh0dXJlIGZvdW5kXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxufTtcblxuLy8gU3luYyB0ZXh0dXJlIGluZm8gdG8gd29ya2VyXG4vLyBDYWxsZWQgZnJvbSB3b3JrZXIsIGdldHMgaW5mbyBvbiBvbmUgb3IgbW9yZSB0ZXh0dXJlcyBpbmZvIGZyb20gbWFpbiB0aHJlYWQgdmlhIHJlbW90ZSBjYWxsLCB0aGVuIHN0b3JlcyBpdFxuLy8gbG9jYWxseSBpbiB3b3JrZXIuICd0ZXh0dXJlcycgY2FuIGJlIGFuIGFycmF5IG9mIHRleHR1cmUgbmFtZXMgdG8gc3luYywgb3IgaWYgbnVsbCwgYWxsIHRleHR1cmVzIGFyZSBzeW5jZWQuXG5UZXh0dXJlLnN5bmNUZXh0dXJlc1RvV29ya2VyID0gZnVuY3Rpb24gKG5hbWVzKSB7XG4gICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnVGV4dHVyZS5nZXRJbmZvJywgbmFtZXMpLlxuICAgICAgICB0aGVuKHRleHR1cmVzID0+IHtcbiAgICAgICAgICAgIHRleHR1cmVzLmZvckVhY2godGV4ID0+IHtcbiAgICAgICAgICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RleC5uYW1lXSA9IHRleDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFRleHR1cmUudGV4dHVyZXM7XG4gICAgICAgIH0pO1xufTtcblxuLy8gUmVwb3J0IG1heCB0ZXh0dXJlIHNpemUgZm9yIGEgR0wgY29udGV4dFxuVGV4dHVyZS5nZXRNYXhUZXh0dXJlU2l6ZSA9IGZ1bmN0aW9uIChnbCkge1xuICAgIHJldHVybiBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfU0laRSk7XG59O1xuXG4vLyBHbG9iYWwgc2V0IG9mIHRleHR1cmVzLCBieSBuYW1lXG5UZXh0dXJlLnRleHR1cmVzID0ge307XG5UZXh0dXJlLnRleHR1cmVfY29uZmlncyA9IHt9O1xuVGV4dHVyZS5ib3VuZFRleHR1cmUgPSBudWxsO1xuVGV4dHVyZS5hY3RpdmVVbml0ID0gbnVsbDtcblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnVGV4dHVyZScsIFRleHR1cmUpO1xuc3Vic2NyaWJlTWl4aW4oVGV4dHVyZSk7XG4iLCIvLyBDcmVhdGVzIGEgVmVydGV4IEFycmF5IE9iamVjdCBpZiB0aGUgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZSwgb3IgZmFsbHMgYmFjayBvbiBzdGFuZGFyZCBhdHRyaWJ1dGUgY2FsbHNcblxuaW1wb3J0IGdldEV4dGVuc2lvbiBmcm9tICcuL2V4dGVuc2lvbnMnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cbiAgICBkaXNhYmxlZDogZmFsc2UsIC8vIHNldCB0byB0cnVlIHRvIGRpc2FibGUgVkFPcyBldmVuIGlmIGV4dGVuc2lvbiBpcyBhdmFpbGFibGVcbiAgICBib3VuZF92YW86IFtdLCAgIC8vIGN1cnJlbnRseSBib3VuZCBWQU8sIGJ5IEdMIGNvbnRleHRcblxuICAgIGluaXQgKGdsKSB7XG4gICAgICAgIGxldCBleHQ7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBleHQgPSBnZXRFeHRlbnNpb24oZ2wsICdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsb2coJ2luZm8nLCAnVmVydGV4IEFycmF5IE9iamVjdCBleHRlbnNpb24gYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZlcnRleCBBcnJheSBPYmplY3QgZXh0ZW5zaW9uIE5PVCBhdmFpbGFibGUnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvZygnd2FybicsICdWZXJ0ZXggQXJyYXkgT2JqZWN0IGV4dGVuc2lvbiBmb3JjZSBkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZSAoZ2wsIHNldHVwLCB0ZWFyZG93bikge1xuICAgICAgICBsZXQgdmFvID0ge307XG4gICAgICAgIHZhby5zZXR1cCA9IHNldHVwO1xuICAgICAgICB2YW8udGVhcmRvd24gPSB0ZWFyZG93bjtcblxuICAgICAgICBsZXQgZXh0ID0gZ2V0RXh0ZW5zaW9uKGdsLCAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbiAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YW8uX3ZhbyA9IGV4dC5jcmVhdGVWZXJ0ZXhBcnJheU9FUygpO1xuICAgICAgICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyh2YW8uX3Zhbyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YW8uc2V0dXAodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHZhbztcbiAgICB9LFxuXG4gICAgZ2V0Q3VycmVudEJpbmRpbmcgKGdsKSB7XG4gICAgICAgIGxldCBib3VuZCA9IHRoaXMuYm91bmRfdmFvLmZpbHRlcihlID0+IGVbMF0gPT09IGdsKVswXTtcbiAgICAgICAgcmV0dXJuIGJvdW5kICYmIGJvdW5kWzFdO1xuICAgIH0sXG5cbiAgICBzZXRDdXJyZW50QmluZGluZyAoZ2wsIHZhbykge1xuICAgICAgICBsZXQgYm91bmRfdmFvID0gdGhpcy5ib3VuZF92YW87XG4gICAgICAgIGxldCBiaW5kaW5nID0gYm91bmRfdmFvLmZpbHRlcihlID0+IGVbMF0gPT09IGdsKVswXTtcbiAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgYm91bmRfdmFvLnB1c2goW2dsLCB2YW9dKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJpbmRpbmdbMV0gPSB2YW87XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYmluZCAoZ2wsIHZhbykge1xuICAgICAgICBsZXQgZXh0ID0gZ2V0RXh0ZW5zaW9uKGdsLCAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbiAgICAgICAgaWYgKHZhbyAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZXh0ICE9IG51bGwgJiYgdmFvLl92YW8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVModmFvLl92YW8pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudEJpbmRpbmcoZ2wsIHZhbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YW8uc2V0dXAoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGJvdW5kX3ZhbyA9IHRoaXMuZ2V0Q3VycmVudEJpbmRpbmcoZ2wpO1xuICAgICAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyhudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJvdW5kX3ZhbyAhPSBudWxsICYmIHR5cGVvZiBib3VuZF92YW8udGVhcmRvd24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBib3VuZF92YW8udGVhcmRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudEJpbmRpbmcoZ2wsIG51bGwpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGRlc3Ryb3kgKGdsLCB2YW8pIHtcbiAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbihnbCwgJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG4gICAgICAgIGlmIChleHQgIT0gbnVsbCAmJiB2YW8gIT0gbnVsbCAmJiB2YW8uX3ZhbyAhPSBudWxsKSB7XG4gICAgICAgICAgICBleHQuZGVsZXRlVmVydGV4QXJyYXlPRVModmFvLl92YW8pO1xuICAgICAgICAgICAgdmFvLl92YW8gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRlc3Ryb3kgaXMgYSBuby1vcCBpZiBWQU8gZXh0ZW5zaW9uIGlzbid0IGF2YWlsYWJsZVxuICAgIH1cblxufTtcbiIsIi8vIE1hbmFnZSByZW5kZXJpbmcgZm9yIHByaW1pdGl2ZXNcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZlcnRleEFycmF5T2JqZWN0IGZyb20gJy4vdmFvJztcblxuLy8gQSBzaW5nbGUgbWVzaC9WQk8sIGRlc2NyaWJlZCBieSBhIHZlcnRleCBsYXlvdXQsIHRoYXQgY2FuIGJlIGRyYXduIHdpdGggb25lIG9yIG1vcmUgcHJvZ3JhbXNcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZCT01lc2ggIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCB2ZXJ0ZXhfZGF0YSwgZWxlbWVudF9kYXRhLCB2ZXJ0ZXhfbGF5b3V0LCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfZGF0YSA9IHZlcnRleF9kYXRhOyAvLyB0eXBlZCBhcnJheVxuICAgICAgICB0aGlzLmVsZW1lbnRfZGF0YSA9IGVsZW1lbnRfZGF0YTsgLy8gdHlwZWQgYXJyYXlcbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gdmVydGV4X2xheW91dDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgdGhpcy5kcmF3X21vZGUgPSBvcHRpb25zLmRyYXdfbW9kZSB8fCB0aGlzLmdsLlRSSUFOR0xFUztcbiAgICAgICAgdGhpcy5kYXRhX3VzYWdlID0gb3B0aW9ucy5kYXRhX3VzYWdlIHx8IHRoaXMuZ2wuU1RBVElDX0RSQVc7XG4gICAgICAgIHRoaXMudmVydGljZXNfcGVyX2dlb21ldHJ5ID0gMzsgLy8gVE9ETzogc3VwcG9ydCBsaW5lcywgc3RyaXAsIGZhbiwgZXRjLlxuICAgICAgICB0aGlzLnVuaWZvcm1zID0gb3B0aW9ucy51bmlmb3JtcztcbiAgICAgICAgdGhpcy5yZXRhaW4gPSBvcHRpb25zLnJldGFpbiB8fCBmYWxzZTsgLy8gd2hldGhlciB0byByZXRhaW4gbWVzaCBkYXRhIGluIENQVSBhZnRlciB1cGxvYWRpbmcgdG8gR1BVXG4gICAgICAgIHRoaXMuY3JlYXRlZF9hdCA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IG9wdGlvbnMuZmFkZV9pbl90aW1lIHx8IDA7IC8vIG9wdGlvbmFsIHRpbWUgdG8gZmFkZSBpbiBtZXNoXG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfY291bnQgPSB0aGlzLnZlcnRleF9kYXRhLmJ5dGVMZW5ndGggLyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlO1xuICAgICAgICB0aGlzLnZhb3MgPSB7fTsgLy8gbWFwIG9mIFZlcnRleEFycmF5T2JqZWN0cywga2V5ZWQgYnkgcHJvZ3JhbVxuXG4gICAgICAgIHRoaXMudG9nZ2xlX2VsZW1lbnRfYXJyYXkgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudF9kYXRhKXtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlX2VsZW1lbnRfYXJyYXkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2NvdW50ID0gdGhpcy5lbGVtZW50X2RhdGEubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5nZW9tZXRyeV9jb3VudCA9IHRoaXMuZWxlbWVudF9jb3VudCAvIHRoaXMudmVydGljZXNfcGVyX2dlb21ldHJ5O1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X3R5cGUgPSAodGhpcy5lbGVtZW50X2RhdGEuY29uc3RydWN0b3IgPT09IFVpbnQxNkFycmF5KSA/IHRoaXMuZ2wuVU5TSUdORURfU0hPUlQ6IHRoaXMuZ2wuVU5TSUdORURfSU5UO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2J1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2RhdGEsIHRoaXMuZGF0YV91c2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdlb21ldHJ5X2NvdW50ID0gdGhpcy52ZXJ0ZXhfY291bnQgLyB0aGlzLnZlcnRpY2VzX3Blcl9nZW9tZXRyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLnZlcnRleF9kYXRhLCB0aGlzLmRhdGFfdXNhZ2UpO1xuXG4gICAgICAgIGlmICghdGhpcy5yZXRhaW4pIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZlcnRleF9kYXRhO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZWxlbWVudF9kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciwgYnkgZGVmYXVsdCB3aXRoIGN1cnJlbnRseSBib3VuZCBwcm9ncmFtLCBvciBvdGhlcndpc2Ugd2l0aCBvcHRpb25hbGx5IHByb3ZpZGVkIG9uZVxuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBtZXNoIHJlcXVlc3RzIGEgcmVuZGVyIG9uIG5leHQgZnJhbWUgKGUuZy4gZm9yIGZhZGUgYW5pbWF0aW9ucylcbiAgICByZW5kZXIob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByb2dyYW0gPSBvcHRpb25zLnByb2dyYW0gfHwgU2hhZGVyUHJvZ3JhbS5jdXJyZW50O1xuICAgICAgICBwcm9ncmFtLnVzZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICBwcm9ncmFtLnNhdmVVbmlmb3Jtcyh0aGlzLnVuaWZvcm1zKTtcbiAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybXModGhpcy51bmlmb3JtcywgZmFsc2UpOyAvLyBkb24ndCByZXNldCB0ZXh0dXJlIHVuaXRcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2aXNpYmxlX3RpbWUgPSAoK25ldyBEYXRlKCkgLSB0aGlzLmNyZWF0ZWRfYXQpIC8gMTAwMDtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3Zpc2libGVfdGltZScsIHZpc2libGVfdGltZSk7XG5cbiAgICAgICAgdGhpcy5iaW5kKHByb2dyYW0pO1xuXG4gICAgICAgIGlmICh0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5KXtcbiAgICAgICAgICAgIHRoaXMuZ2wuZHJhd0VsZW1lbnRzKHRoaXMuZHJhd19tb2RlLCB0aGlzLmVsZW1lbnRfY291bnQsIHRoaXMuZWxlbWVudF90eXBlLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZHJhd0FycmF5cyh0aGlzLmRyYXdfbW9kZSwgMCwgdGhpcy52ZXJ0ZXhfY291bnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuYmluZCh0aGlzLmdsLCBudWxsKTtcblxuICAgICAgICBpZiAodGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgcHJvZ3JhbS5yZXN0b3JlVW5pZm9ybXModGhpcy51bmlmb3Jtcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXF1ZXN0IG5leHQgcmVuZGVyIGlmIG1lc2ggaXMgZmFkaW5nIGluXG4gICAgICAgIHJldHVybiAodmlzaWJsZV90aW1lIDwgdGhpcy5mYWRlX2luX3RpbWUpO1xuICAgIH1cblxuICAgIC8vIEJpbmQgYnVmZmVycyBhbmQgdmVydGV4IGF0dHJpYnV0ZXMgdG8gcHJlcGFyZSBmb3IgcmVuZGVyaW5nXG4gICAgYmluZChwcm9ncmFtKSB7XG4gICAgICAgIC8vIEJpbmQgVkFPIGZvciB0aGlzIHByb2dhbSwgb3IgY3JlYXRlIG9uZVxuICAgICAgICBsZXQgdmFvID0gdGhpcy52YW9zW3Byb2dyYW0uaWRdO1xuICAgICAgICBpZiAodmFvKSB7XG4gICAgICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5iaW5kKHRoaXMuZ2wsIHZhbyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhb3NbcHJvZ3JhbS5pZF0gPSBWZXJ0ZXhBcnJheU9iamVjdC5jcmVhdGUodGhpcy5nbCwgKGZvcmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLnZlcnRleF9idWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmVsZW1lbnRfYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0LmVuYWJsZSh0aGlzLmdsLCBwcm9ncmFtLCBmb3JjZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGxldCB2IGluIHRoaXMudmFvcykge1xuICAgICAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuZGVzdHJveSh0aGlzLmdsLCB0aGlzLnZhb3Nbdl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nKCd0cmFjZScsICdWQk9NZXNoLmRlc3Ryb3k6IGRlbGV0ZSBidWZmZXInICsgKHRoaXMudmVydGV4X2RhdGEgPyBgIG9mIHNpemUgJHt0aGlzLnZlcnRleF9kYXRhLmJ5dGVMZW5ndGh9YCA6ICcnKSk7XG5cbiAgICAgICAgdGhpcy5nbC5kZWxldGVCdWZmZXIodGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50X2J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5nbC5kZWxldGVCdWZmZXIodGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRfYnVmZmVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnZlcnRleF9kYXRhO1xuICAgICAgICBkZWxldGUgdGhpcy5lbGVtZW50X2RhdGE7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgZ2wgZnJvbSAnLi9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IFZlcnRleEVsZW1lbnRzIGZyb20gJy4vdmVydGV4X2VsZW1lbnRzJztcblxuLy8gTWFwcyBHTCB0eXBlcyB0byBKUyBhcnJheSB0eXBlc1xubGV0IGFycmF5X3R5cGVzID0ge1xuICAgIFtnbC5GTE9BVF06IEZsb2F0MzJBcnJheSxcbiAgICBbZ2wuQllURV06IEludDhBcnJheSxcbiAgICBbZ2wuVU5TSUdORURfQllURV06IFVpbnQ4QXJyYXksXG4gICAgW2dsLklOVF06IEludDMyQXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX0lOVF06IFVpbnQzMkFycmF5LFxuICAgIFtnbC5TSE9SVF06IEludDE2QXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX1NIT1JUXTogVWludDE2QXJyYXlcbn07XG5cbi8vIEFuIGludGVybWVkaWFyeSBvYmplY3QgdGhhdCBob2xkcyB2ZXJ0ZXggZGF0YSBpbiB0eXBlZCBhcnJheXMsIGFjY29yZGluZyB0byBhIGdpdmVuIHZlcnRleCBsYXlvdXRcbi8vIFVzZWQgdG8gY29uc3RydWN0IGEgbWVzaC9WQk8gZm9yIHJlbmRlcmluZ1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4RGF0YSB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmVydGV4X2xheW91dCwgeyBwcmVhbGxvYyA9IDUwMCB9ID0ge30pIHtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gdmVydGV4X2xheW91dDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfZWxlbWVudHMgPSBuZXcgVmVydGV4RWxlbWVudHMoKTtcblxuICAgICAgICBpZiAoVmVydGV4RGF0YS5hcnJheV9wb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IFZlcnRleERhdGEuYXJyYXlfcG9vbC5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IE1hdGguZmxvb3IodGhpcy5ieXRlX2xlbmd0aCAvIHRoaXMudmVydGV4X2xheW91dC5zdHJpZGUpO1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBWZXJ0ZXhEYXRhOiByZXVzZWQgYnVmZmVyIG9mIGJ5dGVzICR7dGhpcy5ieXRlX2xlbmd0aH0sICR7dGhpcy5zaXplfSB2ZXJ0aWNlc2ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaXplID0gcHJlYWxsb2M7IC8vICMgb2YgdmVydGljZXMgdG8gYWxsb2NhdGVcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlICogdGhpcy5zaXplO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ieXRlX2xlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgICAvLyBieXRlIG9mZnNldCBpbnRvIGN1cnJlbnRseSBhbGxvY2F0ZWQgYnVmZmVyXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gW107XG4gICAgICAgIGZvciAobGV0IGM9MDsgYyA8IHRoaXMudmVydGV4X2xheW91dC5jb21wb25lbnRzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChbLi4udGhpcy52ZXJ0ZXhfbGF5b3V0LmNvbXBvbmVudHNbY11dKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZlcnRleF9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMucmVhbGxvY19jb3VudCA9IDA7XG4gICAgICAgIHRoaXMuc2V0QnVmZmVyVmlld3MoKTtcbiAgICB9XG5cbiAgICAvLyAoUmUtKWFsbG9jYXRlIHR5cGVkIHZpZXdzIGludG8gdGhlIG1haW4gYnVmZmVyIC0gb25seSBjcmVhdGUgdGhlIHR5cGVzIHdlIG5lZWQgZm9yIHRoaXMgbGF5b3V0XG4gICAgc2V0QnVmZmVyVmlld3MgKCkge1xuICAgICAgICB0aGlzLnZpZXdzID0ge307XG4gICAgICAgIHRoaXMudmlld3NbZ2wuVU5TSUdORURfQllURV0gPSB0aGlzLnZlcnRleF9idWZmZXI7XG4gICAgICAgIGZvciAobGV0IGE9MDsgYSA8IHRoaXMudmVydGV4X2xheW91dC5hdHRyaWJzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWIgPSB0aGlzLnZlcnRleF9sYXlvdXQuYXR0cmlic1thXTtcblxuICAgICAgICAgICAgLy8gTmVlZCB2aWV3IGZvciB0aGlzIHR5cGU/XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3c1thdHRyaWIudHlwZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBhcnJheV90eXBlID0gYXJyYXlfdHlwZXNbYXR0cmliLnR5cGVdO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3NbYXR0cmliLnR5cGVdID0gbmV3IGFycmF5X3R5cGUodGhpcy52ZXJ0ZXhfYnVmZmVyLmJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IGJ1ZmZlciBwb2ludGVyc1xuICAgICAgICBmb3IgKGxldCBjPTA7IGMgPCB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjXTtcbiAgICAgICAgICAgIGNvbXBvbmVudFsxXSA9IHRoaXMudmlld3NbY29tcG9uZW50WzBdXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGFsbG9jYXRlZCBidWZmZXIgc2l6ZSwgZXhwYW5kL3JlYWxsb2MgYnVmZmVyIGlmIG5lZWRlZFxuICAgIGNoZWNrQnVmZmVyU2l6ZSAoKSB7XG4gICAgICAgIGlmICgodGhpcy5vZmZzZXQgKyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlKSA+IHRoaXMuYnl0ZV9sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IE1hdGguZmxvb3IodGhpcy5zaXplICogMS41KTtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSAtPSB0aGlzLnNpemUgJSA0O1xuICAgICAgICAgICAgdGhpcy5ieXRlX2xlbmd0aCA9IHRoaXMudmVydGV4X2xheW91dC5zdHJpZGUgKiB0aGlzLnNpemU7XG4gICAgICAgICAgICB2YXIgbmV3X3ZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLmJ5dGVfbGVuZ3RoKTtcbiAgICAgICAgICAgIG5ld192aWV3LnNldCh0aGlzLnZlcnRleF9idWZmZXIpOyAvLyBjb3B5IGV4aXN0aW5nIGRhdGEgdG8gbmV3IGJ1ZmZlclxuICAgICAgICAgICAgVmVydGV4RGF0YS5hcnJheV9wb29sLnB1c2godGhpcy52ZXJ0ZXhfYnVmZmVyKTsgLy8gc2F2ZSBwcmV2aW91cyBidWZmZXIgZm9yIHVzZSBieSBuZXh0IHRpbGVcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IG5ld192aWV3O1xuICAgICAgICAgICAgdGhpcy5zZXRCdWZmZXJWaWV3cygpO1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jX2NvdW50Kys7XG4gICAgICAgICAgICAvLyBsb2coJ2luZm8nLCBgVmVydGV4RGF0YTogZXhwYW5kZWQgdmVydGV4IGJsb2NrIHRvICR7dGhpcy5zaXplfSB2ZXJ0aWNlc2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgdmVydGV4LCBjb3BpZWQgZnJvbSBhIHBsYWluIEpTIGFycmF5IG9mIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAvLyBOb3RlOiB1c2VzIHByZS1jYWxjdWxhdGVkIGluZm8gYWJvdXQgZWFjaCBhdHRyaWJ1dGUsIGluY2x1ZGluZyBwb2ludGVyIHRvIGFwcHJvcHJpYXRlIHR5cGVkIGFycmF5XG4gICAgLy8gdmlldyBhbmQgb2Zmc2V0IGludG8gaXQuIFRoaXMgd2FzIHRoZSBmYXN0ZXN0IG1ldGhvZCBwcm9maWxlZCBzbyBmYXIgZm9yIGZpbGxpbmcgYSBtaXhlZC10eXBlXG4gICAgLy8gdmVydGV4IGxheW91dCAodGhvdWdoIHN0aWxsIHNsb3dlciB0aGFuIHRoZSBwcmV2aW91cyBtZXRob2QgdGhhdCBvbmx5IHN1cHBvcnRlZCBGbG9hdDMyQXJyYXkgYXR0cmlidXRlcykuXG4gICAgYWRkVmVydGV4ICh2ZXJ0ZXgpIHtcbiAgICAgICAgdGhpcy5jaGVja0J1ZmZlclNpemUoKTtcbiAgICAgICAgdmFyIGk9MDtcblxuICAgICAgICB2YXIgY2xlbiA9IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGM9MDsgYyA8IGNsZW47IGMrKykge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjXTtcbiAgICAgICAgICAgIGNvbXBvbmVudFsxXVsodGhpcy5vZmZzZXQgPj4gY29tcG9uZW50WzJdKSArIGNvbXBvbmVudFszXV0gPSB2ZXJ0ZXhbaSsrXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IHRoaXMudmVydGV4X2xheW91dC5zdHJpZGU7XG4gICAgICAgIHRoaXMudmVydGV4X2NvdW50Kys7XG4gICAgfVxuXG4gICAgLy8gRmluYWxpemUgdmVydGV4IGJ1ZmZlciBmb3IgdXNlIGluIGNvbnN0cnVjdGluZyBhIG1lc2hcbiAgICBlbmQgKCkge1xuICAgICAgICAvLyBDbGlwIHRoZSBidWZmZXIgdG8gc2l6ZSB1c2VkIGZvciB0aGlzIFZCT1xuICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSB0aGlzLnZlcnRleF9idWZmZXIuc3ViYXJyYXkoMCwgdGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLmVsZW1lbnRfYnVmZmVyID0gdGhpcy52ZXJ0ZXhfZWxlbWVudHMuZW5kKCk7XG5cbiAgICAgICAgbG9nKCd0cmFjZScsIGBWZXJ0ZXhEYXRhOiAke3RoaXMuc2l6ZX0gdmVydGljZXMgdG90YWwsIHJlYWxsb2MgY291bnQgJHt0aGlzLnJlYWxsb2NfY291bnR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG59XG5cblZlcnRleERhdGEuYXJyYXlfcG9vbCA9IFtdOyAvLyBwb29sIG9mIGN1cnJlbnRseSBhdmFpbGFibGUgKHByZXZpb3VzbHkgdXNlZCkgYnVmZmVycyAodWludDgpXG4iLCJpbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG5sZXQgTUFYX1ZBTFVFID0gTWF0aC5wb3coMiwgMTYpIC0gMTtcbmxldCBVaW50MzJfZmxhZyA9IGZhbHNlO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJ0ZXhFbGVtZW50cyB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLmFycmF5ID0gW107XG4gICAgICAgIHRoaXMuaGFzX292ZXJmbG93biA9IGZhbHNlO1xuICAgIH1cbiAgICBwdXNoICh2YWx1ZSkge1xuICAgICAgICAvLyBJZiB2YWx1ZXMgaGF2ZSBvdmVyZmxvd24gYW5kIG5vIFVpbnQzMiBvcHRpb24gaXMgYXZhaWxhYmxlLCBkbyBub3QgcHVzaCB2YWx1ZXNcbiAgICAgICAgaWYgKHRoaXMuaGFzX292ZXJmbG93biAmJiAhVWludDMyX2ZsYWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgb3ZlcmZsb3cgaWYgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIFVpbnQxNiBtYXhcbiAgICAgICAgaWYgKHZhbHVlID4gTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCFVaW50MzJfZmxhZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVuZCAoKSB7XG4gICAgICAgIGlmICh0aGlzLmFycmF5Lmxlbmd0aCl7XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gY3JlYXRlQnVmZmVyKHRoaXMuYXJyYXksIHRoaXMuaGFzX292ZXJmbG93bik7XG4gICAgICAgICAgICB0aGlzLmFycmF5ID0gW107XG4gICAgICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblZlcnRleEVsZW1lbnRzLnNldFVpbnQzMkZsYWcgPSBmdW5jdGlvbihmbGFnKSB7XG4gICAgVWludDMyX2ZsYWcgPSBmbGFnO1xufTtcblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyKGFycmF5LCBvdmVyZmxvd24pIHtcbiAgICB2YXIgdHlwZWRBcnJheSA9IChvdmVyZmxvd24gJiYgVWludDMyX2ZsYWcpID8gVWludDMyQXJyYXkgOiBVaW50MTZBcnJheTtcbiAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXkoYXJyYXkpO1xufVxuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdWZXJ0ZXhFbGVtZW50cycsIFZlcnRleEVsZW1lbnRzKTtcbiIsImltcG9ydCBnbCBmcm9tICcuL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVmVydGV4RGF0YSBmcm9tICcuL3ZlcnRleF9kYXRhJztcblxuLy8gRGVzY3JpYmVzIGEgdmVydGV4IGxheW91dCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggbWFueSBkaWZmZXJlbnQgR0wgcHJvZ3JhbXMuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJ0ZXhMYXlvdXQge1xuICAgIC8vIEF0dHJpYnMgYXJlIGFuIGFycmF5LCBpbiBsYXlvdXQgb3JkZXIsIG9mOiBuYW1lLCBzaXplLCB0eXBlLCBub3JtYWxpemVkXG4gICAgLy8gZXg6IHsgbmFtZTogJ3Bvc2l0aW9uJywgc2l6ZTogMywgdHlwZTogZ2wuRkxPQVQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH1cbiAgICBjb25zdHJ1Y3RvciAoYXR0cmlicykge1xuICAgICAgICB0aGlzLmF0dHJpYnMgPSBhdHRyaWJzOyAvLyBhcnJheSBvZiBhdHRyaWJ1dGVzLCBzcGVjaWZpZWQgYXMgc3RhbmRhcmQgR0wgYXR0cmliIG9wdGlvbnNcbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gW107ICAgLy8gbGlzdCBvZiB0eXBlIGFuZCBvZmZzZXQgaW5mbyBhYm91dCBlYWNoIGF0dHJpYnV0ZSBjb21wb25lbnRcbiAgICAgICAgdGhpcy5pbmRleCA9IHt9OyAgICAgICAgLy8gbGluZWFyIGJ1ZmZlciBpbmRleCBvZiBlYWNoIGF0dHJpYnV0ZSBjb21wb25lbnQsIGUuZy4gdGhpcy5pbmRleC5wb3NpdGlvbi54XG5cbiAgICAgICAgLy8gQ2FsYyB2ZXJ0ZXggc3RyaWRlXG4gICAgICAgIHRoaXMuc3RyaWRlID0gMDtcblxuICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICBmb3IgKGxldCBhPTA7IGEgPCB0aGlzLmF0dHJpYnMubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgIGxldCBhdHRyaWIgPSB0aGlzLmF0dHJpYnNbYV07XG4gICAgICAgICAgICBhdHRyaWIub2Zmc2V0ID0gdGhpcy5zdHJpZGU7XG4gICAgICAgICAgICBhdHRyaWIuYnl0ZV9zaXplID0gYXR0cmliLnNpemU7XG4gICAgICAgICAgICB2YXIgc2hpZnQgPSAwO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGF0dHJpYi50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5GTE9BVDpcbiAgICAgICAgICAgICAgICBjYXNlIGdsLklOVDpcbiAgICAgICAgICAgICAgICBjYXNlIGdsLlVOU0lHTkVEX0lOVDpcbiAgICAgICAgICAgICAgICAgICAgYXR0cmliLmJ5dGVfc2l6ZSAqPSA0O1xuICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgZ2wuU0hPUlQ6XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5VTlNJR05FRF9TSE9SVDpcbiAgICAgICAgICAgICAgICAgICAgYXR0cmliLmJ5dGVfc2l6ZSAqPSAyO1xuICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3JjZSA0LWJ5dGUgYWxpZ25tZW50IG9uIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIHRoaXMuc3RyaWRlICs9IGF0dHJpYi5ieXRlX3NpemU7XG4gICAgICAgICAgICBpZiAodGhpcy5zdHJpZGUgJiAzKSB7IC8vIHBhZCB0byBtdWx0aXBsZSBvZiA0IGJ5dGVzXG4gICAgICAgICAgICAgICAgdGhpcy5zdHJpZGUgKz0gNCAtICh0aGlzLnN0cmlkZSAmIDMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgaW5mbyB0byBsaXN0IG9mIGF0dHJpYnV0ZSBjb21wb25lbnRzXG4gICAgICAgICAgICAvLyBVc2VkIHRvIGJ1aWxkIHRoZSB2ZXJ0ZXggZGF0YSwgcHJvdmlkZXMgcG9pbnRlcnMgYW5kIG9mZnNldHMgaW50byBlYWNoIHR5cGVkIGFycmF5IHZpZXdcbiAgICAgICAgICAgIC8vIEVhY2ggY29tcG9uZW50IGlzIGFuIGFycmF5IG9mOlxuICAgICAgICAgICAgLy8gW0dMIGF0dHJpYiB0eXBlLCBwb2ludGVyIHRvIHR5cGVkIGFycmF5IHZpZXcsIGJpdHMgdG8gc2hpZnQgcmlnaHQgdG8gZGV0ZXJtaW5lIGJ1ZmZlciBvZmZzZXQsIGFkZGl0aW9uYWwgYnVmZmVyIG9mZnNldCBmb3IgdGhlIGNvbXBvbmVudF1cbiAgICAgICAgICAgIHZhciBvZmZzZXRfdHlwZWQgPSBhdHRyaWIub2Zmc2V0ID4+IHNoaWZ0O1xuICAgICAgICAgICAgaWYgKGF0dHJpYi5zaXplID4gMSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHM9MDsgcyA8IGF0dHJpYi5zaXplOyBzKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goW2F0dHJpYi50eXBlLCBudWxsLCBzaGlmdCwgb2Zmc2V0X3R5cGVkKytdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChbYXR0cmliLnR5cGUsIG51bGwsIHNoaWZ0LCBvZmZzZXRfdHlwZWRdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJvdmlkZSBhbiBpbmRleCBpbnRvIHRoZSB2ZXJ0ZXggZGF0YSBidWZmZXIgZm9yIGVhY2ggYXR0cmlidXRlIGNvbXBvbmVudFxuICAgICAgICAgICAgdGhpcy5pbmRleFthdHRyaWIubmFtZV0gPSBjb3VudDtcbiAgICAgICAgICAgIGNvdW50ICs9IGF0dHJpYi5zaXplO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgYSB2ZXJ0ZXggbGF5b3V0IGZvciBhIHNwZWNpZmljIEdMIHByb2dyYW1cbiAgICAvLyBBc3N1bWVzIHRoYXQgdGhlIGRlc2lyZWQgdmVydGV4IGJ1ZmZlciAoVkJPKSBpcyBhbHJlYWR5IGJvdW5kXG4gICAgLy8gSWYgYSBnaXZlbiBwcm9ncmFtIGRvZXNuJ3QgaW5jbHVkZSBhbGwgYXR0cmlidXRlcywgaXQgY2FuIHN0aWxsIHVzZSB0aGUgdmVydGV4IGxheW91dFxuICAgIC8vIHRvIHJlYWQgdGhvc2UgYXR0cmlicyB0aGF0IGl0IGRvZXMgcmVjb2duaXplLCB1c2luZyB0aGUgYXR0cmliIG9mZnNldHMgdG8gc2tpcCBvdGhlcnMuXG4gICAgZW5hYmxlIChnbCwgcHJvZ3JhbSwgZm9yY2UpXG4gICAge1xuICAgICAgICB2YXIgYXR0cmliLCBsb2NhdGlvbjtcblxuICAgICAgICAvLyBFbmFibGUgYWxsIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbGF5b3V0XG4gICAgICAgIGZvciAodmFyIGE9MDsgYSA8IHRoaXMuYXR0cmlicy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgYXR0cmliID0gdGhpcy5hdHRyaWJzW2FdO1xuICAgICAgICAgICAgbG9jYXRpb24gPSBwcm9ncmFtLmF0dHJpYnV0ZShhdHRyaWIubmFtZSkubG9jYXRpb247XG5cbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIVZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dIHx8IGZvcmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihsb2NhdGlvbiwgYXR0cmliLnNpemUsIGF0dHJpYi50eXBlLCBhdHRyaWIubm9ybWFsaXplZCwgdGhpcy5zdHJpZGUsIGF0dHJpYi5vZmZzZXQpO1xuICAgICAgICAgICAgICAgIFZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dID0gcHJvZ3JhbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgYW55IHByZXZpb3VzbHkgYm91bmQgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBmb3IgdGhpcyBsYXlvdXRcbiAgICAgICAgZm9yIChsb2NhdGlvbiBpbiBWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGUoZ2wsIGxvY2F0aW9uLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpc2FibGUgYW4gYXR0cmlidXRlIGlmIGl0IHdhcyBub3QgZW5hYmxlZCBmb3IgdGhlIHNwZWNpZmllZCBwcm9ncmFtXG4gICAgLy8gTk9URTogdGhpcyB3YXMgbW92ZWQgb3V0IG9mIHRoZSBpbm5lciBsb29wIGluIGVuYWJsZSgpIHRvIGFzc2lzdCB3L1ZNIG9wdGltaXphdGlvblxuICAgIGRpc2FibGVVbnVzZWRBdHRyaWJ1dGUgKGdsLCBsb2NhdGlvbiwgcHJvZ3JhbSkge1xuICAgICAgICBpZiAoVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl0gIT09IHByb2dyYW0pIHtcbiAgICAgICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XG4gICAgICAgICAgICBkZWxldGUgVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVWZXJ0ZXhEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZXJ0ZXhEYXRhKHRoaXMpO1xuICAgIH1cblxufVxuXG4vLyBUcmFjayBjdXJyZW50bHkgZW5hYmxlZCBhdHRyaWJzLCBieSB0aGUgcHJvZ3JhbSB0aGV5IGFyZSBib3VuZCB0b1xuLy8gU3RhdGljIGNsYXNzIHByb3BlcnR5IHRvIHJlZmxlY3QgZ2xvYmFsIEdMIHN0YXRlXG5WZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzID0ge307XG4iLCJpbXBvcnQgUmVwZWF0R3JvdXAgZnJvbSAnLi9yZXBlYXRfZ3JvdXAnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG52YXIgQ29sbGlzaW9uO1xuXG5leHBvcnQgZGVmYXVsdCBDb2xsaXNpb24gPSB7XG5cbiAgICB0aWxlczoge30sXG5cbiAgICBzdGFydFRpbGUgKHRpbGUpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy50aWxlc1t0aWxlXSA9IHtcbiAgICAgICAgICAgIGJib3hlczogeyAgICAgICAgICAgLy8gY3VycmVudCBzZXQgb2YgcGxhY2VkIGJvdW5kaW5nIGJveGVzXG4gICAgICAgICAgICAgICAgYWFiYjogW10sXG4gICAgICAgICAgICAgICAgb2JiOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9iamVjdHM6IHt9LCAgICAgICAgLy8gb2JqZWN0cyB0byBjb2xsaWRlLCBncm91cGVkIGJ5IHByaW9yaXR5LCB0aGVuIGJ5IHN0eWxlXG4gICAgICAgICAgICBrZWVwOiB7fSwgICAgICAgICAgIC8vIG9iamVjdHMgdGhhdCB3ZXJlIGtlcHQgYWZ0ZXIgY29sbGlzaW9uLCBncm91cGVkIGJ5IHN0eWxlXG4gICAgICAgICAgICBzdHlsZXM6IHt9ICAgICAgICAgIC8vIHN0eWxlcyBjb250cmlidXRpbmcgY29sbGlzaW9uIG9iamVjdHNcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBQcm9taXNlIHJlc29sdmVkIHdoZW4gYWxsIHJlZ2lzdGVyZWQgc3R5bGVzIGhhdmUgYWRkZWQgb2JqZWN0c1xuICAgICAgICBzdGF0ZS5jb21wbGV0ZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgcmVzZXRUaWxlICh0aWxlKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzdHlsZSB0byB0aGUgcGVuZGluZyBzZXQsIGNvbGxpc2lvbiB3aWxsIGJsb2NrIG9uIGFsbCBzdHlsZXMgc3VibWl0dGluZyB0byBjb2xsaXNpb24gc2V0XG4gICAgYWRkU3R5bGUgKHN0eWxlLCB0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZXNbdGlsZV0uc3R5bGVzW3N0eWxlXSA9IHRydWU7XG4gICAgfSxcblxuICAgIC8vIEFkZCBjb2xsaXNpb24gb2JqZWN0cyBmb3IgYSBzdHlsZVxuICAgIGNvbGxpZGUgKG9iamVjdHMsIHN0eWxlLCB0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCAnQ29sbGlzaW9uLmNvbGxpZGUoKSBjYWxsZWQgd2l0aCBudWxsIHRpbGUnLCB0aWxlLCB0aGlzLnRpbGVzLCBzdHlsZSwgb2JqZWN0cyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdyb3VwIGJ5IHByaW9yaXR5IGFuZCBzdHlsZVxuICAgICAgICBsZXQgdGlsZV9vYmplY3RzID0gc3RhdGUub2JqZWN0cztcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG9iaiA9IG9iamVjdHNbaV07XG4gICAgICAgICAgICBsZXQgcHJpb3JpdHkgPSBvYmoubGFiZWwubGF5b3V0LnByaW9yaXR5O1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XSA9IHRpbGVfb2JqZWN0c1twcmlvcml0eV0gfHwge307XG4gICAgICAgICAgICB0aWxlX29iamVjdHNbcHJpb3JpdHldW3N0eWxlXSA9IHRpbGVfb2JqZWN0c1twcmlvcml0eV1bc3R5bGVdIHx8IFtdO1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XVtzdHlsZV0ucHVzaChvYmopO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gcGVuZGluZyBzdHlsZSBzZXQsIGlmIG5vIG1vcmUgc3R5bGVzLCBkbyBjb2xsaXNpb24gJiBmaW5pc2ggdGlsZVxuICAgICAgICBkZWxldGUgc3RhdGUuc3R5bGVzW3N0eWxlXTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN0YXRlLnN0eWxlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVuZFRpbGUodGlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXYWl0IGZvciBvYmplY3RzIHRvIGJlIGFkZGVkIGZyb20gYWxsIHN0eWxlc1xuICAgICAgICByZXR1cm4gc3RhdGUuY29tcGxldGUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUua2VlcFtzdHlsZV0gfHwgW107XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBUZXN0IGxhYmVscyBmb3IgY29sbGlzaW9ucywgaGlnaGVyIHRvIGxvd2VyIHByaW9yaXR5XG4gICAgLy8gV2hlbiB0d28gY29sbGlkZSwgZGlzY2FyZCB0aGUgbG93ZXItcHJpb3JpdHkgbGFiZWxcbiAgICBlbmRUaWxlICh0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIGxldCBrZWVwID0gc3RhdGUua2VlcDtcblxuICAgICAgICBSZXBlYXRHcm91cC5jbGVhcih0aWxlKTtcblxuICAgICAgICAvLyBQcm9jZXNzIGxhYmVscyBieSBwcmlvcml0eSwgdGhlbiBieSBzdHlsZVxuICAgICAgICBsZXQgcHJpb3JpdGllcyA9IE9iamVjdC5rZXlzKHN0YXRlLm9iamVjdHMpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgcHJpb3JpdGllcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgbGV0IHN0eWxlX29iamVjdHMgPSBzdGF0ZS5vYmplY3RzW3ByaW9yaXRpZXNbcF1dO1xuICAgICAgICAgICAgaWYgKCFzdHlsZV9vYmplY3RzKSB7IC8vIG5vIGxhYmVscyBhdCB0aGlzIHByaW9yaXR5LCBza2lwIHRvIG5leHRcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yIGVhY2ggc3R5bGVcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHN0eWxlX29iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgb2JqZWN0cyA9IHN0eWxlX29iamVjdHNbc3R5bGVdO1xuICAgICAgICAgICAgICAgIGtlZXBbc3R5bGVdID0ga2VlcFtzdHlsZV0gfHwgW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iamVjdCA9IG9iamVjdHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkJlUGxhY2VkKG9iamVjdCwgdGlsZSwgb2JqZWN0LmxpbmtlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgb2JqZWN0IGlmIGl0IGlzbid0IGRlcGVuZGVudCBvbiBhIHBhcmVudCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2JqZWN0LmxpbmtlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBbc3R5bGVdLnB1c2gob2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlKG9iamVjdCwgdGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBvYmplY3QgaXMgZGVwZW5kZW50IG9uIGEgcGFyZW50LCBvbmx5IGtlZXAgaWYgYm90aCBjYW4gYmUgcGxhY2VkXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmNhbkJlUGxhY2VkKG9iamVjdC5saW5rZWQsIHRpbGUsIG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwW3N0eWxlXS5wdXNoKG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZShvYmplY3QsIHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2Uob2JqZWN0LmxpbmtlZCwgdGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy50aWxlc1t0aWxlXTtcbiAgICAgICAgc3RhdGUucmVzb2x2ZSgpO1xuICAgIH0sXG5cbiAgICAvLyBSdW4gY29sbGlzaW9uIGFuZCByZXBlYXQgY2hlY2sgdG8gc2VlIGlmIGxhYmVsIGNhbiBjdXJyZW50bHkgYmUgcGxhY2VkXG4gICAgY2FuQmVQbGFjZWQgKG9iamVjdCwgdGlsZSwgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgbGV0IGxhYmVsID0gb2JqZWN0LmxhYmVsO1xuICAgICAgICBsZXQgbGF5b3V0ID0gb2JqZWN0LmxhYmVsLmxheW91dDtcblxuICAgICAgICAvLyBTa2lwIGlmIGFscmVhZHkgcHJvY2Vzc2VkIChlLmcuIGJ5IHBhcmVudCBvYmplY3QpXG4gICAgICAgIGlmIChsYWJlbC5wbGFjZWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnBsYWNlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRlc3QgdGhlIGxhYmVsIGZvciBpbnRlcnNlY3Rpb25zIHdpdGggb3RoZXIgbGFiZWxzIGluIHRoZSB0aWxlXG4gICAgICAgIGxldCBiYm94ZXMgPSB0aGlzLnRpbGVzW3RpbGVdLmJib3hlcztcbiAgICAgICAgaWYgKCFsYXlvdXQuY29sbGlkZSB8fCAhbGFiZWwuZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUgJiYgZXhjbHVkZS5sYWJlbCkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciByZXBlYXRzXG4gICAgICAgICAgICBsZXQgcmVwZWF0ID0gUmVwZWF0R3JvdXAuY2hlY2sobGFiZWwsIGxheW91dCwgdGlsZSk7XG4gICAgICAgICAgICBpZiAocmVwZWF0KSB7XG4gICAgICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsIGBkaXNjYXJkIGxhYmVsICcke2xhYmVsLnRleHR9JywgKG9uZV9wZXJfZ3JvdXA6ICR7cmVwZWF0Lm9uZV9wZXJfZ3JvdXB9KSwgZGlzdCAke01hdGguc3FydChyZXBlYXQuZGlzdF9zcSkvbGF5b3V0LnVuaXRzX3Blcl9waXhlbH0gPCAke01hdGguc3FydChyZXBlYXQucmVwZWF0X2Rpc3Rfc3EpL2xheW91dC51bml0c19wZXJfcGl4ZWx9YCk7XG4gICAgICAgICAgICAgICAgbGFiZWwucGxhY2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsYXlvdXQuY29sbGlkZSkge1xuICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsIGBkaXNjYXJkIGxhYmVsICcke2xhYmVsLnRleHR9JyBkdWUgdG8gY29sbGlzaW9uYCk7XG4gICAgICAgICAgICBsYWJlbC5wbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWwucGxhY2VkO1xuICAgIH0sXG5cbiAgICAvLyBQbGFjZSBsYWJlbFxuICAgIHBsYWNlICh7IGxhYmVsIH0sIHRpbGUpIHtcbiAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IHByb2Nlc3NlZCAoZS5nLiBieSBwYXJlbnQgb2JqZWN0KVxuICAgICAgICBpZiAobGFiZWwucGxhY2VkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlZ2lzdGVyIGFzIHBsYWNlZCBmb3IgZnV0dXJlIGNvbGxpc2lvbiBhbmQgcmVwZWF0IGN1bGxpbmdcbiAgICAgICAgUmVwZWF0R3JvdXAuYWRkKGxhYmVsLCBsYWJlbC5sYXlvdXQsIHRpbGUpO1xuICAgICAgICBsYWJlbC5hZGQodGhpcy50aWxlc1t0aWxlXS5iYm94ZXMpO1xuICAgIH1cblxufTtcbiIsIlxuLy8gRG8gQUFCQiBgYWAgYW5kIGBiYCBpbnRlcnNlY3Q/XG5leHBvcnQgZnVuY3Rpb24gYm94SW50ZXJzZWN0c0JveCAoYSwgYikge1xuICAgIGlmIChhWzJdIDwgYlswXSB8fCAvLyBhIGlzIGxlZnQgb2YgYlxuICAgICAgICBhWzBdID4gYlsyXSB8fCAvLyBhIGlzIHJpZ2h0IG9mIGJcbiAgICAgICAgYVszXSA8IGJbMV0gfHwgLy8gYSBpcyBhYm92ZSBiXG4gICAgICAgIGFbMV0gPiBiWzNdKSB7IC8vIGEgaXMgYmVsb3cgYlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlOyAvLyBib3hlcyBvdmVybGFwXG59XG5cbi8vIERvZXMgQUFCQiBgYWAgaW50ZXJzZWN0IGFueSBvZiB0aGUgQUFCQnMgaW4gYXJyYXkgYGJveGVzYD9cbi8vIEludm9rZXMgYGNhbGxiYWNrYCB3aXRoIGluZGV4IG9mIGludGVyc2VjdGluZyBib3hcbi8vIFN0b3BzIGludGVyc2VjdGluZyBpZiBgY2FsbGJhY2tgIHJldHVybnMgbm9uLW51bGwgdmFsdWUgKGNvbnRpbnVlcyBvdGhlcndpc2UpXG5leHBvcnQgZnVuY3Rpb24gYm94SW50ZXJzZWN0c0xpc3QgKGEsIGJveGVzLCBjYWxsYmFjaykge1xuICAgIGZvciAobGV0IGk9MDsgaSA8IGJveGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChib3hJbnRlcnNlY3RzQm94KGEsIGJveGVzW2ldKSkge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKGkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBQb2ludEFuY2hvciBmcm9tICcuL3BvaW50X2FuY2hvcic7XG5pbXBvcnQge2JveEludGVyc2VjdHNMaXN0fSBmcm9tICcuL2ludGVyc2VjdCc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuLy8gaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc2l6ZSwgbGF5b3V0ID0ge30pIHtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmFuY2hvciA9IEFycmF5LmlzQXJyYXkodGhpcy5sYXlvdXQuYW5jaG9yKSA/IHRoaXMubGF5b3V0LmFuY2hvclswXSA6IHRoaXMubGF5b3V0LmFuY2hvcjsgLy8gaW5pdGlhbCBhbmNob3JcbiAgICAgICAgdGhpcy5wbGFjZWQgPSBudWxsO1xuICAgICAgICB0aGlzLm9mZnNldCA9IGxheW91dC5vZmZzZXQ7XG4gICAgICAgIHRoaXMuYWFiYiA9IG51bGw7XG4gICAgICAgIHRoaXMub2JiID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICB0aGlzLnRocm93X2F3YXkgPSBmYWxzZTsgICAgLy8gaWYgbGFiZWwgZG9lcyBub3QgZml0IChleGNlZWRzIHRpbGUgYm91bmRhcnksIGV0YykgdGhpcyBib29sZWFuIHdpbGwgYmUgdHJ1ZVxuICAgIH1cblxuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIHRoaXMuYWxpZ24gPSB0aGlzLmxheW91dC5hbGlnbiB8fCBQb2ludEFuY2hvci5hbGlnbkZvckFuY2hvcih0aGlzLmFuY2hvcik7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgZm9yIG92ZXJsYXBzIHdpdGggb3RoZXIgbGFiZWxzIGluIHRoZSB0aWxlXG4gICAgb2NjbHVkZWQgKGJib3hlcywgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgbGV0IGludGVyc2VjdCA9IGZhbHNlO1xuICAgICAgICBsZXQgYWFiYnMgPSBiYm94ZXMuYWFiYjtcbiAgICAgICAgbGV0IG9iYnMgPSBiYm94ZXMub2JiO1xuXG4gICAgICAgIC8vIEJyb2FkIHBoYXNlXG4gICAgICAgIGlmIChhYWJicy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBib3hJbnRlcnNlY3RzTGlzdCh0aGlzLmFhYmIsIGFhYmJzLCAoaikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBicm9hZCBwaGFzZSBjb2xsaWRlJywgdGhpcy5sYXlvdXQuaWQsIHRoaXMsIHRoaXMuYWFiYiwgYWFiYnNbal0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBjb2xsaWRpbmcgd2l0aCBleGNsdWRlZCBsYWJlbFxuICAgICAgICAgICAgICAgIGlmIChleGNsdWRlICYmIGFhYmJzW2pdID09PSBleGNsdWRlLmFhYmIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsICdjb2xsaXNpb246IHNraXBwaW5nIGR1ZSB0byBleHBsaWNpdCBleGNsdXNpb24nLCB0aGlzLCBleGNsdWRlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNraXAgbmFycm93IHBoYXNlIGNvbGxpc2lvbiBpZiBubyByb3RhdGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9iYi5hbmdsZSA9PT0gMCAmJiBvYmJzW2pdLmFuZ2xlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBza2lwIG5hcnJvdyBwaGFzZSBjb2xsaWRlIGJlY2F1c2UgbmVpdGhlciBpcyByb3RhdGVkJywgdGhpcy5sYXlvdXQuaWQsIHRoaXMsIHRoaXMub2JiLCBvYmJzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTmFycm93IHBoYXNlXG4gICAgICAgICAgICAgICAgaWYgKE9CQi5pbnRlcnNlY3QodGhpcy5vYmIsIG9iYnNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBuYXJyb3cgcGhhc2UgY29sbGlkZScsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLm9iYiwgb2Jic1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGludGVyc2VjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnRlcnNlY3Q7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoaXMgbGFiZWwncyBib3VuZGluZyBib3ggdG8gdGhlIHByb3ZpZGVkIHNldFxuICAgIGFkZCAoYmJveGVzKSB7XG4gICAgICAgIHRoaXMucGxhY2VkID0gdHJ1ZTtcbiAgICAgICAgYmJveGVzLmFhYmIucHVzaCh0aGlzLmFhYmIpO1xuICAgICAgICBiYm94ZXMub2JiLnB1c2godGhpcy5vYmIpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrcyB3aGV0aGVyIHRoZSBsYWJlbCBpcyB3aXRoaW4gdGhlIHRpbGUgYm91bmRhcmllc1xuICAgIGluVGlsZUJvdW5kcyAoKSB7XG4gICAgICAgIGxldCBtaW4gPSBbIHRoaXMuYWFiYlswXSwgdGhpcy5hYWJiWzFdIF07XG4gICAgICAgIGxldCBtYXggPSBbIHRoaXMuYWFiYlsyXSwgdGhpcy5hYWJiWzNdIF07XG5cbiAgICAgICAgaWYgKCFVdGlscy5wb2ludEluVGlsZShtaW4pIHx8ICFVdGlscy5wb2ludEluVGlsZShtYXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBXaGV0aGVyIHRoZSBsYWJlbCBzaG91bGQgYmUgZGlzY2FyZGVkXG4gICAgLy8gRGVwZW5kcyBvbiB3aGV0aGVyIGxhYmVsIG11c3QgZml0IGluIHRoZSB0aWxlIGJvdW5kcywgYW5kIGlmIHNvLCBjYW4gaXQgYmUgbW92ZWQgdG8gZml0IHRoZXJlXG4gICAgZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLnRocm93X2F3YXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm9jY2x1ZGVkKGJib3hlcywgZXhjbHVkZSk7XG4gICAgfVxufVxuXG5MYWJlbC5lcHNpbG9uID0gMC45OTk5OyAvLyB0b2xlcmFuY2UgYXJvdW5kIGNvbGxpc2lvbiBib3hlcywgcHJldmVudCBwZXJmZWN0bHkgYWRqYWNlbnQgb2JqZWN0cyBmcm9tIGNvbGxpZGluZ1xuIiwiaW1wb3J0IExhYmVsIGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuLi92ZWN0b3InO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuXG5jb25zdCBQTEFDRU1FTlQgPSB7XG4gICAgTUlEX1BPSU5UOiAwLFxuICAgIENPUk5FUjogMVxufTtcblxuY29uc3QgTUFYX0FOR0xFID0gTWF0aC5QSSAvIDI7ICAgICAgLy8gbWF4aW11bSBhbmdsZSBmb3IgYXJ0aWN1bGF0ZWQgbGFiZWxzXG5jb25zdCBMSU5FX0VYQ0VFRF9TVFJBSUdIVCA9IDAuNzsgICAvLyBtaW5pbWFsIHJhdGlvIGZvciBzdHJhaWdodCBsYWJlbHMgKGxhYmVsIGxlbmd0aCkgLyAobGluZSBsZW5ndGgpXG5jb25zdCBMSU5FX0VYQ0VFRF9LSU5LRUQgPSAwLjY7ICAgICAvLyBtaW5pbWFsIHJhdGlvIGZvciBraW5rZWQgbGFiZWxzXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYmVsTGluZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc2l6ZSwgbGluZXMsIGxheW91dCkge1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgICAgICAgdGhpcy5saW5lcyA9IGxpbmVzO1xuICAgICAgICB0aGlzLnNwYWNlX3dpZHRoID0gbGF5b3V0LnNwYWNlX3dpZHRoOyAvLyB3aWR0aCBvZiBzcGFjZSBmb3IgdGhlIGZvbnQgdXNlZFxuICAgICAgICB0aGlzLm51bV9zZWdtZW50cyA9IHNpemUubGVuZ3RoOyAvLyBudW1iZXIgb2YgbGFiZWwgc2VnbWVudHNcbiAgICAgICAgdGhpcy50b3RhbF9sZW5ndGggPSBzaXplLnJlZHVjZShmdW5jdGlvbihwcmV2LCBuZXh0KXsgcmV0dXJuIHByZXYgKyBuZXh0WzBdOyB9LCAwKSArIChzaXplLmxlbmd0aCAtIDEpICogdGhpcy5zcGFjZV93aWR0aDtcbiAgICAgICAgdGhpcy50b3RhbF9oZWlnaHQgPSBzaXplWzBdWzFdO1xuICAgICAgICB0aGlzLnBsYWNlbWVudCA9IChsYXlvdXQucGxhY2VtZW50ID09PSB1bmRlZmluZWQpID8gUExBQ0VNRU5ULk1JRF9QT0lOVCA6IGxheW91dC5wbGFjZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5raW5rX2luZGV4ID0gMDsgLy8gaW5kZXggYXQgd2hpY2ggYW4gYXJ0aWN1bGF0ZWQgbGFiZWwgd2lsbCBraW5rIChlLmcuLCAxIG1lYW5zIGEga2luayBfYWZ0ZXJfIHRoZSBmaXJzdCBzZWdtZW50KVxuICAgICAgICB0aGlzLnNwcmVhZF9mYWN0b3IgPSAwLjU7IC8vIHNwYWNlcyBvdXQgYWRqYWNlbnQgd29yZHMgdG8gcHJldmVudCBvdmVybGFwXG4gICAgICAgIHRoaXMuZml0bmVzcyA9IDA7IC8vIG1lYXN1cmUgb2YgcXVhbGl0eSBvZiBmaXRcblxuICAgICAgICAvLyBBcnJheXMgZm9yIExhYmVsIHByb3BlcnRpZXMuIFRPRE86IGNyZWF0ZSBhcnJheSBvZiBMYWJlbCB0eXBlcywgd2hlcmUgTGFiZWxMaW5lIGFjdHMgYXMgYSBcImdyb3VwZWQgbGFiZWxcIlxuICAgICAgICB0aGlzLnBvc2l0aW9uID0gW107XG4gICAgICAgIHRoaXMuYW5nbGUgPSBbXTtcbiAgICAgICAgdGhpcy5vZmZzZXRzID0gW107XG4gICAgICAgIHRoaXMub2JicyA9IFtdO1xuICAgICAgICB0aGlzLmFhYmJzID0gW107XG5cbiAgICAgICAgLy8gb3B0aW9uYWxseSBsaW1pdCB0aGUgbGluZSBzZWdtZW50cyB0aGF0IHRoZSBsYWJlbCBtYXkgYmUgcGxhY2VkIGluLCBieSBzcGVjaWZ5aW5nIGEgc2VnbWVudCBpbmRleCByYW5nZVxuICAgICAgICAvLyB1c2VkIGFzIGEgY29hcnNlIHN1YmRpdmlkZSBmb3IgcGxhY2luZyBtdWx0aXBsZSBsYWJlbHMgcGVyIGxpbmUgZ2VvbWV0cnlcbiAgICAgICAgdGhpcy5zZWdtZW50X2luZGV4ID0gbGF5b3V0LnNlZ21lbnRfaW5kZXggfHwgbGF5b3V0LnNlZ21lbnRfc3RhcnQgfHwgMDtcbiAgICAgICAgdGhpcy5zZWdtZW50X21heCA9IGxheW91dC5zZWdtZW50X2VuZCB8fCB0aGlzLmxpbmVzLmxlbmd0aDtcblxuICAgICAgICAvLyBGaXJzdCBmaXR0aW5nIHNlZ21lbnRcbiAgICAgICAgbGV0IHNlZ21lbnQgPSB0aGlzLmdldE5leHRGaXR0aW5nU2VnbWVudCh0aGlzLmdldEN1cnJlbnRTZWdtZW50KCkpO1xuICAgICAgICB0aGlzLnRocm93X2F3YXkgPSAoIXNlZ21lbnQpO1xuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGluZSBnZW9tZXRyeSBjcmVhdGluZyB0aGUgbmV4dCB2YWxpZCBsYWJlbC5cbiAgICBzdGF0aWMgbmV4dExhYmVsKGxhYmVsKSB7XG4gICAgICAgIC8vIGluY3JlbWVudCBzZWdtZW50XG4gICAgICAgIGxldCBoYXNOZXh0ID0gbGFiZWwuZ2V0TmV4dFNlZ21lbnQoKTtcbiAgICAgICAgaWYgKCFoYXNOZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbG9uZSBvcHRpb25zXG4gICAgICAgIGxldCBsYXlvdXQgPSBPYmplY3QuY3JlYXRlKGxhYmVsLmxheW91dCk7XG4gICAgICAgIGxheW91dC5zZWdtZW50X2luZGV4ID0gbGFiZWwuc2VnbWVudF9pbmRleDtcbiAgICAgICAgbGF5b3V0LnBsYWNlbWVudCA9IGxhYmVsLnBsYWNlbWVudDtcblxuICAgICAgICAvLyBjcmVhdGUgbmV3IGxhYmVsXG4gICAgICAgIGxldCBuZXh0TGFiZWwgPSBuZXcgTGFiZWxMaW5lKGxhYmVsLnNpemUsIGxhYmVsLmxpbmVzLCBsYXlvdXQpO1xuXG4gICAgICAgIHJldHVybiAobmV4dExhYmVsLnRocm93X2F3YXkpID8gZmFsc2UgOiBuZXh0TGFiZWw7XG4gICAgfVxuXG4gICAgLy8gU3RyYXRlZ3kgZm9yIHJldHVybmluZyB0aGUgbmV4dCBzZWdtZW50LiBBc3N1bWVzIGFuIFwib3JkZXJpbmdcIiBvZiBwb3NzaWJsZSBzZWdtZW50c1xuICAgIC8vIHRha2luZyBpbnRvIGFjY291bnQgYm90aCBzdHJhaWdodCBhbmQgYXJ0aWN1bGF0ZWQgc2VnbWVudHMuIFJldHVybnMgZmFsc2UgaWYgYWxsIHBvc3NpYmlsaXRpZXNcbiAgICAvLyBoYXZlIGJlZW4gZXhoYXVzdGVkXG4gICAgZ2V0TmV4dFNlZ21lbnQoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9IFBMQUNFTUVOVC5NSURfUE9JTlQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VnbWVudF9pbmRleCA+PSB0aGlzLmxpbmVzLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNpemUubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9IFBMQUNFTUVOVC5DT1JORVI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudF9pbmRleCsrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFNlZ21lbnQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIHRoZSBsaW5lIHNlZ21lbnRzIG5lY2Vzc2FyeSBmb3Igb3RoZXIgY2FsY3VsYXRpb25zIGF0IHRoZSBjdXJyZW50IGxpbmUgc2VnbWVudCBpbmRleC5cbiAgICAvLyBUaGlzIGlzIHRoZSBjdXJyZW50IGFuZCBuZXh0IHNlZ21lbnQgZm9yIGEgc3RyYWlnaHQgbGluZSwgYW5kIHRoZSBwcmV2aW91cywgY3VycmVudCBhbmQgbmV4dFxuICAgIC8vIGZvciBhbiBhcnRpY3VsYXRlZCBzZWdtZW50LlxuICAgIGdldEN1cnJlbnRTZWdtZW50KCkge1xuICAgICAgICBsZXQgcDEsIHAyLCBzZWdtZW50O1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgcDEgPSB0aGlzLmxpbmVzW3RoaXMuc2VnbWVudF9pbmRleCAtIDFdO1xuICAgICAgICAgICAgICAgIHAyID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXhdO1xuICAgICAgICAgICAgICAgIGxldCBwMyA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4ICsgMV07XG4gICAgICAgICAgICAgICAgc2VnbWVudCA9IFsgcDEsIHAyLCBwMyBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIHAxID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXhdO1xuICAgICAgICAgICAgICAgIHAyID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXggKyAxXTtcbiAgICAgICAgICAgICAgICBzZWdtZW50ID0gWyBwMSwgcDIgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWdtZW50O1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgbmV4dCBzZWdtZW50IHRoYXQgaXMgdmFsaWQgKHdpdGhpbiB0aWxlLCBpbnNpZGUgYW5nbGUgcmVxdWlyZW1lbnRzIGFuZCB3aXRoaW4gbGluZSBnZW9tZXRyeSkuXG4gICAgZ2V0TmV4dEZpdHRpbmdTZWdtZW50KHNlZ21lbnQpIHtcbiAgICAgICAgc2VnbWVudCA9IHNlZ21lbnQgfHwgdGhpcy5nZXROZXh0U2VnbWVudCgpO1xuICAgICAgICBpZiAoIXNlZ21lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRvZXNTZWdtZW50Rml0KHNlZ21lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5UaWxlQm91bmRzKCkgJiYgdGhpcy5pbkFuZ2xlQm91bmRzKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VnbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldE5leHRGaXR0aW5nU2VnbWVudCgpO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgY3VycmVudCBzZWdtZW50IGlzIHZhbGlkXG4gICAgZG9lc1NlZ21lbnRGaXQoc2VnbWVudCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZml0S2lua2VkU2VnbWVudChzZWdtZW50KTtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maXRTdHJhaWdodFNlZ21lbnQoc2VnbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGtpbmtlZCBzZWdtZW50IGlzIHZhbGlkXG4gICAgLy8gQ3ljbGVzIHRocm91Z2ggdmFyaW91cyB3YXlzIG9mIGtpbmtpbmcgdGhlIGxhYmVscyBhcm91bmQgdGhlIHNlZ21lbnQncyBwaXZvdCxcbiAgICAvLyBmaW5kaW5nIHRoZSBiZXN0IGZpdCwgYW5kIGRldGVybWluZXMgdGhlIGtpbmtfaW5kZXguXG4gICAgZml0S2lua2VkU2VnbWVudChzZWdtZW50KSB7XG4gICAgICAgIGxldCB1cHAgPSB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWw7XG5cbiAgICAgICAgbGV0IHAwcDEgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICBsZXQgcDFwMiA9IFZlY3Rvci5zdWIoc2VnbWVudFsxXSwgc2VnbWVudFsyXSk7XG5cbiAgICAgICAgLy8gRG9uJ3QgZml0IGlmIHNlZ21lbnQgZG9lc24ndCBwYXNzIHRoZSB2ZXJ0aWNhbCBsaW5lIHRlc3QsIHJlc3VsdGluZyBpbiB1cHNpZGUtZG93biBsYWJlbHNcbiAgICAgICAgaWYgKHAwcDFbMF0gKiBwMXAyWzBdIDwgMCAmJiBwMHAxWzFdICogcDFwMlsxXSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsaW5lX2xlbmd0aDEgPSBWZWN0b3IubGVuZ3RoKHAwcDEpIC8gdXBwO1xuICAgICAgICBsZXQgbGluZV9sZW5ndGgyID0gVmVjdG9yLmxlbmd0aChwMXAyKSAvIHVwcDtcblxuICAgICAgICAvLyBicmVhayB1cCBtdWx0aXBsZSBzZWdtZW50cyBpbnRvIHR3byBjaHVua3MgKE4tMSBvcHRpb25zKVxuICAgICAgICBsZXQgbGFiZWxfbGVuZ3RoMSA9IHRoaXMudG90YWxfbGVuZ3RoO1xuICAgICAgICBsZXQgbGFiZWxfbGVuZ3RoMiA9IDA7XG4gICAgICAgIGxldCB3aWR0aCwgZml0bmVzcyA9IDA7XG4gICAgICAgIGxldCBraW5rX2luZGV4ID0gdGhpcy5udW1fc2VnbWVudHMgLSAxO1xuICAgICAgICBsZXQgZml0bmVzc2VzID0gW107XG5cbiAgICAgICAgd2hpbGUgKGtpbmtfaW5kZXggPiAwKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuc2l6ZVtraW5rX2luZGV4XVswXSArIHRoaXMuc3BhY2Vfd2lkdGg7XG5cbiAgICAgICAgICAgIGxhYmVsX2xlbmd0aDEgLT0gd2lkdGg7XG4gICAgICAgICAgICBsYWJlbF9sZW5ndGgyICs9IHdpZHRoO1xuXG4gICAgICAgICAgICBmaXRuZXNzID0gTWF0aC5tYXgoY2FsY0ZpdG5lc3MobGluZV9sZW5ndGgxLCBsYWJlbF9sZW5ndGgxKSwgY2FsY0ZpdG5lc3MobGluZV9sZW5ndGgyLCBsYWJlbF9sZW5ndGgyKSk7XG4gICAgICAgICAgICBmaXRuZXNzZXMudW5zaGlmdChmaXRuZXNzKTtcblxuICAgICAgICAgICAga2lua19pbmRleC0tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1heF9maXRuZXNzID0gTWF0aC5tYXguYXBwbHkobnVsbCwgZml0bmVzc2VzKTtcblxuICAgICAgICBpZiAobWF4X2ZpdG5lc3MgPCBMSU5FX0VYQ0VFRF9LSU5LRUQpIHtcbiAgICAgICAgICAgIHRoaXMua2lua19pbmRleCA9IGZpdG5lc3Nlcy5pbmRleE9mKG1heF9maXRuZXNzKSArIDE7XG4gICAgICAgICAgICB0aGlzLmZpdG5lc3MgPSBtYXhfZml0bmVzcztcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5raW5rX2luZGV4ID0gMDtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgc3RyYWlnaHQgc2VnbWVudCBpcyB2YWxpZFxuICAgIC8vIEEgc3RyYWlnaHQgc2VnbWVudCBpcyBwbGFjZWQgYXQgdGhlIG1pZHBvaW50IGFuZCBpcyB2YWxpZCBpZiB0aGUgbGFiZWwncyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGFcbiAgICAvLyBmYWN0b3IgKExJTkVfRVhDRUVEX1NUUkFJR0hUKSBvZiB0aGUgbGluZSBzZWdtZW50J3MgbGVuZ3RoXG4gICAgZml0U3RyYWlnaHRTZWdtZW50KHNlZ21lbnQpIHtcbiAgICAgICAgbGV0IHVwcCA9IHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcbiAgICAgICAgbGV0IGxpbmVfbGVuZ3RoID0gVmVjdG9yLmxlbmd0aChWZWN0b3Iuc3ViKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pKSAvIHVwcDtcbiAgICAgICAgbGV0IGZpdG5lc3MgPSBjYWxjRml0bmVzcyhsaW5lX2xlbmd0aCwgdGhpcy50b3RhbF9sZW5ndGgpO1xuXG4gICAgICAgIGlmIChmaXRuZXNzIDwgTElORV9FWENFRURfU1RSQUlHSFQpe1xuICAgICAgICAgICAgdGhpcy5maXRuZXNzID0gZml0bmVzcztcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25jZSBhIGZpdHRpbmcgc2VnbWVudCBpcyBmb3VuZCwgZGV0ZXJtaW5lIGl0cyBhbmdsZXMsIHBvc2l0aW9ucyBhbmQgYm91bmRpbmcgYm94ZXNcbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHRoaXMuYW5nbGUgPSB0aGlzLmdldEN1cnJlbnRBbmdsZSgpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5nZXRDdXJyZW50UG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy51cGRhdGVCQm94ZXMoKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50QW5nbGUoKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5nZXRDdXJyZW50U2VnbWVudCgpO1xuICAgICAgICBsZXQgYW5nbGVzID0gW107XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIGxldCB0aGV0YTEgPSBnZXRBbmdsZUZyb21TZWdtZW50KHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgICAgIGxldCB0aGV0YTIgPSBnZXRBbmdsZUZyb21TZWdtZW50KHNlZ21lbnRbMV0sIHNlZ21lbnRbMl0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IHAwcDEgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgICAgIGxldCBwMXAyID0gVmVjdG9yLnN1YihzZWdtZW50WzFdLCBzZWdtZW50WzJdKTtcblxuICAgICAgICAgICAgICAgIGxldCBvcmllbnRhdGlvbiA9IChwMHAxWzBdID49IDAgJiYgcDFwMlswXSA+PSAwKSA/IDEgOiAtMTtcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHRoaXMua2lua19pbmRleCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmdsZSA9IChvcmllbnRhdGlvbiA+IDApID8gdGhldGEyIDogdGhldGExO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSAob3JpZW50YXRpb24gPiAwKSA/IHRoZXRhMSA6IHRoZXRhMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhbmdsZXMucHVzaChhbmdsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIGxldCB0aGV0YSA9IGdldEFuZ2xlRnJvbVNlZ21lbnQoc2VnbWVudFswXSwgc2VnbWVudFsxXSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGVzLnB1c2godGhldGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbmdsZXM7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBsYWJlbFxuICAgIGdldEN1cnJlbnRQb3NpdGlvbigpIHtcbiAgICAgICAgbGV0IHNlZ21lbnQgPSB0aGlzLmdldEN1cnJlbnRTZWdtZW50KCk7XG4gICAgICAgIGxldCBwb3NpdGlvbjtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBzZWdtZW50WzFdLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBbXG4gICAgICAgICAgICAgICAgICAgIDAuNSAqIChzZWdtZW50WzBdWzBdICsgc2VnbWVudFsxXVswXSksXG4gICAgICAgICAgICAgICAgICAgIDAuNSAqIChzZWdtZW50WzBdWzFdICsgc2VnbWVudFsxXVsxXSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBhcnRpY3VsYXRlZCBsYWJlbHMgdG8gYmUgd2l0aGluIGFuIGFuZ2xlIHJhbmdlIFstTUFYX0FOR0xFLCArTUFYX0FOR0xFXVxuICAgIGluQW5nbGVCb3VuZHMoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUwID0gdGhpcy5hbmdsZVswXTtcbiAgICAgICAgICAgICAgICBpZiAoYW5nbGUwIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBhbmdsZTAgKz0gMiAqIE1hdGguUEk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMSA9IHRoaXMuYW5nbGVbMV07XG4gICAgICAgICAgICAgICAgaWYgKGFuZ2xlMSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGUxICs9IDIgKiBNYXRoLlBJO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB0aGV0YSA9IE1hdGguYWJzKGFuZ2xlMSAtIGFuZ2xlMCk7XG4gICAgICAgICAgICAgICAgdGhldGEgPSBNYXRoLm1pbigyICogTWF0aC5QSSAtIHRoZXRhLCB0aGV0YSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhldGEgPD0gTUFYX0FOR0xFO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGJvdW5kaW5nIGJveGVzXG4gICAgdXBkYXRlQkJveGVzKCkge1xuICAgICAgICBsZXQgdXBwID0gdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gKHRoaXMudG90YWxfaGVpZ2h0ICsgdGhpcy5sYXlvdXQuYnVmZmVyWzFdICogMikgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuXG4gICAgICAgIC8vIHJlc2V0IGJvdW5kaW5nIGJveGVzXG4gICAgICAgIHRoaXMub2JicyA9IFtdO1xuICAgICAgICB0aGlzLmFhYmJzID0gW107XG5cbiAgICAgICAgLy8gZnVkZ2Ugd2lkdGggdmFsdWUgYXMgdGV4dCBtYXkgb3ZlcmZsb3cgYm91bmRpbmcgYm94IGlmIGl0IGhhcyBpdGFsaWMsIGJvbGQsIGV0YyBzdHlsZVxuICAgICAgICBsZXQgaXRhbGljc19idWZmZXIgPSAodGhpcy5sYXlvdXQuaXRhbGljKSA/IDUgKiB1cHAgOiAwO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUwID0gdGhpcy5hbmdsZVt0aGlzLmtpbmtfaW5kZXggLSAxXTsgLy8gYW5nbGUgYmVmb3JlIGtpbmtcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUxID0gdGhpcy5hbmdsZVt0aGlzLmtpbmtfaW5kZXhdOyAvLyBhbmdsZSBhZnRlciBraW5rXG4gICAgICAgICAgICAgICAgbGV0IHRoZXRhID0gTWF0aC5hYnMoYW5nbGUxIC0gYW5nbGUwKTsgLy8gYW5nbGUgZGVsdGFcblxuICAgICAgICAgICAgICAgIC8vIEEgc3ByZWFkIGZhY3RvciBvZiAwIHBpdm90cyB0aGUgYm94ZXMgb24gdGhlaXIgaG9yaXpvbnRhbCBjZW50ZXIsIGxvb2tpbmcgbGlrZTogXCJYXCJcbiAgICAgICAgICAgICAgICAvLyBhIHNwcmVhZCBmYWN0b3Igb2YgMSBvZmZzZXRzIHRoZSBib3hlcyBzbyB0aGF0IHRoZWlyIGNvcm5lcnMgdG91Y2gsIGxvb2tpbmcgbGlrZTogXCJcXC9cIiBvciBcIi9cXFwiXG4gICAgICAgICAgICAgICAgbGV0IGR4ID0gdGhpcy5zcHJlYWRfZmFjdG9yICogTWF0aC5hYnModGhpcy50b3RhbF9oZWlnaHQgKiBNYXRoLnRhbigwLjUgKiB0aGV0YSkpO1xuICAgICAgICAgICAgICAgIGxldCBudWRnZSA9IDAuNSAqICgtZHggLSB0aGlzLnNwYWNlX3dpZHRoKTtcblxuICAgICAgICAgICAgICAgIC8vIFBsYWNlIGxhYmVscyBiYWNrd2FyZHMgZnJvbSBraW5rIGluZGV4XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMua2lua19pbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aF9weCA9IHRoaXMuc2l6ZVtpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5hbmdsZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSAod2lkdGhfcHggKyAyICogdGhpcy5sYXlvdXQuYnVmZmVyWzBdKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgLT0gMC41ICogd2lkdGhfcHg7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IFZlY3Rvci5yb3QoW251ZGdlICogdXBwLCAwXSwgLWFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gVmVjdG9yLmFkZCh0aGlzLnBvc2l0aW9uLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmIgPSBnZXRPQkIocG9zaXRpb24sIHdpZHRoICsgaXRhbGljc19idWZmZXIsIGhlaWdodCwgYW5nbGUsIHRoaXMub2Zmc2V0LCB1cHApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWFiYiA9IG9iYi5nZXRFeHRlbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iYnMucHVzaChvYmIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFhYmJzLnB1c2goYWFiYik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2ldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzBdICsgbnVkZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMV1cbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBudWRnZSAtPSAwLjUgKiB3aWR0aF9weCArIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUGxhY2UgbGFiZWxzIGZvcndhcmRzIGZyb20ga2luayBpbmRleFxuICAgICAgICAgICAgICAgIG51ZGdlID0gMC41ICogKGR4ICsgdGhpcy5zcGFjZV93aWR0aCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5raW5rX2luZGV4OyBpIDwgdGhpcy5udW1fc2VnbWVudHM7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aF9weCA9IHRoaXMuc2l6ZVtpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5hbmdsZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSAod2lkdGhfcHggKyAyICogdGhpcy5sYXlvdXQuYnVmZmVyWzBdKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgKz0gMC41ICogd2lkdGhfcHg7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IFZlY3Rvci5yb3QoW251ZGdlICogdXBwLCAwXSwgLWFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gVmVjdG9yLmFkZCh0aGlzLnBvc2l0aW9uLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmIgPSBnZXRPQkIocG9zaXRpb24sIHdpZHRoICsgaXRhbGljc19idWZmZXIsIGhlaWdodCwgYW5nbGUsIHRoaXMub2Zmc2V0LCB1cHApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWFiYiA9IG9iYi5nZXRFeHRlbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iYnMucHVzaChvYmIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFhYmJzLnB1c2goYWFiYik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2ldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzBdICsgbnVkZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMV1cbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBudWRnZSArPSAwLjUgKiB3aWR0aF9weCArIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIGxldCBzaGlmdCA9IC0wLjUgKiB0aGlzLnRvdGFsX2xlbmd0aDsgLy8gc2hpZnQgZm9yIGNlbnRlcmluZyB0aGUgbGFiZWxzXG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGhfcHggPSB0aGlzLnNpemVbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9ICh3aWR0aF9weCArIDIgKiB0aGlzLmxheW91dC5idWZmZXJbMF0pICogdXBwICogTGFiZWwuZXBzaWxvbjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5hbmdsZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBzaGlmdCArPSAwLjUgKiB3aWR0aF9weDtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gVmVjdG9yLnJvdChbc2hpZnQgKiB1cHAsIDBdLCAtYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSBWZWN0b3IuYWRkKHRoaXMucG9zaXRpb24sIG9mZnNldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iYiA9IGdldE9CQihwb3NpdGlvbiwgd2lkdGggKyBpdGFsaWNzX2J1ZmZlciwgaGVpZ2h0LCBhbmdsZSwgdGhpcy5vZmZzZXQsIHVwcCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhYWJiID0gb2JiLmdldEV4dGVudCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Jicy5wdXNoKG9iYik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWFiYnMucHVzaChhYWJiKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbaV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMF0gKyBzaGlmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFsxXVxuICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDAuNSAqIHdpZHRoX3B4ICsgdGhpcy5zcGFjZV93aWR0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrcyBlYWNoIHNlZ21lbnQgdG8gc2VlIGlmIGl0IGlzIHdpdGhpbiB0aGUgdGlsZS4gSWYgYW55IHNlZ21lbnQgZmFpbHMgdGhpcyB0ZXN0LCB0aGV5IGFsbCBmYWlsLlxuICAgIC8vIFRPRE86IGxhYmVsIGdyb3VwXG4gICAgaW5UaWxlQm91bmRzKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYWFiYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBhYWJiID0gdGhpcy5hYWJic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmogPSB7IGFhYmIgfTtcbiAgICAgICAgICAgIGxldCBpbl9ib3VuZHMgPSBMYWJlbC5wcm90b3R5cGUuaW5UaWxlQm91bmRzLmNhbGwob2JqKTtcbiAgICAgICAgICAgIGlmICghaW5fYm91bmRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEFkZHMgZWFjaCBzZWdtZW50IHRvIHRoZSBjb2xsaXNpb24gcGFzcyBhcyBpdHMgb3duIGJvdW5kaW5nIGJveFxuICAgIC8vIFRPRE86IGxhYmVsIGdyb3VwXG4gICAgYWRkKGJib3hlcykge1xuICAgICAgICB0aGlzLnBsYWNlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hYWJicy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGFhYmIgPSB0aGlzLmFhYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iYiA9IHRoaXMub2Jic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmogPSB7IGFhYmIsIG9iYiB9O1xuICAgICAgICAgICAgTGFiZWwucHJvdG90eXBlLmFkZC5jYWxsKG9iaiwgYmJveGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrcyBlYWNoIHNlZ21lbnQgdG8gc2VlIGlmIGl0IHNob3VsZCBiZSBkaXNjYXJkZWQgKHZpYSBjb2xsaXNpb24pLiBJZiBhbnkgc2VnbWVudCBmYWlscyB0aGlzIHRlc3QsIHRoZXkgYWxsIGZhaWwuXG4gICAgLy8gVE9ETzogbGFiZWwgZ3JvdXBcbiAgICBkaXNjYXJkKGJib3hlcywgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMudGhyb3dfYXdheSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub2Jicy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBsZXQgYWFiYiA9IHRoaXMuYWFiYnNbaV07XG4gICAgICAgICAgICBsZXQgb2JiID0gdGhpcy5vYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iaiA9IHsgYWFiYiwgb2JiIH07XG5cbiAgICAgICAgICAgIGxldCBzaG91bGREaXNjYXJkID0gTGFiZWwucHJvdG90eXBlLm9jY2x1ZGVkLmNhbGwob2JqLCBiYm94ZXMsIGV4Y2x1ZGUpO1xuICAgICAgICAgICAgaWYgKHNob3VsZERpc2NhcmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBQcml2YXRlIG1ldGhvZCB0byBjYWxjdWxhdGUgb3JpZW50ZWQgYm91bmRpbmcgYm94XG5mdW5jdGlvbiBnZXRPQkIocG9zaXRpb24sIHdpZHRoLCBoZWlnaHQsIGFuZ2xlLCBvZmZzZXQsIHVwcCkge1xuICAgIGxldCBwMCwgcDE7XG4gICAgLy8gYXBwbHkgb2Zmc2V0LCB4IHBvc2l0aXZlLCB5IHBvaW50aW5nIGRvd25cbiAgICBpZiAob2Zmc2V0ICYmIChvZmZzZXRbMF0gIT09IDAgfHwgb2Zmc2V0WzFdICE9PSAwKSkge1xuICAgICAgICBvZmZzZXQgPSBWZWN0b3Iucm90KG9mZnNldCwgYW5nbGUpO1xuICAgICAgICBwMCA9IHBvc2l0aW9uWzBdICsgKG9mZnNldFswXSAqIHVwcCk7XG4gICAgICAgIHAxID0gcG9zaXRpb25bMV0gLSAob2Zmc2V0WzFdICogdXBwKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHAwID0gcG9zaXRpb25bMF07XG4gICAgICAgIHAxID0gcG9zaXRpb25bMV07XG4gICAgfVxuXG4gICAgLy8gdGhlIGFuZ2xlIG9mIHRoZSBvYmIgaXMgbmVnYXRpdmUgc2luY2UgaXQncyB0aGUgdGlsZSBzeXN0ZW0geSBheGlzIGlzIHBvaW50aW5nIGRvd25cbiAgICByZXR1cm4gbmV3IE9CQihwMCwgcDEsIC1hbmdsZSwgd2lkdGgsIGhlaWdodCk7XG59XG5cbi8vIFByaXZhdGUgbWV0aG9kIHRvIGNhbGN1bGF0ZSB0aGUgYW5nbGUgb2YgYSBzZWdtZW50LlxuLy8gVHJhbnNmb3JtcyB0aGUgYW5nbGUgdG8gbGllIHdpdGhpbiB0aGUgcmFuZ2UgWzAsIFBJLzJdIGFuZCBbMypQSS8yLCAyKlBJXSAoMXN0IG9yIDR0aCBxdWFkcmFudHMpXG4vLyBhcyBvdGhlciByYW5nZXMgcHJvZHVjZSBcInVwc2lkZSBkb3duXCIgbGFiZWxzXG5mdW5jdGlvbiBnZXRBbmdsZUZyb21TZWdtZW50KHB0MSwgcHQyKSB7XG4gICAgbGV0IFBJID0gTWF0aC5QSTtcbiAgICBsZXQgUElfMiA9IFBJIC8gMjtcbiAgICBsZXQgcDFwMiA9IFZlY3Rvci5zdWIocHQxLCBwdDIpO1xuICAgIGxldCB0aGV0YSA9IE1hdGguYXRhbjIocDFwMlswXSwgcDFwMlsxXSkgKyBQSV8yO1xuXG4gICAgaWYgKHRoZXRhID4gUElfMikge1xuICAgICAgICAvLyBJZiBpbiAybmQgcXVhZHJhbnQsIG1vdmUgdG8gNHRoIHF1YWRyYW50XG4gICAgICAgIHRoZXRhICs9IFBJO1xuICAgICAgICB0aGV0YSAlPSAyICogTWF0aC5QSTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhldGEgPCAwKSB7XG4gICAgICAgIC8vIElmIGluIDR0aCBxdWFkcmFudCwgbWFrZSBhIHBvc2l0aXZlIGFuZ2xlXG4gICAgICAgIHRoZXRhICs9IDIgKiBQSTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhldGE7XG59XG5cbmZ1bmN0aW9uIGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoLCBsYWJlbF9sZW5ndGgpe1xuICAgIHJldHVybiAxIC0gbGluZV9sZW5ndGggLyBsYWJlbF9sZW5ndGg7XG59XG4iLCJpbXBvcnQgTGFiZWwgZnJvbSAnLi9sYWJlbCc7XG5pbXBvcnQgUG9pbnRBbmNob3IgZnJvbSAnLi9wb2ludF9hbmNob3InO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYmVsUG9pbnQgZXh0ZW5kcyBMYWJlbCB7XG5cbiAgICBjb25zdHJ1Y3RvciAocG9zaXRpb24sIHNpemUsIGxheW91dCkge1xuICAgICAgICBzdXBlcihzaXplLCBsYXlvdXQpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gW3Bvc2l0aW9uWzBdLCBwb3NpdGlvblsxXV07XG4gICAgICAgIHRoaXMucGFyZW50ID0gdGhpcy5sYXlvdXQucGFyZW50O1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5hbmNob3IpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRfYW5jaG9yX2luZGV4ID0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYXNOZXh0ID0gdGhpcy5nZXROZXh0Rml0KCk7XG4gICAgICAgIHRoaXMudGhyb3dfYXdheSA9ICFoYXNOZXh0O1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMuY29tcHV0ZU9mZnNldCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUJCb3hlcygpO1xuICAgIH1cblxuICAgIGNvbXB1dGVPZmZzZXQgKCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IFt0aGlzLmxheW91dC5vZmZzZXRbMF0sIHRoaXMubGF5b3V0Lm9mZnNldFsxXV07XG5cbiAgICAgICAgLy8gQWRkaXRpb25hbCBhbmNob3Ivb2Zmc2V0IGZvciBwb2ludDpcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICAvLyBwb2ludCdzIG93biBhbmNob3IsIHRleHQgYW5jaG9yIGFwcGxpZWQgdG8gcG9pbnQsIGFkZGl0aW9uYWwgcG9pbnQgb2Zmc2V0XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IFBvaW50QW5jaG9yLmNvbXB1dGVPZmZzZXQodGhpcy5vZmZzZXQsIHBhcmVudC5zaXplLCBwYXJlbnQuYW5jaG9yLCBQb2ludEFuY2hvci56ZXJvX2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IFBvaW50QW5jaG9yLmNvbXB1dGVPZmZzZXQodGhpcy5vZmZzZXQsIHBhcmVudC5zaXplLCB0aGlzLmFuY2hvciwgUG9pbnRBbmNob3IuemVyb19idWZmZXIpO1xuICAgICAgICAgICAgaWYgKHBhcmVudC5vZmZzZXQgIT09IFN0eWxlUGFyc2VyLnplcm9QYWlyKSB7ICAgICAgICAvLyBwb2ludCBoYXMgYW4gb2Zmc2V0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID09PSBTdHlsZVBhcnNlci56ZXJvUGFpcikgeyAgICAgIC8vIG5vIHRleHQgb2Zmc2V0LCB1c2UgcG9pbnQnc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCA9IHBhcmVudC5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IGhhcyBvZmZzZXQsIGFkZCBwb2ludCdzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0WzBdICs9IHBhcmVudC5vZmZzZXRbMF07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0WzFdICs9IHBhcmVudC5vZmZzZXRbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vZmZzZXQgPSBQb2ludEFuY2hvci5jb21wdXRlT2Zmc2V0KHRoaXMub2Zmc2V0LCB0aGlzLnNpemUsIHRoaXMuYW5jaG9yKTtcbiAgICB9XG5cbiAgICB1cGRhdGVCQm94ZXMgKCkge1xuICAgICAgICBsZXQgd2lkdGggPSAodGhpcy5zaXplWzBdICsgdGhpcy5sYXlvdXQuYnVmZmVyWzBdICogMikgKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWwgKiBMYWJlbC5lcHNpbG9uO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gKHRoaXMuc2l6ZVsxXSArIHRoaXMubGF5b3V0LmJ1ZmZlclsxXSAqIDIpICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsICogTGFiZWwuZXBzaWxvbjtcblxuICAgICAgICAvLyBmdWRnZSB3aWR0aCB2YWx1ZSBhcyB0ZXh0IG1heSBvdmVyZmxvdyBib3VuZGluZyBib3ggaWYgaXQgaGFzIGl0YWxpYywgYm9sZCwgZXRjIHN0eWxlXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5pdGFsaWMpe1xuICAgICAgICAgICAgd2lkdGggKz0gNSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwID0gW1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblswXSArICh0aGlzLm9mZnNldFswXSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbCksXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzFdIC0gKHRoaXMub2Zmc2V0WzFdICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMub2JiID0gbmV3IE9CQihwWzBdLCBwWzFdLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5hYWJiID0gdGhpcy5vYmIuZ2V0RXh0ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIG1vdmUgdGhlIGxhYmVsIGludG8gdGhlIHRpbGUgYm91bmRzXG4gICAgLy8gUmV0dXJucyB0cnVlIGlmIGxhYmVsIHdhcyBtb3ZlZCBpbnRvIHRpbGUsIGZhbHNlIGlmIGl0IGNvdWxkbid0IGJlIG1vdmVkXG4gICAgbW92ZUludG9UaWxlICgpIHtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5hYWJiWzBdIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblswXSArPSAtdGhpcy5hYWJiWzBdO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hYWJiWzJdID49IEdlby50aWxlX3NjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzBdIC09IHRoaXMuYWFiYlsyXSAtIEdlby50aWxlX3NjYWxlICsgMTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlszXSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMV0gLT0gdGhpcy5hYWJiWzNdO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hYWJiWzFdIDw9IC1HZW8udGlsZV9zY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblsxXSAtPSB0aGlzLmFhYmJbMV0gKyBHZW8udGlsZV9zY2FsZSAtIDE7XG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUJCb3hlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfVxuXG4gICAgZ2V0TmV4dEZpdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dC5jdWxsX2Zyb21fdGlsZSB8fCB0aGlzLmluVGlsZUJvdW5kcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5tb3ZlX2ludG9fdGlsZSl7XG4gICAgICAgICAgICB0aGlzLm1vdmVJbnRvVGlsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmxheW91dC5hbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgb24gc2Vjb25kIGFuY2hvciAoZmlyc3QgYW5jaG9yIHdhcyBzZXQgb24gY3JlYXRpb24pXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmxheW91dC5hbmNob3IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmNob3IgPSB0aGlzLmxheW91dC5hbmNob3JbaV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydF9hbmNob3JfaW5kZXggPSBpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluVGlsZUJvdW5kcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbm8gYW5jaG9ycyByZXN1bHQgaW4gZml0XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNjYXJkIChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGlmIChzdXBlci5kaXNjYXJkKGJib3hlcywgZXhjbHVkZSkpIHtcbiAgICAgICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgYW5jaG9yIHNwZWNpZmllZCwgdHJ5IHRoZW0gaW4gb3JkZXJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMubGF5b3V0LmFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBvbiBzZWNvbmQgYW5jaG9yIChmaXJzdCBhbmNob3Igd2FzIHNldCBvbiBjcmVhdGlvbilcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPXRoaXMuc3RhcnRfYW5jaG9yX2luZGV4OyBpIDwgdGhpcy5sYXlvdXQuYW5jaG9yLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5jaG9yID0gdGhpcy5sYXlvdXQuYW5jaG9yW2ldO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxheW91dC5jdWxsX2Zyb21fdGlsZSAmJiAhdGhpcy5pblRpbGVCb3VuZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN1cGVyLmRpc2NhcmQoYmJveGVzLCBleGNsdWRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxufVxuXG4vLyBQbGFjZW1lbnQgc3RyYXRlZ2llc1xuTGFiZWxQb2ludC5QTEFDRU1FTlQgPSB7XG4gICAgVkVSVEVYOiAwLCAgICAgICAgICAvLyBwbGFjZSBsYWJlbHMgYXQgZW5kcG9pbnRzIG9mIGxpbmUgc2VnbWVudHNcbiAgICBNSURQT0lOVDogMSwgICAgICAgIC8vIHBsYWNlIGxhYmVscyBhdCBtaWRwb2ludHMgb2YgbGluZSBzZWdtZW50c1xuICAgIFNQQUNFRDogMiwgICAgICAgICAgLy8gcGxhY2UgbGFiZWxzIGVxdWFsbHkgc3BhY2VkIGFsb25nIGxpbmVcbiAgICBDRU5UUk9JRDogMyAgICAgICAgIC8vIHBsYWNlIGxhYmVscyBhdCBjZW50ZXIgb2YgcG9seWdvbnNcbn07XG4iLCIvLyBTZXRzIG9mIHZhbHVlcyB0byBtYXRjaCBmb3IgZGlyZWN0aW9uYWwgYW5kIGNvcm5lciBhbmNob3JzXG5jb25zdCBsZWZ0cyA9IFsnbGVmdCcsICd0b3AtbGVmdCcsICdib3R0b20tbGVmdCddO1xuY29uc3QgcmlnaHRzID0gWydyaWdodCcsICd0b3AtcmlnaHQnLCAnYm90dG9tLXJpZ2h0J107XG5jb25zdCB0b3BzID0gWyd0b3AnLCAndG9wLWxlZnQnLCAndG9wLXJpZ2h0J107XG5jb25zdCBib3R0b21zID0gWydib3R0b20nLCAnYm90dG9tLWxlZnQnLCAnYm90dG9tLXJpZ2h0J107XG5cbmxldCBQb2ludEFuY2hvcjtcblxuZXhwb3J0IGRlZmF1bHQgUG9pbnRBbmNob3IgPSB7XG5cbiAgICBjb21wdXRlT2Zmc2V0IChvZmZzZXQsIHNpemUsIGFuY2hvciwgYnVmZmVyID0gbnVsbCkge1xuICAgICAgICBpZiAoIWFuY2hvciB8fCBhbmNob3IgPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9mZnNldDIgPSBbb2Zmc2V0WzBdLCBvZmZzZXRbMV1dO1xuICAgICAgICBidWZmZXIgPSBidWZmZXIgfHwgdGhpcy5kZWZhdWx0X2J1ZmZlcjtcblxuICAgICAgICAvLyBBbiBvcHRpb25hbCBsZWZ0L3JpZ2h0IG9mZnNldFxuICAgICAgICBpZiAodGhpcy5pc0xlZnRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlswXSAtPSBzaXplWzBdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMF0gLT0gYnVmZmVyWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNSaWdodEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICBvZmZzZXQyWzBdICs9IHNpemVbMF0gLyAyO1xuICAgICAgICAgICAgaWYgKGFuY2hvciA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMF0gKz0gYnVmZmVyWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQW4gb3B0aW9uYWwgdG9wL2JvdHRvbSBvZmZzZXRcbiAgICAgICAgaWYgKHRoaXMuaXNUb3BBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlsxXSAtPSBzaXplWzFdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICd0b3AnKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0MlsxXSAtPSBidWZmZXJbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc0JvdHRvbUFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICBvZmZzZXQyWzFdICs9IHNpemVbMV0gLyAyO1xuICAgICAgICAgICAgaWYgKGFuY2hvciA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzFdICs9IGJ1ZmZlclszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvZmZzZXQyO1xuICAgIH0sXG5cbiAgICBhbGlnbkZvckFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIGlmIChhbmNob3IgJiYgYW5jaG9yICE9PSAnY2VudGVyJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNMZWZ0QW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNSaWdodEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfSxcblxuICAgIGlzTGVmdEFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAobGVmdHMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICBpc1JpZ2h0QW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIChyaWdodHMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICBpc1RvcEFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAodG9wcy5pbmRleE9mKGFuY2hvcikgPiAtMSk7XG4gICAgfSxcblxuICAgIGlzQm90dG9tQW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIChib3R0b21zLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgLy8gQnVmZmVyczogW2xlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbV1cbiAgICBkZWZhdWx0X2J1ZmZlcjogWzIuNSwgMi41LCAxLjUsIDAuNzVdLFxuICAgIHplcm9fYnVmZmVyOiBbMCwgMCwgMCwgMF1cblxufTtcbiIsIi8vIExvZ2ljIGZvciBwbGFjaW5nIHBvaW50IGxhYmVscyBhbG9uZyBhIGxpbmUgZ2VvbWV0cnlcblxuaW1wb3J0IExhYmVsUG9pbnQgZnJvbSAnLi9sYWJlbF9wb2ludCc7XG5pbXBvcnQge2lzQ29vcmRPdXRzaWRlVGlsZX0gZnJvbSAnLi4vYnVpbGRlcnMvY29tbW9uJztcblxuY29uc3QgUExBQ0VNRU5UID0gTGFiZWxQb2ludC5QTEFDRU1FTlQ7XG5jb25zdCBkZWZhdWx0X3NwYWNpbmcgPSA4MDsgLy8gc3BhY2luZyBvZiBwb2ludHMgYWxvbmcgbGluZSBpbiBwaXhlbHNcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGxhY2VQb2ludHNPbkxpbmUgKGxpbmUsIHNpemUsIG9wdGlvbnMpIHtcbiAgICBsZXQgbGFiZWxzID0gW107XG4gICAgbGV0IHN0cmF0ZWd5ID0gb3B0aW9ucy5wbGFjZW1lbnQ7XG4gICAgbGV0IG1pbl9sZW5ndGggPSBNYXRoLm1heChzaXplWzBdLCBzaXplWzFdKSAqIG9wdGlvbnMucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gKiBvcHRpb25zLnVuaXRzX3Blcl9waXhlbDtcblxuICAgIHN3aXRjaCAoc3RyYXRlZ3kpe1xuICAgICAgICBjYXNlIFBMQUNFTUVOVC5TUEFDRUQ6XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZ2V0UG9zaXRpb25zQW5kQW5nbGVzKGxpbmUsIG1pbl9sZW5ndGgsIG9wdGlvbnMpO1xuICAgICAgICAgICAgLy8gZmFsc2Ugd2lsbCBiZSByZXR1cm5lZCBpZiBsaW5lIGhhdmUgbm8gbGVuZ3RoXG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHBvc2l0aW9ucyA9IHJlc3VsdC5wb3NpdGlvbnM7XG4gICAgICAgICAgICBsZXQgYW5nbGVzID0gcmVzdWx0LmFuZ2xlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gYW5nbGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbGVfZWRnZXMgPT09IHRydWUgfHwgIWlzQ29vcmRPdXRzaWRlVGlsZShwb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbmV3IExhYmVsUG9pbnQocG9zaXRpb24sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5hbmdsZSA9IGFuZ2xlO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUExBQ0VNRU5ULlZFUlRFWDpcbiAgICAgICAgICAgIGxldCBwLCBxLCBsYWJlbDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspe1xuICAgICAgICAgICAgICAgIHAgPSBsaW5lW2ldO1xuICAgICAgICAgICAgICAgIHEgPSBsaW5lW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aWxlX2VkZ2VzID09PSB0cnVlIHx8ICFpc0Nvb3JkT3V0c2lkZVRpbGUocCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWxQb2ludChwLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBnZXRBbmdsZShwLCBxLCBvcHRpb25zLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWRkIGxhc3QgZW5kcG9pbnRcbiAgICAgICAgICAgIGxhYmVsID0gbmV3IExhYmVsUG9pbnQocSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBsYWJlbC5hbmdsZSA9IGdldEFuZ2xlKHAsIHEsIG9wdGlvbnMuYW5nbGUpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRFBPSU5UOlxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKyl7XG4gICAgICAgICAgICAgICAgbGV0IHAgPSBsaW5lW2ldO1xuICAgICAgICAgICAgICAgIGxldCBxID0gbGluZVtpICsgMV07XG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gW1xuICAgICAgICAgICAgICAgICAgICAwLjUgKiAocFswXSArIHFbMF0pLFxuICAgICAgICAgICAgICAgICAgICAwLjUgKiAocFsxXSArIHFbMV0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aWxlX2VkZ2VzID09PSB0cnVlIHx8ICFpc0Nvb3JkT3V0c2lkZVRpbGUocG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWluX2xlbmd0aCB8fCBub3JtKHAsIHEpID4gbWluX2xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbmV3IExhYmVsUG9pbnQocG9zaXRpb24sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBnZXRBbmdsZShwLCBxLCBvcHRpb25zLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWxzO1xufVxuXG5mdW5jdGlvbiBnZXRQb3NpdGlvbnNBbmRBbmdsZXMobGluZSwgbWluX2xlbmd0aCwgb3B0aW9ucyl7XG4gICAgbGV0IHVwcCA9IG9wdGlvbnMudW5pdHNfcGVyX3BpeGVsO1xuICAgIGxldCBzcGFjaW5nID0gKG9wdGlvbnMucGxhY2VtZW50X3NwYWNpbmcgfHwgZGVmYXVsdF9zcGFjaW5nKSAqIHVwcDtcblxuICAgIGxldCBsZW5ndGggPSBnZXRMaW5lTGVuZ3RoKGxpbmUpO1xuICAgIGlmIChsZW5ndGggPD0gbWluX2xlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IG51bV9sYWJlbHMgPSBNYXRoLm1heChNYXRoLmZsb29yKGxlbmd0aCAvIHNwYWNpbmcpLCAxKTtcbiAgICBsZXQgcmVtYWluZGVyID0gbGVuZ3RoIC0gKG51bV9sYWJlbHMgLSAxKSAqIHNwYWNpbmc7XG4gICAgbGV0IHBvc2l0aW9ucyA9IFtdO1xuICAgIGxldCBhbmdsZXMgPSBbXTtcblxuICAgIGxldCBkaXN0YW5jZSA9IDAuNSAqIHJlbWFpbmRlcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bV9sYWJlbHM7IGkrKyl7XG4gICAgICAgIGxldCB7cG9zaXRpb24sIGFuZ2xlfSA9IGludGVycG9sYXRlTGluZShsaW5lLCBkaXN0YW5jZSwgbWluX2xlbmd0aCwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChwb3NpdGlvbiAhPSBudWxsICYmIGFuZ2xlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHBvc2l0aW9uKTtcbiAgICAgICAgICAgIGFuZ2xlcy5wdXNoKGFuZ2xlKTtcbiAgICAgICAgfVxuICAgICAgICBkaXN0YW5jZSArPSBzcGFjaW5nO1xuICAgIH1cblxuICAgIHJldHVybiB7cG9zaXRpb25zLCBhbmdsZXN9O1xufVxuXG5mdW5jdGlvbiBnZXRBbmdsZShwLCBxLCBhbmdsZSA9IDApe1xuICAgIHJldHVybiAoYW5nbGUgPT09ICdhdXRvJykgPyBNYXRoLmF0YW4yKHFbMF0gLSBwWzBdLCBxWzFdIC0gcFsxXSkgOiBhbmdsZTtcbn1cblxuZnVuY3Rpb24gZ2V0TGluZUxlbmd0aChsaW5lKXtcbiAgICBsZXQgZGlzdGFuY2UgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspe1xuICAgICAgICBkaXN0YW5jZSArPSBub3JtKGxpbmVbaV0sIGxpbmVbaSsxXSk7XG4gICAgfVxuICAgIHJldHVybiBkaXN0YW5jZTtcbn1cblxuZnVuY3Rpb24gbm9ybShwLCBxKXtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHBbMF0gLSBxWzBdLCAyKSArIE1hdGgucG93KHBbMV0gLSBxWzFdLCAyKSk7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlTGluZShsaW5lLCBkaXN0YW5jZSwgbWluX2xlbmd0aCwgb3B0aW9ucyl7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgbGV0IHBvc2l0aW9uLCBhbmdsZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoLTE7IGkrKyl7XG4gICAgICAgIGxldCBwID0gbGluZVtpXTtcbiAgICAgICAgbGV0IHEgPSBsaW5lW2krMV07XG5cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gbm9ybShwLCBxKTtcbiAgICAgICAgc3VtICs9IGxlbmd0aDtcblxuICAgICAgICBpZiAobGVuZ3RoIDw9IG1pbl9sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1bSA+IGRpc3RhbmNlKXtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaW50ZXJwb2xhdGVTZWdtZW50KHAsIHEsIHN1bSAtIGRpc3RhbmNlKTtcbiAgICAgICAgICAgIGFuZ2xlID0gZ2V0QW5nbGUocCwgcSwgb3B0aW9ucy5hbmdsZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge3Bvc2l0aW9uLCBhbmdsZX07XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlU2VnbWVudChwLCBxLCBkaXN0YW5jZSl7XG4gICAgbGV0IGxlbmd0aCA9IG5vcm0ocCwgcSk7XG4gICAgbGV0IHJhdGlvID0gZGlzdGFuY2UgLyBsZW5ndGg7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcmF0aW8gKiBwWzBdICsgKDEgLSByYXRpbykgKiBxWzBdLFxuICAgICAgICByYXRpbyAqIHBbMV0gKyAoMSAtIHJhdGlvKSAqIHFbMV1cbiAgICBdO1xufVxuIiwiaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBlYXRHcm91cCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoa2V5LCByZXBlYXRfZGlzdCwgbWF4X3JlcGVhdF9kaXN0KSB7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnJlcGVhdF9kaXN0ID0gcmVwZWF0X2Rpc3Q7XG4gICAgICAgIHRoaXMucmVwZWF0X2Rpc3Rfc3EgPSB0aGlzLnJlcGVhdF9kaXN0ICogdGhpcy5yZXBlYXRfZGlzdDtcbiAgICAgICAgdGhpcy5tYXhfcmVwZWF0X2Rpc3Rfc3EgPSBtYXhfcmVwZWF0X2Rpc3QgKiBtYXhfcmVwZWF0X2Rpc3Q7XG4gICAgICAgIHRoaXMub25lX3Blcl9ncm91cCA9ICh0aGlzLnJlcGVhdF9kaXN0X3NxID49IHRoaXMubWF4X3JlcGVhdF9kaXN0X3NxKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbiBvYmplY3QgdG8gc2VlIGlmIGl0J3MgYSByZXBlYXQgaW4gdGhpcyBncm91cFxuICAgIGNoZWNrIChvYmopIHtcbiAgICAgICAgLy8gSWYgb25seSBvbmUgb2JqZWN0IGFsbG93ZWQgcGVyIGdyb3VwLCBzaG9ydGN1dCBkaXN0YW5jZSBsb2dpY1xuICAgICAgICBpZiAodGhpcy5vbmVfcGVyX2dyb3VwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkIGRpc3RhbmNlIG1heGVzIG91dCBhdCB0aHJlc2hvbGQgaW4gdGhpcyBjYXNlXG4gICAgICAgICAgICAgICAgLy8gKG5vdCB0cnVlIGRpc3QgdmFsdWUgc2luY2Ugd2Ugc2tpcHBlZCBjYWxjdWxhdGluZyBpdClcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkaXN0X3NxOiB0aGlzLm1heF9yZXBlYXRfZGlzdF9zcSxcbiAgICAgICAgICAgICAgICAgICAgcmVwZWF0X2Rpc3Rfc3E6IHRoaXMucmVwZWF0X2Rpc3Rfc3EsXG4gICAgICAgICAgICAgICAgICAgIG9uZV9wZXJfZ3JvdXA6IHRoaXMub25lX3Blcl9ncm91cFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47IC8vIG5vIG9iamVjdCBmb3IgdGhpcyBncm91cCB5ZXRcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGRpc3RhbmNlIGZyb20gbmV3IG9iamVjdCB0byBvYmplY3RzIGFscmVhZHkgaW4gZ3JvdXBcbiAgICAgICAgbGV0IHAxID0gb2JqLnBvc2l0aW9uO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0aGlzLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHAyID0gdGhpcy5wb3NpdGlvbnNbaV07XG4gICAgICAgICAgICBsZXQgZHggPSBwMVswXSAtIHAyWzBdO1xuICAgICAgICAgICAgbGV0IGR5ID0gcDFbMV0gLSBwMlsxXTtcbiAgICAgICAgICAgIGxldCBkaXN0X3NxID0gZHggKiBkeCArIGR5ICogZHk7XG5cbiAgICAgICAgICAgIC8vIEZvdW5kIGFuIGV4aXN0aW5nIG9iamVjdCB3aXRoaW4gYWxsb3dlZCBkaXN0YW5jZVxuICAgICAgICAgICAgaWYgKGRpc3Rfc3EgPCB0aGlzLnJlcGVhdF9kaXN0X3NxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzdF9zcSxcbiAgICAgICAgICAgICAgICAgICAgcmVwZWF0X2Rpc3Rfc3E6IHRoaXMucmVwZWF0X2Rpc3Rfc3FcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIG9iamVjdCB0byB0aGlzIGdyb3VwXG4gICAgYWRkIChvYmopIHtcbiAgICAgICAgLy8gb25seSBzdG9yZSBvYmplY3QncyBwb3NpdGlvbiwgdG8gc2F2ZSBzcGFjZSAvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmVmZXJlbmNlc1xuICAgICAgICBpZiAob2JqICYmIG9iai5wb3NpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnMucHVzaChvYmoucG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RhdGljIG1ldGhvZHMgYXJlIHVzZWQgdG8gbWFuYWdlIHJlcGVhdCBncm91cHMsIHdpdGhpbiBhbmQgYWNyb3NzIHRpbGVzXG5cbiAgICAvLyBSZXNldCBhbGwgZ3JvdXBzIGZvciB0aGlzIHRpbGVcbiAgICBzdGF0aWMgY2xlYXIgKHRpbGUpIHtcbiAgICAgICAgdGhpcy5ncm91cHNbdGlsZV0gPSB7fTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbiBvYmplY3QgdG8gc2VlIGlmIGl0J3MgYSByZXBlYXQgd2l0aGluIGl0cyBkZXNpZ25hdGVkIGdyb3VwXG4gICAgc3RhdGljIGNoZWNrIChvYmosIGxheW91dCwgdGlsZSkge1xuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSAmJiBsYXlvdXQucmVwZWF0X2dyb3VwICYmIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0uY2hlY2sob2JqKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBhbiBvYmplY3QgdG8gaXRzIGRlc2lnbmF0ZWQgZ3JvdXBcbiAgICBzdGF0aWMgYWRkIChvYmosIGxheW91dCwgdGlsZSkge1xuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSAmJiBsYXlvdXQucmVwZWF0X2dyb3VwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdID0gbmV3IFJlcGVhdEdyb3VwKFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2Rpc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBSZXBlYXRHcm91cC5tYXhfcmVwZWF0X2Rpc3RcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0uYWRkKG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuLy8gQ3VycmVudCBzZXQgb2YgcmVwZWF0IGdyb3VwcywgZ3JvdXBlZCBhbmQga2V5ZWQgYnkgdGlsZVxuUmVwZWF0R3JvdXAuZ3JvdXBzID0ge307XG5cbi8vIE1heCByZXBlYXQgZGlzdDogZm9yIGdyb3VwcyB3aXRoIGEgcmVwZWF0IGRpc3QgYmV5b25kIHRoaXMgdGhyZXNob2xkLCBvbmx5IG9uZSBsYWJlbFxuLy8gd2lsbCBiZSBhbGxvd2VkIHBlciBncm91cCwgZS5nLiBzZXQgdG8gdGlsZSBzaXplIGZvciBvbmUtbGFiZWwtcGVyLXRpbGVcblJlcGVhdEdyb3VwLm1heF9yZXBlYXRfZGlzdCA9IEdlby50aWxlX3NjYWxlO1xuIiwiaW1wb3J0IFRocmVhZCBmcm9tICcuL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgU2NlbmUgZnJvbSAnLi9zY2VuZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcblxuLy8gRXhwb3J0cyBtdXN0IGFwcGVhciBvdXRzaWRlIGEgZnVuY3Rpb24sIGJ1dCB3aWxsIG9ubHkgYmUgZGVmaW5lZCBpbiBtYWluIHRocmVhZCAoYmVsb3cpXG5leHBvcnQgdmFyIExlYWZsZXRMYXllcjtcbmV4cG9ydCBmdW5jdGlvbiBsZWFmbGV0TGF5ZXIob3B0aW9ucykge1xuICAgIHJldHVybiBleHRlbmRMZWFmbGV0KG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBleHRlbmRMZWFmbGV0KG9wdGlvbnMpIHtcblxuICAgIC8vIElmIExlYWZsZXRMYXllciBpcyBhbHJlYWR5IGRlZmluZWQgd2hlbiB0aGlzIGlzIGNhbGxlZCBqdXN0IHJldHVybiB0aGF0IGltbWVkaWF0ZWx5XG4gICAgLy8gZS5nLiBpZiB5b3UgY2FsbCBsZWFmbGV0TGF5ZXIgbXVsdGlwbGUgdGltZXMgKHdoaWNoIGlzIHZhbGlkKVxuICAgIGlmICh0eXBlb2YgTGVhZmxldExheWVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbmV3IExlYWZsZXRMYXllcihvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBMZWFmbGV0IGxheWVyIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBkZWZpbmVkIGluIG1haW4gdGhyZWFkXG4gICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG5cbiAgICAgICAgbGV0IEwgPSBvcHRpb25zLmxlYWZsZXQgfHwgd2luZG93Lkw7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIGFyZSBleHRlbmRpbmcgdGhlIGxlYWZsZXQgMC43LnggVGlsZUxheWVyIGNsYXNzLCBvciB0aGUgbmV3ZXJcbiAgICAgICAgLy8gbGVhZmxldCAxLnggR3JpZExheWVyIGNsYXNzLlxuICAgICAgICBsZXQgbGF5ZXJCYXNlQ2xhc3MgPSBMLkdyaWRMYXllciA/IEwuR3JpZExheWVyIDogTC5UaWxlTGF5ZXI7XG4gICAgICAgIGxldCBsZWFmbGV0VmVyc2lvbiA9IGxheWVyQmFzZUNsYXNzID09PSBMLkdyaWRMYXllciA/ICcxLngnIDogJzAuNy54JztcbiAgICAgICAgbGV0IGxheWVyQ2xhc3NDb25maWcgPSB7fTtcblxuICAgICAgICAvLyBJZiBleHRlbmRpbmcgbGVhZmxldCAwLjcueCBUaWxlTGF5ZXIsIGFkZGl0aW9uYWwgbW9kaWZpY2F0aW9ucyBhcmUgbmVlZGVkXG4gICAgICAgIGlmIChsYXllckJhc2VDbGFzcyA9PT0gTC5UaWxlTGF5ZXIpIHtcbiAgICAgICAgICAgIGxheWVyQ2xhc3NDb25maWcuX2FkZFRpbGUgPSBmdW5jdGlvbigpe307XG4gICAgICAgICAgICBsYXllckNsYXNzQ29uZmlnLl9yZW1vdmVUaWxlID0gZnVuY3Rpb24oKXt9O1xuICAgICAgICAgICAgbGF5ZXJDbGFzc0NvbmZpZy5fcmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBsYXllckJhc2VDbGFzcy5wcm90b3R5cGUuX3Jlc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgLy8gcmUtYWRkIHRoZSBjYW52YXMgc2luY2UgYmFzZSBjbGFzcyBgdmlld3Jlc2V0YCBldmVudCBjYW4gcmVtb3ZlIGl0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUgJiYgdGhpcy5zY2VuZS5jb250YWluZXIgJiYgdGhpcy5zY2VuZS5jYW52YXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zY2VuZS5jYW52YXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgY3VzdG9tIGxheWVyIG1ldGhvZHNcbiAgICAgICAgT2JqZWN0LmFzc2lnbihsYXllckNsYXNzQ29uZmlnLCB7XG5cbiAgICAgICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNob3dEZWJ1ZyA9ICghb3B0aW9ucy5zaG93RGVidWcgPyBmYWxzZSA6IHRydWUpO1xuXG4gICAgICAgICAgICAgICAgTC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU2NlbmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgLy8gRm9yY2UgbGVhZmxldCB6b29tIGFuaW1hdGlvbnMgb2ZmXG4gICAgICAgICAgICAgICAgdGhpcy5fem9vbUFuaW1hdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjcmVhdGVTY2VuZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUgPSBTY2VuZS5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zY2VuZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtV29ya2VyczogdGhpcy5vcHRpb25zLm51bVdvcmtlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVVcGRhdGU6IHRoaXMub3B0aW9ucy5wcmVVcGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3N0VXBkYXRlOiB0aGlzLm9wdGlvbnMucG9zdFVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNab29tOiAoTGVhZmxldExheWVyLmxlYWZsZXRWZXJzaW9uID09PSAnMS54JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWdoRGVuc2l0eURpc3BsYXk6IHRoaXMub3B0aW9ucy5oaWdoRGVuc2l0eURpc3BsYXksXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dMZXZlbDogdGhpcy5vcHRpb25zLmxvZ0xldmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW50cm9zcGVjdGlvbjogdGhpcy5vcHRpb25zLmludHJvc3BlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNlZCBvcHRpb24sIGFwcCB3aWxsIGhhdmUgdG8gbWFudWFsbHkgY2FsbGVkIHNjZW5lLnVwZGF0ZSgpIHBlciBmcmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVJlbmRlckxvb3A6IHRoaXMub3B0aW9ucy5kaXNhYmxlUmVuZGVyTG9vcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2VkIG9wdGlvbiwgd2lsbCByZXF1aXJlIGxpYnJhcnkgdG8gYmUgc2VydmVkIGFzIHNhbWUgaG9zdCBhcyBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0Nyb3NzRG9tYWluV29ya2VyczogdGhpcy5vcHRpb25zLmFsbG93Q3Jvc3NEb21haW5Xb3JrZXJzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gRmluaXNoIGluaXRpYWxpemluZyBzY2VuZSBhbmQgc2V0dXAgZXZlbnRzIHdoZW4gbGF5ZXIgaXMgYWRkZWQgdG8gbWFwXG4gICAgICAgICAgICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVNjZW5lKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGF5ZXJCYXNlQ2xhc3MucHJvdG90eXBlLm9uQWRkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLnJlc2l6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ3Jlc2l6ZScsIHRoaXMuaG9va3MucmVzaXplKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MubW92ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG1hcC5nZXRDZW50ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy56b29tID0gTWF0aC5taW4obWFwLmdldFpvb20oKSwgbWFwLmdldE1heFpvb20oKSB8fCBHZW8uZGVmYXVsdF92aWV3X21heF96b29tKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0Vmlldyh2aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5pbW1lZGlhdGVSZWRyYXcoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXZlcnNlVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignbW92ZScsIHRoaXMuaG9va3MubW92ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLnpvb21zdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc3RhcnRab29tKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignem9vbXN0YXJ0JywgdGhpcy5ob29rcy56b29tc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5kcmFnc3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5wYW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignZHJhZ3N0YXJ0JywgdGhpcy5ob29rcy5kcmFnc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5kcmFnZW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcucGFubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdkcmFnZW5kJywgdGhpcy5ob29rcy5kcmFnZW5kKTtcblxuICAgICAgICAgICAgICAgIC8vIEZvcmNlIGxlYWZsZXQgem9vbSBhbmltYXRpb25zIG9mZlxuICAgICAgICAgICAgICAgIG1hcC5fem9vbUFuaW1hdGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBNb2RpZnkgZGVmYXVsdCBMZWFmbGV0IGJlaGF2aW9yc1xuICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5U2Nyb2xsV2hlZWxCZWhhdmlvcihtYXApO1xuICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5RG91YmxlQ2xpY2tab29tKG1hcCk7XG5cbiAgICAgICAgICAgICAgICAvLyBTZXR1cCBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dXBTZWxlY3Rpb25FdmVudEhhbmRsZXJzKG1hcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25FdmVudHModGhpcy5vcHRpb25zLmV2ZW50cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgR0wgY2FudmFzIHRvIGxheWVyIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcblxuICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgdmlld1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuXG4gICAgICAgICAgICAgICAgLy8gU3Vic2NyaWJlIHRvIHRhbmdyYW0gZXZlbnRzXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBtb3ZlOiB0aGlzLm9uVGFuZ3JhbVZpZXdVcGRhdGUuYmluZCh0aGlzKVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gVXNlIGxlYWZsZXQncyBleGlzdGluZyBldmVudCBzeXN0ZW0gYXMgdGhlIGNhbGxiYWNrIG1lY2hhbmlzbVxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUubG9hZCh0aGlzLm9wdGlvbnMuc2NlbmUsXG4gICAgICAgICAgICAgICAgICAgIHsgY29uZmlnX3BhdGg6IHRoaXMub3B0aW9ucy5zY2VuZUJhc2VQYXRoLCBibG9ja2luZzogZmFsc2UgfSkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldmVyc2VUcmFuc2Zvcm0oKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCdpbml0Jyk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25SZW1vdmU6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgICAgICBsYXllckJhc2VDbGFzcy5wcm90b3R5cGUub25SZW1vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ3Jlc2l6ZScsIHRoaXMuaG9va3MucmVzaXplKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdtb3ZlJywgdGhpcy5ob29rcy5tb3ZlKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCd6b29tc3RhcnQnLCB0aGlzLmhvb2tzLnpvb21zdGFydCk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignZHJhZ3N0YXJ0JywgdGhpcy5ob29rcy5kcmFnc3RhcnQpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ2RyYWdlbmQnLCB0aGlzLmhvb2tzLmRyYWdlbmQpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ2NsaWNrJywgdGhpcy5ob29rcy5jbGljayk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW91c2Vtb3ZlJywgdGhpcy5ob29rcy5tb3VzZW1vdmUpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ21vdXNlb3V0JywgdGhpcy5ob29rcy5tb3VzZW91dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNyZWF0ZVRpbGU6IGZ1bmN0aW9uIChjb29yZHMpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gY29vcmRzLnggKyAnLycgKyBjb29yZHMueSArICcvJyArIGNvb3Jkcy56O1xuICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBkaXYuc2V0QXR0cmlidXRlKCdkYXRhLXRpbGUta2V5Jywga2V5KTtcbiAgICAgICAgICAgICAgICBkaXYuc3R5bGUud2lkdGggPSAnMjU2cHgnO1xuICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5oZWlnaHQgPSAnMjU2cHgnO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93RGVidWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlYnVnX292ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS50ZXh0Q29udGVudCA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUubGVmdCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUudG9wID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5jb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUuZm9udFNpemUgPSAnMTZweCc7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUudGV4dE91dGxpbmUgPSAnMXB4ICMwMDAwMDAnO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLnBhZGRpbmcgPSAnOHB4JztcblxuICAgICAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZGVidWdfb3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3JkZXJTdHlsZSA9ICdzb2xpZCc7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3JkZXJDb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3JkZXJXaWR0aCA9ICcxcHgnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBkaXY7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBNb2RpZnkgbGVhZmxldCdzIGRlZmF1bHQgc2Nyb2xsIHdoZWVsIGJlaGF2aW9yIHRvIHJlbmRlciBmcmFtZXMgbW9yZSBmcmVxdWVudGx5XG4gICAgICAgICAgICAvLyAoc2hvdWxkIGdlbmVyYWxseSBsZWFkIHRvIHNtb290aGVyIHNjcm9sbCB3aXRoIFRhbmdyYW0gZnJhbWUgcmUtcmVuZGVyKVxuICAgICAgICAgICAgbW9kaWZ5U2Nyb2xsV2hlZWxCZWhhdmlvcjogZnVuY3Rpb24gKG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLnZpZXcuY29udGludW91c196b29tICYmIG1hcC5zY3JvbGxXaGVlbFpvb20gJiYgdGhpcy5vcHRpb25zLm1vZGlmeVNjcm9sbFdoZWVsICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBtYXAub3B0aW9ucy56b29tU25hcCA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5hYmxlZCA9IG1hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlZCgpO1xuICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLmRpc2FibGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLl9vbldoZWVsU2Nyb2xsID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWx0YSA9IEwuRG9tRXZlbnQuZ2V0V2hlZWxEZWx0YShlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbHRhICs9IGRlbHRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdE1vdXNlUG9zID0gdGhpcy5fbWFwLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGVyZm9ybVpvb20oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQuc3RvcChlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLl9wZXJmb3JtWm9vbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSA9IG1hcC5nZXRab29tKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5fc3RvcCgpOyAvLyBzdG9wIHBhbm5pbmcgYW5kIGZseSBhbmltYXRpb25zIGlmIGFueVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsdGEgPSB0aGlzLl9kZWx0YSAvICh0aGlzLl9tYXAub3B0aW9ucy53aGVlbFB4UGVyWm9vbUxldmVsICogNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWx0YSA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoem9vbSArIGRlbHRhKSA+PSB0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSB0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpIC0gem9vbTsgLy8gZG9uJ3QgZ28gcGFzdCBtYXggem9vbVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlbHRhKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwLm9wdGlvbnMuc2Nyb2xsV2hlZWxab29tID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXRab29tKHpvb20gKyBkZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXRab29tQXJvdW5kKHRoaXMuX2xhc3RNb3VzZVBvcywgem9vbSArIGRlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIE1vZGlmeSBsZWFmbGV0J3MgZGVmYXVsdCBkb3VibGUtY2xpY2sgem9vbSBiZWhhdmlvciwgdG8gbWF0Y2ggdHlwaWNhbCB2ZWN0b3IgYmFzZW1hcCBwcm9kdWN0c1xuICAgICAgICAgICAgbW9kaWZ5RG91YmxlQ2xpY2tab29tOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUudmlldy5jb250aW51b3VzX3pvb20gJiYgbWFwLmRvdWJsZUNsaWNrWm9vbSAmJiB0aGlzLm9wdGlvbnMubW9kaWZ5RG91YmxlQ2xpY2tab29tICE9PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE1vZGlmaWVkIHZlcnNpb24gb2YgTGVhZmxldCdzIHNldFpvb21Bcm91bmQgdGhhdCBkb2Vzbid0IHRyaWdnZXIgYSBtb3ZlRW5kIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldFpvb21Bcm91bmROb01vdmVFbmQgPSBmdW5jdGlvbiAobWFwLCBsYXRsbmcsIHpvb20sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY2FsZSA9IG1hcC5nZXRab29tU2NhbGUoem9vbSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0hhbGYgPSBtYXAuZ2V0U2l6ZSgpLmRpdmlkZUJ5KDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclBvaW50ID0gbGF0bG5nIGluc3RhbmNlb2YgTC5Qb2ludCA/IGxhdGxuZyA6IG1hcC5sYXRMbmdUb0NvbnRhaW5lclBvaW50KGxhdGxuZyksXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJPZmZzZXQgPSBjb250YWluZXJQb2ludC5zdWJ0cmFjdCh2aWV3SGFsZikubXVsdGlwbHlCeSgxIC0gMSAvIHNjYWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDZW50ZXIgPSBtYXAuY29udGFpbmVyUG9pbnRUb0xhdExuZyh2aWV3SGFsZi5hZGQoY2VudGVyT2Zmc2V0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXAuX21vdmUobmV3Q2VudGVyLCB6b29tLCB7IGZseVRvOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBMZWFmbGV0J3MgZmx5VG8sIGZvciBzaG9ydCBhbmltYXRpb25zIHpvb21pbmcgYXJvdW5kIGEgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmx5QXJvdW5kID0gZnVuY3Rpb24gKG1hcCwgdGFyZ2V0Q2VudGVyLCB0YXJnZXRab29tLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlIHx8ICFMLkJyb3dzZXIuYW55M2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnNldFZpZXcodGFyZ2V0Q2VudGVyLCB0YXJnZXRab29tLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLl9zdG9wKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydFpvb20gPSBtYXAuX3pvb207XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlciA9IEwubGF0TG5nKHRhcmdldENlbnRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRab29tID0gdGFyZ2V0Wm9vbSA9PT0gdW5kZWZpbmVkID8gc3RhcnRab29tIDogdGFyZ2V0Wm9vbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFpvb20gPSBNYXRoLm1pbih0YXJnZXRab29tLCBtYXAuZ2V0TWF4Wm9vbSgpKTsgLy8gZG9uJ3QgZ28gcGFzdCBtYXggem9vbVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnJvbSA9IG1hcC5wcm9qZWN0KG1hcC5nZXRDZW50ZXIoKSwgc3RhcnRab29tKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byA9IG1hcC5wcm9qZWN0KHRhcmdldENlbnRlciwgc3RhcnRab29tKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb24gPyAxMDAwICogb3B0aW9ucy5kdXJhdGlvbiA6IDc1O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmcmFtZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gZHVyYXRpb247XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldXNlIGludGVybmFsIGZseVRvIGZyYW1lIHRvIGVuc3VyZSB0aGVzZSBhbmltYXRpb25zIGFyZSBjYW5jZWxlZCBsaWtlIG90aGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuX2ZseVRvRnJhbWUgPSBMLlV0aWwucmVxdWVzdEFuaW1GcmFtZShmcmFtZSwgbWFwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VudGVyID0gZnJvbS5hZGQodG8uc3VidHJhY3QoZnJvbSkubXVsdGlwbHlCeSh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IFtjZW50ZXIueCwgY2VudGVyLnldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBHZW8ubWV0ZXJzVG9MYXRMbmcoY2VudGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Wm9vbUFyb3VuZE5vTW92ZUVuZChtYXAsIHRhcmdldENlbnRlciwgc3RhcnRab29tICsgKHRhcmdldFpvb20gLSBzdGFydFpvb20pICogdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Wm9vbUFyb3VuZE5vTW92ZUVuZChtYXAsIHRhcmdldENlbnRlciwgdGFyZ2V0Wm9vbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5fbW92ZUVuZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5fbW92ZVN0YXJ0KHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jYWxsKG1hcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE1vZGlmeSB0aGUgZG91YmxlLWNsaWNrIHpvb20gaGFuZGxlciB0byBkbyBhIHNob3J0IHpvb20gYW5pbWF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSBtYXAuZG91YmxlQ2xpY2tab29tLmVuYWJsZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgbWFwLmRvdWJsZUNsaWNrWm9vbS5kaXNhYmxlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbWFwLmRvdWJsZUNsaWNrWm9vbS5fb25Eb3VibGVDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFpvb20gPSBtYXAuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gbWFwLm9wdGlvbnMuem9vbURlbHRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSBlLm9yaWdpbmFsRXZlbnQuc2hpZnRLZXkgPyBvbGRab29tIC0gZGVsdGEgOiBvbGRab29tICsgZGVsdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXAub3B0aW9ucy5kb3VibGVDbGlja1pvb20gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx5QXJvdW5kKG1hcCwgbWFwLmdldENlbnRlcigpLCB6b29tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx5QXJvdW5kKG1hcCwgbWFwLmNvbnRhaW5lclBvaW50VG9MYXRMbmcoZS5jb250YWluZXJQb2ludCksIHpvb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuZG91YmxlQ2xpY2tab29tLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdXBkYXRlVmlldzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5fbWFwLmdldENlbnRlcigpO1xuICAgICAgICAgICAgICAgIHZpZXcuem9vbSA9IE1hdGgubWluKHRoaXMuX21hcC5nZXRab29tKCksIHRoaXMuX21hcC5nZXRNYXhab29tKCkgfHwgR2VvLmRlZmF1bHRfdmlld19tYXhfem9vbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS52aWV3LnNldFZpZXcodmlldyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB1cGRhdGVTaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSB0aGlzLl9tYXAuZ2V0U2l6ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUucmVzaXplTWFwKHNpemUueCwgc2l6ZS55KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9uVGFuZ3JhbVZpZXdVcGRhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21hcCB8fCB0aGlzLl91cGRhdGluZ190YW5ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLnNldFZpZXcoW3RoaXMuc2NlbmUudmlldy5jZW50ZXIubGF0LCB0aGlzLnNjZW5lLnZpZXcuY2VudGVyLmxuZ10sIHRoaXMuc2NlbmUudmlldy56b29tLCB7IGFuaW1hdGU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJzZVRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudXBkYXRlKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBSZXZlcnNlIHRoZSBDU1MgcG9zaXRpb25pbmcgTGVhZmxldCBhcHBsaWVzIHRvIHRoZSBsYXllciwgc2luY2UgVGFuZ3JhbSdzIFdlYkdMIGNhbnZhc1xuICAgICAgICAgICAgLy8gaXMgZXhwZWN0ZWQgdG8gYmUgJ2Fic29sdXRlbHknIHBvc2l0aW9uZWQuXG4gICAgICAgICAgICByZXZlcnNlVHJhbnNmb3JtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXAgfHwgIXRoaXMuc2NlbmUgfHwgIXRoaXMuc2NlbmUuY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgdG9wX2xlZnQgPSB0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQoWzAsIDBdKTtcbiAgICAgICAgICAgICAgICBMLkRvbVV0aWwuc2V0UG9zaXRpb24odGhpcy5zY2VuZS5jb250YWluZXIsIHRvcF9sZWZ0KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIFRpZSBMZWFmbGV0IGV2ZW50IGhhbmRsZXJzIHRvIFRhbmdyYW0gZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgICAgIHNldHVwU2VsZWN0aW9uRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKG1hcCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMgPSB7fTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MuY2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEZlYXR1cmVBdChldmVudC5jb250YWluZXJQb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbihzZWxlY3Rpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdGlvbiwgeyBsZWFmbGV0X2V2ZW50OiBldmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5jbGljayhyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdjbGljaycsIHRoaXMuaG9va3MuY2xpY2spO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5tb3VzZW1vdmUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmhvdmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEZlYXR1cmVBdChldmVudC5jb250YWluZXJQb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbihzZWxlY3Rpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdGlvbiwgeyBsZWFmbGV0X2V2ZW50OiBldmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3ZlcihyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdtb3VzZW1vdmUnLCB0aGlzLmhvb2tzLm1vdXNlbW92ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLm1vdXNlb3V0ID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gbW91c2UgbGVhdmVzIG1hcCwgc2VuZCBhbiBhZGRpdGlvbmFsIHNlbGVjdGlvbiBldmVudCB0byBpbmRpY2F0ZSBubyBmZWF0dXJlIGlzIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3ZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3Zlcih7IGNoYW5nZWQ6IHRydWUsIGxlYWZsZXRfZXZlbnQ6IGV2ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ21vdXNlb3V0JywgdGhpcy5ob29rcy5tb3VzZW91dCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBTZXQgdXNlci1kZWZpbmVkIGhhbmRsZXJzIGZvciBmZWF0dXJlIHNlbGVjdGlvbiBldmVudHNcbiAgICAgICAgICAgIC8vIEN1cnJlbnRseSBvbmx5IG9uZSBoYW5kbGVyIGNhbiBiZSBkZWZpbmVkIGZvciBlYWNoIGV2ZW50IHR5cGVcbiAgICAgICAgICAgIC8vIEV2ZW50IHR5cGVzIGFyZTogYGNsaWNrYCwgYGhvdmVyYCAobGVhZmxldCBgbW91c2Vtb3ZlYClcbiAgICAgICAgICAgIHNldFNlbGVjdGlvbkV2ZW50czogZnVuY3Rpb24gKGV2ZW50cykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMgPSBPYmplY3QuYXNzaWduKHRoaXMuX3NlbGVjdGlvbl9ldmVudHMsIGV2ZW50cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBsYXllciBjbGFzc1xuICAgICAgICBMZWFmbGV0TGF5ZXIgPSBsYXllckJhc2VDbGFzcy5leHRlbmQobGF5ZXJDbGFzc0NvbmZpZyk7XG5cbiAgICAgICAgLy8gUG9seWZpbGwgc29tZSAxLjAgbWV0aG9kc1xuICAgICAgICBpZiAodHlwZW9mIExlYWZsZXRMYXllci5yZW1vdmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIExlYWZsZXRMYXllci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgncmVtb3ZlJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgTGVhZmxldExheWVyLmxheWVyQmFzZUNsYXNzID0gbGF5ZXJCYXNlQ2xhc3M7XG4gICAgICAgIExlYWZsZXRMYXllci5sZWFmbGV0VmVyc2lvbiA9IGxlYWZsZXRWZXJzaW9uO1xuXG4gICAgICAgIHJldHVybiBuZXcgTGVhZmxldExheWVyKG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbC9nbHNsJztcbmltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuL3ZlY3Rvcic7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuXG5jb25zdCBzaGFkZXJTcmNfYW1iaWVudExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9hbWJpZW50TGlnaHQuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfZGlyZWN0aW9uYWxMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvZGlyZWN0aW9uYWxMaWdodC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19wb2ludExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9wb2ludExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3Nwb3RMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvc3BvdExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuXG4vLyBBYnN0cmFjdCBsaWdodFxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcblxuICAgICAgICBpZiAoY29uZmlnLmFtYmllbnQgPT0gbnVsbCB8fCB0eXBlb2YgY29uZmlnLmFtYmllbnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmFtYmllbnQgPSBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLmFtYmllbnQgfHwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFtYmllbnQgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGNvbmZpZy5hbWJpZW50KS5zbGljZSgwLCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuZGlmZnVzZSA9PSBudWxsIHx8IHR5cGVvZiBjb25maWcuZGlmZnVzZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuZGlmZnVzZSA9IEdMU0wuZXhwYW5kVmVjMyhjb25maWcuZGlmZnVzZSAhPSBudWxsID8gY29uZmlnLmRpZmZ1c2UgOiAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlmZnVzZSA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoY29uZmlnLmRpZmZ1c2UpLnNsaWNlKDAsIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5zcGVjdWxhciA9PSBudWxsIHx8IHR5cGVvZiBjb25maWcuc3BlY3VsYXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLnNwZWN1bGFyID0gR0xTTC5leHBhbmRWZWMzKGNvbmZpZy5zcGVjdWxhciB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3BlY3VsYXIgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGNvbmZpZy5zcGVjdWxhcikuc2xpY2UoMCwgMyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBsaWdodCBieSB0eXBlIG5hbWUsIGZhY3Rvcnktc3R5bGVcbiAgICAvLyAnY29uZmlnJyBtdXN0IGluY2x1ZGUgJ25hbWUnIGFuZCAndHlwZScsIGFsb25nIHdpdGggYW55IG90aGVyIHR5cGUtc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHN0YXRpYyBjcmVhdGUgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBpZiAoTGlnaHQudHlwZXNbY29uZmlnLnR5cGVdKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpZ2h0LnR5cGVzW2NvbmZpZy50eXBlXSh2aWV3LCBjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGxpZ2h0IGZvciBhIHN0eWxlOiBmcmFnbWVudCBsaWdodGluZywgdmVydGV4IGxpZ2h0aW5nLCBvciBub25lXG4gICAgc3RhdGljIHNldE1vZGUgKG1vZGUsIHN0eWxlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBtb2RlID0gJ2ZyYWdtZW50JztcbiAgICAgICAgfVxuICAgICAgICBtb2RlID0gTGlnaHQuZW5hYmxlZCAmJiAoKG1vZGUgIT0gbnVsbCkgPyBtb2RlIDogJ2ZyYWdtZW50Jyk7IC8vIGRlZmF1bHQgdG8gZnJhZ21lbnQgbGlnaHRpbmdcbiAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9MSUdIVElOR19GUkFHTUVOVCddID0gKG1vZGUgPT09ICdmcmFnbWVudCcpO1xuICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX0xJR0hUSU5HX1ZFUlRFWCddID0gKG1vZGUgPT09ICd2ZXJ0ZXgnKTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3QgYWxsIHByb3ZpZGVkIGxpZ2h0IGRlZmluaXRpb25zLCBhbmQgY2FsY3VsYXRlIGN1bXVsYXRpdmUgbGlnaHQgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0IChsaWdodHMpIHtcbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgaW5qZWN0aW9uc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKExpZ2h0LmJsb2NrKTtcblxuICAgICAgICAvLyBJZiBsaWdodGluZyBpcyBnbG9iYWxseSBkaXNhYmxlZCwgbm90aGluZyBpcyBpbmplY3RlZCAobW9zdGx5IGZvciBkZWJ1Z2dpbmcgb3IgbGl2ZSBlZGl0aW5nKVxuICAgICAgICBpZiAoIUxpZ2h0LmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnN0cnVjdCBjb2RlIHRvIGNhbGN1bGF0ZSBlYWNoIGxpZ2h0IGluc3RhbmNlXG4gICAgICAgIGxldCBjYWxjdWxhdGVMaWdodHMgPSBcIlwiO1xuICAgICAgICBpZiAobGlnaHRzICYmIE9iamVjdC5rZXlzKGxpZ2h0cykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gQ29sbGVjdCB1bmlxdWVzIHR5cGVzIG9mIGxpZ2h0c1xuICAgICAgICAgICAgbGV0IHR5cGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBsaWdodF9uYW1lIGluIGxpZ2h0cykge1xuICAgICAgICAgICAgICAgIHR5cGVzW2xpZ2h0c1tsaWdodF9uYW1lXS50eXBlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBlYWNoIHR5cGUgb2YgbGlnaHRcbiAgICAgICAgICAgIGZvciAobGV0IHR5cGUgaW4gdHlwZXMpIHtcbiAgICAgICAgICAgICAgICBMaWdodC50eXBlc1t0eXBlXS5pbmplY3QoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IHBlci1pbnN0YW5jZSBibG9ja3MgYW5kIGNvbnN0cnVjdCB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlIGVhY2ggbGlnaHRcbiAgICAgICAgICAgIGZvciAobGV0IGxpZ2h0X25hbWUgaW4gbGlnaHRzKSB7XG4gICAgICAgICAgICAgICAgLy8gRGVmaW5lIGluc3RhbmNlXG4gICAgICAgICAgICAgICAgbGlnaHRzW2xpZ2h0X25hbWVdLmluamVjdCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjYWxjdWxhdGlvbiBmdW5jdGlvbiB0byB0aGUgbGlzdFxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUxpZ2h0cyArPSBgY2FsY3VsYXRlTGlnaHQoJHtsaWdodF9uYW1lfSwgX2V5ZVRvUG9pbnQsIF9ub3JtYWwpO1xcbmA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHbHVlIHRvZ2V0aGVyIHRoZSBmaW5hbCBsaWdodGluZyBmdW5jdGlvbiB0aGF0IHN1bXMgYWxsIHRoZSBsaWdodHNcbiAgICAgICAgbGV0IGNhbGN1bGF0ZUZ1bmN0aW9uID0gYFxuICAgICAgICAgICAgdmVjNCBjYWxjdWxhdGVMaWdodGluZyhpbiB2ZWMzIF9leWVUb1BvaW50LCBpbiB2ZWMzIF9ub3JtYWwsIGluIHZlYzQgX2NvbG9yKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBEbyBpbml0aWFsIG1hdGVyaWFsIGNhbGN1bGF0aW9ucyBvdmVyIG5vcm1hbCwgZW1pc3Npb24sIGFtYmllbnQsIGRpZmZ1c2UgYW5kIHNwZWN1bGFyIHZhbHVlc1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU1hdGVyaWFsKF9leWVUb1BvaW50LF9ub3JtYWwpO1xuXG4gICAgICAgICAgICAgICAgLy8gVW4gcm9sbCB0aGUgbG9vcCBvZiBpbmRpdmlkdWFsIGxpZ3RocyB0byBjYWxjdWxhdGVcbiAgICAgICAgICAgICAgICAke2NhbGN1bGF0ZUxpZ2h0c31cblxuICAgICAgICAgICAgICAgIC8vICBGaW5hbCBsaWdodCBpbnRlbnNpdHkgY2FsY3VsYXRpb25cbiAgICAgICAgICAgICAgICB2ZWM0IGNvbG9yID0gdmVjNCgwLjApO1xuXG4gICAgICAgICAgICAgICAgLy8gS2VlcCBtYXRlcmlhbCBhbHBoYSBjaGFubmVsIHdoZW4gYWxwaGEgYmxlbmRpbmcgaXMgb25cbiAgICAgICAgICAgICAgICAjaWYgIWRlZmluZWQoVEFOR1JBTV9CTEVORF9PUEFRVUUpXG4gICAgICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX0VNSVNTSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IG1hdGVyaWFsLmVtaXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9BTUJJRU5UXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvciArPSBsaWdodF9hY2N1bXVsYXRvcl9hbWJpZW50ICogX2NvbG9yICogbWF0ZXJpYWwuYW1iaWVudDtcbiAgICAgICAgICAgICAgICAgICAgI2Vsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciArPSBsaWdodF9hY2N1bXVsYXRvcl9hbWJpZW50ICogX2NvbG9yICogbWF0ZXJpYWwuZGlmZnVzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvciArPSBsaWdodF9hY2N1bXVsYXRvcl9kaWZmdXNlICogX2NvbG9yICogbWF0ZXJpYWwuZGlmZnVzZTtcbiAgICAgICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfU1BFQ1VMQVJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICs9IGxpZ2h0X2FjY3VtdWxhdG9yX3NwZWN1bGFyICogbWF0ZXJpYWwuc3BlY3VsYXI7XG4gICAgICAgICAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgICAgIC8vIE11bHRpcGx5IG1hdGVyaWFsIGFscGhhIGNoYW5uZWwgaW50byBtYXRlcmlhbCBSR0Igd2hlbiBhbHBoYSBibGVuZGluZyBpcyBvZmZcbiAgICAgICAgICAgICAgICAjZWxzZVxuICAgICAgICAgICAgICAgICAgICBjb2xvci5hID0gX2NvbG9yLmE7IC8vIHVzZSB2ZXJ0ZXggY29sb3IgYWxwaGFcblxuICAgICAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9FTUlTU0lPTlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiID0gbWF0ZXJpYWwuZW1pc3Npb24ucmdiICogbWF0ZXJpYWwuZW1pc3Npb24uYTtcbiAgICAgICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfQU1CSUVOVFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX2FtYmllbnQucmdiICogX2NvbG9yLnJnYiAqIG1hdGVyaWFsLmFtYmllbnQucmdiICogbWF0ZXJpYWwuYW1iaWVudC5hO1xuICAgICAgICAgICAgICAgICAgICAjZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLnJnYiArPSBsaWdodF9hY2N1bXVsYXRvcl9hbWJpZW50LnJnYiAqIF9jb2xvci5yZ2IgKiBtYXRlcmlhbC5kaWZmdXNlLnJnYiAqIG1hdGVyaWFsLmRpZmZ1c2UuYTtcbiAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgKz0gbGlnaHRfYWNjdW11bGF0b3JfZGlmZnVzZS5yZ2IgKiBfY29sb3IucmdiICogbWF0ZXJpYWwuZGlmZnVzZS5yZ2IgKiBtYXRlcmlhbC5kaWZmdXNlLmE7XG4gICAgICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX1NQRUNVTEFSXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgKz0gbGlnaHRfYWNjdW11bGF0b3Jfc3BlY3VsYXIucmdiICogbWF0ZXJpYWwuc3BlY3VsYXIucmdiICogbWF0ZXJpYWwuc3BlY3VsYXIuYTtcbiAgICAgICAgICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAvLyBDbGFtcCBmaW5hbCBjb2xvclxuICAgICAgICAgICAgICAgIGNvbG9yID0gY2xhbXAoY29sb3IsIDAuMCwgMS4wKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjtcbiAgICAgICAgICAgIH1gO1xuXG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIGNhbGN1bGF0ZUZ1bmN0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBDb21tb24gaW5zdGFuY2UgZGVmaW5pdGlvblxuICAgIGluamVjdCAoKSB7XG4gICAgICAgIGxldCBpbnN0YW5jZSA9ICBgXG4gICAgICAgICAgICB1bmlmb3JtICR7dGhpcy5zdHJ1Y3RfbmFtZX0gdV8ke3RoaXMubmFtZX07XG4gICAgICAgICAgICAke3RoaXMuc3RydWN0X25hbWV9ICR7dGhpcy5uYW1lfTtcbiAgICAgICAgICAgIGA7XG4gICAgICAgIGxldCBhc3NpZ24gPSBgXG4gICAgICAgICAgICAke3RoaXMubmFtZX0gPSB1XyR7dGhpcy5uYW1lfTtcXG5cbiAgICAgICAgYDtcblxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBpbnN0YW5jZSk7XG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soJ3NldHVwJywgYXNzaWduKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbWV0aG9kIGNhbGxlZCBvbmNlIHBlciBmcmFtZVxuICAgIHVwZGF0ZSAoKSB7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uY2UgcGVyIGZyYW1lIHBlciBwcm9ncmFtIChlLmcuIGZvciBtYWluIHJlbmRlciBwYXNzLCB0aGVuIGZvciBlYWNoIGFkZGl0aW9uYWxcbiAgICAvLyBwYXNzIGZvciBmZWF0dXJlIHNlbGVjdGlvbiwgZXRjLilcbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIC8vICBUaHJlZSBjb21tb24gbGlnaHQgcHJvcGVydGllc1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uYW1iaWVudGAsIHRoaXMuYW1iaWVudCk7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5kaWZmdXNlYCwgdGhpcy5kaWZmdXNlKTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LnNwZWN1bGFyYCwgdGhpcy5zcGVjdWxhcik7XG4gICAgfVxuXG59XG5cbkxpZ2h0LnR5cGVzID0ge307IC8vIHJlZmVyZW5jZXMgdG8gc3ViY2xhc3NlcyBieSBzaG9ydCBuYW1lXG5MaWdodC5ibG9jayA9ICdsaWdodGluZyc7IC8vIHNoYWRlciBibG9jayBuYW1lXG5MaWdodC5lbmFibGVkID0gdHJ1ZTsgLy8gbGlnaHRpbmcgY2FuIGJlIGdsb2JhbGx5IGVuYWJsZWQvZGlzYWJsZWRcblxuXG4vLyBMaWdodCBzdWJjbGFzc2VzXG5jbGFzcyBBbWJpZW50TGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3VwZXIodmlldywgY29uZmlnKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2FtYmllbnQnO1xuICAgICAgICB0aGlzLnN0cnVjdF9uYW1lID0gJ0FtYmllbnRMaWdodCc7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IHN0cnVjdCBhbmQgY2FsY3VsYXRlIGZ1bmN0aW9uXG4gICAgc3RhdGljIGluamVjdCgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX2FtYmllbnRMaWdodCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uYW1iaWVudGAsIHRoaXMuYW1iaWVudCk7XG4gICAgfVxuXG59XG5MaWdodC50eXBlc1snYW1iaWVudCddID0gQW1iaWVudExpZ2h0O1xuXG5jbGFzcyBEaXJlY3Rpb25hbExpZ2h0IGV4dGVuZHMgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IodmlldywgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdkaXJlY3Rpb25hbCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnRGlyZWN0aW9uYWxMaWdodCc7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5kaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IGNvbmZpZy5kaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBEZWZhdWx0IGRpcmVjdGlvbmFsIGxpZ2h0IG1haW50YWlucyBmdWxsIGludGVuc2l0eSBvbiBncm91bmQsIHdpdGggYmFzaWMgZXh0cnVzaW9uIHNoYWRpbmdcbiAgICAgICAgICAgIGxldCB0aGV0YSA9IDEzNTsgLy8gYW5nbGUgb2YgbGlnaHQgaW4geHkgcGxhbmUgKHJvdGF0ZWQgYXJvdW5kIHogYXhpcylcbiAgICAgICAgICAgIGxldCBzY2FsZSA9IE1hdGguc2luKE1hdGguUEkqNjAvMTgwKTsgLy8gc2NhbGluZyBmYWN0b3IgdG8ga2VlcCB0b3RhbCBkaXJlY3Rpb25hbCBpbnRlbnNpdHkgdG8gMC41XG4gICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBbXG4gICAgICAgICAgICAgICAgTWF0aC5jb3MoTWF0aC5QSSp0aGV0YS8xODApICogc2NhbGUsXG4gICAgICAgICAgICAgICAgTWF0aC5zaW4oTWF0aC5QSSp0aGV0YS8xODApICogc2NhbGUsXG4gICAgICAgICAgICAgICAgLTAuNVxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5hbWJpZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFtYmllbnQgPSBHTFNMLmV4cGFuZFZlYzMoMC41KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHRoaXMuX2RpcmVjdGlvbi5tYXAocGFyc2VGbG9hdCk7XG4gICAgfVxuXG4gICAgZ2V0IGRpcmVjdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXJlY3Rpb247XG4gICAgfVxuXG4gICAgc2V0IGRpcmVjdGlvbiAodikge1xuICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBWZWN0b3Iubm9ybWFsaXplKHYpO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBzdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIHNoYWRlclNyY19kaXJlY3Rpb25hbExpZ2h0KTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIHN1cGVyLnNldHVwUHJvZ3JhbShfcHJvZ3JhbSk7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5kaXJlY3Rpb25gLCB0aGlzLmRpcmVjdGlvbik7XG4gICAgfVxuXG59XG5MaWdodC50eXBlc1snZGlyZWN0aW9uYWwnXSA9IERpcmVjdGlvbmFsTGlnaHQ7XG5cblxuY2xhc3MgUG9pbnRMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yICh2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3VwZXIodmlldywgY29uZmlnKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3BvaW50JztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdQb2ludExpZ2h0JztcblxuICAgICAgICB0aGlzLnBvc2l0aW9uID0gY29uZmlnLnBvc2l0aW9uIHx8IFswLCAwLCAnMTAwcHgnXTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbl9leWUgPSBbXTsgLy8gcG9zaXRpb24gaW4gZXllc3BhY2VcbiAgICAgICAgdGhpcy5vcmlnaW4gPSBjb25maWcub3JpZ2luIHx8ICdncm91bmQnO1xuICAgICAgICB0aGlzLmF0dGVudWF0aW9uID0gIWlzTmFOKHBhcnNlRmxvYXQoY29uZmlnLmF0dGVudWF0aW9uKSkgPyBwYXJzZUZsb2F0KGNvbmZpZy5hdHRlbnVhdGlvbikgOiAwO1xuXG4gICAgICAgIGlmIChjb25maWcucmFkaXVzKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcucmFkaXVzKSAmJiBjb25maWcucmFkaXVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHRoaXMucmFkaXVzID0gY29uZmlnLnJhZGl1cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmFkaXVzID0gW251bGwsIGNvbmZpZy5yYWRpdXNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IHN0cnVjdCBhbmQgY2FsY3VsYXRlIGZ1bmN0aW9uXG4gICAgc3RhdGljIGluamVjdCAoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIHNoYWRlclNyY19wb2ludExpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3QgaXNudGFuY2Utc3BlY2lmaWMgc2V0dGluZ3NcbiAgICBpbmplY3QoKSB7XG4gICAgICAgIHN1cGVyLmluamVjdCgpO1xuXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX0VYUE9ORU5UJ10gPSAodGhpcy5hdHRlbnVhdGlvbiAhPT0gMCk7XG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX0lOTkVSX1JBRElVUyddID0gKHRoaXMucmFkaXVzICE9IG51bGwgJiYgdGhpcy5yYWRpdXNbMF0gIT0gbnVsbCk7XG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX09VVEVSX1JBRElVUyddID0gKHRoaXMucmFkaXVzICE9IG51bGwpO1xuICAgIH1cblxuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRXllUG9zaXRpb24oKTtcbiAgICB9XG5cbiAgICB1cGRhdGVFeWVQb3NpdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm9yaWdpbiA9PT0gJ3dvcmxkJykge1xuICAgICAgICAgICAgLy8gRm9yIHdvcmxkIG9yaWdpbiwgZm9ybWF0IGlzOiBbbG9uZ2l0dWRlLCBsYXRpdHVkZSwgbWV0ZXJzIChkZWZhdWx0KSBvciBwaXhlbHMgdy9weCB1bml0c11cblxuICAgICAgICAgICAgLy8gTW92ZSBsaWdodCdzIHdvcmxkIHBvc2l0aW9uIGludG8gY2FtZXJhIHNwYWNlXG4gICAgICAgICAgICBsZXQgW3gsIHldID0gR2VvLmxhdExuZ1RvTWV0ZXJzKHRoaXMucG9zaXRpb24pO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMF0gPSB4IC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMF07XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsxXSA9IHkgLSB0aGlzLnZpZXcuY2FtZXJhLnBvc2l0aW9uX21ldGVyc1sxXTtcblxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMl0gPSBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModGhpcy5wb3NpdGlvblsyXSxcbiAgICAgICAgICAgICAgICB7IHpvb206IHRoaXMudmlldy56b29tLCBtZXRlcnNfcGVyX3BpeGVsOiBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy52aWV3Lnpvb20pIH0pO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMl0gPSB0aGlzLnBvc2l0aW9uX2V5ZVsyXSAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzJdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMub3JpZ2luID09PSAnZ3JvdW5kJyB8fCB0aGlzLm9yaWdpbiA9PT0gJ2NhbWVyYScpIHtcbiAgICAgICAgICAgIC8vIEZvciBjYW1lcmEgb3IgZ3JvdW5kIG9yaWdpbiwgZm9ybWF0IGlzOiBbeCwgeSwgel0gaW4gbWV0ZXJzIChkZWZhdWx0KSBvciBwaXhlbHMgdy9weCB1bml0c1xuXG4gICAgICAgICAgICAvLyBMaWdodCBpcyBpbiBjYW1lcmEgc3BhY2UgYnkgZGVmYXVsdFxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWUgPSBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModGhpcy5wb3NpdGlvbixcbiAgICAgICAgICAgICAgICB7IHpvb206IHRoaXMudmlldy56b29tLCBtZXRlcnNfcGVyX3BpeGVsOiBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy52aWV3Lnpvb20pIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcmlnaW4gPT09ICdncm91bmQnKSB7XG4gICAgICAgICAgICAgICAgLy8gTGVhdmUgbGlnaHQncyB4eSBpbiBjYW1lcmEgc3BhY2UsIGJ1dCB6IG5lZWRzIHRvIGJlIG1vdmVkIHJlbGF0aXZlIHRvIGdyb3VuZCBwbGFuZVxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzJdID0gdGhpcy5wb3NpdGlvbl9leWVbMl0gLSB0aGlzLnZpZXcuY2FtZXJhLnBvc2l0aW9uX21ldGVyc1syXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVszXSA9IDE7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICBzdXBlci5zZXR1cFByb2dyYW0oX3Byb2dyYW0pO1xuXG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzRmdicsIGB1XyR7dGhpcy5uYW1lfS5wb3NpdGlvbmAsIHRoaXMucG9zaXRpb25fZXllKTtcblxuICAgICAgICBpZihTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9FWFBPTkVOVCddKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5hdHRlbnVhdGlvbkV4cG9uZW50YCwgdGhpcy5hdHRlbnVhdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZihTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9JTk5FUl9SQURJVVMnXSkge1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCBgdV8ke3RoaXMubmFtZX0uaW5uZXJSYWRpdXNgLFxuICAgICAgICAgICAgICAgIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh0aGlzLnJhZGl1c1swXSxcbiAgICAgICAgICAgICAgICAgICAgeyB6b29tOiB0aGlzLnZpZXcuem9vbSwgbWV0ZXJzX3Blcl9waXhlbDogR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMudmlldy56b29tKSB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9PVVRFUl9SQURJVVMnXSkge1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCBgdV8ke3RoaXMubmFtZX0ub3V0ZXJSYWRpdXNgLFxuICAgICAgICAgICAgICAgIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh0aGlzLnJhZGl1c1sxXSxcbiAgICAgICAgICAgICAgICAgICAgeyB6b29tOiB0aGlzLnZpZXcuem9vbSwgbWV0ZXJzX3Blcl9waXhlbDogR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMudmlldy56b29tKSB9KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5MaWdodC50eXBlc1sncG9pbnQnXSA9IFBvaW50TGlnaHQ7XG5cblxuY2xhc3MgU3BvdExpZ2h0IGV4dGVuZHMgUG9pbnRMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmlldywgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdzcG90bGlnaHQnO1xuICAgICAgICB0aGlzLnN0cnVjdF9uYW1lID0gJ1Nwb3RMaWdodCc7XG5cbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSB0aGlzLl9kaXJlY3Rpb24gPSAoY29uZmlnLmRpcmVjdGlvbiB8fCBbMCwgMCwgLTFdKS5tYXAocGFyc2VGbG9hdCk7IC8vIFt4LCB5LCB6XVxuICAgICAgICB0aGlzLmV4cG9uZW50ID0gY29uZmlnLmV4cG9uZW50ID8gcGFyc2VGbG9hdChjb25maWcuZXhwb25lbnQpIDogMC4yO1xuICAgICAgICB0aGlzLmFuZ2xlID0gY29uZmlnLmFuZ2xlID8gcGFyc2VGbG9hdChjb25maWcuYW5nbGUpIDogMjA7XG4gICAgfVxuXG4gICAgZ2V0IGRpcmVjdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXJlY3Rpb247XG4gICAgfVxuXG4gICAgc2V0IGRpcmVjdGlvbiAodikge1xuICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBWZWN0b3Iubm9ybWFsaXplKHYpO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBzdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QgKCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfc3BvdExpZ2h0KTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIHN1cGVyLnNldHVwUHJvZ3JhbShfcHJvZ3JhbSk7XG5cbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmRpcmVjdGlvbmAsIHRoaXMuZGlyZWN0aW9uKTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCBgdV8ke3RoaXMubmFtZX0uc3BvdENvc0N1dG9mZmAsIE1hdGguY29zKHRoaXMuYW5nbGUgKiAzLjE0MTU5IC8gMTgwKSk7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LnNwb3RFeHBvbmVudGAsIHRoaXMuZXhwb25lbnQpO1xuICAgIH1cblxufVxuTGlnaHQudHlwZXNbJ3Nwb3RsaWdodCddID0gU3BvdExpZ2h0O1xuIiwiaW1wb3J0IEdMU0wgZnJvbSAnLi9nbC9nbHNsJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfbWF0ZXJpYWwgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9nbC9zaGFkZXJzL21hdGVyaWFsLmdsc2wnLCAndXRmOCcpO1xuXG5jb25zdCBtYXRlcmlhbF9wcm9wcyA9IFsnZW1pc3Npb24nLCAnYW1iaWVudCcsICdkaWZmdXNlJywgJ3NwZWN1bGFyJ107XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hdGVyaWFsIHtcbiAgICBjb25zdHJ1Y3RvciAoY29uZmlnKSB7XG5cbiAgICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuXG4gICAgICAgIC8vIFRoZXNlIHByb3BlcnRpZXMgYWxsIGhhdmUgdGhlIHNhbWUgZGVmYXVsdHMsIHNvIHRoZXkgY2FuIGJlIHNldCBpbiBidWxrXG4gICAgICAgIG1hdGVyaWFsX3Byb3BzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLnRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmU6IHZhbHVlLnRleHR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nOiB2YWx1ZS5tYXBwaW5nIHx8ICdzcGhlcmVtYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IEdMU0wuZXhwYW5kVmVjMyh2YWx1ZS5zY2FsZSAhPSBudWxsID8gdmFsdWUuc2NhbGUgOiAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudDogR0xTTC5leHBhbmRWZWM0KHZhbHVlLmFtb3VudCAhPSBudWxsID8gdmFsdWUuYW1vdW50IDogMSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0geyBhbW91bnQ6IEdMU0wuZXhwYW5kVmVjNCh2YWx1ZSkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0geyBhbW91bnQ6IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IodmFsdWUpIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFeHRyYSBzcGVjdWxhciBwcm9wc1xuICAgICAgICBpZiAodGhpcy5zcGVjdWxhcikge1xuICAgICAgICAgICAgdGhpcy5zcGVjdWxhci5zaGluaW5lc3MgPSBjb25maWcuc2hpbmluZXNzID8gcGFyc2VGbG9hdChjb25maWcuc2hpbmluZXNzKSA6IDAuMjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vcm1hbCBtYXBwaW5nXG4gICAgICAgIGlmIChjb25maWcubm9ybWFsICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubm9ybWFsID0ge1xuICAgICAgICAgICAgICAgIHRleHR1cmU6IGNvbmZpZy5ub3JtYWwudGV4dHVyZSxcbiAgICAgICAgICAgICAgICBtYXBwaW5nOiBjb25maWcubm9ybWFsLm1hcHBpbmcgfHwgJ3RyaXBsYW5hcicsXG4gICAgICAgICAgICAgICAgc2NhbGU6IEdMU0wuZXhwYW5kVmVjMyhjb25maWcubm9ybWFsLnNjYWxlICE9IG51bGwgPyBjb25maWcubm9ybWFsLnNjYWxlIDogMSksXG4gICAgICAgICAgICAgICAgYW1vdW50OiBjb25maWcubm9ybWFsLmFtb3VudCAhPSBudWxsID8gY29uZmlnLm5vcm1hbC5hbW91bnQgOiAxXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIGEgbWF0ZXJpYWwgY29uZmlnIGJsb2NrIGhhcyBzdWZmaWNpZW50IHByb3BlcnRpZXMgdG8gY3JlYXRlIGEgbWF0ZXJpYWxcbiAgICBzdGF0aWMgaXNWYWxpZCAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5lbWlzc2lvbiA9PSBudWxsICYmXG4gICAgICAgICAgICBjb25maWcuYW1iaWVudCA9PSBudWxsICYmXG4gICAgICAgICAgICBjb25maWcuZGlmZnVzZSA9PSBudWxsICYmXG4gICAgICAgICAgICBjb25maWcuc3BlY3VsYXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaW5qZWN0IChzdHlsZSkge1xuICAgICAgICAvLyBGb3IgZWFjaCBwcm9wZXJ0eSwgc2V0cyBkZWZpbmVzIHRvIGNvbmZpZ3VyZSB0ZXh0dXJlIG1hcHBpbmcsIHdpdGggYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFLCBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0VfVEVYVFVSRSwgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFX1RFWFRVUkVfU1BIRVJFTUFQXG4gICAgICAgIC8vIEFsc28gc2V0cyBmbGFncyB0byBrZWVwIHRyYWNrIG9mIGVhY2ggdW5pcXVlIG1hcHBpbmcgdHlwZSBiZWluZyB1c2VkLCBlLmcuOlxuICAgICAgICAvLyAgIFRBTkdSQU1fTUFURVJJQUxfVEVYVFVSRV9TUEhFUkVNQVBcbiAgICAgICAgLy8gRW5hYmxlcyB0ZXh0dXJlIGNvb3JkaW5hdGVzIGlmIG5lZWRlZCBhbmQgbm90IGFscmVhZHkgb25cbiAgICAgICAgbWF0ZXJpYWxfcHJvcHMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIGxldCBkZWYgPSBgVEFOR1JBTV9NQVRFUklBTF8ke3Byb3AudG9VcHBlckNhc2UoKX1gO1xuICAgICAgICAgICAgbGV0IHRleGRlZiA9IGRlZiArICdfVEVYVFVSRSc7XG4gICAgICAgICAgICBzdHlsZS5kZWZpbmVzW2RlZl0gPSAodGhpc1twcm9wXSAhPSBudWxsKTtcbiAgICAgICAgICAgIGlmICh0aGlzW3Byb3BdICYmIHRoaXNbcHJvcF0udGV4dHVyZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbdGV4ZGVmXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1t0ZXhkZWYgKyAnXycgKyB0aGlzW3Byb3BdLm1hcHBpbmcudG9VcHBlckNhc2UoKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbYFRBTkdSQU1fTUFURVJJQUxfVEVYVFVSRV8ke3RoaXNbcHJvcF0ubWFwcGluZy50b1VwcGVyQ2FzZSgpfWBdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBzdHlsZS50ZXhjb29yZHMgfHwgKHRoaXNbcHJvcF0ubWFwcGluZyA9PT0gJ3V2Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE5vcm1hbCBtYXBwaW5nXG4gICAgICAgIC8vIEFzIGFub3ZlLCBzZXRzIGZsYWdzIHRvIGtlZXAgdHJhY2sgb2YgZWFjaCB1bmlxdWUgbWFwcGluZyB0eXBlIGJlaW5nIHVzZWQsIGUuZy46XG4gICAgICAgIC8vICAgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFX1NQSEVSRU1BUFxuICAgICAgICBpZiAodGhpcy5ub3JtYWwgJiYgdGhpcy5ub3JtYWwudGV4dHVyZSkge1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9NQVRFUklBTF9OT1JNQUxfVEVYVFVSRSddID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbJ1RBTkdSQU1fTUFURVJJQUxfTk9STUFMX1RFWFRVUkVfJyArIHRoaXMubm9ybWFsLm1hcHBpbmcudG9VcHBlckNhc2UoKV0gPSB0cnVlO1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1tgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFXyR7dGhpcy5ub3JtYWwubWFwcGluZy50b1VwcGVyQ2FzZSgpfWBdID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHN0eWxlLnRleGNvb3JkcyB8fCAodGhpcy5ub3JtYWwubWFwcGluZyA9PT0gJ3V2Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS5yZXBsYWNlU2hhZGVyQmxvY2soTWF0ZXJpYWwuYmxvY2ssIHNoYWRlclNyY19tYXRlcmlhbCwgJ01hdGVyaWFsJyk7XG4gICAgICAgIHN0eWxlLmFkZFNoYWRlckJsb2NrKCdzZXR1cCcsICdcXG5tYXRlcmlhbCA9IHVfbWF0ZXJpYWw7XFxuJywgJ01hdGVyaWFsJyk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICAvLyBGb3IgZWFjaCBwcm9wZXJ0eSwgc2V0cyB1bmlmb3JtcyBpbiB0aGUgcGF0dGVybjpcbiAgICAgICAgLy8gdV9tYXRlcmlhbC5kaWZmdXNlLCB1X21hdGVyaWFsLmRpZmZ1c2VTY2FsZSB1X21hdGVyaWFsX2RpZmZ1c2VfdGV4dHVyZVxuICAgICAgICBtYXRlcmlhbF9wcm9wcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXNbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpc1twcm9wXS50ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9wcm9ncmFtLnNldFRleHR1cmVVbmlmb3JtKGB1X21hdGVyaWFsXyR7cHJvcH1fdGV4dHVyZWAsIHRoaXNbcHJvcF0udGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1X21hdGVyaWFsLiR7cHJvcH1TY2FsZWAsIHRoaXNbcHJvcF0uc2NhbGUpO1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCc0ZnYnLCBgdV9tYXRlcmlhbC4ke3Byb3B9YCwgdGhpc1twcm9wXS5hbW91bnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1twcm9wXS5hbW91bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnNGZ2JywgYHVfbWF0ZXJpYWwuJHtwcm9wfWAsIHRoaXNbcHJvcF0uYW1vdW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4dHJhIHNwZWN1bGFyIHByb3BzXG4gICAgICAgIGlmICh0aGlzLnNwZWN1bGFyKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X21hdGVyaWFsLnNoaW5pbmVzcycsIHRoaXMuc3BlY3VsYXIuc2hpbmluZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vcm1hbCBtYXBwaW5nXG4gICAgICAgIGlmICh0aGlzLm5vcm1hbCAmJiB0aGlzLm5vcm1hbC50ZXh0dXJlKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS5zZXRUZXh0dXJlVW5pZm9ybSgndV9tYXRlcmlhbF9ub3JtYWxfdGV4dHVyZScsIHRoaXMubm9ybWFsLnRleHR1cmUpO1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgJ3VfbWF0ZXJpYWwubm9ybWFsU2NhbGUnLCB0aGlzLm5vcm1hbC5zY2FsZSk7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X21hdGVyaWFsLm5vcm1hbEFtb3VudCcsIHRoaXMubm9ybWFsLmFtb3VudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbk1hdGVyaWFsLmJsb2NrID0gJ21hdGVyaWFsJztcbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5cbmltcG9ydCAnLi91dGlscy9wb2x5ZmlsbHMnO1xuXG4vLyBUaGUgbGVhZmxldCBsYXllciBwbHVnaW4gaXMgY3VycmVudGx5IHRoZSBwcmltYXJ5IHB1YmxpYyBBUElcbmltcG9ydCB7bGVhZmxldExheWVyfSBmcm9tICcuL2xlYWZsZXRfbGF5ZXInO1xuXG4vLyBUaGUgc2NlbmUgd29ya2VyIGlzIG9ubHkgYWN0aXZhdGVkIHdoZW4gYSB3b3JrZXIgdGhyZWFkIGlzIGluc3RhbnRpYXRlZCwgYnV0IG11c3QgYWx3YXlzIGJlIGxvYWRlZFxuaW1wb3J0IFNjZW5lIGZyb20gJy4vc2NlbmUnO1xuaW1wb3J0IHtTY2VuZVdvcmtlcn0gZnJvbSAnLi9zY2VuZV93b3JrZXInO1xuXG4vLyBBZGRpdGlvbmFsIG1vZHVsZXMgYXJlIGV4cG9zZWQgZm9yIGRlYnVnZ2luZ1xuaW1wb3J0IHZlcnNpb24gZnJvbSAnLi91dGlscy92ZXJzaW9uJztcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IFRocmVhZCBmcm9tICcuL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi92ZWN0b3InO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9zb3VyY2VzL2RhdGFfc291cmNlJztcbmltcG9ydCAnLi9zb3VyY2VzL2dlb2pzb24nO1xuaW1wb3J0ICcuL3NvdXJjZXMvdG9wb2pzb24nO1xuaW1wb3J0ICcuL3NvdXJjZXMvbXZ0JztcbmltcG9ydCAnLi9zb3VyY2VzL3Jhc3Rlcic7XG5pbXBvcnQgR0xTTCBmcm9tICcuL2dsL2dsc2wnO1xuaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgVmVydGV4RGF0YSBmcm9tICcuL2dsL3ZlcnRleF9kYXRhJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi9tYXRlcmlhbCc7XG5pbXBvcnQgTGlnaHQgZnJvbSAnLi9saWdodCc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQge2xheWVyX2NhY2hlfSBmcm9tICcuL3N0eWxlcy9sYXllcic7XG5pbXBvcnQge1N0eWxlTWFuYWdlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tICcuL2xhYmVscy9jb2xsaXNpb24nO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi9zZWxlY3Rpb24nO1xuaW1wb3J0IENhbnZhc1RleHQgZnJvbSAnLi9zdHlsZXMvdGV4dC9jYW52YXNfdGV4dCc7XG5pbXBvcnQgZGVidWdTZXR0aW5ncyBmcm9tICcuL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgSlNaaXAgZnJvbSAnanN6aXAnO1xuXG4vLyBNYWtlIHNvbWUgbW9kdWxlcyBhY2Nlc3NpYmxlIGZvciBkZWJ1Z2dpbmdcbnZhciBkZWJ1ZyA9IHtcbiAgICBsb2csXG4gICAgeWFtbCxcbiAgICBUaHJlYWQsXG4gICAgVXRpbHMsXG4gICAgR2VvLFxuICAgIFZlY3RvcixcbiAgICBEYXRhU291cmNlLFxuICAgIEdMU0wsXG4gICAgU2hhZGVyUHJvZ3JhbSxcbiAgICBWZXJ0ZXhEYXRhLFxuICAgIFRleHR1cmUsXG4gICAgTWF0ZXJpYWwsXG4gICAgTGlnaHQsXG4gICAgU2NlbmUsXG4gICAgU2NlbmVXb3JrZXIsXG4gICAgV29ya2VyQnJva2VyLFxuICAgIGxheWVyX2NhY2hlLFxuICAgIFN0eWxlTWFuYWdlcixcbiAgICBTdHlsZVBhcnNlcixcbiAgICBDb2xsaXNpb24sXG4gICAgRmVhdHVyZVNlbGVjdGlvbixcbiAgICBDYW52YXNUZXh0LFxuICAgIGRlYnVnU2V0dGluZ3Ncbn07XG5cbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIFV0aWxzLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsKCk7XG5cbiAgICAvLyBBdHRhY2ggUHJvbWlzZSBwb2x5ZmlsbCB0byB3aW5kb3dcbiAgICAvLyBBbGxvd3MgRm9udEZhY2VPYnNlcnZlciB0byB1c2UgcG9seWZpbGwgKHdpdGhvdXQgbmVlZGluZyB0byBpbmNsdWRlIGl0cyBvd24gZHVwbGljYXRlIHBvbHlmaWxsKVxuICAgIGlmICh3aW5kb3cuUHJvbWlzZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdpbmRvdy5Qcm9taXNlID0gUHJvbWlzZTtcbiAgICAgICAgSlNaaXAuZXh0ZXJuYWwuUHJvbWlzZSA9IFByb21pc2U7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBsZWFmbGV0TGF5ZXIsXG4gICAgZGVidWcsXG4gICAgdmVyc2lvblxufTtcbiIsImltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0ICogYXMgVVJMcyBmcm9tICcuL3V0aWxzL3VybHMnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuaW1wb3J0IHN1YnNjcmliZU1peGluIGZyb20gJy4vdXRpbHMvc3Vic2NyaWJlJztcbmltcG9ydCBDb250ZXh0IGZyb20gJy4vZ2wvY29udGV4dCc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuaW1wb3J0IFZlcnRleEFycmF5T2JqZWN0IGZyb20gJy4vZ2wvdmFvJztcbmltcG9ydCB7U3R5bGVNYW5hZ2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCB7U3R5bGV9IGZyb20gJy4vc3R5bGVzL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgU2NlbmVMb2FkZXIgZnJvbSAnLi9zY2VuZV9sb2FkZXInO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCBMaWdodCBmcm9tICcuL2xpZ2h0JztcbmltcG9ydCBUaWxlTWFuYWdlciBmcm9tICcuL3RpbGVfbWFuYWdlcic7XG5pbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL3NvdXJjZXMvZGF0YV9zb3VyY2UnO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi9zZWxlY3Rpb24nO1xuaW1wb3J0IFJlbmRlclN0YXRlTWFuYWdlciBmcm9tICcuL2dsL3JlbmRlcl9zdGF0ZSc7XG5pbXBvcnQgRm9udE1hbmFnZXIgZnJvbSAnLi9zdHlsZXMvdGV4dC9mb250X21hbmFnZXInO1xuaW1wb3J0IE1lZGlhQ2FwdHVyZSBmcm9tICcuL3V0aWxzL21lZGlhX2NhcHR1cmUnO1xuXG4vLyBMb2FkIHNjZW5lIGRlZmluaXRpb246IHBhc3MgYW4gb2JqZWN0IGRpcmVjdGx5LCBvciBhIFVSTCBhcyBzdHJpbmcgdG8gbG9hZCByZW1vdGVseVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NlbmUge1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnX3NvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgc3Vic2NyaWJlTWl4aW4odGhpcyk7XG5cbiAgICAgICAgdGhpcy5pZCA9IFNjZW5lLmlkKys7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSBudWxsOyAvLyB3aWxsIGJlIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2NlbmUgaXMgbG9hZGVkXG4gICAgICAgIHRoaXMuc291cmNlcyA9IHt9O1xuXG4gICAgICAgIHRoaXMudmlldyA9IG5ldyBWaWV3KHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnRpbGVfbWFuYWdlciA9IG5ldyBUaWxlTWFuYWdlcih7IHNjZW5lOiB0aGlzLCB2aWV3OiB0aGlzLnZpZXcgfSk7XG4gICAgICAgIHRoaXMubnVtX3dvcmtlcnMgPSBvcHRpb25zLm51bVdvcmtlcnMgfHwgMjtcbiAgICAgICAgdGhpcy53b3JrZXJfdXJsID0gb3B0aW9ucy53b3JrZXJVcmw7XG4gICAgICAgIGlmIChvcHRpb25zLmRpc2FibGVWZXJ0ZXhBcnJheU9iamVjdHMgPT09IHRydWUpIHtcbiAgICAgICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWxzLnVzZV9oaWdoX2RlbnNpdHlfZGlzcGxheSA9IG9wdGlvbnMuaGlnaERlbnNpdHlEaXNwbGF5ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmhpZ2hEZW5zaXR5RGlzcGxheSA6IHRydWU7XG4gICAgICAgIFV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8oKTtcblxuICAgICAgICB0aGlzLmNvbmZpZyA9IG51bGw7XG4gICAgICAgIHRoaXMuY29uZmlnX3NvdXJjZSA9IGNvbmZpZ19zb3VyY2U7XG4gICAgICAgIHRoaXMuY29uZmlnX3NlcmlhbGl6ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3NvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5zdHlsZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmFjdGl2ZV9zdHlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyID0gbmV3IFN0eWxlTWFuYWdlcigpO1xuXG4gICAgICAgIHRoaXMuYnVpbGRpbmcgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNrcyBjdXJyZW50IHNjZW5lIGJ1aWxkaW5nIHN0YXRlICh0aWxlcyBiZWluZyBidWlsdCwgZXRjLilcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBhIHJlZHJhd1xuICAgICAgICB0aGlzLmFuaW1hdGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IHJlZHJhdyBldmVyeSBmcmFtZVxuICAgICAgICB0aGlzLnByZVVwZGF0ZSA9IG9wdGlvbnMucHJlVXBkYXRlOyAgICAgICAgICAgICAvLyBvcHRpb25hbCBwcmUtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICB0aGlzLnBvc3RVcGRhdGUgPSBvcHRpb25zLnBvc3RVcGRhdGU7ICAgICAgICAgICAvLyBvcHRpb25hbCBwb3N0LXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcCA9ICFvcHRpb25zLmRpc2FibGVSZW5kZXJMb29wOyAgLy8gZGlzYWJsZSByZW5kZXIgbG9vcCAtIGFwcCB3aWxsIGhhdmUgdG8gbWFudWFsbHkgY2FsbCBTY2VuZS5yZW5kZXIoKSBwZXIgZnJhbWVcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9zdG9wID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyX2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5sYXN0X3JlbmRlcl9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mcmFtZSA9IDA7XG4gICAgICAgIHRoaXMubWVkaWFfY2FwdHVyZSA9IG5ldyBNZWRpYUNhcHR1cmUoKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmludHJvc3BlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldFRpbWUoKTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyO1xuXG4gICAgICAgIHRoaXMubGlnaHRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gbnVsbDtcblxuICAgICAgICB0aGlzLmNyZWF0ZUxpc3RlbmVycygpO1xuICAgICAgICB0aGlzLnVwZGF0aW5nID0gMDtcbiAgICAgICAgdGhpcy5nZW5lcmF0aW9uID0gU2NlbmUuZ2VuZXJhdGlvbjsgLy8gYW4gaWQgdGhhdCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgdGhlIHNjZW5lIGNvbmZpZyBpcyBpbnZhbGlkYXRlZFxuICAgICAgICB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbiA9IFNjZW5lLmdlbmVyYXRpb247IC8vIGxhc3QgZ2VuZXJhdGlvbiBpZCB3aXRoIGEgY29tcGxldGUgdmlld1xuICAgICAgICB0aGlzLnNldHVwRGVidWcoKTtcblxuICAgICAgICB0aGlzLmxvZ19sZXZlbCA9IG9wdGlvbnMubG9nTGV2ZWwgfHwgJ3dhcm4nO1xuICAgICAgICBsb2cuc2V0TGV2ZWwodGhpcy5sb2dfbGV2ZWwpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGUgKGNvbmZpZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NlbmUoY29uZmlnLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHNjZW5lIChvciByZWxvYWQgZXhpc3Rpbmcgc2NlbmUgaWYgbm8gbmV3IHNvdXJjZSBzcGVjaWZpZWQpXG4gICAgLy8gT3B0aW9uczpcbiAgICAvLyAgIGBjb25maWdfcGF0aGA6IGJhc2UgVVJMIGFnYWluc3Qgd2hpY2ggcm9vIHNjZW5lIHJlc291cmNlcyBzaG91bGQgYmUgcmVzb2x2ZWQgKHVzZWZ1bCBmb3IgUGxheSkgKGRlZmF1bHQgbnVsbGwpXG4gICAgLy8gICBgYmxvY2tpbmdgOiBzaG91bGQgcmVuZGVyaW5nIGJsb2NrIG9uIHNjZW5lIGxvYWQgY29tcGxldGlvbiAoZGVmYXVsdCB0cnVlKVxuICAgIGxvYWQoY29uZmlnX3NvdXJjZSA9IG51bGwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXppbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRpbmcrKztcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsdHkgZm9yIHBhc3NpbmcgYGNvbmZpZ19wYXRoYCBzdHJpbmcgYXMgc2Vjb25kIGFyZ3VtZW50XG4gICAgICAgIC8vIChzaW5jZSB0cmFuc2l0aW9uZWQgdG8gdXNpbmcgb3B0aW9ucyBhcmd1bWVudCB0byBhY2NlcHQgbW9yZSBwYXJhbWV0ZXJzKVxuICAgICAgICBvcHRpb25zID0gKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykgPyB7IGNvbmZpZ19wYXRoOiBvcHRpb25zIH0gOiBvcHRpb25zO1xuICAgICAgICBsZXQgY29uZmlnX3BhdGggPSBvcHRpb25zLmNvbmZpZ19wYXRoO1xuXG4gICAgICAgIC8vIFNob3VsZCByZW5kZXJpbmcgYmxvY2sgb24gbG9hZCAobm90IGRlc2lyYWJsZSBmb3IgaW5pdGlhbCBsb2FkLCBvZnRlbiBkZXNpcmVkIGZvciBsaXZlIHN0eWxlLXN3aXRjaGluZylcbiAgICAgICAgb3B0aW9ucy5ibG9ja2luZyA9IChvcHRpb25zLmJsb2NraW5nICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5ibG9ja2luZyA6IHRydWU7XG5cbiAgICAgICAgLy8gTG9hZCBzY2VuZSBkZWZpbml0aW9uIChzb3VyY2VzLCBzdHlsZXMsIGV0Yy4pLCB0aGVuIGNyZWF0ZSBzdHlsZXMgJiB3b3JrZXJzXG4gICAgICAgIHRoaXMuY3JlYXRlQ2FudmFzKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gdGhpcy5sb2FkU2NlbmUoY29uZmlnX3NvdXJjZSwgY29uZmlnX3BhdGgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmNyZWF0ZVdvcmtlcnMoKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmVhdHVyZVNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2NlbmUgbG9hZGVkIGZyb20gYSBKUyBvYmplY3QsIG9yIG1vZGlmaWVkIGJ5IGEgYGxvYWRgIGV2ZW50LCBtYXkgY29udGFpbiBjb21waWxlZCBKUyBmdW5jdGlvbnNcbiAgICAgICAgICAgICAgICAvLyB3aGljaCBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQsIHdoaWxlIG9uZSBsb2FkZWQgb25seSBmcm9tIGEgVVJMIGRvZXMgbm90LlxuICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZV9mdW5jcyA9ICgodHlwZW9mIHRoaXMuY29uZmlnX3NvdXJjZSA9PT0gJ29iamVjdCcpIHx8IHRoaXMuaGFzU3Vic2NyaWJlcnNGb3IoJ2xvYWQnKSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGluZyA9IHRoaXMudXBkYXRlQ29uZmlnKHsgc2VyaWFsaXplX2Z1bmNzLCBmYWRlX2luOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2NraW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0aW5nLS07XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlID0gdGhpcy5jb25maWdfc291cmNlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdF92YWxpZF9jb25maWdfcGF0aCA9IHRoaXMuY29uZmlnX3BhdGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJfbG9vcCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR1cFJlbmRlckxvb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmcgPSAwO1xuXG4gICAgICAgICAgICAvLyBSZXBvcnQgYW5kIHJldmVydCB0byBsYXN0IHZhbGlkIGNvbmZpZyBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGxldCB0eXBlLCBtZXNzYWdlO1xuICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdZQU1MRXhjZXB0aW9uJykge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAneWFtbCc7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICdFcnJvciBwYXJzaW5nIHNjZW5lIFlBTUwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogbW9yZSBlcnJvciB0eXBlc1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnRXJyb3IgaW5pdGlhbGl6aW5nIHNjZW5lJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignZXJyb3InLCB7IHR5cGUsIG1lc3NhZ2UsIGVycm9yLCB1cmw6IHRoaXMuY29uZmlnX3NvdXJjZSB9KTtcblxuICAgICAgICAgICAgbWVzc2FnZSA9IGBTY2VuZS5sb2FkKCkgZmFpbGVkIHRvIGxvYWQgJHt0aGlzLmNvbmZpZ19zb3VyY2V9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3NvdXJjZSkge1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBsb2coJ2luZm8nLCBgU2NlbmUubG9hZCgpIHJldmVydGluZyB0byBsYXN0IHZhbGlkIGNvbmZpZ3VyYXRpb25gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkKHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlLCB0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3BhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nKCdlcnJvcicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXppbmc7XG4gICAgfVxuXG4gICAgLy8gRm9yIEFQSSBjb21wYXRpYmlsaXR5XG4gICAgcmVsb2FkKGNvbmZpZ19zb3VyY2UgPSBudWxsLCBjb25maWdfcGF0aCA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZChjb25maWdfc291cmNlLCBjb25maWdfcGF0aCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX3N0b3AgPSB0cnVlOyAvLyBzY2hlZHVsZSByZW5kZXIgbG9vcCB0byBzdG9wXG5cbiAgICAgICAgdGhpcy5kZXN0cm95TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzICYmIHRoaXMuY2FudmFzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jYW52YXMpO1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdsKSB7XG4gICAgICAgICAgICBUZXh0dXJlLmRlc3Ryb3kodGhpcy5nbCk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuZGVzdHJveSh0aGlzLmdsKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzID0ge307XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIGNvbnRleHQgbG9zc1xuICAgICAgICAgICAgbGV0IGV4dCA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJHTF9sb3NlX2NvbnRleHQnKTtcbiAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICBleHQubG9zZUNvbnRleHQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5nbCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNvdXJjZXMgPSB7fTtcblxuICAgICAgICB0aGlzLmRlc3Ryb3lXb3JrZXJzKCk7XG4gICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy50aWxlX21hbmFnZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGNyZWF0ZUNhbnZhcygpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyIHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUudG9wID0gMDtcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUubGVmdCA9IDA7XG5cbiAgICAgICAgLy8gRm9yY2UgdGFuZ3JhbSBjYW52YXMgdW5kZXJuZWF0aCBhbGwgbGVhZmxldCBsYXllcnMsIGFuZCBzZXQgYmFja2dyb3VuZCB0byB0cmFuc3BhcmVudFxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZ2wgPSBDb250ZXh0LmdldENvbnRleHQodGhpcy5jYW52YXMsIHtcbiAgICAgICAgICAgICAgICBhbHBoYTogdHJ1ZSwgcHJlbXVsdGlwbGllZEFscGhhOiB0cnVlLCAvLyBUT0RPOiB2YXJ5IHcvc2NlbmUgYWxwaGFcbiAgICAgICAgICAgICAgICBkZXZpY2VfcGl4ZWxfcmF0aW86IFV0aWxzLmRldmljZV9waXhlbF9yYXRpb1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ291bGRuJ3QgY3JlYXRlIFdlYkdMIGNvbnRleHQuIFwiICtcbiAgICAgICAgICAgICAgICBcIllvdXIgYnJvd3NlciBtYXkgbm90IHN1cHBvcnQgV2ViR0wsIG9yIGl0J3MgdHVybmVkIG9mZj8gXCIgK1xuICAgICAgICAgICAgICAgIFwiVmlzaXQgaHR0cDovL3dlYmdscmVwb3J0LmNvbS8gZm9yIG1vcmUgaW5mby5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzaXplTWFwKHRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoLCB0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQpO1xuICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5pbml0KHRoaXMuZ2wpO1xuICAgICAgICB0aGlzLnJlbmRlcl9zdGF0ZXMgPSBuZXcgUmVuZGVyU3RhdGVNYW5hZ2VyKHRoaXMuZ2wpO1xuICAgICAgICB0aGlzLm1lZGlhX2NhcHR1cmUuc2V0Q2FudmFzKHRoaXMuY2FudmFzKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIFVSTCB0byBsb2FkIHRoZSB3ZWIgd29ya2VyIGZyb21cbiAgICBnZXRXb3JrZXJVcmwoKSB7XG4gICAgICAgIGxldCB3b3JrZXJfdXJsID0gdGhpcy53b3JrZXJfdXJsIHx8IFVSTHMuZmluZEN1cnJlbnRVUkwoJ3RhbmdyYW0uZGVidWcuanMnLCAndGFuZ3JhbS5taW4uanMnKTtcblxuICAgICAgICBpZiAoIXdvcmtlcl91cmwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGxvYWQgd29ya2VyIGJlY2F1c2UgY291bGRuJ3QgZmluZCBiYXNlIFVSTCB0aGF0IGxpYnJhcnkgd2FzIGxvYWRlZCBmcm9tXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW1wb3J0IGN1c3RvbSBkYXRhIHNvdXJjZSBzY3JpcHRzIGFsb25nc2lkZSBjb3JlIGxpYnJhcnlcbiAgICAgICAgLy8gTk9URTogd29ya2Fyb3VuZCBmb3IgaXNzdWUgd2hlcmUgbGFyZ2UgbGlicmFyaWVzIGludGVybWl0dGVudGx5IGZhaWwgdG8gbG9hZCBpbiB3ZWIgd29ya2VycyxcbiAgICAgICAgLy8gd2hlbiBtdWx0aXBsZSBpbXBvcnRTY3JpcHRzKCkgY2FsbHMgYXJlIHVzZWQuIExvYWRpbmcgYWxsIHNjcmlwdHMgKGluY2x1ZGluZyBUYW5ncmFtIGl0c2VsZilcbiAgICAgICAgLy8gaW4gb25lIGNhbGwgYXQgYXQgd29ya2VyIGNyZWF0aW9uIHRpbWUgaGFzIG5vdCBleGhpYml0ZWQgdGhlIHNhbWUgaXNzdWUuXG4gICAgICAgIGxldCB1cmxzID0gWy4uLnRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0c107XG4gICAgICAgIHVybHMucHVzaCh3b3JrZXJfdXJsKTsgLy8gbG9hZCBUYW5ncmFtICpsYXN0KiAoaGFzIGJlZW4gbW9yZSByZWxpYWJsZSwgdGhvdWdoIHJlYXNvbiB1bmtub3duKVxuICAgICAgICBsZXQgYm9keSA9IGBpbXBvcnRTY3JpcHRzKCR7dXJscy5tYXAodXJsID0+IGAnJHt1cmx9J2ApLmpvaW4oJywnKX0pO2A7XG4gICAgICAgIHJldHVybiBVUkxzLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbYm9keV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnIH0pKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbGlzdCBvZiBhbnkgY3VzdG9tIGRhdGEgc291cmNlIHNjcmlwdHMgKGlmIGFueSlcbiAgICB1cGRhdGVEYXRhU291cmNlU2NyaXB0cyAoKSB7XG4gICAgICAgIGxldCBwcmV2X3NjcmlwdHMgPSBbLi4uKHRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0c3x8W10pXTsgLy8gc2F2ZSBsaXN0IG9mIHByZXZpb3VzbHkgbG9hZGVkIHNjcmlwdHNcbiAgICAgICAgbGV0IHNjcmlwdHMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5zb3VyY2VzKS5tYXAocyA9PiB0aGlzLmNvbmZpZy5zb3VyY2VzW3NdLnNjcmlwdHMpLmZpbHRlcih4ID0+IHgpO1xuICAgICAgICBpZiAoc2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgJ2xvYWRpbmcgY3VzdG9tIGRhdGEgc291cmNlIHNjcmlwdHMgaW4gd29ya2VyOicsIHNjcmlwdHMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0cyA9IFtdLmNvbmNhdCguLi5zY3JpcHRzKS5zb3J0KCk7XG5cbiAgICAgICAgLy8gU2NyaXB0cyBjaGFuZ2VkP1xuICAgICAgICByZXR1cm4gISh0aGlzLmRhdGFfc291cmNlX3NjcmlwdHMubGVuZ3RoID09PSBwcmV2X3NjcmlwdHMubGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLmRhdGFfc291cmNlX3NjcmlwdHMuZXZlcnkoKHYsIGkpID0+IHYgPT09IHByZXZfc2NyaXB0c1tpXSkpO1xuICAgIH1cblxuICAgIC8vIFdlYiB3b3JrZXJzIGhhbmRsZSBoZWF2eSBkdXR5IHRpbGUgY29uc3RydWN0aW9uOiBuZXR3b3JraW5nLCBnZW9tZXRyeSBwcm9jZXNzaW5nLCBldGMuXG4gICAgY3JlYXRlV29ya2VycygpIHtcbiAgICAgICAgLy8gUmVzZXQgb2xkIHdvcmtlcnMgKGlmIGFueSkgaWYgd2UgbmVlZCB0byByZS1pbnN0YW50aWF0ZSB3aXRoIG5ldyBleHRlcm5hbCBzY3JpcHRzXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZURhdGFTb3VyY2VTY3JpcHRzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVdvcmtlcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy53b3JrZXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlV29ya2Vycyh0aGlzLmdldFdvcmtlclVybCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgLy8gSW5zdGFudGlhdGUgd29ya2VycyBmcm9tIFVSTCwgaW5pdCBldmVudCBoYW5kbGVyc1xuICAgIG1ha2VXb3JrZXJzKHVybCkge1xuICAgICAgICB2YXIgcXVldWUgPSBbXTtcblxuICAgICAgICB0aGlzLndvcmtlcnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWQ9MDsgaWQgPCB0aGlzLm51bV93b3JrZXJzOyBpZCsrKSB7XG4gICAgICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlcih1cmwpO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJzW2lkXSA9IHdvcmtlcjtcblxuICAgICAgICAgICAgV29ya2VyQnJva2VyLmFkZFdvcmtlcih3b3JrZXIpO1xuXG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgYFNjZW5lLm1ha2VXb3JrZXJzOiBpbml0aWFsaXppbmcgd29ya2VyICR7aWR9YCk7XG4gICAgICAgICAgICBsZXQgX2lkID0gaWQ7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh3b3JrZXIsICdzZWxmLmluaXQnLCB0aGlzLmlkLCBpZCwgdGhpcy5udW1fd29ya2VycywgdGhpcy5sb2dfbGV2ZWwsIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbykudGhlbihcbiAgICAgICAgICAgICAgICAoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBTY2VuZS5tYWtlV29ya2VyczogaW5pdGlhbGl6ZWQgd29ya2VyICR7aWR9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ2Vycm9yJywgYFNjZW5lLm1ha2VXb3JrZXJzOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSB3b3JrZXIgJHtfaWR9OmAsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmV4dF93b3JrZXIgPSAwO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocXVldWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgbG9nLnNldFdvcmtlcnModGhpcy53b3JrZXJzKTtcblxuICAgICAgICAgICAgLy8gTGV0IFZlcnRleEVsZW1lbnRzIGtub3cgaWYgMzIgYml0IGluZGljZXMgZm9yIGVsZW1lbnQgYXJyYXlzIGFyZSBhdmFpbGFibGVcbiAgICAgICAgICAgIGxldCBVaW50MzJfZmxhZyA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKFwiT0VTX2VsZW1lbnRfaW5kZXhfdWludFwiKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdWZXJ0ZXhFbGVtZW50cy5zZXRVaW50MzJGbGFnJywgVWludDMyX2ZsYWcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkZXN0cm95V29ya2VycygpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy53b3JrZXJzKSkge1xuICAgICAgICAgICAgbG9nLnNldFdvcmtlcnMobnVsbCk7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB7XG4gICAgICAgICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnMgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUm91bmQgcm9iaW4gc2VsZWN0aW9uIG9mIG5leHQgd29ya2VyXG4gICAgbmV4dFdvcmtlcigpIHtcbiAgICAgICAgdmFyIHdvcmtlciA9IHRoaXMud29ya2Vyc1t0aGlzLm5leHRfd29ya2VyXTtcbiAgICAgICAgdGhpcy5uZXh0X3dvcmtlciA9ICh0aGlzLm5leHRfd29ya2VyICsgMSkgJSB0aGlzLndvcmtlcnMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gd29ya2VyO1xuICAgIH1cblxuICAgIC8vIFNjZW5lIGlzIHJlYWR5IGZvciByZW5kZXJpbmdcbiAgICByZWFkeSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXcucmVhZHkoKSB8fCBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZXNpemUgdGhlIG1hcCB3aGVuIGRldmljZSBwaXhlbCByYXRpbyBjaGFuZ2VzLCBlLmcuIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZGlzcGxheXNcbiAgICB1cGRhdGVEZXZpY2VQaXhlbFJhdGlvICgpIHtcbiAgICAgICAgaWYgKFV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8oKSkge1xuICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbycsIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbylcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlYnVpbGQoKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlc2l6ZU1hcCh0aGlzLnZpZXcuc2l6ZS5jc3Mud2lkdGgsIHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2l6ZU1hcCh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGlmICh3aWR0aCA9PT0gMCAmJiBoZWlnaHQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXcuc2V0Vmlld3BvcnRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBpZiAodGhpcy5nbCkge1xuICAgICAgICAgICAgQ29udGV4dC5yZXNpemUodGhpcy5nbCwgd2lkdGgsIGhlaWdodCwgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlcXVlc3Qgc2NlbmUgYmUgcmVkcmF3biBhdCBuZXh0IGFuaW1hdGlvbiBsb29wXG4gICAgcmVxdWVzdFJlZHJhdygpIHtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVkcmF3IHNjZW5lIGltbWVkaWF0ZWx5IC0gZG9uJ3Qgd2FpdCBmb3IgYW5pbWF0aW9uIGxvb3BcbiAgICAvLyBVc2Ugc3BhcmluZ2x5LCBidXQgZm9yIGNhc2VzIHdoZXJlIHlvdSBuZWVkIHRoZSBjbG9zZXN0IHBvc3NpYmxlIHN5bmMgd2l0aCBvdGhlciBVSSBlbGVtZW50cyxcbiAgICAvLyBzdWNoIGFzIG90aGVyLCBub24tV2ViR0wgbWFwIGxheWVycyAoZS5nLiBMZWFmbGV0IHJhc3RlciBsYXllcnMsIG1hcmtlcnMsIGV0Yy4pXG4gICAgaW1tZWRpYXRlUmVkcmF3KCkge1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICByZW5kZXJMb29wICgpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUgPSB0cnVlOyAvLyBvbmx5IGxldCB0aGUgcmVuZGVyIGxvb3AgaW5zdGFudGlhdGUgb25jZVxuXG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAvLyBSZW5kZXIgdGhlIHNjZW5lXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVxdWVzdCB0aGUgbmV4dCBmcmFtZSBpZiBub3Qgc2NoZWR1bGVkIHRvIHN0b3BcbiAgICAgICAgaWYgKCF0aGlzLnJlbmRlcl9sb29wX3N0b3ApIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZW5kZXJMb29wLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9zdG9wID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcl9sb29wX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgdGhlIHJlbmRlciBsb29wXG4gICAgc2V0dXBSZW5kZXJMb29wKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVuZGVyX2xvb3BfYWN0aXZlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5yZW5kZXJMb29wKCk7IH0sIDApOyAvLyBkZWxheSBzdGFydCBieSBvbmUgdGlja1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICAvLyBSZW5kZXIgb24gZGVtYW5kXG4gICAgICAgIHZhciB3aWxsX3JlbmRlciA9ICEoXG4gICAgICAgICAgICB0aGlzLmRpcnR5ID09PSBmYWxzZSB8fFxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9PT0gZmFsc2UgfHxcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmcgPiAwIHx8XG4gICAgICAgICAgICB0aGlzLnJlYWR5KCkgPT09IGZhbHNlXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUHJlLXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5wcmVVcGRhdGUod2lsbF9yZW5kZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmFpbCBpZiBubyBuZWVkIHRvIHJlbmRlclxuICAgICAgICBpZiAoIXdpbGxfcmVuZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlOyAvLyBzdWJjbGFzc2VzIGNhbiBzZXQgdGhpcyBiYWNrIHRvIHRydWUgd2hlbiBhbmltYXRpb24gaXMgbmVlZGVkXG5cbiAgICAgICAgLy8gUmVuZGVyIHRoZSBzY2VuZVxuICAgICAgICB0aGlzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8oKTtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3Q29tcGxldGUoKTsgLy8gZmlyZXMgZXZlbnQgd2hlbiByZW5kZXJlZCB0aWxlIHNldCBvciBzdHlsZSBjaGFuZ2VzXG4gICAgICAgIHRoaXMubWVkaWFfY2FwdHVyZS5jb21wbGV0ZVNjcmVlbnNob3QoKTsgLy8gY29tcGxldGVzIHNjcmVlbnNob3QgY2FwdHVyZSBpZiByZXF1ZXN0ZWRcblxuICAgICAgICAvLyBQb3N0LXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBvc3RVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdFVwZGF0ZSh3aWxsX3JlbmRlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWRyYXcgZXZlcnkgZnJhbWUgaWYgYW5pbWF0aW5nXG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZnJhbWUrKztcbiAgICAgICAgbG9nKCd0cmFjZScsICdTY2VuZS5yZW5kZXIoKScpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgLy8gVXBkYXRlIHN0eWxlcywgY2FtZXJhLCBsaWdodHNcbiAgICAgICAgdGhpcy52aWV3LnVwZGF0ZSgpO1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmFjdGl2ZV9zdHlsZXMpLmZvckVhY2goaSA9PiB0aGlzLnN0eWxlc1tpXS51cGRhdGUoKSk7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMubGlnaHRzKS5mb3JFYWNoKGkgPT4gdGhpcy5saWdodHNbaV0udXBkYXRlKCkpO1xuXG4gICAgICAgIC8vIFJlbmRlcmFibGUgdGlsZSBsaXN0XG4gICAgICAgIHRoaXMucmVuZGVyYWJsZV90aWxlcyA9IHRoaXMudGlsZV9tYW5hZ2VyLmdldFJlbmRlcmFibGVUaWxlcygpO1xuICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXNfY291bnQgPSB0aGlzLnJlbmRlcmFibGVfdGlsZXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIFJlbmRlciBtYWluIHBhc3NcbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnQgPSB0aGlzLnJlbmRlclBhc3MoKTtcblxuICAgICAgICAvLyBSZW5kZXIgc2VsZWN0aW9uIHBhc3MgKGlmIG5lZWRlZClcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLnBlbmRpbmdSZXF1ZXN0cygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3LnBhbm5pbmcgfHwgdGhpcy52aWV3Lnpvb21pbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhclBlbmRpbmdSZXF1ZXN0cygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uYmluZCgpOyAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBGQk9cbiAgICAgICAgICAgIHRoaXMucmVuZGVyUGFzcyhcbiAgICAgICAgICAgICAgICAnc2VsZWN0aW9uX3Byb2dyYW0nLCAgICAgICAgICAgICAgICAvLyByZW5kZXIgdy9hbHRlcm5hdGUgcHJvZ3JhbVxuICAgICAgICAgICAgICAgIHsgYWxsb3dfYmxlbmQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVhZCgpOyAgICAgICAgICAgICAgICAgIC8vIHJlYWQgcmVzdWx0cyBmcm9tIHNlbGVjdGlvbiBidWZmZXJcblxuICAgICAgICAgICAgLy8gUmVzZXQgdG8gc2NyZWVuIGJ1ZmZlclxuICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnRfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJfY291bnQgIT09IHRoaXMubGFzdF9yZW5kZXJfY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplKCkudGhlbihzaXplID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZSkgeyAvLyByZXR1cm5zIHVuZGVmaW5lZCBpZiBwcmV2aW91cyByZXF1ZXN0IHBlbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdpbmZvJywgYFNjZW5lOiByZW5kZXJlZCAke3RoaXMucmVuZGVyX2NvdW50fSBwcmltaXRpdmVzICgke3NpemV9IGZlYXR1cmVzIGluIHNlbGVjdGlvbiBtYXApYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0X3JlbmRlcl9jb3VudCA9IHRoaXMucmVuZGVyX2NvdW50O1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBhbGwgYWN0aXZlIHN0eWxlcywgZ3JvdXBlZCBieSBibGVuZC9kZXB0aCB0eXBlIChvcGFxdWUsIG92ZXJsYXksIGV0Yy4pIGFuZCBieSBwcm9ncmFtIChzdHlsZSlcbiAgICAvLyBDYWxsZWQgYm90aCBmb3IgbWFpbiByZW5kZXIgcGFzcywgYW5kIGZvciBzZWNvbmRhcnkgcGFzc2VzIGxpa2Ugc2VsZWN0aW9uIGJ1ZmZlclxuICAgIHJlbmRlclBhc3MocHJvZ3JhbV9rZXkgPSAncHJvZ3JhbScsIHsgYWxsb3dfYmxlbmQgfSA9IHt9KSB7XG4gICAgICAgIC8vIG9wdGlvbmFsbHkgZm9yY2UgYWxwaGEgb2ZmIChlLmcuIGZvciBzZWxlY3Rpb24gcGFzcylcbiAgICAgICAgYWxsb3dfYmxlbmQgPSAoYWxsb3dfYmxlbmQgPT0gbnVsbCkgPyB0cnVlIDogYWxsb3dfYmxlbmQ7XG5cbiAgICAgICAgdGhpcy5jbGVhckZyYW1lKHsgY2xlYXJfY29sb3I6IHRydWUsIGNsZWFyX2RlcHRoOiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIFNvcnQgc3R5bGVzIGJ5IGJsZW5kIG9yZGVyXG4gICAgICAgIGxldCBzdHlsZXMgPSBPYmplY3Qua2V5cyh0aGlzLmFjdGl2ZV9zdHlsZXMpLlxuICAgICAgICAgICAgbWFwKHMgPT4gdGhpcy5zdHlsZXNbc10pLlxuICAgICAgICAgICAgc29ydChTdHlsZS5ibGVuZE9yZGVyU29ydCk7XG5cbiAgICAgICAgLy8gUmVuZGVyIHN0eWxlc1xuICAgICAgICBsZXQgY291bnQgPSAwOyAvLyBob3cgbWFueSBwcmltaXRpdmVzIHdlcmUgcmVuZGVyZWRcbiAgICAgICAgbGV0IGxhc3RfYmxlbmQ7XG4gICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHN0eWxlcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW3NdO1xuICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgcmVuZGVyIHN0YXRlIHdoZW4gYmxlbmQgbW9kZSBjaGFuZ2VzXG4gICAgICAgICAgICBpZiAoc3R5bGUuYmxlbmQgIT09IGxhc3RfYmxlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LFxuICAgICAgICAgICAgICAgICAgICBTdHlsZS5yZW5kZXJfc3RhdGVzW3N0eWxlLmJsZW5kXSwgICAgICAgLy8gcmVuZGVyIHN0YXRlIGZvciBibGVuZCBtb2RlXG4gICAgICAgICAgICAgICAgICAgIHsgYmxlbmQ6IChhbGxvd19ibGVuZCAmJiBzdHlsZS5ibGVuZCkgfSAvLyBlbmFibGUvZGlzYWJsZSBibGVuZGluZyAoZS5nLiBubyBibGVuZCBmb3Igc2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJTdGF0ZShzdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudCArPSB0aGlzLnJlbmRlclN0eWxlKHN0eWxlLm5hbWUsIHByb2dyYW1fa2V5KTtcbiAgICAgICAgICAgIGxhc3RfYmxlbmQgPSBzdHlsZS5ibGVuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG5cbiAgICByZW5kZXJTdHlsZShzdHlsZSwgcHJvZ3JhbV9rZXkpIHtcbiAgICAgICAgbGV0IGZpcnN0X2Zvcl9zdHlsZSA9IHRydWU7XG4gICAgICAgIGxldCByZW5kZXJfY291bnQgPSAwO1xuXG4gICAgICAgIGxldCBwcm9ncmFtID0gdGhpcy5zdHlsZXNbc3R5bGVdW3Byb2dyYW1fa2V5XTtcbiAgICAgICAgaWYgKCFwcm9ncmFtIHx8ICFwcm9ncmFtLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbmRlciB0aWxlIEdMIGdlb21ldHJpZXNcbiAgICAgICAgZm9yIChsZXQgdD0wOyB0IDwgdGhpcy5yZW5kZXJhYmxlX3RpbGVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMucmVuZGVyYWJsZV90aWxlc1t0XTtcblxuICAgICAgICAgICAgaWYgKHRpbGUubWVzaGVzW3N0eWxlXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0eWxlLXNwZWNpZmljIHN0YXRlXG4gICAgICAgICAgICAvLyBPbmx5IHNldHVwIHN0eWxlIGlmIHJlbmRlcmluZyBmb3IgZmlyc3QgdGltZSB0aGlzIGZyYW1lXG4gICAgICAgICAgICAvLyAobGF6eSBpbml0LCBub3QgYWxsIHN0eWxlcyB3aWxsIGJlIHVzZWQgaW4gYWxsIHNjcmVlbiB2aWV3czsgc29tZSBzdHlsZXMgbWlnaHQgYmUgZGVmaW5lZCBidXQgbmV2ZXIgdXNlZClcbiAgICAgICAgICAgIGlmIChmaXJzdF9mb3Jfc3R5bGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBmaXJzdF9mb3Jfc3R5bGUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHByb2dyYW0udXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZXNbc3R5bGVdLnNldHVwKCk7XG5cbiAgICAgICAgICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfdGltZScsIHRoaXMuYW5pbWF0ZWQgPyAoKCgrbmV3IERhdGUoKSkgLSB0aGlzLnN0YXJ0X3RpbWUpIC8gMTAwMCkgOiAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuc2V0dXBQcm9ncmFtKHByb2dyYW0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5saWdodHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saWdodHNbaV0uc2V0dXBQcm9ncmFtKHByb2dyYW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2tpcCBwcm94eSB0aWxlcyBpZiBuZXcgdGlsZXMgaGF2ZSBmaW5pc2hlZCBsb2FkaW5nIHRoaXMgc3R5bGVcbiAgICAgICAgICAgIGlmICghdGlsZS5zaG91bGRQcm94eUZvclN0eWxlKHN0eWxlKSkge1xuICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCBgU2NlbmUucmVuZGVyU3R5bGUoKTogU2tpcCBwcm94eSB0aWxlIGZvciBzdHlsZSAnJHtzdHlsZX0nIGAsIHRpbGUsIHRpbGUucHJveHlfZm9yKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGlsZS1zcGVjaWZpYyBzdGF0ZVxuICAgICAgICAgICAgdGhpcy52aWV3LnNldHVwVGlsZSh0aWxlLCBwcm9ncmFtKTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIHRpbGVcbiAgICAgICAgICAgIGlmICh0aGlzLnN0eWxlc1tzdHlsZV0ucmVuZGVyKHRpbGUubWVzaGVzW3N0eWxlXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBpbmN1ciBhZGRpdGlvbmFsIHJlbmRlcnMgd2hpbGUgdmlld3BvcnQgaXMgbW92aW5nXG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy52aWV3LnBhbm5pbmcgfHwgdGhpcy52aWV3Lnpvb21pbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVuZGVyX2NvdW50ICs9IHRpbGUubWVzaGVzW3N0eWxlXS5nZW9tZXRyeV9jb3VudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZW5kZXJfY291bnQ7XG4gICAgfVxuXG4gICAgY2xlYXJGcmFtZSh7IGNsZWFyX2NvbG9yLCBjbGVhcl9kZXB0aCB9ID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0c1xuICAgICAgICBjbGVhcl9jb2xvciA9IChjbGVhcl9jb2xvciA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlOyAvLyBkZWZhdWx0IHRydWVcbiAgICAgICAgY2xlYXJfZGVwdGggPSAoY2xlYXJfZGVwdGggPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTsgLy8gZGVmYXVsdCB0cnVlXG5cbiAgICAgICAgLy8gU2V0IEdMIHN0YXRlXG4gICAgICAgIHRoaXMucmVuZGVyX3N0YXRlcy5kZXB0aF93cml0ZS5zZXQoeyBkZXB0aF93cml0ZTogY2xlYXJfZGVwdGggfSk7XG5cbiAgICAgICAgbGV0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgaWYgKGNsZWFyX2NvbG9yIHx8IGNsZWFyX2RlcHRoKSB7XG4gICAgICAgICAgICBsZXQgbWFzayA9IChjbGVhcl9jb2xvciAmJiBnbC5DT0xPUl9CVUZGRVJfQklUKSB8IChjbGVhcl9kZXB0aCAmJiBnbC5ERVBUSF9CVUZGRVJfQklUKTtcbiAgICAgICAgICAgIGdsLmNsZWFyKG1hc2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0UmVuZGVyU3RhdGUoeyBkZXB0aF90ZXN0LCBkZXB0aF93cml0ZSwgY3VsbF9mYWNlLCBibGVuZCB9ID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0c1xuICAgICAgICAvLyBUT0RPOiB3aGVuIHdlIGFic3RyYWN0IG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLCB0aGVzZSBjYW4gYmUgcGVyLXBhc3MgY29uZmlnIG9wdGlvbnNcbiAgICAgICAgbGV0IHJlbmRlcl9zdGF0ZXMgPSB0aGlzLnJlbmRlcl9zdGF0ZXM7XG4gICAgICAgIGRlcHRoX3Rlc3QgPSAoZGVwdGhfdGVzdCA9PT0gZmFsc2UpID8gZmFsc2UgOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmRlcHRoX3Rlc3Q7ICAgICAgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGRlcHRoX3dyaXRlID0gKGRlcHRoX3dyaXRlID09PSBmYWxzZSkgPyBmYWxzZSA6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuZGVwdGhfd3JpdGU7ICAgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGN1bGxfZmFjZSA9IChjdWxsX2ZhY2UgPT09IGZhbHNlKSA/IGZhbHNlIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5jdWxsaW5nOyAgICAgICAgICAgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGJsZW5kID0gKGJsZW5kICE9IG51bGwpID8gYmxlbmQgOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmJsZW5kaW5nOyAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBmYWxzZVxuXG4gICAgICAgIC8vIFJlc2V0IGZyYW1lIHN0YXRlXG4gICAgICAgIGxldCBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgcmVuZGVyX3N0YXRlcy5kZXB0aF90ZXN0LnNldCh7IGRlcHRoX3Rlc3Q6IGRlcHRoX3Rlc3QgfSk7XG4gICAgICAgIHJlbmRlcl9zdGF0ZXMuZGVwdGhfd3JpdGUuc2V0KHsgZGVwdGhfd3JpdGU6IGRlcHRoX3dyaXRlIH0pO1xuICAgICAgICByZW5kZXJfc3RhdGVzLmN1bGxpbmcuc2V0KHsgY3VsbDogY3VsbF9mYWNlLCBmYWNlOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmN1bGxpbmdfZmFjZSB9KTtcblxuICAgICAgICAvLyBCbGVuZGluZyBvZiBhbHBoYSBjaGFubmVsIGlzIG1vZGlmaWVkIHRvIGFjY291bnQgZm9yIFdlYkdMIGFscGhhIGJlaGF2aW9yLCBzZWU6XG4gICAgICAgIC8vIGh0dHA6Ly93ZWJnbGZ1bmRhbWVudGFscy5vcmcvd2ViZ2wvbGVzc29ucy93ZWJnbC1hbmQtYWxwaGEuaHRtbFxuICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMTUzMzQxNlxuICAgICAgICBpZiAoYmxlbmQpIHtcbiAgICAgICAgICAgIC8vIE9wYXF1ZTogYWxsIHNvdXJjZSwgbm8gZGVzdGluYXRpb25cbiAgICAgICAgICAgIGlmIChibGVuZCA9PT0gJ29wYXF1ZScpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGdsLlNSQ19BTFBIQSwgZHN0OiBnbC5aRVJPXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUcmFkaXRpb25hbCBhbHBoYSBibGVuZGluZ1xuICAgICAgICAgICAgZWxzZSBpZiAoYmxlbmQgPT09ICdvdmVybGF5JyB8fCBibGVuZCA9PT0gJ2lubGF5Jykge1xuICAgICAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYmxlbmQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNyYzogZ2wuU1JDX0FMUEhBLCBkc3Q6IGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsXG4gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYTogZ2wuT05FLCBkc3RfYWxwaGE6IGdsLk9ORV9NSU5VU19TUkNfQUxQSEFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFkZGl0aXZlIGJsZW5kaW5nXG4gICAgICAgICAgICBlbHNlIGlmIChibGVuZCA9PT0gJ2FkZCcpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGdsLk9ORSwgZHN0OiBnbC5PTkUsXG4gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYTogZ2wuT05FLCBkc3RfYWxwaGE6IGdsLk9ORV9NSU5VU19TUkNfQUxQSEFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE11bHRpcGxpY2F0aXZlIGJsZW5kaW5nXG4gICAgICAgICAgICBlbHNlIGlmIChibGVuZCA9PT0gJ211bHRpcGx5Jykge1xuICAgICAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYmxlbmQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNyYzogZ2wuWkVSTywgZHN0OiBnbC5TUkNfQ09MT1IsXG4gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYTogZ2wuT05FLCBkc3RfYWxwaGE6IGdsLk9ORV9NSU5VU19TUkNfQUxQSEFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHsgYmxlbmQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVxdWVzdCBmZWF0dXJlIHNlbGVjdGlvbiBhdCBnaXZlbiBwaXhlbC4gUnVucyBhc3luYyBhbmQgcmV0dXJucyByZXN1bHRzIHZpYSBhIHByb21pc2UuXG4gICAgZ2V0RmVhdHVyZUF0KHBpeGVsKSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIFwiU2NlbmUuZ2V0RmVhdHVyZUF0KCkgY2FsbGVkIGJlZm9yZSBzY2VuZSB3YXMgaW5pdGlhbGl6ZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQb2ludCBzY2FsZWQgdG8gWzAuLjFdIHJhbmdlXG4gICAgICAgIHZhciBwb2ludCA9IHtcbiAgICAgICAgICAgIHg6IHBpeGVsLnggKiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gLyB0aGlzLnZpZXcuc2l6ZS5kZXZpY2Uud2lkdGgsXG4gICAgICAgICAgICB5OiBwaXhlbC55ICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvIC8gdGhpcy52aWV3LnNpemUuZGV2aWNlLmhlaWdodFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlOyAvLyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgc2NlbmUgcmUtcmVuZGVycyBmb3IgdGhlc2UgdG8gYmUgcHJvY2Vzc2VkXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5nZXRGZWF0dXJlQXQocG9pbnQpLlxuICAgICAgICAgICAgdGhlbihzZWxlY3Rpb24gPT4gT2JqZWN0LmFzc2lnbihzZWxlY3Rpb24sIHsgcGl4ZWwgfSkpLlxuICAgICAgICAgICAgY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZXNvbHZlKHsgZXJyb3IgfSkpO1xuICAgIH1cblxuICAgIC8vIFJlYnVpbGQgZ2VvbWV0cnksIHdpdGhvdXQgcmUtcGFyc2luZyB0aGUgY29uZmlnIG9yIHJlLWNvbXBpbGluZyBzdHlsZXNcbiAgICAvLyBUT0RPOiBkZXRlY3Qgd2hpY2ggZWxlbWVudHMgbmVlZCB0byBiZSByZWZyZXNoZWQvcmVidWlsdCAoc3R5bGVzaGVldCBjaGFuZ2VzLCBldGMuKVxuICAgIHJlYnVpbGQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWJ1aWxkR2VvbWV0cnkob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gUmVidWlsZCBhbGwgdGlsZXNcbiAgICAvLyBzeW5jOiBib29sZWFuIG9mIHdoZXRoZXIgdG8gc3luYyB0aGUgY29uZmlnIG9iamVjdCB0byB0aGUgd29ya2VyXG4gICAgLy8gc291cmNlczogb3B0aW9uYWwgYXJyYXkgb2YgZGF0YSBzb3VyY2VzIHRvIHNlbGVjdGl2ZWx5IHJlYnVpbGQgKGJ5IGRlZmF1bHQgYWxsIG91ciByZWJ1aWx0KVxuICAgIHJlYnVpbGRHZW9tZXRyeSh7IHN5bmMgPSB0cnVlLCBzb3VyY2VzID0gbnVsbCwgc2VyaWFsaXplX2Z1bmNzLCBwcm9maWxlID0gZmFsc2UsIGZhZGVfaW4gPSBmYWxzZSB9ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFNraXAgcmVidWlsZCBpZiBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgICAgICAgICBpZiAodGhpcy5idWlsZGluZykge1xuICAgICAgICAgICAgICAgIC8vIFF1ZXVlIHVwIHRvIG9uZSByZWJ1aWxkIGNhbGwgYXQgYSB0aW1lLCBvbmx5IHNhdmUgbGFzdCByZXF1ZXN0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmcucXVldWVkICYmIHRoaXMuYnVpbGRpbmcucXVldWVkLnJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgcHJldmlvdXMgcmVxdWVzdCB0aGF0IGl0IGRpZCBub3QgY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsICdTY2VuZS5yZWJ1aWxkOiByZXF1ZXN0IHN1cGVyY2VkZWQgYnkgYSBuZXdlciBjYWxsJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcucXVldWVkLnJlc29sdmUoZmFsc2UpOyAvLyBmYWxzZSBmbGFnIGluZGljYXRlcyByZWJ1aWxkIHJlcXVlc3Qgd2FzIHN1cGVyY2VkZWRcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTYXZlIHF1ZXVlZCByZXF1ZXN0XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZGluZy5xdWV1ZWQgPSB7IHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU2NlbmUucmVidWlsZCgpOiBxdWV1aW5nIHJlcXVlc3RgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHRpbGUgYnVpbGQgc3RhdGVcbiAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcgPSB7IHJlc29sdmUsIHJlamVjdCB9O1xuXG4gICAgICAgICAgICAvLyBQcm9maWxpbmdcbiAgICAgICAgICAgIGlmIChwcm9maWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZmlsZSgnU2NlbmUucmVidWlsZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgY29uZmlnIChpbiBjYXNlIEpTIG9iamVjdHMgd2VyZSBtYW5pcHVsYXRlZCBkaXJlY3RseSlcbiAgICAgICAgICAgIGlmIChzeW5jKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jQ29uZmlnVG9Xb3JrZXIoeyBzZXJpYWxpemVfZnVuY3MgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyLmNvbXBpbGUodGhpcy51cGRhdGVBY3RpdmVTdHlsZXMoKSwgdGhpcyk7IC8vIG9ubHkgcmVjb21waWxlIG5ld2x5IGFjdGl2ZSBzdHlsZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVzZXRGZWF0dXJlU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0VGltZSgpO1xuXG4gICAgICAgICAgICAvLyBSZWJ1aWxkIHZpc2libGUgdGlsZXNcbiAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLnBydW5lVG9WaXNpYmxlVGlsZXMoKTtcbiAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLmZvckVhY2hUaWxlKHRpbGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc291cmNlcyB8fCBzb3VyY2VzLmluZGV4T2YodGlsZS5zb3VyY2UubmFtZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5idWlsZFRpbGUodGlsZSwgeyBmYWRlX2luIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIudXBkYXRlVGlsZXNGb3JWaWV3KCk7IC8vIHBpY2tzIHVwIGFkZGl0aW9uYWwgdGlsZXMgZm9yIGFueSBuZXcvY2hhbmdlZCBkYXRhIHNvdXJjZXNcbiAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLmNoZWNrQnVpbGRRdWV1ZSgpOyAgICAvLyByZXNvbHZlIGltbWVkaWF0ZWx5IGlmIG5vIHRpbGVzIHRvIGJ1aWxkXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUHJvZmlsaW5nXG4gICAgICAgICAgICBpZiAocHJvZmlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2ZpbGVFbmQoJ1NjZW5lLnJlYnVpbGQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVGlsZSBtYW5hZ2VyIGZpbmlzaGVkIGJ1aWxkaW5nIHRpbGVzXG4gICAgLy8gVE9ETyBtb3ZlIHRvIHRpbGUgbWFuYWdlclxuICAgIHRpbGVNYW5hZ2VyQnVpbGREb25lKCkge1xuICAgICAgICBpZiAodGhpcy5idWlsZGluZykge1xuICAgICAgICAgICAgbG9nKCdpbmZvJywgYFNjZW5lOiBidWlsZCBnZW9tZXRyeSBmaW5pc2hlZGApO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmcucmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQW5vdGhlciByZWJ1aWxkIHF1ZXVlZD9cbiAgICAgICAgICAgIHZhciBxdWV1ZWQgPSB0aGlzLmJ1aWxkaW5nLnF1ZXVlZDtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHF1ZXVlZCkge1xuICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgU2NlbmU6IHN0YXJ0aW5nIHF1ZXVlZCByZWJ1aWxkKCkgcmVxdWVzdGApO1xuICAgICAgICAgICAgICAgIHRoaXMucmVidWlsZCgpLnRoZW4ocXVldWVkLnJlc29sdmUsIHF1ZXVlZC5yZWplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgTG9hZCAob3IgcmVsb2FkKSB0aGUgc2NlbmUgY29uZmlnXG4gICAgICAgQHJldHVybiB7UHJvbWlzZX1cbiAgICAqL1xuICAgIGxvYWRTY2VuZShjb25maWdfc291cmNlID0gbnVsbCwgY29uZmlnX3BhdGggPSBudWxsKSB7XG4gICAgICAgIHRoaXMuY29uZmlnX3NvdXJjZSA9IGNvbmZpZ19zb3VyY2UgfHwgdGhpcy5jb25maWdfc291cmNlO1xuICAgICAgICB0aGlzLmNvbmZpZ19nbG9iYWxzX2FwcGxpZWQgPSBbXTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnX3NvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3BhdGggPSBVUkxzLnBhdGhGb3JVUkwoY29uZmlnX3BhdGggfHwgdGhpcy5jb25maWdfc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3BhdGggPSBVUkxzLnBhdGhGb3JVUkwoY29uZmlnX3BhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFNjZW5lTG9hZGVyLmxvYWRTY2VuZSh0aGlzLmNvbmZpZ19zb3VyY2UsIHRoaXMuY29uZmlnX3BhdGgpLnRoZW4oY29uZmlnID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdsb2FkJywgeyBjb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc291cmNlIHRvIGEgc2NlbmUsIGFyZ3VtZW50cyBgbmFtZWAgYW5kIGBjb25maWdgIG5lZWQgdG8gYmUgcHJvdmlkZWQ6XG4gICAgLy8gIC0gSWYgdGhlIG5hbWUgZG9lc24ndCBtYXRjaCBhIHNvdXJjZXMgaXQgd2lsbCBjcmVhdGUgaXRcbiAgICAvLyAgLSB0aGUgYGNvbmZpZ2Agb2JqIGZvbGxvdyB0aGUgWUFNTCBzY2VuZSBzcGVjLCBleDogYGBge3R5cGU6ICdUb3BvSlNPTicsIHVybDogXCIvL3ZlY3Rvci5tYXB6ZW4uY29tL29zbS9hbGwve3p9L3t4fS97eX0udG9wb2pzb25cIl19YGBgXG4gICAgLy8gICAgdGhhdCBsb29rcyBsaWtlOlxuICAgIC8vXG4gICAgLy8gICAgICBzY2VuZS5zZXREYXRhU291cmNlKFwib3NtXCIsIHt0eXBlOiAnVG9wb0pTT04nLCB1cmw6IFwiLy92ZWN0b3IubWFwemVuLmNvbS9vc20vYWxsL3t6fS97eH0ve3l9LnRvcG9qc29uXCIgfSk7XG4gICAgLy9cbiAgICAvLyAgLSBhbHNvIGNhbiBiZSBwYXNzIGEgYGBgZGF0YWBgYCBvYmo6IGBgYHt0eXBlOiAnR2VvSlNPTicsIGRhdGE6IEpTT2JqIF19YGBgXG4gICAgLy9cbiAgICAvLyAgICAgIHZhciBnZW9qc29uX2RhdGEgPSB7fTtcbiAgICAvLyAgICAgIC4uLlxuICAgIC8vICAgICAgc2NlbmUuc2V0RGF0YVNvdXJjZShcImR5bmFtaWNfZGF0YVwiLCB7dHlwZTogJ0dlb0pTT04nLCBkYXRhOiBnZW9qc29uX2RhdGEgfSk7XG4gICAgLy9cbiAgICBzZXREYXRhU291cmNlIChuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKCFuYW1lIHx8ICFjb25maWcgfHwgIWNvbmZpZy50eXBlIHx8ICghY29uZmlnLnVybCAmJiAhY29uZmlnLmRhdGEpKSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgXCJObyBuYW1lIHByb3ZpZGVkIG9yIG5vdCBhIHZhbGlkIGNvbmZpZzpcIiwgbmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2FkID0gKHRoaXMuY29uZmlnLnNvdXJjZXNbbmFtZV0gPT0gbnVsbCk7XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLmNvbmZpZy5zb3VyY2VzW25hbWVdID0gT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnKTtcblxuICAgICAgICBpZiAoc291cmNlLmRhdGEgJiYgdHlwZW9mIHNvdXJjZS5kYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgc291cmNlLnVybCA9IFVSTHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShzb3VyY2UuZGF0YSldKSk7XG4gICAgICAgICAgICBkZWxldGUgc291cmNlLmRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9hZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ29uZmlnKHsgcmVidWlsZDogeyBzb3VyY2VzOiBbbmFtZV0gfSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYnVpbGQoeyBzb3VyY2VzOiBbbmFtZV0gfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVEYXRhU291cmNlcygpIHtcbiAgICAgICAgbGV0IHJlc2V0ID0gW107IC8vIHNvdXJjZXMgdG8gcmVzZXRcbiAgICAgICAgbGV0IHByZXZfc291cmNlX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKTtcblxuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuY29uZmlnLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLmNvbmZpZy5zb3VyY2VzW25hbWVdO1xuICAgICAgICAgICAgbGV0IHByZXZfc291cmNlID0gdGhpcy5zb3VyY2VzW25hbWVdO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlc1tuYW1lXSA9IERhdGFTb3VyY2UuY3JlYXRlKE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZSwge25hbWV9KSwgdGhpcy5zb3VyY2VzKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc291cmNlc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc291cmNlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBDb3VsZCBub3QgY3JlYXRlIGRhdGEgc291cmNlOiAke2UubWVzc2FnZX1gO1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTY2VuZTogJHttZXNzYWdlfWAsIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCd3YXJuaW5nJywgeyB0eXBlOiAnc291cmNlcycsIHNvdXJjZSwgbWVzc2FnZSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGF0YSBzb3VyY2UgY2hhbmdlZD9cbiAgICAgICAgICAgIGlmIChEYXRhU291cmNlLmNoYW5nZWQodGhpcy5zb3VyY2VzW25hbWVdLCBwcmV2X3NvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICByZXNldC5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU291cmNlcyB0aGF0IHdlcmUgcmVtb3ZlZFxuICAgICAgICBwcmV2X3NvdXJjZV9uYW1lcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zb3VyY2VzW3NdKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc291cmNlc1tzXTsgLy8gVE9ETzogcmVtb3ZlIGZyb20gd29ya2VycyB0b28/XG4gICAgICAgICAgICAgICAgcmVzZXQucHVzaChzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRpbGVzIGZyb20gc291cmNlcyB0aGF0IGhhdmUgY2hhbmdlZFxuICAgICAgICBpZiAocmVzZXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIucmVtb3ZlVGlsZXModGlsZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyZXNldC5pbmRleE9mKHRpbGUuc291cmNlLm5hbWUpID4gLTEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIHNvdXJjZXMgdGhhdCB3aWxsIGdlbmVyYXRlIGdlb21ldHJ5IHRpbGVzXG4gICAgICAgIC8vIChhbGwgZXhjZXB0IHRob3NlIHRoYXQgYXJlIG9ubHkgcmFzdGVyIHNvdXJjZXMgYXR0YWNoZWQgdG8gb3RoZXIgc291cmNlcylcbiAgICAgICAgZm9yIChsZXQgbG4gaW4gdGhpcy5jb25maWcubGF5ZXJzKSB7XG4gICAgICAgICAgICBsZXQgbGF5ZXIgPSB0aGlzLmNvbmZpZy5sYXllcnNbbG5dO1xuICAgICAgICAgICAgaWYgKGxheWVyLmRhdGEgJiYgdGhpcy5zb3VyY2VzW2xheWVyLmRhdGEuc291cmNlXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlc1tsYXllci5kYXRhLnNvdXJjZV0uYnVpbGRzX2dlb21ldHJ5X3RpbGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgYWxsIHRleHR1cmVzIGluIHRoZSBzY2VuZSBkZWZpbml0aW9uXG4gICAgbG9hZFRleHR1cmVzKCkge1xuICAgICAgICByZXR1cm4gVGV4dHVyZS5jcmVhdGVGcm9tT2JqZWN0KHRoaXMuZ2wsIHRoaXMuY29uZmlnLnRleHR1cmVzKS5cbiAgICAgICAgICAgIHRoZW4oKCkgPT4gVGV4dHVyZS5jcmVhdGVEZWZhdWx0KHRoaXMuZ2wpKTsgLy8gY3JlYXRlIGEgJ2RlZmF1bHQnIHRleHR1cmUgZm9yIHBsYWNlaG9sZGVyc1xuICAgIH1cblxuICAgIC8vIENhbGxlZCAoY3VycmVudGx5IG1hbnVhbGx5KSBhZnRlciBzdHlsZXMgYXJlIHVwZGF0ZWQgaW4gc3R5bGVzaGVldFxuICAgIHVwZGF0ZVN0eWxlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkICYmICF0aGlzLmluaXRpYWxpemluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTY2VuZS51cGRhdGVTdHlsZXMoKSBjYWxsZWQgYmVmb3JlIHNjZW5lIHdhcyBpbml0aWFsaXplZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gKFJlKWJ1aWxkIHN0eWxlcyBmcm9tIGNvbmZpZ1xuICAgICAgICB0aGlzLnN0eWxlcyA9IHRoaXMuc3R5bGVfbWFuYWdlci5idWlsZCh0aGlzLmNvbmZpZy5zdHlsZXMpO1xuICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuaW5pdFN0eWxlcyh0aGlzKTtcblxuICAgICAgICAvLyBPcHRpb25hbGx5IHNldCBHTCBjb250ZXh0ICh1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIG9yIHJlLWluaXRpYWxpemluZyBHTCByZXNvdXJjZXMpXG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRoaXMuc3R5bGVzKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlc1tzdHlsZV0uc2V0R0wodGhpcy5nbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5kICYgY29tcGlsZSBhY3RpdmUgc3R5bGVzXG4gICAgICAgIHRoaXMudXBkYXRlQWN0aXZlU3R5bGVzKCk7XG4gICAgICAgIHRoaXMuc3R5bGVfbWFuYWdlci5jb21waWxlKE9iamVjdC5rZXlzKHRoaXMuYWN0aXZlX3N0eWxlcyksIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIHVwZGF0ZUFjdGl2ZVN0eWxlcygpIHtcbiAgICAgICAgLy8gTWFrZSBhIHNldCBvZiBjdXJyZW50bHkgYWN0aXZlIHN0eWxlcyAodXNlZCBpbiBhIGxheWVyKVxuICAgICAgICAvLyBOb3RlOiBkb2Vzbid0IGFjdHVhbGx5IGNoZWNrIGlmIGFueSBnZW9tZXRyeSBtYXRjaGVzIHRoZSBsYXllciwganVzdCB0aGF0IHRoZSBzdHlsZSBpcyBwb3RlbnRpYWxseSByZW5kZXJhYmxlXG4gICAgICAgIGxldCBwcmV2X3N0eWxlcyA9IE9iamVjdC5rZXlzKHRoaXMuYWN0aXZlX3N0eWxlcyB8fCB7fSk7XG4gICAgICAgIHRoaXMuYWN0aXZlX3N0eWxlcyA9IHt9O1xuICAgICAgICBsZXQgYW5pbWF0ZWQgPSBmYWxzZTsgLy8gaXMgYW55IGFjdGl2ZSBzdHlsZSBhbmltYXRlZD9cblxuICAgICAgICBjb25zdCBwYXJzZUxheWVycyA9IChsYXllcikgPT4ge1xuICAgICAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJhdmVyc2UgZHJhdyBncm91cHNcbiAgICAgICAgICAgIGlmIChsYXllci5kcmF3KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBsYXllci5kcmF3KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGxheWVyLmRyYXdbbmFtZV07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogd2FybiBvbiBub24tb2JqZWN0IGRyYXcgZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwICE9IG51bGwgJiYgdHlwZW9mIGdyb3VwID09PSAnb2JqZWN0JyAmJiBncm91cC52aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlX25hbWUgPSBncm91cC5zdHlsZSB8fCBuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlcyA9IFtzdHlsZV9uYW1lXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwgYWRkaXRpb25hbCBvdXRsaW5lIHN0eWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAub3V0bGluZSAmJiBncm91cC5vdXRsaW5lLnN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnB1c2goZ3JvdXAub3V0bGluZS5zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcyA9IHN0eWxlcy5maWx0ZXIoeCA9PiB0aGlzLnN0eWxlc1t4XSkuZm9yRWFjaChzdHlsZV9uYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLnN0eWxlc1tzdHlsZV9uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzW3N0eWxlX25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlLmFuaW1hdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJhdmVyc2Ugc3VibGF5ZXJzXG4gICAgICAgICAgICBpZiAodHlwZW9mIGxheWVyID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShsYXllcikpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBuYW1lIGluIGxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlTGF5ZXJzKGxheWVyW25hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHBhcnNlTGF5ZXJzKHRoaXMuY29uZmlnLmxheWVycyk7XG5cbiAgICAgICAgLy8gVXNlIGV4cGxpY2l0bHkgc2V0IHNjZW5lIGFuaW1hdGlvbiBmbGFnIGlmIGRlZmluZWQsIG90aGVyd2lzZSB0dXJuIG9uIGFuaW1hdGlvblxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgYW55IGFuaW1hdGVkIHN0eWxlc1xuICAgICAgICB0aGlzLmFuaW1hdGVkID0gdGhpcy5jb25maWcuc2NlbmUuYW5pbWF0ZWQgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLnNjZW5lLmFuaW1hdGVkIDogYW5pbWF0ZWQ7XG5cbiAgICAgICAgLy8gQ29tcGlsZSBuZXdseSBhY3RpdmUgc3R5bGVzXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmFjdGl2ZV9zdHlsZXMpLmZpbHRlcihzID0+IHByZXZfc3R5bGVzLmluZGV4T2YocykgPT09IC0xKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgYWN0aXZlIGNhbWVyYSAtIGZvciBwdWJsaWMgQVBJXG4gICAgZ2V0QWN0aXZlQ2FtZXJhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBhY3RpdmUgY2FtZXJhIC0gZm9yIHB1YmxpYyBBUElcbiAgICBzZXRBY3RpdmVDYW1lcmEobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LnNldEFjdGl2ZUNhbWVyYShuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbGlnaHRpbmdcbiAgICBjcmVhdGVMaWdodHMoKSB7XG4gICAgICAgIHRoaXMubGlnaHRzID0ge307XG4gICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5jb25maWcubGlnaHRzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmxpZ2h0c1tpXSB8fCB0eXBlb2YgdGhpcy5jb25maWcubGlnaHRzW2ldICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGxpZ2h0ID0gdGhpcy5jb25maWcubGlnaHRzW2ldO1xuICAgICAgICAgICAgbGlnaHQubmFtZSA9IGkucmVwbGFjZSgnLScsICdfJyk7IC8vIGxpZ2h0IG5hbWVzIGFyZSBpbmplY3RlZCBpbiBzaGFkZXJzLCBjYW4ndCBoYXZlIGh5cGhlbnNcbiAgICAgICAgICAgIGxpZ2h0LnZpc2libGUgPSAobGlnaHQudmlzaWJsZSA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICAgICAgaWYgKGxpZ2h0LnZpc2libGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpZ2h0c1tsaWdodC5uYW1lXSA9IExpZ2h0LmNyZWF0ZSh0aGlzLnZpZXcsIGxpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBMaWdodC5pbmplY3QodGhpcy5saWdodHMpO1xuICAgIH1cblxuICAgIC8vIFNldCBiYWNrZ3JvdW5kIGNvbG9yXG4gICAgc2V0QmFja2dyb3VuZCgpIHtcbiAgICAgICAgbGV0IGJnID0gdGhpcy5jb25maWcuc2NlbmUuYmFja2dyb3VuZDtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0ge307XG4gICAgICAgIGlmIChiZyAmJiBiZy5jb2xvcikge1xuICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLmNvbG9yID0gU3R5bGVQYXJzZXIucGFyc2VDb2xvcihiZy5jb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmJhY2tncm91bmQuY29sb3IpIHtcbiAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZC5jb2xvciA9IFswLCAwLCAwLCAwXTsgLy8gZGVmYXVsdCBiYWNrZ3JvdW5kIFRPRE86IHZhcnkgdy9zY2VuZSBhbHBoYVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgYmFja2dyb3VuZCBpcyBmdWxseSBvcGFxdWUsIHNldCBjYW52YXMgYmFja2dyb3VuZCB0byBtYXRjaFxuICAgICAgICBpZiAodGhpcy5iYWNrZ3JvdW5kLmNvbG9yWzNdID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPVxuICAgICAgICAgICAgICAgIGByZ2JhKCR7dGhpcy5iYWNrZ3JvdW5kLmNvbG9yLm1hcChjID0+IE1hdGguZmxvb3IoYyAqIDI1NSkpLmpvaW4oJywgJyl9KWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbC5jbGVhckNvbG9yKC4uLnRoaXMuYmFja2dyb3VuZC5jb2xvcik7XG4gICAgfVxuXG4gICAgLy8gVHVybiBpbnRyb3NwZWN0aW9uIG1vZGUgb24vb2ZmXG4gICAgc2V0SW50cm9zcGVjdGlvbiAodmFsKSB7XG4gICAgICAgIHRoaXMuaW50cm9zcGVjdGlvbiA9IHZhbCB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGVDb25maWcoKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc2NlbmUgY29uZmlnLCBhbmQgb3B0aW9uYWxseSByZWJ1aWxkIGdlb21ldHJ5XG4gICAgLy8gcmVidWlsZCBjYW4gYmUgYm9vbGVhbiwgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgcmVidWlsZCBvcHRpb25zIHRvIHBhc3N0aHJvdWdoXG4gICAgdXBkYXRlQ29uZmlnKHsgcmVidWlsZCA9IHRydWUsIHNlcmlhbGl6ZV9mdW5jcywgZmFkZV9pbiA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSArK1NjZW5lLmdlbmVyYXRpb247XG4gICAgICAgIHRoaXMudXBkYXRpbmcrKztcblxuICAgICAgICB0aGlzLmNvbmZpZyA9IFNjZW5lTG9hZGVyLmFwcGx5R2xvYmFsUHJvcGVydGllcyh0aGlzLmNvbmZpZywgdGhpcy5jb25maWdfZ2xvYmFsc19hcHBsaWVkKTtcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyLmluaXQoKTtcbiAgICAgICAgdGhpcy52aWV3LnJlc2V0KCk7XG4gICAgICAgIHRoaXMuY3JlYXRlTGlnaHRzKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlRGF0YVNvdXJjZXMoKTtcbiAgICAgICAgdGhpcy5sb2FkVGV4dHVyZXMoKTtcbiAgICAgICAgdGhpcy5zZXRCYWNrZ3JvdW5kKCk7XG4gICAgICAgIEZvbnRNYW5hZ2VyLmxvYWRGb250cyh0aGlzLmNvbmZpZy5mb250cyk7XG5cbiAgICAgICAgLy8gVE9ETzogZGV0ZWN0IGNoYW5nZXMgdG8gc3R5bGVzPyBhbHJlYWR5IChjdXJyZW50bHkpIG5lZWQgdG8gcmVjb21waWxlIGFueXdheSB3aGVuIGNhbWVyYSBvciBsaWdodHMgY2hhbmdlXG4gICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKCk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWxseSByZWJ1aWxkIGdlb21ldHJ5XG4gICAgICAgIGxldCBkb25lID0gcmVidWlsZCA/XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGQoT2JqZWN0LmFzc2lnbih7IHNlcmlhbGl6ZV9mdW5jcywgZmFkZV9pbiB9LCB0eXBlb2YgcmVidWlsZCA9PT0gJ29iamVjdCcgJiYgcmVidWlsZCkpIDpcbiAgICAgICAgICAgIHRoaXMuc3luY0NvbmZpZ1RvV29ya2VyKHsgc2VyaWFsaXplX2Z1bmNzIH0pOyAvLyByZWJ1aWxkKCkgYWxzbyBzeW5jcyBjb25maWdcblxuICAgICAgICAvLyBGaW5pc2ggYnkgdXBkYXRpbmcgYm91bmRzIGFuZCByZS1yZW5kZXJpbmdcbiAgICAgICAgdGhpcy51cGRhdGluZy0tO1xuICAgICAgICB0aGlzLnZpZXcudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuXG4gICAgICAgIHJldHVybiBkb25lO1xuICAgIH1cblxuICAgIC8vIFNlcmlhbGl6ZSBjb25maWcgYW5kIHNlbmQgdG8gd29ya2VyXG4gICAgc3luY0NvbmZpZ1RvV29ya2VyKHsgc2VyaWFsaXplX2Z1bmNzID0gdHJ1ZSB9ID0ge30pIHtcbiAgICAgICAgLy8gVGVsbCB3b3JrZXJzIHdlJ3JlIGFib3V0IHRvIHJlYnVpbGQgKHNvIHRoZXkgY2FuIHVwZGF0ZSBzdHlsZXMsIGV0Yy4pXG4gICAgICAgIHRoaXMuY29uZmlnX3NlcmlhbGl6ZWQgPVxuICAgICAgICAgICAgc2VyaWFsaXplX2Z1bmNzID8gVXRpbHMuc2VyaWFsaXplV2l0aEZ1bmN0aW9ucyh0aGlzLmNvbmZpZykgOiBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZyk7XG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi51cGRhdGVDb25maWcnLCB7XG4gICAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnX3NlcmlhbGl6ZWQsXG4gICAgICAgICAgICBnZW5lcmF0aW9uOiB0aGlzLmdlbmVyYXRpb24sXG4gICAgICAgICAgICBpbnRyb3NwZWN0aW9uOiB0aGlzLmludHJvc3BlY3Rpb25cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIHRvIHJlbGF0ZWQgb2JqZWN0c1xuICAgIGNyZWF0ZUxpc3RlbmVycyAoKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0ge307XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMudmlldyA9IHtcbiAgICAgICAgICAgIG1vdmU6ICgpID0+IHRoaXMudHJpZ2dlcignbW92ZScpXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudmlldy5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudmlldyk7XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMudGV4dHVyZSA9IHtcbiAgICAgICAgICAgIHVwZGF0ZTogKCkgPT4gdGhpcy5kaXJ0eSA9IHRydWUsXG4gICAgICAgICAgICB3YXJuaW5nOiAoZGF0YSkgPT4gdGhpcy50cmlnZ2VyKCd3YXJuaW5nJywgT2JqZWN0LmFzc2lnbih7IHR5cGU6ICd0ZXh0dXJlcycgfSwgZGF0YSkpXG4gICAgICAgIH07XG4gICAgICAgIFRleHR1cmUuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnRleHR1cmUpO1xuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnNjZW5lX2xvYWRlciA9IHtcbiAgICAgICAgICAgIGVycm9yOiAoZGF0YSkgPT4gdGhpcy50cmlnZ2VyKCdlcnJvcicsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiAnc2NlbmUnIH0sIGRhdGEpKVxuICAgICAgICB9O1xuICAgICAgICBTY2VuZUxvYWRlci5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMuc2NlbmVfbG9hZGVyKTtcbiAgICB9XG5cbiAgICBkZXN0cm95TGlzdGVuZXJzICgpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZUFsbCgpO1xuICAgICAgICB0aGlzLnZpZXcudW5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudmlldyk7XG4gICAgICAgIFRleHR1cmUudW5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudGV4dHVyZSk7XG4gICAgICAgIFNjZW5lTG9hZGVyLnVuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnNjZW5lX2xvYWRlcik7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXNldEZlYXR1cmVTZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IEZlYXR1cmVTZWxlY3Rpb24odGhpcy5nbCwgdGhpcy53b3JrZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLndvcmtlcnMpIHtcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnJlc2V0RmVhdHVyZVNlbGVjdGlvbicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0cyB0aGUgY3VycmVudCBmZWF0dXJlIHNlbGVjdGlvbiBtYXAgc2l6ZSBhY3Jvc3MgYWxsIHdvcmtlcnMuIFJldHVybnMgYSBwcm9taXNlLlxuICAgIGdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5mZXRjaGluZ19zZWxlY3Rpb25fbWFwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIHJldHVybiB1bmRlZmluZWQgaWYgYWxyZWFkeSBwZW5kaW5nXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mZXRjaGluZ19zZWxlY3Rpb25fbWFwID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYuZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUnKVxuICAgICAgICAgICAgLnRoZW4oc2l6ZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hpbmdfc2VsZWN0aW9uX21hcCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBzaXplcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGludGVybmFsIGNsb2NrLCBtb3N0bHkgdXNlZnVsIGZvciBjb25zaXN0ZW50IGV4cGVyaWVuY2Ugd2hlbiBjaGFuZ2luZyBzdHlsZXMvZGVidWdnaW5nXG4gICAgcmVzZXRUaW1lKCkge1xuICAgICAgICB0aGlzLnN0YXJ0X3RpbWUgPSArbmV3IERhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBGaXJlcyBldmVudCB3aGVuIHJlbmRlcmVkIHRpbGUgc2V0IG9yIHN0eWxlIGNoYW5nZXNcbiAgICB1cGRhdGVWaWV3Q29tcGxldGUgKCkge1xuICAgICAgICBpZiAoKHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgfHwgdGhpcy5nZW5lcmF0aW9uICE9PSB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbikgJiZcbiAgICAgICAgICAgICF0aGlzLnRpbGVfbWFuYWdlci5pc0xvYWRpbmdWaXNpYmxlVGlsZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSB0aGlzLmdlbmVyYXRpb247XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3ZpZXdfY29tcGxldGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Vmlld0NvbXBsZXRlICgpIHtcbiAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFRha2UgYSBzY3JlZW5zaG90XG4gICAgLy8gQXN5bmNocm9ub3VzIGJlY2F1c2Ugd2UgaGF2ZSB0byB3YWl0IGZvciBuZXh0IHJlbmRlciB0byBjYXB0dXJlIGJ1ZmZlclxuICAgIC8vIFJldHVybnMgYSBwcm9taXNlXG4gICAgc2NyZWVuc2hvdCAoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZWRpYV9jYXB0dXJlLnNjcmVlbnNob3QoKTtcbiAgICB9XG5cbiAgICBzdGFydFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZWRpYV9jYXB0dXJlLnN0YXJ0VmlkZW9DYXB0dXJlKCk7XG4gICAgfVxuXG4gICAgc3RvcFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lZGlhX2NhcHR1cmUuc3RvcFZpZGVvQ2FwdHVyZSgpO1xuICAgIH1cblxuXG4gICAgLy8gU3RhdHMvZGVidWcvcHJvZmlsaW5nIG1ldGhvZHNcblxuICAgIC8vIFByb2ZpbGUgaGVscGVycywgaXNzdWVzIGEgcHJvZmlsZSBvbiBtYWluIHRocmVhZCAmIGFsbCB3b3JrZXJzXG4gICAgX3Byb2ZpbGUobmFtZSkge1xuICAgICAgICBjb25zb2xlLnByb2ZpbGUoYG1haW4gdGhyZWFkOiAke25hbWV9YCk7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnByb2ZpbGUnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBfcHJvZmlsZUVuZChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZUVuZChgbWFpbiB0aHJlYWQ6ICR7bmFtZX1gKTtcbiAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYucHJvZmlsZUVuZCcsIG5hbWUpO1xuICAgIH1cblxuICAgIC8vIERlYnVnIGNvbmZpZyBhbmQgZnVuY3Rpb25zXG4gICAgc2V0dXBEZWJ1ZyAoKSB7XG4gICAgICAgIGxldCBzY2VuZSA9IHRoaXM7XG4gICAgICAgIHRoaXMuZGVidWcgPSB7XG4gICAgICAgICAgICAvLyBSZWJ1aWxkIGdlb21ldHJ5IGEgZ2l2ZW4gIyBvZiB0aW1lcyBhbmQgcHJpbnQgYXZlcmFnZSwgbWluLCBtYXggdGltaW5nc1xuICAgICAgICAgICAgdGltZVJlYnVpbGQgKG51bSA9IDEsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgICAgIGxldCB0aW1lcyA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBjeWNsZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHNjZW5lLnJlYnVpbGQob3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lcy5wdXNoKCtuZXcgRGF0ZSgpIC0gc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZXMubGVuZ3RoIDwgbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdmcgPSB+fih0aW1lcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKSAvIHRpbWVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdpbmZvJywgYFByb2ZpbGVkIHJlYnVpbGQgJHtudW19IHRpbWVzOiAke2F2Z30gYXZnICgke01hdGgubWluKC4uLnRpbWVzKX0gbWluLCAke01hdGgubWF4KC4uLnRpbWVzKX0gbWF4KWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGN5Y2xlKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBSZXR1cm4gZ2VvbWV0cnkgY291bnRzIG9mIHZpc2libGUgdGlsZXMsIGdyb3VwZWQgYnkgc3R5bGUgbmFtZVxuICAgICAgICAgICAgZ2VvbWV0cnlDb3VudEJ5U3R5bGUgKCkge1xuICAgICAgICAgICAgICAgIGxldCBjb3VudHMgPSB7fTtcbiAgICAgICAgICAgICAgICBzY2VuZS50aWxlX21hbmFnZXIuZ2V0UmVuZGVyYWJsZVRpbGVzKCkuZm9yRWFjaCh0aWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGlsZS5tZXNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1tzdHlsZV0gPSBjb3VudHNbc3R5bGVdIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbc3R5bGVdICs9IHRpbGUubWVzaGVzW3N0eWxlXS5nZW9tZXRyeV9jb3VudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHM7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZW9tZXRyeUNvdW50QnlCYXNlU3R5bGUgKCkge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZV9jb3VudHMgPSBzY2VuZS5kZWJ1Zy5nZW9tZXRyeUNvdW50QnlTdHlsZSgpO1xuICAgICAgICAgICAgICAgIGxldCBjb3VudHMgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiBzdHlsZV9jb3VudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2UgPSBzY2VuZS5zdHlsZXNbc3R5bGVdLmJhc2VTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb3VudHNbYmFzZV0gPSBjb3VudHNbYmFzZV0gfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRzW2Jhc2VdICs9IHN0eWxlX2NvdW50c1tzdHlsZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG59XG5cblNjZW5lLmlkID0gMDsgICAgICAgICAvLyB1bmlxdWUgaWQgZm9yIGEgc2NlbmUgaW5zdGFuY2VcblNjZW5lLmdlbmVyYXRpb24gPSAwOyAvLyBpZCB0aGF0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIHNjZW5lIGNvbmZpZyBpcyByZS1wYXJzZWRcbiIsImltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCAqIGFzIFVSTHMgZnJvbSAnLi91dGlscy91cmxzJztcbmltcG9ydCBKU1ppcCBmcm9tICdqc3ppcCc7XG5cbmV4cG9ydCBjbGFzcyBTY2VuZUJ1bmRsZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIHBhdGgsIHBhcmVudCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG5cbiAgICAgICAgLy8gSWYgYSBiYXNlIHBhdGggd2FzIHByb3ZpZGVkLCB1c2UgaXQgZm9yIHJlc29sdmluZyBsb2NhbCBidW5kbGUgcmVzb3VyY2VzIG9ubHkgaWZcbiAgICAgICAgLy8gdGhlIGJhc2UgcGF0aCBpcyBhYnNvbHV0ZSwgb3IgdGhpcyBidW5kbGUncyBwYXRoIGlzIHJlbGF0aXZlXG4gICAgICAgIGlmIChwYXRoICYmICghVVJMcy5pc1JlbGF0aXZlVVJMKHBhdGgpIHx8IFVSTHMuaXNSZWxhdGl2ZVVSTCh0aGlzLnVybCkpKSB7XG4gICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYXRoID0gVVJMcy5wYXRoRm9yVVJMKHRoaXMudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGF0aF9mb3JfcGFyZW50ID0gcGF0aCB8fCB0aGlzLnBhdGg7IC8vIGZvciByZXNvbHZpbmcgcGF0aHMgcmVsYXRpdmUgdG8gYSBwYXJlbnQgYnVuZGxlXG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXG4gICAgICAgIC8vIEFuIGFuY2VzdG9yIGJ1bmRsZSBtYXkgYmUgYSBjb250YWluZXIgKGUuZy4gemlwIGZpbGUpIHRoYXQgbmVlZHMgdG8gcmVzb2x2ZSByZWxhdGl2ZSBwYXRoc1xuICAgICAgICAvLyBmb3IgYW55IHNjZW5lcyBpdCBjb250YWlucywgZS5nLiBgcm9vdC56aXBgIGhhcyBhIGByb290LnlhbWxgIHRoYXQgaW5jbHVkZXMgYSBgZm9sZGVyL2NoaWxkLnlhbWxgOlxuICAgICAgICAvLyByZXNvdXJjZXMgd2l0aGluIGBjaGlsZC55YW1sYCBtdXN0IGJlIHJlc29sdmVkIHRocm91Z2ggdGhlIGJ1bmRsZSBmb3IgYHJvb3QuemlwYFxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50LmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYXJlbnQuY29udGFpbmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wYXJlbnQuaXNDb250YWluZXIoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICByZXR1cm4gVXRpbHMubG9hZFJlc291cmNlKHRoaXMudXJsKTtcbiAgICB9XG5cbiAgICAvLyBJbmZvIGZvciByZXRyaWV2aW5nIGEgc3BlY2lmaWMgcmVzb3VyY2UgZnJvbSB0aGlzIGJ1bmRsZVxuICAgIC8vIHVybDogZnVsbHkgcXVhbGlmaWVkIFVSTCB0byByZXRyaWV2ZSB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UgKGUuZy4gemlwcyB3aWxsIHRyYW5zZm9ybSB0aGlzIHRvIGJsb2IgVVJMKVxuICAgIC8vIHBhdGg6IG9yaWdpbmFsIHBhdGggb2YgdGhlIHJlc291cmNlIHdpdGhpbiB0aGUgYnVuZGxlIChmb3IgcmVzb2x2aW5nIHBhdGhzIHVwIHRoZSBidW5kbGUgdHJlZSlcbiAgICAvLyB0eXBlOiBmaWxlIGV4dGVuc2lvbiAodXNlZCBmb3IgZGV0ZXJtaW5pbmcgYnVuZGxlIHR5cGUsIGB5YW1sYCBvciBgemlwYClcbiAgICByZXNvdXJjZUZvcih1cmwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVybDogdGhpcy51cmxGb3IodXJsKSxcbiAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aEZvcih1cmwpLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlRm9yKHVybClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB1cmxGb3IodXJsKSB7XG4gICAgICAgIGlmIChVUkxzLmlzUmVsYXRpdmVVUkwodXJsKSAmJiB0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LnVybEZvcih0aGlzLnBhdGhfZm9yX3BhcmVudCArIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFVSTHMuYWRkQmFzZVVSTCh1cmwsIHRoaXMucGF0aCk7XG4gICAgfVxuXG4gICAgcGF0aEZvcih1cmwpIHtcbiAgICAgICAgcmV0dXJuIFVSTHMucGF0aEZvclVSTCh1cmwpO1xuICAgIH1cblxuICAgIHR5cGVGb3IodXJsKSB7XG4gICAgICAgIHJldHVybiBVUkxzLmV4dGVuc2lvbkZvclVSTCh1cmwpO1xuICAgIH1cblxuICAgIGlzQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBaaXBTY2VuZUJ1bmRsZSBleHRlbmRzIFNjZW5lQnVuZGxlIHtcblxuICAgIGNvbnN0cnVjdG9yKHVybCwgcGF0aCwgcGFyZW50KSB7XG4gICAgICAgIHN1cGVyKHVybCwgcGF0aCwgcGFyZW50KTtcbiAgICAgICAgdGhpcy56aXAgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbGVzID0ge307XG4gICAgICAgIHRoaXMucm9vdCA9IG51bGw7XG4gICAgICAgIHRoaXMucGF0aCA9ICcnO1xuICAgIH1cblxuICAgIGlzQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICB0aGlzLnppcCA9IG5ldyBKU1ppcCgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuaW8odGhpcy51cmwsIDYwMDAwLCAnYXJyYXlidWZmZXInKVxuICAgICAgICAgICAgICAgIC50aGVuKGJvZHkgPT4gdGhpcy56aXAubG9hZEFzeW5jKGJvZHkpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucGFyc2VaaXBGaWxlcygpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMubG9hZFJvb3QoKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZSA9PiBQcm9taXNlLnJlamVjdChlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXJsRm9yKHVybCkge1xuICAgICAgICBpZiAoVVJMcy5pc1JlbGF0aXZlVVJMKHVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVybEZvclppcEZpbGUoVVJMcy5mbGF0dGVuUmVsYXRpdmVVUkwodXJsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLnVybEZvcih1cmwpO1xuICAgIH1cblxuICAgIHR5cGVGb3IodXJsKSB7XG4gICAgICAgIGlmIChVUkxzLmlzUmVsYXRpdmVVUkwodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZUZvclppcEZpbGUodXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIudHlwZUZvcih1cmwpO1xuICAgIH1cblxuICAgIGxvYWRSb290KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kUm9vdCgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiBVdGlscy5sb2FkUmVzb3VyY2UodGhpcy51cmxGb3JaaXBGaWxlKHRoaXMucm9vdCkpKTtcbiAgICB9XG5cbiAgICBmaW5kUm9vdCgpIHtcbiAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBhIHNpbmdsZSBZQU1MIGZpbGUgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgemlwXG4gICAgICAgIGNvbnN0IHlhbWxzID0gT2JqZWN0LmtleXModGhpcy5maWxlcylcbiAgICAgICAgICAgIC5maWx0ZXIocGF0aCA9PiB0aGlzLmZpbGVzW3BhdGhdLmRlcHRoID09PSAwKVxuICAgICAgICAgICAgLmZpbHRlcihwYXRoID0+IFVSTHMuZXh0ZW5zaW9uRm9yVVJMKHBhdGgpID09PSAneWFtbCcpO1xuXG4gICAgICAgIGlmICh5YW1scy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHlhbWxzWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gcm9vdCBmb3VuZFxuICAgICAgICBpZiAoIXRoaXMucm9vdCkge1xuICAgICAgICAgICAgbGV0IG1zZyA9IGBDb3VsZCBub3QgZmluZCByb290IHNjZW5lIGZvciBidW5kbGUgJyR7dGhpcy51cmx9JzogYDtcbiAgICAgICAgICAgIG1zZyArPSBgVGhlIHppcCBhcmNoaXZlJ3Mgcm9vdCBsZXZlbCBtdXN0IGNvbnRhaW4gYSBzaW5nbGUgc2NlbmUgZmlsZSB3aXRoIHRoZSAnLnlhbWwnIGV4dGVuc2lvbi4gYDtcbiAgICAgICAgICAgIGlmICh5YW1scy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbXNnICs9IGBGb3VuZCBtdWx0aXBsZSBZQU1MIGZpbGVzIGF0IHRoZSByb290IGxldmVsOiAke3lhbWxzLm1hcChyID0+ICdcXCcnICsgciArICdcXCcnICkuam9pbignLCAnKX0uYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1zZyArPSBgRm91bmQgTk8gWUFNTCBmaWxlcyBhdCB0aGUgcm9vdCBsZXZlbC5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KEVycm9yKG1zZykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBwYXJzZVppcEZpbGVzKCkge1xuICAgICAgICBsZXQgcGF0aHMgPSBbXTtcbiAgICAgICAgbGV0IHF1ZXVlID0gW107XG4gICAgICAgIHRoaXMuemlwLmZvckVhY2goKHBhdGgsIGZpbGUpID0+IHtcbiAgICAgICAgICAgIGlmICghZmlsZS5kaXIpIHtcbiAgICAgICAgICAgICAgICBwYXRocy5wdXNoKHBhdGgpO1xuICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goZmlsZS5hc3luYygnYXJyYXlidWZmZXInKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChxdWV1ZSkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IHBhdGhzW2ldO1xuICAgICAgICAgICAgICAgIGxldCBkZXB0aCA9IHBhdGguc3BsaXQoJy8nKS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbcGF0aF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFVSTHMuZXh0ZW5zaW9uRm9yVVJMKHBhdGgpLFxuICAgICAgICAgICAgICAgICAgICBkZXB0aFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVybEZvclppcEZpbGUoZmlsZSkge1xuICAgICAgICBpZiAodGhpcy5maWxlc1tmaWxlXSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVzW2ZpbGVdLnVybCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbZmlsZV0udXJsID0gVVJMcy5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3RoaXMuZmlsZXNbZmlsZV0uZGF0YV0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZXNbZmlsZV0udXJsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHlwZUZvclppcEZpbGUoZmlsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWxlc1tmaWxlXSAmJiB0aGlzLmZpbGVzW2ZpbGVdLnR5cGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTY2VuZUJ1bmRsZSh1cmwsIHBhdGgsIHBhcmVudCwgdHlwZSA9IG51bGwpIHtcbiAgICBpZiAodHlwZSA9PT0gJ3ppcCcgfHwgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnICYmIFVSTHMuZXh0ZW5zaW9uRm9yVVJMKHVybCkgPT09ICd6aXAnKSkge1xuICAgICAgICByZXR1cm4gbmV3IFppcFNjZW5lQnVuZGxlKHVybCwgcGF0aCwgcGFyZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTY2VuZUJ1bmRsZSh1cmwsIHBhdGgsIHBhcmVudCk7XG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQgKiBhcyBVUkxzIGZyb20gJy4vdXRpbHMvdXJscyc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4vdXRpbHMvbWVyZ2UnO1xuaW1wb3J0IHN1YnNjcmliZU1peGluIGZyb20gJy4vdXRpbHMvc3Vic2NyaWJlJztcbmltcG9ydCB7Y3JlYXRlU2NlbmVCdW5kbGV9IGZyb20gJy4vc2NlbmVfYnVuZGxlJztcblxudmFyIFNjZW5lTG9hZGVyO1xuXG5leHBvcnQgZGVmYXVsdCBTY2VuZUxvYWRlciA9IHtcblxuICAgIC8vIExvYWQgc2NlbmVzIGRlZmluaXRpb25zIGZyb20gVVJMICYgcHJvcHJvY2Vzc1xuICAgIGxvYWRTY2VuZSh1cmwsIHBhdGggPSBudWxsKSB7XG4gICAgICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZFNjZW5lUmVjdXJzaXZlKHsgdXJsLCBwYXRoIH0sIG51bGwsIGVycm9ycykuXG4gICAgICAgICAgICB0aGVuKGNvbmZpZyA9PiB0aGlzLmZpbmFsaXplKGNvbmZpZykpLlxuICAgICAgICAgICAgdGhlbihjb25maWcgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJvb3Qgc2NlbmUgZmFpbGVkIHRvIGxvYWQsIHJlamVjdCB3aXRoIGZpcnN0IGVycm9yXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcnNbMF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBzY2VuZSBsb2FkZWQsIGJ1dCBzb21lIGltcG9ydHMgaGFkIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMuZm9yRWFjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBGYWlsZWQgdG8gaW1wb3J0IHNjZW5lOiAke2Vycm9yLnVybH1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdlcnJvcicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcignZXJyb3InLCB7IHR5cGU6ICdzY2VuZV9pbXBvcnQnLCBtZXNzYWdlLCBlcnJvciwgdXJsOiBlcnJvci51cmwgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIExvYWRzIHNjZW5lIGZpbGVzIGZyb20gVVJMLCByZWN1cnNpdmVseSBsb2FkaW5nICdpbXBvcnQnIHNjZW5lc1xuICAgIC8vIE9wdGlvbmFsICppbml0aWFsKiBwYXRoIG9ubHkgKHdvbid0IGJlIHBhc3NlZCB0byByZWN1cnNpdmUgJ2ltcG9ydCcgY2FsbHMpXG4gICAgLy8gVXNlZnVsIGZvciBsb2FkaW5nIHJlc291cmNlcyBpbiBiYXNlIHNjZW5lIGZpbGUgZnJvbSBhIHNlcGFyYXRlIGxvY2F0aW9uXG4gICAgLy8gKGUuZy4gaW4gVGFuZ3JhbSBQbGF5LCB3aGVuIG1vZGlmaWVkIGxvY2FsIHNjZW5lIHNob3VsZCBzdGlsbCByZWZlciB0byBvcmlnaW5hbCByZXNvdXJjZSBVUkxzKVxuICAgIGxvYWRTY2VuZVJlY3Vyc2l2ZSh7IHVybCwgcGF0aCwgdHlwZSB9LCBwYXJlbnQsIGVycm9ycyA9IFtdKSB7XG4gICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBidW5kbGUgPSBjcmVhdGVTY2VuZUJ1bmRsZSh1cmwsIHBhdGgsIHBhcmVudCwgdHlwZSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1bmRsZS5sb2FkKCkudGhlbihjb25maWcgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5pbXBvcnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhY2NlcHQgc2luZ2xlIGVudHJ5IG9yIGFycmF5XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLmltcG9ydCkpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuaW1wb3J0ID0gW2NvbmZpZy5pbXBvcnRdOyAvLyBjb252ZXJ0IHRvIGFycmF5XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENvbGxlY3QgVVJMcyBvZiBzY2VuZXMgdG8gaW1wb3J0XG4gICAgICAgICAgICBsZXQgaW1wb3J0cyA9IFtdO1xuICAgICAgICAgICAgY29uZmlnLmltcG9ydC5mb3JFYWNoKHVybCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ29udmVydCBzY2VuZSBvYmplY3RzIHRvIFVSTHNcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gVVJMcy5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHVybCldKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaW1wb3J0cy5wdXNoKGJ1bmRsZS5yZXNvdXJjZUZvcih1cmwpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5pbXBvcnQ7IC8vIGRvbid0IHdhbnQgdG8gbWVyZ2UgdGhpcyBwcm9wZXJ0eVxuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5cbiAgICAgICAgICAgIGFsbChpbXBvcnRzLm1hcChyZXNvdXJjZSA9PiB0aGlzLmxvYWRTY2VuZVJlY3Vyc2l2ZShyZXNvdXJjZSwgYnVuZGxlLCBlcnJvcnMpKSkuXG4gICAgICAgICAgICAgICAgdGhlbihjb25maWdzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VPYmplY3RzKHt9LCAuLi5jb25maWdzLCBjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZShjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIC8vIENvbGxlY3Qgc2NlbmUgbG9hZCBlcnJvcnMgYXMgd2UgZ29cbiAgICAgICAgICAgIGVycm9yLnVybCA9IHVybDtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIE5vcm1hbGl6ZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIGFkanVzdCB3aXRoaW4gZWFjaCBsb2NhbCBzY2VuZSBmaWxlICh1c3VhbGx5IGJ5IHBhdGgpXG4gICAgbm9ybWFsaXplKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIHRoaXMubm9ybWFsaXplRGF0YVNvdXJjZXMoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZUZvbnRzKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVUZXh0dXJlcyhjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSxcblxuICAgIC8vIEV4cGFuZCBwYXRocyBmb3IgZGF0YSBzb3VyY2VcbiAgICBub3JtYWxpemVEYXRhU291cmNlcyhjb25maWcsIGJ1bmRsZSkge1xuICAgICAgICBjb25maWcuc291cmNlcyA9IGNvbmZpZy5zb3VyY2VzIHx8IHt9O1xuXG4gICAgICAgIGZvciAobGV0IHNuIGluIGNvbmZpZy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gY29uZmlnLnNvdXJjZXNbc25dO1xuICAgICAgICAgICAgc291cmNlLnVybCA9IGJ1bmRsZS51cmxGb3Ioc291cmNlLnVybCk7XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZS5zY3JpcHRzKSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZS5zY3JpcHRzID0gc291cmNlLnNjcmlwdHMubWFwKHVybCA9PiBidW5kbGUudXJsRm9yKHVybCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIHBhdGhzIGZvciBmb250c1xuICAgIG5vcm1hbGl6ZUZvbnRzKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIGNvbmZpZy5mb250cyA9IGNvbmZpZy5mb250cyB8fCB7fTtcblxuICAgICAgICBmb3IgKGxldCBmYW1pbHkgaW4gY29uZmlnLmZvbnRzKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcuZm9udHNbZmFtaWx5XSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuZm9udHNbZmFtaWx5XS5mb3JFYWNoKGZhY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmYWNlLnVybCA9IGZhY2UudXJsICYmIGJ1bmRsZS51cmxGb3IoZmFjZS51cmwpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGZhY2UgPSBjb25maWcuZm9udHNbZmFtaWx5XTtcbiAgICAgICAgICAgICAgICBmYWNlLnVybCA9IGZhY2UudXJsICYmIGJ1bmRsZS51cmxGb3IoZmFjZS51cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIHBhdGhzIGFuZCBjZW50cmFsaXplIHRleHR1cmUgZGVmaW5pdGlvbnMgZm9yIGEgc2NlbmUgb2JqZWN0XG4gICAgbm9ybWFsaXplVGV4dHVyZXMoY29uZmlnLCBidW5kbGUpIHtcbiAgICAgICAgY29uZmlnLnRleHR1cmVzID0gY29uZmlnLnRleHR1cmVzIHx8IHt9O1xuXG4gICAgICAgIC8vIEFkZCBjdXJyZW50IHNjZW5lJ3MgYmFzZSBwYXRoIHRvIGdsb2JhbGx5IGRlZmluZWQgdGV4dHVyZXNcbiAgICAgICAgLy8gT25seSBhZGRzIHBhdGggZm9yIHRleHR1cmVzIHdpdGggcmVsYXRpdmUgVVJMcywgc28gdGV4dHVyZXMgaW4gaW1wb3J0ZWQgc2NlbmVzIGdldCB0aGUgYmFzZVxuICAgICAgICAvLyBwYXRoIG9mIHRoZWlyIGltbWVkaWF0ZSBzY2VuZSBmaWxlXG4gICAgICAgIGlmIChjb25maWcudGV4dHVyZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHRuIGluIGNvbmZpZy50ZXh0dXJlcykge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gY29uZmlnLnRleHR1cmVzW3RuXTtcbiAgICAgICAgICAgICAgICBpZiAodGV4dHVyZS51cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS51cmwgPSBidW5kbGUudXJsRm9yKHRleHR1cmUudXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb3ZlIFwiVVJMIHNob3J0Y3V0XCIgdGV4dHVyZXMsIGUuZy4gdGhvc2Ugc3BlY2lmaWVkIGFzIGlubGluZSBVUkwgc3RyaW5ncywgdG8gdGhlIHNjZW5lJ3MgdG9wLWxldmVsXG4gICAgICAgIC8vIHNldCBvZiB0ZXh0dXJlcyAoY29uZmlnLnRleHR1cmVzKS4gVGhlcmUgYXJlIDMgc3VjaCBjYXNlcyBvZiB0ZXh0dXJlczpcbiAgICAgICAgLy8gLSBpbiBhIHN0eWxlJ3MgYHRleHR1cmVgIHByb3BlcnR5XG4gICAgICAgIC8vIC0gaW4gYSBzdHlsZSdzIGBtYXRlcmlhbGAgcHJvcGVydGllc1xuICAgICAgICAvLyAtIGluIGEgc3R5bGUncyBjdXN0b20gdW5pZm9ybXMgKGBzaGFkZXJzLnVuaWZvcm1zYClcbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2UgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgdGV4dHVyZSBhbHJlYWR5IGRlZmluZWQgd2l0aCB0aGF0IHN0cmluZyBuYW1lLiBUaGUgdGV4dHVyZSdzIFVSTFxuICAgICAgICAvLyBpcyBleHBhbmRlZCB0byBpbmNsdWRlIHRoZSBjdXJyZW50IHNjZW5lJ3MgYmFzZSBwYXRoLlxuICAgICAgICBpZiAoY29uZmlnLnN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgc24gaW4gY29uZmlnLnN0eWxlcykge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IGNvbmZpZy5zdHlsZXNbc25dO1xuXG4gICAgICAgICAgICAgICAgLy8gU3R5bGUgYHRleHR1cmVgXG4gICAgICAgICAgICAgICAgbGV0IHRleCA9IHN0eWxlLnRleHR1cmU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXggPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdGV4XSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXggPSBidW5kbGUudXJsRm9yKHRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy50ZXh0dXJlc1t0ZXhdID0geyB1cmw6IHRleCB9O1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXh0dXJlID0gdGV4O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE1hdGVyaWFsXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLm1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIFsnZW1pc3Npb24nLCAnYW1iaWVudCcsICdkaWZmdXNlJywgJ3NwZWN1bGFyJywgJ25vcm1hbCddLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRlcmlhbCBwcm9wZXJ0eSBoYXMgYSB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4ID0gc3R5bGUubWF0ZXJpYWxbcHJvcF0gIT0gbnVsbCAmJiBzdHlsZS5tYXRlcmlhbFtwcm9wXS50ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXggPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdGV4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleCA9IGJ1bmRsZS51cmxGb3IodGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudGV4dHVyZXNbdGV4XSA9IHsgdXJsOiB0ZXggfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5tYXRlcmlhbFtwcm9wXS50ZXh0dXJlID0gdGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaGFkZXIgdW5pZm9ybXNcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUuc2hhZGVycyAmJiBzdHlsZS5zaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgIEdMU0wucGFyc2VVbmlmb3JtcyhzdHlsZS5zaGFkZXJzLnVuaWZvcm1zKS5mb3JFYWNoKCh7dHlwZSwgdmFsdWUsIGtleSwgdW5pZm9ybXN9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXh0dXJlIGJ5IFVSTCAoc3RyaW5nLW5hbWVkIHRleHR1cmUgbm90IHJlZmVyZW5jaW5nIGV4aXN0aW5nIHRleHR1cmUgZGVmaW5pdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnc2FtcGxlcjJEJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleCA9IGJ1bmRsZS51cmxGb3IodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50ZXh0dXJlc1t0ZXhdID0geyB1cmw6IHRleCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zW2tleV0gPSB0ZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSxcblxuICAgIC8vIFN1YnN0aXR1dGVzIGdsb2JhbCBzY2VuZSBwcm9wZXJ0aWVzICh0aG9zZSBkZWZpbmVkIGluIHRoZSBgY29uZmlnLmdsb2JhbGAgb2JqZWN0KSBmb3IgYW55IHN0eWxlIHZhbHVlc1xuICAgIC8vIG9mIHRoZSBmb3JtIGBnbG9iYWwuYCwgZm9yIGV4YW1wbGUgYGNvbG9yOiBnbG9iYWwucGFya19jb2xvcmAgd291bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdmFsdWUgKGlmIGFueSlcbiAgICAvLyBkZWZpbmVkIGZvciB0aGUgYHBhcmtfY29sb3JgIHByb3BlcnR5IGluIGBjb25maWcuZ2xvYmFsLnBhcmtfY29sb3JgLlxuICAgIGFwcGx5R2xvYmFsUHJvcGVydGllcyhjb25maWcsIGFwcGxpZWQpIHtcbiAgICAgICAgaWYgKCFjb25maWcuZ2xvYmFsIHx8IE9iamVjdC5rZXlzKGNvbmZpZy5nbG9iYWwpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsgLy8gbm8gZ2xvYmFsIHByb3BlcnRpZXMgdG8gdHJhbnNmb3JtXG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSBwcm9wZXJ0aWVzIGZyb20gZ2xvYmFsc1xuICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSAnOic7XG4gICAgICAgIGNvbnN0IHByb3BzID0gZmxhdHRlblByb3BlcnRpZXMoY29uZmlnLmdsb2JhbCwgc2VwYXJhdG9yKTtcblxuICAgICAgICAvLyBSZS1hcHBseSBwcmV2aW91c2x5IGFwcGxpZWQgcHJvcGVydGllc1xuICAgICAgICAvLyBOQjogYSBjdXJyZW50IHNob3J0Y29taW5nIGhlcmUgaXMgdGhhdCB5b3UgY2Fubm90IFwidW4tbGlua1wiIGEgdGFyZ2V0IHByb3BlcnR5IGZyb20gYSBnbG9iYWxcbiAgICAgICAgLy8gYXQgcnVuLXRpbWUuIE9uY2UgYSBnbG9iYWwgcHJvcGVydHkgc3Vic3RpdHV0aW9uIGhhcyBiZWVuIHJlY29yZGVyZCwgaXQgd2lsbCBhbHdheXMgYmUgcmUtYXBwbGllZFxuICAgICAgICAvLyBvbiBzdWJzZXF1ZW50IHNjZW5lIHVwZGF0ZXMsIGV2ZW4gaWYgdGhlIHRhcmdldCBwcm9wZXJ0eSB3YXMgdXBkYXRlZCB0byBhbm90aGVyIGxpdGVyYWwgdmFsdWUuXG4gICAgICAgIC8vIFRoaXMgaXMgdW5saWtlbHkgdG8gYmUgYSBjb21tb24gb2NjdXJyZW5jZSBhbiBhY2NlcHRhYmxlIGxpbWl0YXRpb24gZm9yIG5vdy5cbiAgICAgICAgYXBwbGllZC5mb3JFYWNoKCh7IHByb3AsIHRhcmdldCwga2V5IH0pID0+IHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHByb3BzW3Byb3BdO1xuICAgICAgICAgICAgICAgIC8vIGxvZygnaW5mbycsIGBSZS1hcHBseWluZyAke3Byb3B9IHdpdGggdmFsdWUgJHtwcm9wc1twcm9wXX0gdG8ga2V5ICR7a2V5fSBpbmAsIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEZpbmQgYW5kIGFwcGx5IG5ldyBwcm9wZXJ0aWVzXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5UHJvcHMgKG9iaiwgdGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wID0gKG9iai5zbGljZSgwLCA3KSA9PT0gJ2dsb2JhbC4nKSAmJiAob2JqLnNsaWNlKDcpLnJlcGxhY2UoL1xcLi9nLCBzZXBhcmF0b3IpKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcCAmJiBwcm9wc1twcm9wXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgcmVjb3JkIG9mIHdoZXJlIHByb3BlcnR5IGlzIGFwcGxpZWRcbiAgICAgICAgICAgICAgICAgICAgYXBwbGllZC5wdXNoKHsgcHJvcCwgdGFyZ2V0LCBrZXkgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgb2JqID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ialtwXSA9IGFwcGx5UHJvcHMob2JqW3BdLCBvYmosIHApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXBwbHlQcm9wcyhjb25maWcpO1xuICAgIH0sXG5cbiAgICAvLyBOb3JtYWxpemUgc29tZSBzY2VuZS13aWRlIHNldHRpbmdzIHRoYXQgYXBwbHkgdG8gdGhlIGZpbmFsLCBtZXJnZWQgc2NlbmVcbiAgICBmaW5hbGl6ZShjb25maWcpIHtcbiAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuc3VyZSB0b3AtbGV2ZWwgcHJvcGVydGllc1xuICAgICAgICBjb25maWcuc2NlbmUgPSBjb25maWcuc2NlbmUgfHwge307XG4gICAgICAgIGNvbmZpZy5jYW1lcmFzID0gY29uZmlnLmNhbWVyYXMgfHwge307XG4gICAgICAgIGNvbmZpZy5saWdodHMgPSBjb25maWcubGlnaHRzIHx8IHt9O1xuICAgICAgICBjb25maWcuc3R5bGVzID0gY29uZmlnLnN0eWxlcyB8fCB7fTtcbiAgICAgICAgY29uZmlnLmxheWVycyA9IGNvbmZpZy5sYXllcnMgfHwge307XG5cbiAgICAgICAgLy8gQXNzaWduIGlkcyB0byBkYXRhIHNvdXJjZXNcbiAgICAgICAgbGV0IHNvdXJjZV9pZCA9IDA7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBpbiBjb25maWcuc291cmNlcykge1xuICAgICAgICAgICAgY29uZmlnLnNvdXJjZXNbc291cmNlXS5pZCA9IHNvdXJjZV9pZCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb25seSBvbmUgY2FtZXJhIHNwZWNpZmllZCwgc2V0IGl0IGFzIGRlZmF1bHRcbiAgICAgICAgaWYgKGNvbmZpZy5jYW1lcmEpIHtcbiAgICAgICAgICAgIGNvbmZpZy5jYW1lcmFzLmRlZmF1bHQgPSBjb25maWcuY2FtZXJhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gY2FtZXJhcyBzcGVjaWZpZWQsIGNyZWF0ZSBvbmVcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbmZpZy5jYW1lcmFzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZy5jYW1lcmFzLmRlZmF1bHQgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIGxpZ2h0cyBzcGVjaWZpZWQsIGNyZWF0ZSBkZWZhdWx0XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjb25maWcubGlnaHRzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbmZpZy5saWdodHMpLmV2ZXJ5KGkgPT4gY29uZmlnLmxpZ2h0c1tpXS52aXNpYmxlID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5saWdodHMuZGVmYXVsdF9saWdodCA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGlyZWN0aW9uYWwnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG5cbn07XG5cbi8vIEZsYXR0ZW4gbmVzdGVkIHByb3BlcnRpZXMgZm9yIHNpbXBsZXIgc3RyaW5nIGxvb2stdXBzXG4vLyBlLmcuIGdsb2JhbC5iYWNrZ3JvdW5kLmNvbG9yIC0+ICdnbG9iYWw6YmFja2dyb3VuZDpjb2xvcidcbmZ1bmN0aW9uIGZsYXR0ZW5Qcm9wZXJ0aWVzIChvYmosIHNlcGFyYXRvciA9ICc6JywgcHJlZml4ID0gbnVsbCwgcHJvcHMgPSB7fSkge1xuICAgIHByZWZpeCA9IHByZWZpeCA/IChwcmVmaXggKyBzZXBhcmF0b3IpIDogJyc7XG5cbiAgICBmb3IgKGxldCBwIGluIG9iaikge1xuICAgICAgICBsZXQga2V5ID0gcHJlZml4ICsgcDtcbiAgICAgICAgbGV0IHZhbCA9IG9ialtwXTtcbiAgICAgICAgcHJvcHNba2V5XSA9IHZhbDtcblxuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgZmxhdHRlblByb3BlcnRpZXModmFsLCBzZXBhcmF0b3IsIGtleSwgcHJvcHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wcztcbn1cblxuc3Vic2NyaWJlTWl4aW4oU2NlbmVMb2FkZXIpO1xuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cbmltcG9ydCBUaHJlYWQgZnJvbSAnLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tICcuL3V0aWxzL21lcmdlJztcbmltcG9ydCBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL3NvdXJjZXMvZGF0YV9zb3VyY2UnO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcbmltcG9ydCB7U3R5bGVNYW5hZ2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCB7cGFyc2VMYXllcnN9IGZyb20gJy4vc3R5bGVzL2xheWVyJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5cbmV4cG9ydCB2YXIgU2NlbmVXb3JrZXIgPSBzZWxmO1xuXG4vLyBXb3JrZXIgZnVuY3Rpb25hbGl0eSB3aWxsIG9ubHkgYmUgZGVmaW5lZCBpbiB3b3JrZXIgdGhyZWFkXG5pZiAoVGhyZWFkLmlzX3dvcmtlcikge1xuXG5PYmplY3QuYXNzaWduKHNlbGYsIHtcblxuICAgIEZlYXR1cmVTZWxlY3Rpb24sXG5cbiAgICBzb3VyY2VzOiB7XG4gICAgICAgIHRpbGVzOiB7fSxcbiAgICAgICAgb2JqZWN0czoge31cbiAgICB9LFxuICAgIHN0eWxlczoge30sXG4gICAgbGF5ZXJzOiB7fSxcbiAgICB0aWxlczoge30sXG4gICAgb2JqZWN0czoge30sXG4gICAgY29uZmlnOiB7fSwgICAgIC8vIHJhdyBjb25maWcgKGUuZy4gZnVuY3Rpb25zLCBldGMuIG5vdCBleHBhbmRlZClcblxuICAgIC8vIEluaXRpYWxpemUgd29ya2VyXG4gICAgaW5pdCAoc2NlbmVfaWQsIHdvcmtlcl9pZCwgbnVtX3dvcmtlcnMsIGxvZ19sZXZlbCwgZGV2aWNlX3BpeGVsX3JhdGlvKSB7XG4gICAgICAgIHNlbGYuc2NlbmVfaWQgPSBzY2VuZV9pZDtcbiAgICAgICAgc2VsZi5fd29ya2VyX2lkID0gd29ya2VyX2lkO1xuICAgICAgICBzZWxmLm51bV93b3JrZXJzID0gbnVtX3dvcmtlcnM7XG4gICAgICAgIGxvZy5zZXRMZXZlbChsb2dfbGV2ZWwpO1xuICAgICAgICBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gPSBkZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIEZlYXR1cmVTZWxlY3Rpb24uc2V0UHJlZml4KHNlbGYuX3dvcmtlcl9pZCk7XG4gICAgICAgIHNlbGYuc3R5bGVfbWFuYWdlciA9IG5ldyBTdHlsZU1hbmFnZXIoKTtcbiAgICAgICAgcmV0dXJuIHdvcmtlcl9pZDtcbiAgICB9LFxuXG4gICAgLy8gU3RhcnRzIGEgY29uZmlnIHJlZnJlc2hcbiAgICB1cGRhdGVDb25maWcgKHsgY29uZmlnLCBnZW5lcmF0aW9uLCBpbnRyb3NwZWN0aW9uIH0pIHtcbiAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShjb25maWcpO1xuXG4gICAgICAgIHNlbGYubGFzdF9jb25maWcgPSBtZXJnZU9iamVjdHMoe30sIHNlbGYuY29uZmlnKTtcbiAgICAgICAgc2VsZi5jb25maWcgPSBtZXJnZU9iamVjdHMoe30sIGNvbmZpZyk7XG4gICAgICAgIHNlbGYuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247XG4gICAgICAgIHNlbGYuaW50cm9zcGVjdGlvbiA9IGludHJvc3BlY3Rpb247XG5cbiAgICAgICAgLy8gRGF0YSBibG9jayBmdW5jdGlvbnMgYXJlIG5vdCBjb250ZXh0IHdyYXBwZWQgbGlrZSB0aGUgcmVzdCBvZiB0aGUgc3R5bGUgZnVuY3Rpb25zIGFyZVxuICAgICAgICAvLyBUT0RPOiBwcm9iYWJseSB3YW50IGEgY2xlYW5lciB3YXkgdG8gZXhjbHVkZSB0aGVzZVxuICAgICAgICBmb3IgKGxldCBsYXllciBpbiBjb25maWcubGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmxheWVyc1tsYXllcl0pIHtcbiAgICAgICAgICAgICAgICBjb25maWcubGF5ZXJzW2xheWVyXS5kYXRhID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKGNvbmZpZy5sYXllcnNbbGF5ZXJdLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXhwYW5kIGdsb2JhbCBwcm9wZXJ0aWVzXG4gICAgICAgIHNlbGYuZ2xvYmFsID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKGNvbmZpZy5nbG9iYWwpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBkYXRhIHNvdXJjZXNcbiAgICAgICAgc2VsZi5jcmVhdGVEYXRhU291cmNlcyhjb25maWcpO1xuXG4gICAgICAgIC8vIEV4cGFuZCBzdHlsZXNcbiAgICAgICAgY29uZmlnLnN0eWxlcyA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcuc3R5bGVzLCBTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24pO1xuICAgICAgICBzZWxmLnN0eWxlcyA9IHNlbGYuc3R5bGVfbWFuYWdlci5idWlsZChjb25maWcuc3R5bGVzKTtcbiAgICAgICAgc2VsZi5zdHlsZV9tYW5hZ2VyLmluaXRTdHlsZXMoe1xuICAgICAgICAgICAgZ2VuZXJhdGlvbjogc2VsZi5nZW5lcmF0aW9uLFxuICAgICAgICAgICAgc3R5bGVzOiBzZWxmLnN0eWxlcyxcbiAgICAgICAgICAgIHNvdXJjZXM6IHNlbGYuc291cmNlcy50aWxlcyxcbiAgICAgICAgICAgIGludHJvc3BlY3Rpb246IHNlbGYuaW50cm9zcGVjdGlvblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQYXJzZSBlYWNoIHRvcC1sZXZlbCBsYXllciBhcyBhIHNlcGFyYXRlIHRyZWVcbiAgICAgICAgc2VsZi5sYXllcnMgPSBwYXJzZUxheWVycyhjb25maWcubGF5ZXJzLCBzZWxmLnN0eWxlX21hbmFnZXIuc3R5bGVzKTtcblxuICAgICAgICAvLyBTeW5jIHRldHh1cmUgaW5mbyBmcm9tIG1haW4gdGhyZWFkXG4gICAgICAgIHNlbGYuc3luY2luZ190ZXh0dXJlcyA9IHNlbGYuc3luY1RleHR1cmVzKGNvbmZpZy50ZXh0dXJlcyk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHByb21pc2UgZm9yIHdoZW4gY29uZmlnIHJlZnJlc2ggZmluaXNoZXNcbiAgICAgICAgc2VsZi5jb25maWd1cmluZyA9IHNlbGYuc3luY2luZ190ZXh0dXJlcy50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgdXBkYXRlZCBjb25maWdgKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIENyZWF0ZSBkYXRhIHNvdXJjZXMgYW5kIGNsZWFyIHRpbGUgY2FjaGUgaWYgbmVjZXNzYXJ5XG4gICAgY3JlYXRlRGF0YVNvdXJjZXMgKGNvbmZpZykge1xuICAgICAgICBjb25maWcuc291cmNlcyA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcuc291cmNlcyk7IC8vIHBhcnNlIG5ldyBzb3VyY2VzXG4gICAgICAgIHNlbGYuc291cmNlcy50aWxlcyA9IHt9OyAvLyBjbGVhciBwcmV2aW91cyBzb3VyY2VzXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gY29uZmlnLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2U7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHNvdXJjZSA9IERhdGFTb3VyY2UuY3JlYXRlKE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZy5zb3VyY2VzW25hbWVdLCB7bmFtZX0pLCBzZWxmLnNvdXJjZXMudGlsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc291cmNlLnRpbGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5zb3VyY2VzLnRpbGVzW25hbWVdID0gc291cmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRGlzdHJpYnV0ZSBvYmplY3Qgc291cmNlcyBhY3Jvc3Mgd29ya2Vyc1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaWQgJSBzZWxmLm51bV93b3JrZXJzID09PSBzZWxmLl93b3JrZXJfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBzb3VyY2UgaWYgbm90IGNhY2hlZFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnNvdXJjZXMub2JqZWN0c1tuYW1lXSA9IHNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9iamVjdHNbc291cmNlLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9iamVjdHNbc291cmNlLm5hbWVdID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubG9hZChzZWxmLm9iamVjdHNbc291cmNlLm5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIHRpbGUgY2FjaGUgaWYgZGF0YSBzb3VyY2UgY29uZmlnIGNoYW5nZWRcbiAgICAgICAgaWYgKCFzZWxmLmNvbmZpZy5zb3VyY2VzIHx8XG4gICAgICAgICAgICAhc2VsZi5sYXN0X2NvbmZpZy5zb3VyY2VzIHx8XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhzZWxmLmNvbmZpZy5zb3VyY2VzKS5zb21lKHMgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzZWxmLmNvbmZpZy5zb3VyY2VzW3NdKSAhPT0gSlNPTi5zdHJpbmdpZnkoc2VsZi5sYXN0X2NvbmZpZy5zb3VyY2VzW3NdKTtcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBzZWxmLnRpbGVzID0ge307XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aGVuIGNvbmZpZyByZWZyZXNoIGlzIGZpbmlzaGVkXG4gICAgYXdhaXRDb25maWd1cmF0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlndXJpbmc7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIGEgdGlsZTogbG9hZCBmcm9tIHRpbGUgc291cmNlIGlmIGJ1aWxkaW5nIGZvciBmaXJzdCB0aW1lLCBvdGhlcndpc2UgcmVidWlsZCB3aXRoIGV4aXN0aW5nIGRhdGFcbiAgICBidWlsZFRpbGUgKHsgdGlsZSB9KSB7XG4gICAgICAgIC8vIFRpbGUgY2FjaGVkP1xuICAgICAgICBpZiAoc2VsZi5nZXRUaWxlKHRpbGUua2V5KSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IGxvYWRpbmc/XG4gICAgICAgICAgICBpZiAoc2VsZi5nZXRUaWxlKHRpbGUua2V5KS5sb2FkaW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHRpbGUgY2FjaGVcbiAgICAgICAgdGlsZSA9IHNlbGYudGlsZXNbdGlsZS5rZXldID0gT2JqZWN0LmFzc2lnbihzZWxmLmdldFRpbGUodGlsZS5rZXkpIHx8IHt9LCB0aWxlKTtcblxuICAgICAgICAvLyBVcGRhdGUgY29uZmlnIChzdHlsZXMsIGV0Yy4pLCB0aGVuIGJ1aWxkIHRpbGVcbiAgICAgICAgcmV0dXJuIHNlbGYuYXdhaXRDb25maWd1cmF0aW9uKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBGaXJzdCB0aW1lIGJ1aWxkaW5nIHRoZSB0aWxlXG4gICAgICAgICAgICBpZiAodGlsZS5sb2FkZWQgIT09IHRydWUpIHtcblxuICAgICAgICAgICAgICAgIHRpbGUubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGlsZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aWxlLmVycm9yID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIHNlbGYubG9hZFRpbGVTb3VyY2VEYXRhKHRpbGUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZ2V0VGlsZSh0aWxlLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgc3RvcCB0aWxlIGJ1aWxkIGFmdGVyIGRhdGEgc291cmNlIGxvYWQgYmVjYXVzZSB0aWxlIHdhcyByZW1vdmVkOiAke3RpbGUua2V5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2FybiBhbmQgY29udGludWUgb24gZGF0YSBzb3VyY2UgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuc291cmNlX2RhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGB0aWxlIGxvYWQgZXJyb3IocykgZm9yICR7dGlsZS5rZXl9OiAke3RpbGUuc291cmNlX2RhdGEuZXJyb3Iuc3RhY2t9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBUaWxlLmJ1aWxkR2VvbWV0cnkodGlsZSwgc2VsZik7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmVycm9yID0gZXJyb3Iuc3RhY2s7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBgdGlsZSBsb2FkIGVycm9yIGZvciAke3RpbGUua2V5fTogJHt0aWxlLmVycm9yfWApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgZXJyb3IgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKGBUaWxlTWFuYWdlcl8ke3NlbGYuc2NlbmVfaWR9LmJ1aWxkVGlsZUVycm9yYCwgVGlsZS5zbGljZSh0aWxlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaWxlIGFscmVhZHkgbG9hZGVkLCBqdXN0IHJlYnVpbGRcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgdXNlZCB3b3JrZXIgY2FjaGUgZm9yIHRpbGUgJHt0aWxlLmtleX1gKTtcblxuICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGdlb21ldHJ5XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgVGlsZS5idWlsZEdlb21ldHJ5KHRpbGUsIHNlbGYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGVycm9yIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIHRpbGUuZXJyb3IgPSBlcnJvci50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoYFRpbGVNYW5hZ2VyXyR7c2VsZi5zY2VuZV9pZH0uYnVpbGRUaWxlRXJyb3JgLCBUaWxlLnNsaWNlKHRpbGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkIHRoaXMgdGlsZSdzIGRhdGEgc291cmNlXG4gICAgbG9hZFRpbGVTb3VyY2VEYXRhICh0aWxlKSB7XG4gICAgICAgIGlmIChzZWxmLnNvdXJjZXMudGlsZXNbdGlsZS5zb3VyY2VdKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zb3VyY2VzLnRpbGVzW3RpbGUuc291cmNlXS5sb2FkKHRpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGlsZS5zb3VyY2VfZGF0YSA9IHsgZXJyb3I6IGBEYXRhIHNvdXJjZSAnJHt0aWxlLnNvdXJjZX0nIG5vdCBmb3VuZGAgfTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGlsZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0VGlsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYudGlsZXNba2V5XTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZlIHRpbGVcbiAgICByZW1vdmVUaWxlIChrZXkpIHtcbiAgICAgICAgdmFyIHRpbGUgPSBzZWxmLnRpbGVzW2tleV07XG5cbiAgICAgICAgaWYgKHRpbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ2FuY2VsIGlmIGxvYWRpbmdcbiAgICAgICAgICAgIGlmICh0aWxlLmxvYWRpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYGNhbmNlbCB0aWxlIGxvYWQgZm9yICR7a2V5fWApO1xuICAgICAgICAgICAgICAgIHRpbGUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIFRpbGUuY2FuY2VsKHRpbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBjYWNoZVxuICAgICAgICAgICAgRmVhdHVyZVNlbGVjdGlvbi5jbGVhclRpbGUoa2V5KTtcbiAgICAgICAgICAgIGRlbGV0ZSBzZWxmLnRpbGVzW2tleV07XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYHJlbW92ZSB0aWxlIGZyb20gY2FjaGUgZm9yICR7a2V5fWApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEdldCBhIGZlYXR1cmUgZnJvbSB0aGUgc2VsZWN0aW9uIG1hcFxuICAgIGdldEZlYXR1cmVTZWxlY3Rpb24gKHsgaWQsIGtleSB9ID0ge30pIHtcbiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IEZlYXR1cmVTZWxlY3Rpb24ubWFwW2tleV07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIGZlYXR1cmU6IChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmZlYXR1cmUpXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8vIFJlc2V0cyB0aGUgZmVhdHVyZSBzZWxlY3Rpb24gc3RhdGVcbiAgICByZXNldEZlYXR1cmVTZWxlY3Rpb24gKCkge1xuICAgICAgICBGZWF0dXJlU2VsZWN0aW9uLnJlc2V0KCk7XG4gICAgfSxcblxuICAgIC8vIFNlbGVjdGlvbiBtYXAgc2l6ZSBmb3IgdGhpcyB3b3JrZXJcbiAgICBnZXRGZWF0dXJlU2VsZWN0aW9uTWFwU2l6ZSAoKSB7XG4gICAgICAgIHJldHVybiBGZWF0dXJlU2VsZWN0aW9uLmdldE1hcFNpemUoKTtcbiAgICB9LFxuXG4gICAgLy8gVGV4dHVyZSBpbmZvIG5lZWRzIHRvIGJlIHN5bmNlZCBmcm9tIG1haW4gdGhyZWFkLCBlLmcuIHdpZHRoL2hlaWdodCwgd2hpY2ggd2Ugb25seSBrbm93IGFmdGVyIHRoZSB0ZXh0dXJlIGxvYWRzXG4gICAgc3luY1RleHR1cmVzICh0ZXhfY29uZmlnKSB7XG4gICAgICAgIGxldCB0ZXh0dXJlcyA9IFtdO1xuICAgICAgICBpZiAodGV4X2NvbmZpZykge1xuICAgICAgICAgICAgdGV4dHVyZXMucHVzaCguLi5PYmplY3Qua2V5cyh0ZXhfY29uZmlnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2coJ3RyYWNlJywgJ3N5bmMgdGV4dHVyZXMgdG8gd29ya2VyOicsIHRleHR1cmVzKTtcbiAgICAgICAgaWYgKHRleHR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnN5bmNUZXh0dXJlc1RvV29ya2VyKHRleHR1cmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfSxcblxuICAgIC8vIFN5bmMgZGV2aWNlIHBpeGVsIHJhdGlvIGZyb20gbWFpbiB0aHJlYWRcbiAgICB1cGRhdGVEZXZpY2VQaXhlbFJhdGlvIChkZXZpY2VfcGl4ZWxfcmF0aW8pIHtcbiAgICAgICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvID0gZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgIH0sXG5cbiAgICAvLyBQcm9maWxpbmcgaGVscGVyc1xuICAgIHByb2ZpbGUgKG5hbWUpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlKGB3b3JrZXIgJHtzZWxmLl93b3JrZXJfaWR9OiAke25hbWV9YCk7XG4gICAgfSxcblxuICAgIHByb2ZpbGVFbmQgKG5hbWUpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlRW5kKGB3b3JrZXIgJHtzZWxmLl93b3JrZXJfaWR9OiAke25hbWV9YCk7XG4gICAgfVxuXG59KTtcblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnc2VsZicsIHNlbGYpO1xuXG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZlYXR1cmVTZWxlY3Rpb24ge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIHdvcmtlcnMpIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLndvcmtlcnMgPSB3b3JrZXJzOyAvLyBwb29sIG9mIHdvcmtlcnMgdG8gcmVxdWVzdCBmZWF0dXJlIGxvb2stdXBzIGZyb20sIGtleWVkIGJ5IGlkXG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIC8vIFNlbGVjdGlvbiBzdGF0ZSB0cmFja2luZ1xuICAgICAgICB0aGlzLnJlcXVlc3RzID0ge307IC8vIHBlbmRpbmcgc2VsZWN0aW9uIHJlcXVlc3RzXG4gICAgICAgIHRoaXMuZmVhdHVyZSA9IG51bGw7IC8vIGN1cnJlbnRseSBzZWxlY3RlZCBmZWF0dXJlXG4gICAgICAgIHRoaXMucmVhZF9kZWxheSA9IDU7IC8vIGRlbGF5IHRpbWUgZnJvbSBzZWxlY3Rpb24gcmVuZGVyIHRvIGZyYW1lYnVmZmVyIHNhbXBsZSwgdG8gYXZvaWQgQ1BVL0dQVSBzeW5jIGxvY2tcbiAgICAgICAgdGhpcy5yZWFkX2RlbGF5X3RpbWVyID0gbnVsbDsgLy8gY3VycmVudCB0aW1lciAoc2V0VGltZW91dCkgZm9yIGRlbGF5ZWQgc2VsZWN0aW9uIHJlYWRzXG5cbiAgICAgICAgdGhpcy5waXhlbCA9IG5ldyBVaW50OEFycmF5KDQpO1xuICAgICAgICB0aGlzLnBpeGVsMzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMucGl4ZWwuYnVmZmVyKTtcblxuICAgICAgICAvLyBGcmFtZSBidWZmZXIgZm9yIHNlbGVjdGlvblxuICAgICAgICAvLyBUT0RPOiBpbml0aWF0ZSBsYXppbHkgaW4gY2FzZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueSBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5mYm8gPSB0aGlzLmdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG4gICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZmJvKTtcbiAgICAgICAgdGhpcy5mYm9fc2l6ZSA9IHsgd2lkdGg6IDI1NiwgaGVpZ2h0OiAyNTYgfTsgLy8gVE9ETzogbWFrZSBjb25maWd1cmFibGUgLyBhZGFwdGl2ZSBiYXNlZCBvbiBjYW52YXMgc2l6ZVxuICAgICAgICB0aGlzLmZib19zaXplLmFzcGVjdCA9IHRoaXMuZmJvX3NpemUud2lkdGggLyB0aGlzLmZib19zaXplLmhlaWdodDtcblxuICAgICAgICAvLyBUZXh0dXJlIGZvciB0aGUgRkJPIGNvbG9yIGF0dGFjaG1lbnRcbiAgICAgICAgdmFyIGZib190ZXh0dXJlID0gVGV4dHVyZS5jcmVhdGUoIHRoaXMuZ2wsICdzZWxlY3Rpb25fZmJvJywgeyBmaWx0ZXJpbmc6ICduZWFyZXN0JyB9KTtcbiAgICAgICAgZmJvX3RleHR1cmUuc2V0RGF0YSh0aGlzLmZib19zaXplLndpZHRoLCB0aGlzLmZib19zaXplLmhlaWdodCwgbnVsbCwgeyBmaWx0ZXJpbmc6ICduZWFyZXN0JyB9KTtcbiAgICAgICAgdGhpcy5nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCh0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmdsLkNPTE9SX0FUVEFDSE1FTlQwLCB0aGlzLmdsLlRFWFRVUkVfMkQsIGZib190ZXh0dXJlLnRleHR1cmUsIDApO1xuXG4gICAgICAgIC8vIFJlbmRlcmJ1ZmZlciBmb3IgdGhlIEZCTyBkZXB0aCBhdHRhY2htZW50XG4gICAgICAgIHZhciBmYm9fZGVwdGhfcmIgPSB0aGlzLmdsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmdsLmJpbmRSZW5kZXJidWZmZXIodGhpcy5nbC5SRU5ERVJCVUZGRVIsIGZib19kZXB0aF9yYik7XG4gICAgICAgIHRoaXMuZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSh0aGlzLmdsLlJFTkRFUkJVRkZFUiwgdGhpcy5nbC5ERVBUSF9DT01QT05FTlQxNiwgdGhpcy5mYm9fc2l6ZS53aWR0aCwgdGhpcy5mYm9fc2l6ZS5oZWlnaHQpO1xuICAgICAgICB0aGlzLmdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZ2wuREVQVEhfQVRUQUNITUVOVCwgdGhpcy5nbC5SRU5ERVJCVUZGRVIsIGZib19kZXB0aF9yYik7XG5cbiAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2wgJiYgdGhpcy5mYm8pIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5mYm8pO1xuICAgICAgICAgICAgdGhpcy5mYm8gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBmcmVlIHRleHR1cmU/XG4gICAgfVxuXG4gICAgYmluZCgpIHtcbiAgICAgICAgLy8gU3dpdGNoIHRvIEZCT1xuICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmZibyk7XG4gICAgICAgIHRoaXMuZ2wudmlld3BvcnQoMCwgMCwgdGhpcy5mYm9fc2l6ZS53aWR0aCwgdGhpcy5mYm9fc2l6ZS5oZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAvLyBSdW5zIGFzeW5jaHJvbm91c2x5LCBzY2hlZHVsZXMgc2VsZWN0aW9uIGJ1ZmZlciB0byBiZSB1cGRhdGVkXG4gICAgZ2V0RmVhdHVyZUF0KHBvaW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBRdWV1ZSByZXF1ZXN0cyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24sIGFuZCB0aGV5IHdpbGwgYmUgcGlja2VkIHVwIGJ5IHRoZSByZW5kZXIgbG9vcFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZCA9ICh0aGlzLnNlbGVjdGlvbl9yZXF1ZXN0X2lkICsgMSkgfHwgMDtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdHNbdGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZF0gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3BvaW50JyxcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZCxcbiAgICAgICAgICAgICAgICBwb2ludCxcbiAgICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQW55IHBlbmRpbmcgc2VsZWN0aW9uIHJlcXVlc3RzXG4gICAgcGVuZGluZ1JlcXVlc3RzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0cztcbiAgICB9XG5cbiAgICBjbGVhclBlbmRpbmdSZXF1ZXN0cygpIHtcbiAgICAgICAgZm9yICh2YXIgciBpbiB0aGlzLnJlcXVlc3RzKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IHRoaXMucmVxdWVzdHNbcl07XG5cbiAgICAgICAgICAgIC8vIFRoaXMgcmVxdWVzdCB3YXMgYWxyZWFkeSBzZW50IHRvIHRoZSB3b3JrZXIsIHdlJ3JlIGp1c3QgYXdhaXRpbmcgaXRzIHJlcGx5XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5zZW50KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlamVjdCByZXF1ZXN0IHNpbmNlIGl0IHdpbGwgbmV2ZXIgYmUgZnVsZmlsbGVkXG4gICAgICAgICAgICAvLyBUT0RPOiBwYXNzIGEgcmVhc29uIGZvciByZWplY3Rpb24/XG4gICAgICAgICAgICByZXF1ZXN0LnJlamVjdCh7IHJlcXVlc3QgfSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5yZXF1ZXN0c1tyXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlYWQgcGVuZGluZyByZXN1bHRzIGZyb20gdGhlIHNlbGVjdGlvbiBidWZmZXIuIENhbGxlZCBhZnRlciByZW5kZXJpbmcgdG8gc2VsZWN0aW9uIGJ1ZmZlci5cbiAgICByZWFkKCkge1xuICAgICAgICAvLyBEZWxheSByZWFkaW5nIHRoZSBwaXhlbCByZXN1bHQgZnJvbSB0aGUgc2VsZWN0aW9uIGJ1ZmZlciB0byBhdm9pZCBDUFUvR1BVIHN5bmMgbG9jay5cbiAgICAgICAgLy8gQ2FsbGluZyByZWFkUGl4ZWxzIHN5bmNocm9ub3VzbHkgY2F1c2VkIGEgbWFzc2l2ZSBwZXJmb3JtYW5jZSBoaXQsIHByZXN1bWFibHkgc2luY2UgaXRcbiAgICAgICAgLy8gZm9yY2VkIHRoaXMgZnVuY3Rpb24gdG8gd2FpdCBmb3IgdGhlIEdQVSB0byBmaW5pc2ggcmVuZGVyaW5nIGFuZCByZXRyaWV2ZSB0aGUgdGV4dHVyZSBjb250ZW50cy5cbiAgICAgICAgaWYgKHRoaXMucmVhZF9kZWxheV90aW1lciAhPSBudWxsKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWFkX2RlbGF5X3RpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWRfZGVsYXlfdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgdGhpcy5mYm8pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciByIGluIHRoaXMucmVxdWVzdHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVxdWVzdCA9IHRoaXMucmVxdWVzdHNbcl07XG5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIHJlcXVlc3Qgd2FzIGFscmVhZHkgc2VudCB0byB0aGUgd29ya2VyLCB3ZSdyZSBqdXN0IGF3YWl0aW5nIGl0cyByZXBseVxuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnNlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBvdGhlciBzZWxlY3Rpb24gdHlwZXMsIHN1Y2ggYXMgZmVhdHVyZXMgd2l0aGluIGEgYm94XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QudHlwZSAhPT0gJ3BvaW50Jykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBzZWxlY3Rpb24gbWFwIGFnYWluc3QgRkJPXG4gICAgICAgICAgICAgICAgZ2wucmVhZFBpeGVscyhcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihyZXF1ZXN0LnBvaW50LnggKiB0aGlzLmZib19zaXplLndpZHRoKSxcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcigoMSAtIHJlcXVlc3QucG9pbnQueSkgKiB0aGlzLmZib19zaXplLmhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIDEsIDEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMucGl4ZWwpO1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlX2tleSA9ICh0aGlzLnBpeGVsWzBdICsgKHRoaXMucGl4ZWxbMV0gPDwgOCkgKyAodGhpcy5waXhlbFsyXSA8PCAxNikgKyAodGhpcy5waXhlbFszXSA8PCAyNCkpID4+PiAwO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgZmVhdHVyZSBmb3VuZCwgYXNrIGFwcHJvcHJpYXRlIHdlYiB3b3JrZXIgdG8gbG9va3VwIGZlYXR1cmVcbiAgICAgICAgICAgICAgICB2YXIgd29ya2VyX2lkID0gdGhpcy5waXhlbFszXTtcbiAgICAgICAgICAgICAgICBpZiAod29ya2VyX2lkICE9PSAyNTUpIHsgLy8gMjU1IGluZGljYXRlcyBhbiBlbXB0eSBzZWxlY3Rpb24gYnVmZmVyIHBpeGVsXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLndvcmtlcnNbd29ya2VyX2lkXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZXJzW3dvcmtlcl9pZF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbGYuZ2V0RmVhdHVyZVNlbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogcmVxdWVzdC5pZCwga2V5OiBmZWF0dXJlX2tleSB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4obWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5pc2hSZWFkKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTm8gZmVhdHVyZSBmb3VuZCwgYnV0IHN0aWxsIG5lZWQgdG8gcmVzb2x2ZSBwcm9taXNlXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoUmVhZCh7IGlkOiByZXF1ZXN0LmlkLCBmZWF0dXJlOiBudWxsIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VudCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG5cbiAgICAgICAgfSwgdGhpcy5yZWFkX2RlbGF5KTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWQgd2hlbiBhIHdlYiB3b3JrZXIgZmluZHMgYSBmZWF0dXJlIGluIHRoZSBzZWxlY3Rpb24gYnVmZmVyXG4gICAgZmluaXNoUmVhZCAobWVzc2FnZSkge1xuICAgICAgICB2YXIgcmVxdWVzdCA9IHRoaXMucmVxdWVzdHNbbWVzc2FnZS5pZF07XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIFwiRmVhdHVyZVNlbGVjdGlvbi5maW5pc2hSZWFkKCk6IGNvdWxkIG5vdCBmaW5kIG1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47IC8vIHJlcXVlc3Qgd2FzIGNsZWFyZWQgYmVmb3JlIGl0IHJldHVybmVkXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmVhdHVyZSA9IG1lc3NhZ2UuZmVhdHVyZTtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKChmZWF0dXJlICE9IG51bGwgJiYgdGhpcy5mZWF0dXJlID09IG51bGwpIHx8XG4gICAgICAgICAgICAoZmVhdHVyZSA9PSBudWxsICYmIHRoaXMuZmVhdHVyZSAhPSBudWxsKSB8fFxuICAgICAgICAgICAgKGZlYXR1cmUgIT0gbnVsbCAmJiB0aGlzLmZlYXR1cmUgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmZlYXR1cmUpKSkge1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOyAvLyBzdG9yZSB0aGUgbW9zdCByZWNlbnRseSBzZWxlY3RlZCBmZWF0dXJlXG5cbiAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcmVxdWVzdFxuICAgICAgICByZXF1ZXN0LnJlc29sdmUoeyBmZWF0dXJlLCBjaGFuZ2VkLCByZXF1ZXN0IH0pO1xuICAgICAgICBkZWxldGUgdGhpcy5yZXF1ZXN0c1ttZXNzYWdlLmlkXTsgLy8gZG9uZSBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdFxuICAgIH1cblxuXG4gICAgLy8gU2VsZWN0aW9uIG1hcCBnZW5lcmF0aW9uXG4gICAgLy8gRWFjaCB3b3JrZXIgd2lsbCBjcmVhdGUgaXRzIG93biBpbmRlcGVuZGVudCwgJ2xvY2FsJyBzZWxlY3Rpb24gbWFwXG5cbiAgICAvLyBDcmVhdGUgYSB1bmlxdWUgMzItYml0IGNvbG9yIHRvIGlkZW50aWZ5IGEgZmVhdHVyZVxuICAgIC8vIFdvcmtlcnMgaW5kZXBlbmRlbnRseSBjcmVhdGUvbW9kaWZ5IHNlbGVjdGlvbiBjb2xvcnMgaW4gdGhlaXIgb3duIHRocmVhZHMsIGJ1dCB3ZSBhbHNvXG4gICAgLy8gbmVlZCB0aGUgbWFpbiB0aHJlYWQgdG8ga25vdyB3aGVyZSBlYWNoIGZlYXR1cmUgY29sb3Igb3JpZ2luYXRlZC4gVG8gYWNjb21wbGlzaCB0aGlzLFxuICAgIC8vIHdlIHBhcnRpdGlvbiB0aGUgbWFwIGJ5IHNldHRpbmcgdGhlIDR0aCBjb21wb25lbnQgKGFscGhhIGNoYW5uZWwpIHRvIHRoZSB3b3JrZXIncyBpZC5cbiAgICBzdGF0aWMgbWFrZUVudHJ5KHRpbGUpIHtcbiAgICAgICAgLy8gMzItYml0IGNvbG9yIGtleVxuICAgICAgICB0aGlzLm1hcF9lbnRyeSsrO1xuICAgICAgICB2YXIgaXIgPSB0aGlzLm1hcF9lbnRyeSAmIDI1NTtcbiAgICAgICAgdmFyIGlnID0gKHRoaXMubWFwX2VudHJ5ID4+IDgpICYgMjU1O1xuICAgICAgICB2YXIgaWIgPSAodGhpcy5tYXBfZW50cnkgPj4gMTYpICYgMjU1O1xuICAgICAgICB2YXIgaWEgPSB0aGlzLm1hcF9wcmVmaXg7XG4gICAgICAgIHZhciByID0gaXIgLyAyNTU7XG4gICAgICAgIHZhciBnID0gaWcgLyAyNTU7XG4gICAgICAgIHZhciBiID0gaWIgLyAyNTU7XG4gICAgICAgIHZhciBhID0gaWEgLyAyNTU7XG4gICAgICAgIHZhciBrZXkgPSAoaXIgKyAoaWcgPDwgOCkgKyAoaWIgPDwgMTYpICsgKGlhIDw8IDI0KSkgPj4+IDA7IC8vIG5lZWQgdW5zaWduZWQgcmlnaHQgc2hpZnQgdG8gY29udmVydCB0byBwb3NpdGl2ZSAjXG5cbiAgICAgICAgdGhpcy5tYXBba2V5XSA9IHtcbiAgICAgICAgICAgIGNvbG9yOiBbciwgZywgYiwgYV0sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubWFwX3NpemUrKztcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRpbGUtc3BlY2lmaWMgdHJhY2tpbmcgaW5mb1xuICAgICAgICBpZiAoIXRoaXMudGlsZXNbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVzW3RpbGUua2V5XSA9IHtcbiAgICAgICAgICAgICAgICBlbnRyaWVzOiBbXSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb2YgZmVhdHVyZSBlbnRyaWVzIGluIHRoaXMgdGhyZWFkXG4gICAgICAgICAgICAgICAgdGlsZTogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3Vic2V0IG9mIHRpbGUgcHJvcGVydGllcyB0byBwYXNzIGJhY2sgd2l0aCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgICAgIGtleTogdGlsZS5rZXksXG4gICAgICAgICAgICAgICAgICAgIGNvb3JkczogdGlsZS5jb29yZHMsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlX3pvb206IHRpbGUuc3R5bGVfem9vbSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aWxlLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbjogdGlsZS5nZW5lcmF0aW9uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGlsZXNbdGlsZS5rZXldLmVudHJpZXMucHVzaChrZXkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLm1hcFtrZXldO1xuICAgIH1cblxuICAgIHN0YXRpYyBtYWtlQ29sb3IoZmVhdHVyZSwgdGlsZSwgY29udGV4dCkge1xuICAgICAgICB2YXIgc2VsZWN0b3IgPSB0aGlzLm1ha2VFbnRyeSh0aWxlKTtcbiAgICAgICAgc2VsZWN0b3IuZmVhdHVyZSA9IHtcbiAgICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgc291cmNlX25hbWU6IGNvbnRleHQuc291cmNlLFxuICAgICAgICAgICAgc291cmNlX2xheWVyOiBjb250ZXh0LmxheWVyLFxuICAgICAgICAgICAgbGF5ZXJzOiBjb250ZXh0LmxheWVycyxcbiAgICAgICAgICAgIHRpbGU6IHRoaXMudGlsZXNbdGlsZS5rZXldLnRpbGVcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc2VsZWN0b3IuY29sb3I7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnRpbGVzID0ge307XG4gICAgICAgIHRoaXMubWFwID0ge307XG4gICAgICAgIHRoaXMubWFwX3NpemUgPSAwO1xuICAgICAgICB0aGlzLm1hcF9lbnRyeSA9IDA7XG4gICAgfVxuXG4gICAgc3RhdGljIGNsZWFyVGlsZShrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMudGlsZXNba2V5XSkge1xuICAgICAgICAgICAgdGhpcy50aWxlc1trZXldLmVudHJpZXMuZm9yRWFjaChrID0+IGRlbGV0ZSB0aGlzLm1hcFtrXSk7XG4gICAgICAgICAgICB0aGlzLm1hcF9zaXplIC09IHRoaXMudGlsZXNba2V5XS5lbnRyaWVzLmxlbmd0aDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0TWFwU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwX3NpemU7XG4gICAgfVxuXG4gICAgc3RhdGljIHNldFByZWZpeChwcmVmaXgpIHtcbiAgICAgICAgdGhpcy5tYXBfcHJlZml4ID0gcHJlZml4O1xuICAgIH1cblxufVxuXG4vLyBTdGF0aWMgcHJvcGVydGllc1xuRmVhdHVyZVNlbGVjdGlvbi5tYXAgPSB7fTsgICAvLyB0aGlzIHdpbGwgYmUgdW5pcXVlIHBlciBtb2R1bGUgaW5zdGFuY2UgKHNvIHVuaXF1ZSBwZXIgd29ya2VyKVxuRmVhdHVyZVNlbGVjdGlvbi50aWxlcyA9IHt9OyAvLyBzZWxlY3Rpb24ga2V5cywgYnkgdGlsZVxuRmVhdHVyZVNlbGVjdGlvbi5tYXBfc2l6ZSA9IDA7XG5GZWF0dXJlU2VsZWN0aW9uLm1hcF9lbnRyeSA9IDA7XG5GZWF0dXJlU2VsZWN0aW9uLm1hcF9wcmVmaXggPSAwOyAvLyBzZXQgYnkgd29ya2VyIHRvIHdvcmtlciBpZCAjXG5GZWF0dXJlU2VsZWN0aW9uLmRlZmF1bHRDb2xvciA9IFswLCAwLCAwLCAxXTtcbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSAqL1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IHtNZXRob2ROb3RJbXBsZW1lbnRlZH0gZnJvbSAnLi4vdXRpbHMvZXJyb3JzJztcbmltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgKiBhcyBVUkxzIGZyb20gJy4uL3V0aWxzL3VybHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChjb25maWcsIHNvdXJjZXMpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7IC8vIHNhdmUgb3JpZ2luYWwgY29uZmlnXG4gICAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7IC8vIGZ1bGwgc2V0IG9mIGRhdGEgc291cmNlcyBUT0RPOiBjZW50cmFsaXplIHRoZXNlIGxpa2UgdGV4dHVyZXM/XG4gICAgICAgIHRoaXMuaWQgPSBjb25maWcuaWQ7XG4gICAgICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgICAgICB0aGlzLnBhZF9zY2FsZSA9IGNvbmZpZy5wYWRfc2NhbGUgfHwgMC4wMDAxOyAvLyBzY2FsZSB0aWxlIHVwIGJ5IHNtYWxsIGZhY3RvciB0byBjb3ZlciBzZWFtc1xuICAgICAgICB0aGlzLmRlZmF1bHRfd2luZGluZyA9IG51bGw7IC8vIHdpbmRpbmcgb3JkZXIgd2lsbCBhZGFwdCB0byBkYXRhIHNvdXJjZVxuICAgICAgICB0aGlzLnJhc3RlcnMgPSBbXTsgLy8gYXR0YWNoZWQgcmFzdGVyIHRpbGUgc291cmNlc1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcucmFzdGVycykpIHsgLy8gY29weSB1bmlxdWUgc2V0IG9mIHJhc3RlciBzb3VyY2VzXG4gICAgICAgICAgICBjb25maWcucmFzdGVycy5mb3JFYWNoKHIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJhc3RlcnMuaW5kZXhPZihyKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yYXN0ZXJzLnB1c2gocik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gc291cmNlIGRhdGFcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSBjb25maWcudHJhbnNmb3JtO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5iaW5kKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBkYXRhIHRvIHBhc3MgdG8gdGhlIHRyYW5zZm9ybSBmdW5jdGlvblxuICAgICAgICB0aGlzLmV4dHJhX2RhdGEgPSBjb25maWcuZXh0cmFfZGF0YTtcblxuICAgICAgICAvLyBPcHRpb25hbCBhZGRpdGlvbmFsIHNjcmlwdHMgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHRyYW5zZm9ybSBmdW5jdGlvblxuICAgICAgICAvLyBOT1RFOiB0aGVzZSBhcmUgbG9hZGVkIGFsb25nc2lkZSB0aGUgbGlicmFyeSB3aGVuIHRoZSB3b3JrZXJzIGFyZSBpbnN0YW50aWF0ZWRcbiAgICAgICAgdGhpcy5zY3JpcHRzID0gY29uZmlnLnNjcmlwdHM7XG5cbiAgICAgICAgLy8gb3Zlcnpvb20gd2lsbCBhcHBseSBmb3Igem9vbXMgaGlnaGVyIHRoYW4gdGhpc1xuICAgICAgICB0aGlzLm1heF96b29tID0gKGNvbmZpZy5tYXhfem9vbSAhPSBudWxsKSA/IGNvbmZpZy5tYXhfem9vbSA6IEdlby5kZWZhdWx0X3NvdXJjZV9tYXhfem9vbTtcblxuICAgICAgICAvLyBubyB0aWxlcyB3aWxsIGJlIHJlcXVlc3RlZCBvciBkaXNwbGF5ZWQgb3V0c2lkZSBvZiB0aGVzZSBtaW4vbWF4IHZhbHVlc1xuICAgICAgICB0aGlzLm1pbl9kaXNwbGF5X3pvb20gPSAoY29uZmlnLm1pbl9kaXNwbGF5X3pvb20gIT0gbnVsbCkgPyBjb25maWcubWluX2Rpc3BsYXlfem9vbSA6IDA7XG4gICAgICAgIHRoaXMubWF4X2Rpc3BsYXlfem9vbSA9IChjb25maWcubWF4X2Rpc3BsYXlfem9vbSAhPSBudWxsKSA/IGNvbmZpZy5tYXhfZGlzcGxheV96b29tIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSB0aWxlIHNvdXJjZSBieSB0eXBlLCBmYWN0b3J5LXN0eWxlXG4gICAgc3RhdGljIGNyZWF0ZSAoc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIGlmIChEYXRhU291cmNlLnR5cGVzW3NvdXJjZS50eXBlXSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlLnR5cGVzW3NvdXJjZS50eXBlXShzb3VyY2UsIHNvdXJjZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYSBkYXRhIHNvdXJjZSBkZWZpbml0aW9uIGNoYW5nZWRcbiAgICBzdGF0aWMgY2hhbmdlZCAoc291cmNlLCBwcmV2X3NvdXJjZSkge1xuICAgICAgICBpZiAoIXNvdXJjZSB8fCAhcHJldl9zb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1ciA9IE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZS5jb25maWcsIHsgaWQ6IG51bGwgfSk7IC8vIG51bGwgb3V0IGlkcyBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGNvbXBhcmUgdGhlbVxuICAgICAgICBsZXQgcHJldiA9IE9iamVjdC5hc3NpZ24oe30sIHByZXZfc291cmNlLmNvbmZpZywgeyBpZDogbnVsbCB9KTtcblxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY3VyKSAhPT0gSlNPTi5zdHJpbmdpZnkocHJldik7XG4gICAgfVxuXG4gICAgLy8gTWVyY2F0b3IgcHJvamVjdGlvblxuICAgIHN0YXRpYyBwcm9qZWN0RGF0YSAoc291cmNlKSB7XG4gICAgICAgIHZhciB0aW1lciA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICBmb3IgKHZhciB0IGluIHNvdXJjZS5sYXllcnMpIHtcbiAgICAgICAgICAgIHZhciBudW1fZmVhdHVyZXMgPSBzb3VyY2UubGF5ZXJzW3RdLmZlYXR1cmVzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAodmFyIGY9MDsgZiA8IG51bV9mZWF0dXJlczsgZisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmUgPSBzb3VyY2UubGF5ZXJzW3RdLmZlYXR1cmVzW2ZdO1xuICAgICAgICAgICAgICAgIEdlby50cmFuc2Zvcm1HZW9tZXRyeShmZWF0dXJlLmdlb21ldHJ5LCBjb29yZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBbeCwgeV0gPSBHZW8ubGF0TG5nVG9NZXRlcnMoY29vcmQpO1xuICAgICAgICAgICAgICAgICAgICBjb29yZFswXSA9IHg7XG4gICAgICAgICAgICAgICAgICAgIGNvb3JkWzFdID0geTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzb3VyY2UuZGVidWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc291cmNlLmRlYnVnLnByb2plY3Rpb24gPSArbmV3IERhdGUoKSAtIHRpbWVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgIFJlLXNjYWxlIGdlb21ldHJpZXMgd2l0aGluIGVhY2ggc291cmNlIHRvIGludGVybmFsIHRpbGUgdW5pdHNcbiAgICAqL1xuICAgIHN0YXRpYyBzY2FsZURhdGEgKHNvdXJjZSwge2Nvb3Jkczoge3p9LCBtaW4sIG1heH0pIHtcbiAgICAgICAgbGV0IHVuaXRzX3Blcl9tZXRlciA9IEdlby51bml0c1Blck1ldGVyKHopO1xuICAgICAgICBmb3IgKHZhciB0IGluIHNvdXJjZS5sYXllcnMpIHtcbiAgICAgICAgICAgIHZhciBudW1fZmVhdHVyZXMgPSBzb3VyY2UubGF5ZXJzW3RdLmZlYXR1cmVzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAodmFyIGY9MDsgZiA8IG51bV9mZWF0dXJlczsgZisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmUgPSBzb3VyY2UubGF5ZXJzW3RdLmZlYXR1cmVzW2ZdO1xuICAgICAgICAgICAgICAgIEdlby50cmFuc2Zvcm1HZW9tZXRyeShmZWF0dXJlLmdlb21ldHJ5LCBjb29yZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvb3JkWzBdID0gKGNvb3JkWzBdIC0gbWluLngpICogdW5pdHNfcGVyX21ldGVyO1xuICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IChjb29yZFsxXSAtIG1pbi55KSAqIHVuaXRzX3Blcl9tZXRlciAqIC0xOyAvLyBmbGlwIGNvb3JkcyBwb3NpdGl2ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZChkZXN0KSB7XG4gICAgICAgIGRlc3Quc291cmNlX2RhdGEgPSB7fTtcbiAgICAgICAgZGVzdC5zb3VyY2VfZGF0YS5sYXllcnMgPSB7fTtcbiAgICAgICAgZGVzdC5wYWRfc2NhbGUgPSB0aGlzLnBhZF9zY2FsZTtcbiAgICAgICAgZGVzdC5yYXN0ZXJzID0gWy4uLnRoaXMucmFzdGVyc107IC8vIGNvcHkgbGlzdCBvZiByYXN0ZXJzIHRvIGxvYWQgZm9yIHRpbGVcblxuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZChkZXN0KS50aGVuKChkZXN0KSA9PiB7XG4gICAgICAgICAgICAvLyBQb3N0LXByb2Nlc3NpbmdcbiAgICAgICAgICAgIGZvciAobGV0IGxheWVyIGluIGRlc3Quc291cmNlX2RhdGEubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBkZXN0LnNvdXJjZV9kYXRhLmxheWVyc1tsYXllcl07XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5mZWF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmZlYXR1cmVzLmZvckVhY2goZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsaXAgWSBjb29yZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IC1jb29yZFsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNsaWdodGx5IHNjYWxlIHVwIHRpbGUgdG8gY292ZXIgc2VhbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYWRfc2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRbMF0gPSBNYXRoLnJvdW5kKGNvb3JkWzBdICogKDEgKyB0aGlzLnBhZF9zY2FsZSkgLSAoR2VvLnRpbGVfc2NhbGUgKiB0aGlzLnBhZF9zY2FsZS8yKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWzFdID0gTWF0aC5yb3VuZChjb29yZFsxXSAqICgxICsgdGhpcy5wYWRfc2NhbGUpIC0gKEdlby50aWxlX3NjYWxlICogdGhpcy5wYWRfc2NhbGUvMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgZmlyc3QgZW5jb3VudGVyZWQgcG9seWdvbiB3aW5kaW5nIG9yZGVyIGFzIGRlZmF1bHQgZm9yIGRhdGEgc291cmNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURlZmF1bHRXaW5kaW5nKGZlYXR1cmUuZ2VvbWV0cnkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlc3QuZGVmYXVsdF93aW5kaW5nID0gdGhpcy5kZWZhdWx0X3dpbmRpbmcgfHwgJ0NDVyc7XG4gICAgICAgICAgICByZXR1cm4gZGVzdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3ViLWNsYXNzZXMgbXVzdCBpbXBsZW1lbnRcbiAgICBfbG9hZChkZXN0KSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZCgnX2xvYWQnKTtcbiAgICB9XG5cbiAgICAvLyBJbmZlciB3aW5kaW5nIGZvciBkYXRhIHNvdXJjZSBmcm9tIGZpcnN0IHJpbmcgb2YgcHJvdmlkZWQgZ2VvbWV0cnlcbiAgICB1cGRhdGVEZWZhdWx0V2luZGluZyAoZ2VvbSkge1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0X3dpbmRpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGdlb20udHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0X3dpbmRpbmcgPSBHZW8ucmluZ1dpbmRpbmcoZ2VvbS5jb29yZGluYXRlc1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChnZW9tLnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0X3dpbmRpbmcgPSBHZW8ucmluZ1dpbmRpbmcoZ2VvbS5jb29yZGluYXRlc1swXVswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdF93aW5kaW5nO1xuICAgIH1cblxuICAgIC8vIEFsbCBkYXRhIHNvdXJjZXMgc3VwcG9ydCBhIG1pbiB6b29tLCB0aWxlZCBzb3VyY2VzIGNhbiBzdWJjbGFzcyBmb3IgbW9yZSBzcGVjaWZpYyBsaW1pdHMgKGUuZy4gYm91bmRpbmcgYm94KVxuICAgIGluY2x1ZGVzVGlsZSAoY29vcmRzLCBzdHlsZV96b29tKSB7XG4gICAgICAgIC8vIExpbWl0IGJ5IHRoaXMgZGF0YSBzb3VyY2VcbiAgICAgICAgaWYgKGNvb3Jkcy56IDwgdGhpcy5taW5fZGlzcGxheV96b29tIHx8ICh0aGlzLm1heF9kaXNwbGF5X3pvb20gIT0gbnVsbCAmJiBzdHlsZV96b29tID4gdGhpcy5tYXhfZGlzcGxheV96b29tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGltaXQgYnkgYW55IGRlcGVuZGVudCByYXN0ZXIgc291cmNlc1xuICAgICAgICBmb3IgKGxldCByPTA7IHIgPCB0aGlzLnJhc3RlcnMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZV9uYW1lID0gdGhpcy5yYXN0ZXJzW3JdO1xuICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlc1tzb3VyY2VfbmFtZV0gJiZcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZXNbc291cmNlX25hbWVdICE9PSB0aGlzICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuc291cmNlc1tzb3VyY2VfbmFtZV0uaW5jbHVkZXNUaWxlKGNvb3JkcywgY29vcmRzLnopKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgYSBuZXcgZGF0YSBzb3VyY2UgdHlwZSwgdW5kZXIgYSB0eXBlIG5hbWVcbiAgICBzdGF0aWMgcmVnaXN0ZXIodHlwZV9jbGFzcywgdHlwZV9uYW1lKSB7XG4gICAgICAgIGlmICghdHlwZV9jbGFzcyB8fCAhdHlwZV9uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBEYXRhU291cmNlLnR5cGVzW3R5cGVfbmFtZV0gPSB0eXBlX2NsYXNzO1xuICAgIH1cblxufVxuXG5EYXRhU291cmNlLnR5cGVzID0ge307IC8vIHNldCBvZiBzdXBwb3J0ZWQgZGF0YSBzb3VyY2UgY2xhc3NlcywgcmVmZXJlbmNlZCBieSB0eXBlIG5hbWVcblxuXG4vKioqIEdlbmVyaWMgbmV0d29yayBsb2FkaW5nIHNvdXJjZSAtIGFic3RyYWN0IGNsYXNzICoqKi9cblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtTb3VyY2UgZXh0ZW5kcyBEYXRhU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgdGhpcy51cmwgPSBVUkxzLmFkZFBhcmFtc1RvVVJMKHNvdXJjZS51cmwsIHNvdXJjZS51cmxfcGFyYW1zKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZV90eXBlID0gXCJcIjsgLy8gdXNlIHRvIHNldCBleHBsaWNpdCBYSFIgdHlwZVxuXG4gICAgICAgIGlmICh0aGlzLnVybCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTmV0d29yayBkYXRhIHNvdXJjZSBtdXN0IHByb3ZpZGUgYSBgdXJsYCBwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2xvYWQgKGRlc3QpIHtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuZm9ybWF0VXJsKHRoaXMudXJsLCBkZXN0KTtcblxuICAgICAgICBsZXQgc291cmNlX2RhdGEgPSBkZXN0LnNvdXJjZV9kYXRhO1xuICAgICAgICBzb3VyY2VfZGF0YS51cmwgPSB1cmw7XG4gICAgICAgIGRlc3QuZGVidWcgPSBkZXN0LmRlYnVnIHx8IHt9O1xuICAgICAgICBkZXN0LmRlYnVnLm5ldHdvcmsgPSArbmV3IERhdGUoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc291cmNlX2RhdGEuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgLy8gRm9yIHRlc3RpbmcgbmV0d29yayBlcnJvcnNcbiAgICAgICAgICAgIC8vIHZhciBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMCwgdGhpcy5yZXNwb25zZV90eXBlKTtcbiAgICAgICAgICAgIC8vIGlmIChNYXRoLnJhbmRvbSgpIDwgLjcpIHtcbiAgICAgICAgICAgIC8vICAgICBwcm9taXNlID0gUHJvbWlzZS5yZWplY3QoRXJyb3IoJ2Zha2UgZGF0YSBzb3VyY2UgZXJyb3InKSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgIGxldCBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMDAsIHRoaXMucmVzcG9uc2VfdHlwZSk7XG4gICAgICAgICAgICBzb3VyY2VfZGF0YS5yZXF1ZXN0ID0gcHJvbWlzZS5yZXF1ZXN0O1xuXG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICBkZXN0LmRlYnVnLnJlc3BvbnNlX3NpemUgPSBib2R5Lmxlbmd0aCB8fCBib2R5LmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5uZXR3b3JrID0gK25ldyBEYXRlKCkgLSBkZXN0LmRlYnVnLm5ldHdvcms7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5wYXJzaW5nID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZVNvdXJjZURhdGEoZGVzdCwgc291cmNlX2RhdGEsIGJvZHkpO1xuICAgICAgICAgICAgICAgIGRlc3QuZGVidWcucGFyc2luZyA9ICtuZXcgRGF0ZSgpIC0gZGVzdC5kZWJ1Zy5wYXJzaW5nO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGVzdCk7XG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfZGF0YS5lcnJvciA9IGVycm9yLnN0YWNrO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGVzdCk7IC8vIHJlc29sdmUgcmVxdWVzdCBidXQgcGFzcyBhbG9uZyBlcnJvclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN1Yi1jbGFzc2VzIG11c3QgaW1wbGVtZW50OlxuXG4gICAgZm9ybWF0VXJsICh1cmxfdGVtcGxhdGUsIGRlc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkKCdmb3JtYXRVcmwnKTtcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKGRlc3QsIHNvdXJjZSwgcmVwb25zZSkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ3BhcnNlU291cmNlRGF0YScpO1xuICAgIH1cbn1cblxuXG4vKioqIEdlbmVyaWMgbmV0d29yayB0aWxlIGxvYWRpbmcgLSBhYnN0cmFjdCBjbGFzcyAqKiovXG5cbmV4cG9ydCBjbGFzcyBOZXR3b3JrVGlsZVNvdXJjZSBleHRlbmRzIE5ldHdvcmtTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3IgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuXG4gICAgICAgIHRoaXMudGlsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhcnNlQm91bmRzKHNvdXJjZSk7XG5cbiAgICAgICAgLy8gaW5kaWNhdGVzIGlmIHNvdXJjZSBzaG91bGQgYnVpbGQgZ2VvbWV0cnkgdGlsZXMsIGVuYWJsZWQgZm9yIHNvdXJjZXMgcmVmZXJlbmNlZCBpbiB0aGUgc2NlbmUncyBsYXllcnMsXG4gICAgICAgIC8vIGFuZCBsZWZ0IGRpc2FibGVkIGZvciBzb3VyY2VzIHRoYXQgYXJlIG5ldmVyIHJlZmVyZW5jZWQsIG9yIG9ubHkgdXNlZCBhcyByYXN0ZXIgdGV4dHVyZXNcbiAgICAgICAgdGhpcy5idWlsZHNfZ2VvbWV0cnlfdGlsZXMgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnRtcyA9IChzb3VyY2UudG1zID09PSB0cnVlKTsgLy8gb3B0aW9uYWxseSBmbGlwIHRpbGUgY29vcmRzIGZvciBUTVNcbiAgICAgICAgdGhpcy51cmxfaG9zdHMgPSBudWxsO1xuICAgICAgICB2YXIgaG9zdF9tYXRjaCA9IHRoaXMudXJsLm1hdGNoKC97czpcXFsoW159K10rKVxcXX0vKTtcbiAgICAgICAgaWYgKGhvc3RfbWF0Y2ggIT0gbnVsbCAmJiBob3N0X21hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMudXJsX2hvc3RzID0gaG9zdF9tYXRjaFsxXS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgdGhpcy5uZXh0X2hvc3QgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IGJvdW5kcyBmcm9tIHNvdXJjZSBjb25maWcgcGFyYW1ldGVyc1xuICAgIHBhcnNlQm91bmRzIChzb3VyY2UpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlLmJvdW5kcykgJiYgc291cmNlLmJvdW5kcy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzID0gc291cmNlLmJvdW5kcztcbiAgICAgICAgICAgIGxldCBbdywgcywgZSwgbl0gPSB0aGlzLmJvdW5kcztcbiAgICAgICAgICAgIHRoaXMuYm91bmRzX21ldGVycyA9IHtcbiAgICAgICAgICAgICAgICBtaW46IEdlby5sYXRMbmdUb01ldGVycyhbdywgbl0pLFxuICAgICAgICAgICAgICAgIG1heDogR2VvLmxhdExuZ1RvTWV0ZXJzKFtlLCBzXSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNfdGlsZXMgPSB7IG1pbjoge30sIG1heDoge30gfTsgLy8gbWF4IHRpbGUgYm91bmRzIHBlciB6b29tIChsYXppbHkgZXZhbHVhdGVkKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aWxlIGlzIG91dHNpZGUgZGF0YSBzb3VyY2UncyBib3VuZHMsIHRydWUgaWYgd2l0aGluXG4gICAgY2hlY2tCb3VuZHMgKGNvb3Jkcykge1xuICAgICAgICAvLyBDaGVjayB0aWxlIGJvdW5kc1xuICAgICAgICBpZiAodGhpcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIGNvb3JkcyA9IEdlby53cmFwVGlsZShjb29yZHMsIHsgeDogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgbGV0IG1pbiA9IHRoaXMuYm91bmRzX3RpbGVzLm1pbltjb29yZHMuel07XG4gICAgICAgICAgICBpZiAoIW1pbikge1xuICAgICAgICAgICAgICAgIG1pbiA9IHRoaXMuYm91bmRzX3RpbGVzLm1pbltjb29yZHMuel0gPSBHZW8udGlsZUZvck1ldGVycyh0aGlzLmJvdW5kc19tZXRlcnMubWluLCBjb29yZHMueik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBtYXggPSB0aGlzLmJvdW5kc190aWxlcy5tYXhbY29vcmRzLnpdO1xuICAgICAgICAgICAgaWYgKCFtYXgpIHtcbiAgICAgICAgICAgICAgICBtYXggPSB0aGlzLmJvdW5kc190aWxlcy5tYXhbY29vcmRzLnpdID0gR2VvLnRpbGVGb3JNZXRlcnModGhpcy5ib3VuZHNfbWV0ZXJzLm1heCwgY29vcmRzLnopO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29vcmRzLnggPCBtaW4ueCB8fCBjb29yZHMueCA+IG1heC54IHx8XG4gICAgICAgICAgICAgICAgY29vcmRzLnkgPCBtaW4ueSB8fCBjb29yZHMueSA+IG1heC55KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGluY2x1ZGVzVGlsZSAoY29vcmRzLCBzdHlsZV96b29tKSB7XG4gICAgICAgIGlmICghc3VwZXIuaW5jbHVkZXNUaWxlKGNvb3Jkcywgc3R5bGVfem9vbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRpbGUgYm91bmRzXG4gICAgICAgIGlmICghdGhpcy5jaGVja0JvdW5kcyhjb29yZHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9ybWF0VXJsKHVybF90ZW1wbGF0ZSwgdGlsZSkge1xuICAgICAgICBsZXQgY29vcmRzID0gR2VvLndyYXBUaWxlKHRpbGUuY29vcmRzLCB7IHg6IHRydWUgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMudG1zKSB7XG4gICAgICAgICAgICBjb29yZHMueSA9IE1hdGgucG93KDIsIGNvb3Jkcy56KSAtIDEgLSBjb29yZHMueTsgLy8gb3B0aW9uYWxseSBmbGlwIHRpbGUgY29vcmRzIGZvciBUTVNcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB1cmwgPSB1cmxfdGVtcGxhdGUucmVwbGFjZSgne3h9JywgY29vcmRzLngpLnJlcGxhY2UoJ3t5fScsIGNvb3Jkcy55KS5yZXBsYWNlKCd7en0nLCBjb29yZHMueik7XG5cbiAgICAgICAgaWYgKHRoaXMudXJsX2hvc3RzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKC97czpcXFsoW159K10rKVxcXX0vLCB0aGlzLnVybF9ob3N0c1t0aGlzLm5leHRfaG9zdF0pO1xuICAgICAgICAgICAgdGhpcy5uZXh0X2hvc3QgPSAodGhpcy5uZXh0X2hvc3QgKyAxKSAlIHRoaXMudXJsX2hvc3RzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cblxuICAgIC8vIENoZWNrcyBmb3IgdGhlIHgveS96IHRpbGUgcGF0dGVybiBpbiBVUkwgdGVtcGxhdGVcbiAgICB1cmxIYXNUaWxlUGF0dGVybih1cmwpIHtcbiAgICAgICAgcmV0dXJuIHVybCAmJlxuICAgICAgICAgICAgdXJsLnNlYXJjaCgne3h9JykgPiAtMSAmJlxuICAgICAgICAgICAgdXJsLnNlYXJjaCgne3l9JykgPiAtMSAmJlxuICAgICAgICAgICAgdXJsLnNlYXJjaCgne3p9JykgPiAtMTtcbiAgICB9XG5cbn1cbiIsImltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBEYXRhU291cmNlLCB7TmV0d29ya1NvdXJjZSwgTmV0d29ya1RpbGVTb3VyY2V9IGZyb20gJy4vZGF0YV9zb3VyY2UnO1xuaW1wb3J0IHtkZWNvZGVNdWx0aVBvbHlnb259IGZyb20gJy4vbXZ0JztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuLy8gRm9yIHRpbGluZyBHZW9KU09OIGNsaWVudC1zaWRlXG5pbXBvcnQgZ2VvanNvbnZ0IGZyb20gJ2dlb2pzb24tdnQnO1xuXG4vKipcbiBHZW9KU09OIHN0YW5kYWxvbmUgKG5vbi10aWxlZCkgc291cmNlXG4gVXNlcyBnZW9qc29uLXZ0IHNwbGl0IGludG8gdGlsZXMgY2xpZW50LXNpZGVcbiovXG5cbmV4cG9ydCBjbGFzcyBHZW9KU09OU291cmNlIGV4dGVuZHMgTmV0d29ya1NvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgdGhpcy50aWxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZF9kYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy50aWxlX2luZGV4ZXMgPSB7fTsgLy8gZ2VvanNvbi12dCB0aWxlIGluZGljZXMsIGJ5IGxheWVyIG5hbWVcbiAgICAgICAgdGhpcy5tYXhfem9vbSA9IE1hdGgubWF4KHRoaXMubWF4X3pvb20gfHwgMCwgMTUpOyAvLyBUT0RPOiBtYXggem9vbSA8IDE1IGNhdXNlcyBhcnRpZmFjdHMvbm8tZHJhdyBhdCAyMCwgaW52ZXN0aWdhdGVcbiAgICAgICAgdGhpcy5wYWRfc2NhbGUgPSAwOyAvLyB3ZSBkb24ndCB3YW50IHBhZGRpbmcgb24gYXV0by10aWxlZCBzb3VyY2VzXG4gICAgfVxuXG4gICAgX2xvYWQoZGVzdCkge1xuICAgICAgICBpZiAoIXRoaXMubG9hZF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRfZGF0YSA9IHN1cGVyLl9sb2FkKHsgc291cmNlX2RhdGE6IHsgbGF5ZXJzOiB7fSB9IH0pLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2FybiBhbmQgY29udGludWUgb24gZGF0YSBzb3VyY2UgZXJyb3JcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5zb3VyY2VfZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgZGF0YSBzb3VyY2UgbG9hZCBlcnJvcihzKSBmb3Igc291cmNlICcke3RoaXMubmFtZX0nLCBVUkwgJyR7dGhpcy51cmx9JzogJHtkYXRhLnNvdXJjZV9kYXRhLmVycm9yfWApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBsYXllcnMgPSBkYXRhLnNvdXJjZV9kYXRhLmxheWVycztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBsYXllcl9uYW1lIGluIGxheWVycykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbGVfaW5kZXhlc1tsYXllcl9uYW1lXSA9IGdlb2pzb252dChsYXllcnNbbGF5ZXJfbmFtZV0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFpvb206IHRoaXMubWF4X3pvb20sICAvLyBtYXggem9vbSB0byBwcmVzZXJ2ZSBkZXRhaWwgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRvbGVyYW5jZTogMywgLy8gc2ltcGxpZmljYXRpb24gdG9sZXJhbmNlIChoaWdoZXIgbWVhbnMgc2ltcGxlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVudDogR2VvLnRpbGVfc2NhbGUsIC8vIHRpbGUgZXh0ZW50IChib3RoIHdpZHRoIGFuZCBoZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI6IDAuMDAwMSAgICAgLy8gdGlsZSBidWZmZXIgb24gZWFjaCBzaWRlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZF9kYXRhLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgbGF5ZXJfbmFtZSBpbiB0aGlzLnRpbGVfaW5kZXhlcykge1xuICAgICAgICAgICAgICAgIGRlc3Quc291cmNlX2RhdGEubGF5ZXJzW2xheWVyX25hbWVdID0gdGhpcy5nZXRUaWxlRmVhdHVyZXMoZGVzdCwgbGF5ZXJfbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0VGlsZUZlYXR1cmVzKHRpbGUsIGxheWVyX25hbWUpIHtcbiAgICAgICAgbGV0IGNvb3JkcyA9IEdlby53cmFwVGlsZSh0aWxlLmNvb3JkcywgeyB4OiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIHJlcXVlc3QgYSBwYXJ0aWN1bGFyIHRpbGVcbiAgICAgICAgbGV0IHQgPSB0aGlzLnRpbGVfaW5kZXhlc1tsYXllcl9uYW1lXS5nZXRUaWxlKGNvb3Jkcy56LCBjb29yZHMueCwgY29vcmRzLnkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZnJvbSBNVlQtc3R5bGUgSlNPTiBzdHJ1Y3QgdG8gR2VvSlNPTlxuICAgICAgICBsZXQgY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKHQgJiYgdC5mZWF0dXJlcykge1xuICAgICAgICAgICAgY29sbGVjdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdC5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSB0LmZlYXR1cmVzW2ldO1xuXG4gICAgICAgICAgICAgICAgLy8gR2VvSlNPTiBmZWF0dXJlXG4gICAgICAgICAgICAgICAgbGV0IGYgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHt9LFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnRhZ3NcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzID0gZmVhdHVyZS5nZW9tZXRyeS5tYXAoY29vcmQgPT4gW2Nvb3JkWzBdLCBjb29yZFsxXV0pO1xuICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5LnR5cGUgPSAnTXVsdGlQb2ludCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZlYXR1cmUudHlwZSA9PT0gMiB8fCBmZWF0dXJlLnR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS5jb29yZGluYXRlcyA9IGZlYXR1cmUuZ2VvbWV0cnkubWFwKHJpbmcgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJpbmcubWFwKGNvb3JkID0+IFtjb29yZFswXSwgY29vcmRbMV1dKVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLnR5cGUgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkudHlwZSA9ICdNdWx0aUxpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkgPSBkZWNvZGVNdWx0aVBvbHlnb24oZi5nZW9tZXRyeSk7IC8vIHVuLWZsYXR0ZW4gcmluZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLmdlb21ldHJ5ID09IG51bGwpIHsgLy8gc2tpcCBwb2x5cyB0aGF0IGNvdWxkbid0IGJlIGRlY29kZWQgKGUuZy4gZGVnZW5lcmF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbi5mZWF0dXJlcy5wdXNoKGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgfVxuXG4gICAgZm9ybWF0VXJsIChkZXN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVybDtcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IHBhcnNlZF9yZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICBsZXQgbGF5ZXJzID0gdGhpcy5nZXRMYXllcnMocGFyc2VkX3Jlc3BvbnNlKTtcbiAgICAgICAgc291cmNlLmxheWVycyA9IHRoaXMucHJlcHJvY2Vzc0xheWVycyhsYXllcnMpO1xuICAgIH1cblxuICAgIHByZXByb2Nlc3NMYXllcnMgKGxheWVycyl7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBsYXllcnMpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IGxheWVyc1trZXldO1xuICAgICAgICAgICAgdGhpcy5wcmVwcm9jZXNzRmVhdHVyZXMobGF5ZXIuZmVhdHVyZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgZGF0YSB0cmFuc2Zvcm1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGxheWVycykubGVuZ3RoID09PSAxICYmIGxheWVycy5fZGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIGxheWVycy5fZGVmYXVsdCA9IHRoaXMudHJhbnNmb3JtKGxheWVycy5fZGVmYXVsdCwgdGhpcy5leHRyYV9kYXRhKTsgLy8gc2luZ2xlLWxheWVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXllcnMgPSB0aGlzLnRyYW5zZm9ybShsYXllcnMsIHRoaXMuZXh0cmFfZGF0YSk7IC8vIG11bHRpcGxlIGxheWVyc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9XG5cbiAgICAvLyBQcmVwcm9jZXNzIGZlYXR1cmVzLiBDdXJyZW50bHkgdXNlZCB0byBhZGQgYSBuZXcgXCJjZW50cm9pZFwiIGZlYXR1cmUgZm9yIHBvbHlnb24gbGFiZWxpbmdcbiAgICBwcmVwcm9jZXNzRmVhdHVyZXMgKGZlYXR1cmVzKSB7XG4gICAgICAgIC8vIERlZmluZSBjZW50cm9pZHMgZm9yIHBvbHlnb25zIGZvciBjZW50cm9pZCBsYWJlbCBwbGFjZW1lbnRcbiAgICAgICAgLy8gQXZvaWRzIHJlZHVuZGFudCBsYWJlbCBwbGFjZW1lbnQgZm9yIGVhY2ggZ2VuZXJhdGVkIHRpbGUgYXQgaGlnaGVyIHpvb20gbGV2ZWxzXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5nZW5lcmF0ZV9sYWJlbF9jZW50cm9pZHMpe1xuICAgICAgICAgICAgbGV0IGZlYXR1cmVzX2NlbnRyb2lkID0gW107XG4gICAgICAgICAgICBsZXQgY2VudHJvaWRfcHJvcGVydGllcyA9IHtcImxhYmVsX3BsYWNlbWVudFwiIDogdHJ1ZX07XG5cbiAgICAgICAgICAgIGZlYXR1cmVzLmZvckVhY2goZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNvb3JkaW5hdGVzLCBjZW50cm9pZF9mZWF0dXJlO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJvaWRfZmVhdHVyZSA9IGdldENlbnRyb2lkRmVhdHVyZUZvclBvbHlnb24oY29vcmRpbmF0ZXMsIGZlYXR1cmUucHJvcGVydGllcywgY2VudHJvaWRfcHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlc19jZW50cm9pZC5wdXNoKGNlbnRyb2lkX2ZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ011bHRpUG9seWdvbic6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgY2VudHJvaWQgZmVhdHVyZSBmb3IgbGFyZ2VzdCBwb2x5Z29uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyA9IGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF4X2FyZWEgPSAtSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF4X2FyZWFfaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvb3JkaW5hdGVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcmVhID0gR2VvLnBvbHlnb25BcmVhKGNvb3JkaW5hdGVzW2luZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZWEgPiBtYXhfYXJlYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYXJlYSA9IGFyZWE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hcmVhX2luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJvaWRfZmVhdHVyZSA9IGdldENlbnRyb2lkRmVhdHVyZUZvclBvbHlnb24oY29vcmRpbmF0ZXNbbWF4X2FyZWFfaW5kZXhdLCBmZWF0dXJlLnByb3BlcnRpZXMsIGNlbnRyb2lkX3Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXNfY2VudHJvaWQucHVzaChjZW50cm9pZF9mZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBhcHBlbmQgY2VudHJvaWQgZmVhdHVyZXMgdG8gZmVhdHVyZXMgYXJyYXlcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGZlYXR1cmVzLCBmZWF0dXJlc19jZW50cm9pZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0IHNpbmdsZSBvciBtdWx0aXBsZSBsYXllcnMgaW4gcmV0dXJuZWQgZGF0YVxuICAgIGdldExheWVycyAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgX2RlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IFtkYXRhXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF9kZWZhdWx0OiBkYXRhXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuLyoqXG4gR2VvSlNPTiB2ZWN0b3IgdGlsZXNcbiBAY2xhc3MgR2VvSlNPTlRpbGVTb3VyY2VcbiovXG5leHBvcnQgY2xhc3MgR2VvSlNPTlRpbGVTb3VyY2UgZXh0ZW5kcyBOZXR3b3JrVGlsZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgVVJMIHRpbGUgcGF0dGVybiwgaWYgbm90IGZvdW5kLCB0cmVhdCBhcyBzdGFuZGFsb25lIEdlb0pTT04vVG9wb0pTT04gb2JqZWN0XG4gICAgICAgIGlmICghdGhpcy51cmxIYXNUaWxlUGF0dGVybih0aGlzLnVybCkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGluc3RhbmNlIHR5cGUgZnJvbSBwYXJlbnQgY2xhc3NcbiAgICAgICAgICAgIGlmIChzb3VyY2UudHlwZSA9PT0gJ0dlb0pTT04nKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBpbnN0YW5jZSB0eXBlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW9KU09OU291cmNlKHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzIGJhY2sgdG8gcGFyZW50IGNsYXNzIHRvIGluc3RhbnRpYXRlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICAgIHRoaXMucHJlcGFyZUdlb0pTT04oZGF0YSwgdGlsZSwgc291cmNlKTtcbiAgICB9XG5cbiAgICBwcmVwYXJlR2VvSlNPTiAoZGF0YSwgdGlsZSwgc291cmNlKSB7XG4gICAgICAgIC8vIEFwcGx5IG9wdGlvbmFsIGRhdGEgdHJhbnNmb3JtXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLnRyYW5zZm9ybShkYXRhLCB0aGlzLmV4dHJhX2RhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgc291cmNlLmxheWVycyA9IEdlb0pTT05Tb3VyY2UucHJvdG90eXBlLmdldExheWVycyhkYXRhKTtcblxuICAgICAgICAvLyBBIFwic3ludGhldGljXCIgdGlsZSB0aGF0IGFkanVzdHMgdGhlIHRpbGUgbWluIGFuY2hvciB0byBhY2NvdW50IGZvciB0aWxlIGxvbmdpdHVkZSB3cmFwcGluZ1xuICAgICAgICBsZXQgYW5jaG9yID0ge1xuICAgICAgICAgICAgY29vcmRzOiB0aWxlLmNvb3JkcyxcbiAgICAgICAgICAgIG1pbjogR2VvLm1ldGVyc0ZvclRpbGUoR2VvLndyYXBUaWxlKHRpbGUuY29vcmRzLCB7IHg6IHRydWUgfSkpXG4gICAgICAgIH07XG5cbiAgICAgICAgRGF0YVNvdXJjZS5wcm9qZWN0RGF0YShzb3VyY2UpOyAvLyBtZXJjYXRvciBwcm9qZWN0aW9uXG4gICAgICAgIERhdGFTb3VyY2Uuc2NhbGVEYXRhKHNvdXJjZSwgYW5jaG9yKTsgLy8gcmUtc2NhbGUgZnJvbSBtZXRlcnMgdG8gbG9jYWwgdGlsZSBjb29yZHNcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS5yZWdpc3RlcihHZW9KU09OVGlsZVNvdXJjZSwgJ0dlb0pTT04nKTsgICAgICAvLyBwcmVmZXJlZCBzaG9ydGVyIG5hbWVcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBjZW50cm9pZCBwb2ludCBmZWF0dXJlIGZyb20gcG9seWdvbiBjb29yZGluYXRlcyBhbmQgcHJvdmlkZWQgZmVhdHVyZSBtZXRhLWRhdGFcbmZ1bmN0aW9uIGdldENlbnRyb2lkRmVhdHVyZUZvclBvbHlnb24gKGNvb3JkaW5hdGVzLCBwcm9wZXJ0aWVzLCBuZXdQcm9wZXJ0aWVzKSB7XG4gICAgbGV0IGNlbnRyb2lkID0gR2VvLmNlbnRyb2lkKGNvb3JkaW5hdGVzKTtcblxuICAgIC8vIGNsb25lIHByb3BlcnRpZXMgYW5kIG1peGl4IG5ld1Byb3BlcnRpZXNcbiAgICBsZXQgY2VudHJvaWRfcHJvcGVydGllcyA9IHt9O1xuICAgIE9iamVjdC5hc3NpZ24oY2VudHJvaWRfcHJvcGVydGllcywgcHJvcGVydGllcywgbmV3UHJvcGVydGllcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgICAgcHJvcGVydGllczogY2VudHJvaWRfcHJvcGVydGllcyxcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiUG9pbnRcIixcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBjZW50cm9pZFxuICAgICAgICB9XG4gICAgfTtcbn1cbiIsImltcG9ydCBEYXRhU291cmNlLCB7TmV0d29ya1RpbGVTb3VyY2V9IGZyb20gJy4vZGF0YV9zb3VyY2UnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5pbXBvcnQgUGJmIGZyb20gJ3BiZic7XG5pbXBvcnQge1ZlY3RvclRpbGUsIFZlY3RvclRpbGVGZWF0dXJlfSBmcm9tICd2ZWN0b3ItdGlsZSc7XG5cbi8qKlxuIE1hcGJveCBWZWN0b3IgVGlsZSBmb3JtYXRcbiBAY2xhc3MgTVZUU291cmNlXG4qL1xuZXhwb3J0IGNsYXNzIE1WVFNvdXJjZSBleHRlbmRzIE5ldHdvcmtUaWxlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZV90eXBlID0gXCJhcnJheWJ1ZmZlclwiOyAvLyBiaW5hcnkgZGF0YVxuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICAvLyBDb252ZXJ0IE1hcGJveCB2ZWN0b3IgdGlsZSB0byBHZW9KU09OXG4gICAgICAgIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpO1xuICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFBiZihkYXRhKTtcbiAgICAgICAgc291cmNlLmRhdGEgPSBuZXcgVmVjdG9yVGlsZShidWZmZXIpO1xuICAgICAgICBzb3VyY2UubGF5ZXJzID0gdGhpcy50b0dlb0pTT04oc291cmNlLmRhdGEpO1xuXG4gICAgICAgIC8vIEFwcGx5IG9wdGlvbmFsIGRhdGEgdHJhbnNmb3JtXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNvdXJjZS5sYXllcnMgPSB0aGlzLnRyYW5zZm9ybShzb3VyY2UubGF5ZXJzLCB0aGlzLmV4dHJhX2RhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHNvdXJjZS5kYXRhOyAvLyBjb21tZW50IG91dCB0byBzYXZlIHJhdyBkYXRhIGZvciBkZWJ1Z2dpbmdcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggbGF5ZXJzL2ZlYXR1cmVzIHVzaW5nIE1hcGJveCBsaWIgQVBJLCBjb252ZXJ0IHRvIEdlb0pTT04gZmVhdHVyZXNcbiAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGtleXMgZm9yIGVhY2ggbGF5ZXIsIGUuZy4geyBsYXllcjogZ2VvanNvbiB9XG4gICAgdG9HZW9KU09OICh0aWxlKSB7XG4gICAgICAgIHZhciBsYXllcnMgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgbCBpbiB0aWxlLmxheWVycykge1xuICAgICAgICAgICAgdmFyIGxheWVyID0gdGlsZS5sYXllcnNbbF07XG4gICAgICAgICAgICB2YXIgbGF5ZXJfZ2VvanNvbiA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yICh2YXIgZj0wOyBmIDwgbGF5ZXIubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZSA9IGxheWVyLmZlYXR1cmUoZik7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmVfZ2VvanNvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeToge30sXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlX2dlb2pzb24uZ2VvbWV0cnk7XG4gICAgICAgICAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0gZmVhdHVyZS5sb2FkR2VvbWV0cnkoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByPTA7IHIgPCBjb29yZGluYXRlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmluZyA9IGNvb3JkaW5hdGVzW3JdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTA7IGMgPCByaW5nLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByaW5nW2NdID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10ueCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nW2NdLnlcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBjb29yZGluYXRlcztcblxuICAgICAgICAgICAgICAgIGlmIChWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1tmZWF0dXJlLnR5cGVdID09PSAnUG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPSAnUG9pbnQnO1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1tmZWF0dXJlLnR5cGVdID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkudHlwZSA9ICdMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS50eXBlID0gJ011bHRpTGluZVN0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbZmVhdHVyZS50eXBlXSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gZGVjb2RlTXVsdGlQb2x5Z29uKGdlb21ldHJ5KTsgLy8gdW4tZmxhdHRlbiByaW5nc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxheWVyX2dlb2pzb24uZmVhdHVyZXMucHVzaChmZWF0dXJlX2dlb2pzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGF5ZXJzW2xdID0gbGF5ZXJfZ2VvanNvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5ZXJzO1xuICAgIH1cblxufVxuXG4vLyBEZWNvZGUgbXVsdGlwb2x5Z29ucywgd2hpY2ggYXJlIGVuY29kZWQgYXMgYSBzaW5nbGUgc2V0IG9mIHJpbmdzXG4vLyBXaW5kaW5nIG9yZGVyIG9mIGZpcnN0IHJpbmcgaXMgYXNzdW1lZCB0byBpbmRpY2F0ZSBleHRlcmlvciByaW5nLFxuLy8gdGhlIG9wcG9zaXRlIHdpbmRpbmcgb3JkZXIgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiBhIG5ldyBwb2x5Z29uLlxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZU11bHRpUG9seWdvbiAoZ2VvbSkge1xuICAgIGxldCBwb2x5cyA9IFtdO1xuICAgIGxldCBwb2x5ID0gW107XG4gICAgbGV0IG91dGVyX3dpbmRpbmc7XG4gICAgZm9yIChsZXQgcj0wOyByIDwgZ2VvbS5jb29yZGluYXRlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICBsZXQgcmluZyA9IGdlb20uY29vcmRpbmF0ZXNbcl07XG4gICAgICAgIGxldCB3aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKHJpbmcpO1xuICAgICAgICBpZiAod2luZGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB6ZXJvLWFyZWEgcmluZ3NcbiAgICAgICAgfVxuXG4gICAgICAgIG91dGVyX3dpbmRpbmcgPSBvdXRlcl93aW5kaW5nIHx8IHdpbmRpbmc7IC8vIGFzc3VtZSBmaXJzdCByaW5nIGluZGljYXRlcyBvdXRlciByaW5nIHdpbmRpbmdcblxuICAgICAgICBpZiAod2luZGluZyA9PT0gb3V0ZXJfd2luZGluZyAmJiBwb2x5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBvbHlzLnB1c2gocG9seSk7XG4gICAgICAgICAgICBwb2x5ID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcG9seS5wdXNoKHJpbmcpO1xuICAgIH1cbiAgICBpZiAocG9seS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHBvbHlzLnB1c2gocG9seSk7XG4gICAgfVxuXG4gICAgLy8gU2luZ2xlIG9yIG11bHRpP1xuICAgIGlmIChwb2x5cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZ2VvbS50eXBlID0gJ1BvbHlnb24nO1xuICAgICAgICBnZW9tLmNvb3JkaW5hdGVzID0gcG9seXNbMF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHBvbHlzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZ2VvbS50eXBlID0gJ011bHRpUG9seWdvbic7XG4gICAgICAgIGdlb20uY29vcmRpbmF0ZXMgPSBwb2x5cztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdlb20gPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBnZW9tO1xufVxuXG5EYXRhU291cmNlLnJlZ2lzdGVyKE1WVFNvdXJjZSwgJ01WVCcpO1xuIiwiaW1wb3J0IERhdGFTb3VyY2UsIHtOZXR3b3JrVGlsZVNvdXJjZX0gZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQgVGlsZSBmcm9tICcuLi90aWxlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuZXhwb3J0IGNsYXNzIFJhc3RlclRpbGVTb3VyY2UgZXh0ZW5kcyBOZXR3b3JrVGlsZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcblxuICAgICAgICBpZiAodGhpcy5yYXN0ZXJzLmluZGV4T2YodGhpcy5uYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucmFzdGVycy51bnNoaWZ0KHRoaXMubmFtZSk7IC8vIGFkZCB0aGlzIHJhc3RlciBhcyB0aGUgZmlyc3RcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlcmluZyA9IHNvdXJjZS5maWx0ZXJpbmc7IC8vIG9wdGlvbmFsIHRleHR1cmUgZmlsdGVyaW5nIChuZWFyZXN0LCBsaW5lYXIsIG1pcG1hcClcblxuICAgICAgICAvLyBzYXZlIHRleHR1cmUgb2JqZWN0cyBieSB0aWxlIGtleSwgc28gVVJMIHJlbWFpbnMgc3RhYmxlIGlmIHRpbGUgaXMgYnVpbHQgbXVsdGlwbGUgdGltZXMsXG4gICAgICAgIC8vIGUuZy4gYXZvaWQgcmUtbG9hZGluZyB0aGUgc2FtZSB0aWxlIHRleHR1cmUgdW5kZXIgYSBkaWZmZXJlbnQgc3ViZG9tYWluIHdoZW4gdXNpbmcgdGlsZSBob3N0c1xuICAgICAgICB0aGlzLnRleHR1cmVzID0ge307XG4gICAgfVxuXG4gICAgbG9hZCh0aWxlKSB7XG4gICAgICAgIHRpbGUuc291cmNlX2RhdGEgPSB7fTtcbiAgICAgICAgdGlsZS5zb3VyY2VfZGF0YS5sYXllcnMgPSB7fTtcbiAgICAgICAgdGlsZS5wYWRfc2NhbGUgPSB0aGlzLnBhZF9zY2FsZTtcbiAgICAgICAgdGlsZS5yYXN0ZXJzID0gWy4uLnRoaXMucmFzdGVyc107IC8vIGNvcHkgbGlzdCBvZiByYXN0ZXJzIHRvIGxvYWQgZm9yIHRpbGVcblxuICAgICAgICAvLyBHZW5lcmF0ZSBhIHNpbmdsZSBxdWFkIHRoYXQgZmlsbHMgdGhlIGVudGlyZSB0aWxlXG4gICAgICAgIGxldCBzY2FsZSA9IEdlby50aWxlX3NjYWxlO1xuICAgICAgICB0aWxlLnNvdXJjZV9kYXRhLmxheWVycyA9IHtcbiAgICAgICAgICAgIF9kZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICBmZWF0dXJlczogW3tcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBbW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAwXSwgW3NjYWxlLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2NhbGUsIC1zY2FsZV0sIFswLCAtc2NhbGVdLCBbMCwgMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIF1dXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHt9XG4gICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aWxlLmRlZmF1bHRfd2luZGluZyA9ICdDVyc7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGlsZSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRleHR1cmUgaW5mbyBmb3IgYSByYXN0ZXIgdGlsZVxuICAgIHRpbGVUZXh0dXJlICh0aWxlKSB7XG4gICAgICAgIGxldCBrZXkgPSB0aWxlLmNvb3Jkcy5rZXk7XG4gICAgICAgIGlmICghdGhpcy50ZXh0dXJlc1trZXldKSB7XG4gICAgICAgICAgICBsZXQgY29vcmRzID0gVGlsZS5jb29yZGluYXRlV2l0aE1heFpvb20odGlsZS5jb29yZHMsIHRoaXMubWF4X3pvb20pO1xuICAgICAgICAgICAgbGV0IHVybCA9IHRoaXMuZm9ybWF0VXJsKHRoaXMudXJsLCB7IGNvb3JkcyB9KTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZXNba2V5XSA9IHsgdXJsLCBmaWx0ZXJpbmc6IHRoaXMuZmlsdGVyaW5nLCBjb29yZHMgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50ZXh0dXJlc1trZXldO1xuICAgIH1cblxufVxuXG5EYXRhU291cmNlLnJlZ2lzdGVyKFJhc3RlclRpbGVTb3VyY2UsICdSYXN0ZXInKTtcbiIsImltcG9ydCBEYXRhU291cmNlIGZyb20gJy4vZGF0YV9zb3VyY2UnO1xuaW1wb3J0IHtHZW9KU09OU291cmNlLCBHZW9KU09OVGlsZVNvdXJjZX0gZnJvbSAnLi9nZW9qc29uJztcblxuaW1wb3J0ICogYXMgdG9wb2pzb24gZnJvbSAndG9wb2pzb24tY2xpZW50JztcblxuLyoqXG4gVG9wb0pTT04gc3RhbmRhbG9uZSAobm9uLXRpbGVkKSBzb3VyY2VcbiBVc2VzIGdlb2pzb24tdnQgc3BsaXQgaW50byB0aWxlcyBjbGllbnQtc2lkZVxuKi9cblxuZXhwb3J0IGNsYXNzIFRvcG9KU09OU291cmNlIGV4dGVuZHMgR2VvSlNPTlNvdXJjZSB7XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgZGF0YSA9IHRoaXMudG9HZW9KU09OKGRhdGEpO1xuXG4gICAgICAgIGxldCBsYXllcnMgPSB0aGlzLmdldExheWVycyhkYXRhKTtcbiAgICAgICAgc3VwZXIucHJlcHJvY2Vzc0xheWVycyhsYXllcnMpO1xuICAgICAgICBzb3VyY2UubGF5ZXJzID0gbGF5ZXJzO1xuICAgIH1cblxuICAgIHRvR2VvSlNPTiAoZGF0YSkge1xuICAgICAgICAvLyBTaW5nbGUgbGF5ZXJcbiAgICAgICAgaWYgKGRhdGEub2JqZWN0cyAmJlxuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGF0YS5vYmplY3RzKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IE9iamVjdC5rZXlzKGRhdGEub2JqZWN0cylbMF07XG4gICAgICAgICAgICBkYXRhID0gZ2V0VG9wb0pTT05GZWF0dXJlKGRhdGEsIGRhdGEub2JqZWN0c1tsYXllcl0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE11bHRpcGxlIGxheWVyc1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYXllcnMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhLm9iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBsYXllcnNba2V5XSA9IGdldFRvcG9KU09ORmVhdHVyZShkYXRhLCBkYXRhLm9iamVjdHNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhID0gbGF5ZXJzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxufVxuXG5mdW5jdGlvbiBnZXRUb3BvSlNPTkZlYXR1cmUgKHRvcG9sb2d5LCBvYmplY3QpIHtcbiAgICBsZXQgZmVhdHVyZSA9IHRvcG9qc29uLmZlYXR1cmUodG9wb2xvZ3ksIG9iamVjdCk7XG5cbiAgICAvLyBDb252ZXJ0IHNpbmdsZSBmZWF0dXJlIHRvIGEgZmVhdHVyZSBjb2xsZWN0aW9uXG4gICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgIGZlYXR1cmUgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgZmVhdHVyZXM6IFtmZWF0dXJlXVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZmVhdHVyZTtcbn1cblxuXG4vKipcbiBUb3BvSlNPTiB2ZWN0b3IgdGlsZXNcbiBAY2xhc3MgVG9wb0pTT05UaWxlU291cmNlXG4qL1xuZXhwb3J0IGNsYXNzIFRvcG9KU09OVGlsZVNvdXJjZSBleHRlbmRzIEdlb0pTT05UaWxlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuXG4gICAgICAgIC8vIFJlcGxhY2Ugd2l0aCBub24tdGlsZWQgc291cmNlIGlmIHRpbGVkIHNvdXJjZSBmYWlsZWQgdG8gaW5zdGFudGlhdGVcbiAgICAgICAgaWYgKCF0aGlzLnVybEhhc1RpbGVQYXR0ZXJuKHRoaXMudXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUb3BvSlNPTlNvdXJjZShzb3VyY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICAgIGRhdGEgPSBUb3BvSlNPTlNvdXJjZS5wcm90b3R5cGUudG9HZW9KU09OKGRhdGEpO1xuICAgICAgICB0aGlzLnByZXBhcmVHZW9KU09OKGRhdGEsIHRpbGUsIHNvdXJjZSk7XG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoVG9wb0pTT05UaWxlU291cmNlLCAnVG9wb0pTT04nKTsgICAgICAgIC8vIHByZWZlcmVkIHNob3J0ZXIgbmFtZVxuIiwiaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi4vdXRpbHMvbWVyZ2UnO1xuaW1wb3J0IHttYXRjaH0gZnJvbSAnbWF0Y2gtZmVhdHVyZSc7XG5cbmV4cG9ydCBjb25zdCB3aGl0ZUxpc3QgPSBbJ2ZpbHRlcicsICdkcmF3JywgJ3Zpc2libGUnLCAnZGF0YSddO1xuXG5leHBvcnQgY29uc3QgbGF5ZXJfY2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gY2FjaGVLZXkgKGxheWVycykge1xuICAgIGlmIChsYXllcnMubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgayA9IGxheWVyc1swXTtcbiAgICAgICAgZm9yICh2YXIgaT0xOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBrICs9ICcvJyArIGxheWVyc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrO1xuICAgIH1cbiAgICByZXR1cm4gbGF5ZXJzWzBdO1xufVxuXG4vLyBNZXJnZSBtYXRjaGluZyBsYXllciB0cmVlcyBpbnRvIGEgZmluYWwgZHJhdyBncm91cFxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlVHJlZXMobWF0Y2hpbmdUcmVlcywgZ3JvdXApIHtcbiAgICBsZXQgZHJhd3MsIHRyZWVEZXB0aCA9IDA7XG5cbiAgICBsZXQgZHJhdyA9IHtcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSAvLyB2aXNpYmxlIGJ5IGRlZmF1bHRcbiAgICB9O1xuXG4gICAgLy8gRmluZCBkZWVwZXN0IHRyZWVcbiAgICBmb3IgKGxldCB0PTA7IHQgPCBtYXRjaGluZ1RyZWVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgIGlmIChtYXRjaGluZ1RyZWVzW3RdLmxlbmd0aCA+IHRyZWVEZXB0aCkge1xuICAgICAgICAgICAgdHJlZURlcHRoID0gbWF0Y2hpbmdUcmVlc1t0XS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBObyBsYXllcnMgdG8gcGFyc2VcbiAgICBpZiAodHJlZURlcHRoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgdHJlZXMgaW4gcGFyYWxsZWxcbiAgICBmb3IgKGxldCB4PTA7IHggPCB0cmVlRGVwdGg7IHgrKykge1xuICAgICAgICAvLyBQdWxsIG91dCB0aGUgcmVxdWVzdGVkIGRyYXcgZ3JvdXAsIGZvciBlYWNoIHRyZWUsIGF0IHRoaXMgZGVwdGhcbiAgICAgICAgZHJhd3MgPSBtYXRjaGluZ1RyZWVzLm1hcCh0cmVlID0+IHRyZWVbeF0gJiYgdHJlZVt4XVtncm91cF0pO1xuICAgICAgICBpZiAoZHJhd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgYnkgbGF5ZXIgbmFtZSBiZWZvcmUgbWVyZ2luZywgc28gbGF5ZXJzIGFyZSBhcHBsaWVkIGRldGVybWluaXN0aWNhbGx5XG4gICAgICAgIC8vIHdoZW4gbXVsdGlwbGUgbGF5ZXJzIG1vZGlmeSB0aGUgc2FtZSBwcm9wZXJ0aWVzXG4gICAgICAgIGRyYXdzLnNvcnQoKGEsIGIpID0+IChhICYmIGEubGF5ZXJfbmFtZSkgPiAoYiAmJiBiLmxheWVyX25hbWUpID8gMSA6IC0xKTtcblxuICAgICAgICAvLyBNZXJnZSBkcmF3IG9iamVjdHNcbiAgICAgICAgbWVyZ2VPYmplY3RzKGRyYXcsIC4uLmRyYXdzKTtcblxuICAgICAgICAvLyBSZW1vdmUgbGF5ZXIgbmFtZXMsIHRoZXkgd2VyZSBvbmx5IHVzZWQgdHJhbnNpZW50bHkgdG8gc29ydCBhbmQgY2FsY3VsYXRlIGZpbmFsIGxheWVyXG4gICAgICAgIC8vIChmaW5hbCBtZXJnZWQgbmFtZXMgd2lsbCBub3QgYmUgYWNjdXJhdGUgc2luY2Ugb25seSBvbmUgdHJlZSBjYW4gd2luKVxuICAgICAgICBkZWxldGUgZHJhdy5sYXllcl9uYW1lO1xuICAgIH1cblxuICAgIC8vIFNob3J0LWNpcmN1aXQgaWYgbm90IHZpc2libGVcbiAgICBpZiAoZHJhdy52aXNpYmxlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZHJhdztcbn1cblxuY29uc3QgYmxhY2tsaXN0ID0gWydhbnknLCAnYWxsJywgJ25vdCcsICdub25lJ107XG5cbmNsYXNzIExheWVyIHtcblxuICAgIGNvbnN0cnVjdG9yKHsgbGF5ZXIsIG5hbWUsIHBhcmVudCwgZHJhdywgdmlzaWJsZSwgZmlsdGVyIH0pIHtcbiAgICAgICAgdGhpcy5pZCA9IExheWVyLmlkKys7XG4gICAgICAgIHRoaXMuY29uZmlnID0gbGF5ZXI7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmZ1bGxfbmFtZSA9IHRoaXMucGFyZW50ID8gKHRoaXMucGFyZW50LmZ1bGxfbmFtZSArICc6JyArIHRoaXMubmFtZSkgOiB0aGlzLm5hbWU7XG4gICAgICAgIHRoaXMuZHJhdyA9IGRyYXc7XG4gICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyO1xuICAgICAgICB0aGlzLmlzX2J1aWx0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMudmlzaWJsZSA9IHZpc2libGUgIT09IHVuZGVmaW5lZCA/IHZpc2libGUgOiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQudmlzaWJsZSk7XG5cbiAgICAgICAgLy8gRGVub3JtYWxpemUgbGF5ZXIgbmFtZSB0byBkcmF3IGdyb3Vwc1xuICAgICAgICBpZiAodGhpcy5kcmF3KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBncm91cCBpbiB0aGlzLmRyYXcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcmF3W2dyb3VwXSA9PSBudWxsIHx8IHR5cGVvZiB0aGlzLmRyYXdbZ3JvdXBdICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGRyYXcgZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBEcmF3IGdyb3VwICcke2dyb3VwfScgZm9yIGxheWVyICR7dGhpcy5mdWxsX25hbWV9IGlzIGludmFsaWQsIG11c3QgYmUgYW4gb2JqZWN0LCBgO1xuICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYGJ1dCB3YXMgc2V0IHRvIFxcYCR7Z3JvdXB9OiAke3RoaXMuZHJhd1tncm91cF19XFxgIGluc3RlYWRgO1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBtc2cpOyAvLyBUT0RPOiBmaXJlIGV4dGVybmFsIGV2ZW50IHRoYXQgY2xpZW50cyB0byBzdWJzY3JpYmUgdG9cblxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5kcmF3W2dyb3VwXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd1tncm91cF0ubGF5ZXJfbmFtZSA9IHRoaXMuZnVsbF9uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJ1aWxkICgpIHtcbiAgICAgICAgbG9nKCd0cmFjZScsIGBCdWlsZGluZyBsYXllciAnJHt0aGlzLmZ1bGxfbmFtZX0nYCk7XG4gICAgICAgIHRoaXMuYnVpbGRGaWx0ZXIoKTtcbiAgICAgICAgdGhpcy5idWlsZERyYXcoKTtcbiAgICAgICAgdGhpcy5pc19idWlsdCA9IHRydWU7XG4gICAgfVxuXG4gICAgYnVpbGREcmF3KCkge1xuICAgICAgICB0aGlzLmRyYXcgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnModGhpcy5kcmF3LCBTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24pO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZWREcmF3ID0gY2FsY3VsYXRlRHJhdyh0aGlzKTtcbiAgICB9XG5cbiAgICBidWlsZEZpbHRlcigpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJfb3JpZ2luYWwgPSB0aGlzLmZpbHRlcjtcbiAgICAgICAgdGhpcy5maWx0ZXIgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnModGhpcy5maWx0ZXIsIFN0eWxlUGFyc2VyLndyYXBGdW5jdGlvbik7XG5cbiAgICAgICAgbGV0IHR5cGUgPSB0eXBlb2YgdGhpcy5maWx0ZXI7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlciAhPSBudWxsICYmIHR5cGUgIT09ICdvYmplY3QnICYmIHR5cGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEludmFsaWQgZmlsdGVyXG4gICAgICAgICAgICBsZXQgbXNnID0gYEZpbHRlciBmb3IgbGF5ZXIgJHt0aGlzLmZ1bGxfbmFtZX0gaXMgaW52YWxpZCwgZmlsdGVyIHZhbHVlIG11c3QgYmUgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uLCBgO1xuICAgICAgICAgICAgbXNnICs9IGBidXQgd2FzIHNldCB0byBcXGBmaWx0ZXI6ICR7dGhpcy5maWx0ZXJ9XFxgIGluc3RlYWRgO1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgbXNnKTsgLy8gVE9ETzogZmlyZSBleHRlcm5hbCBldmVudCB0aGF0IGNsaWVudHMgdG8gc3Vic2NyaWJlIHRvXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWlsZFpvb21zKCk7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkUHJvcE1hdGNoZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlciAhPSBudWxsICYmICh0eXBlb2YgdGhpcy5maWx0ZXIgPT09ICdmdW5jdGlvbicgfHwgT2JqZWN0LmtleXModGhpcy5maWx0ZXIpLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBtYXRjaCh0aGlzLmZpbHRlciwgRmlsdGVyT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgLy8gSW52YWxpZCBmaWx0ZXJcbiAgICAgICAgICAgIGxldCBtc2cgPSBgRmlsdGVyIGZvciBsYXllciAke3RoaXMuZnVsbF9uYW1lfSBpcyBpbnZhbGlkLCBcXGBmaWx0ZXI6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5maWx0ZXIpfVxcYCBgO1xuICAgICAgICAgICAgbXNnICs9IGBmYWlsZWQgd2l0aCBlcnJvciAnJHtlLm1lc3NhZ2V9Jywgc3RhY2sgdHJhY2U6ICR7ZS5zdGFja31gO1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgbXNnKTsgLy8gVE9ETzogZmlyZSBleHRlcm5hbCBldmVudCB0aGF0IGNsaWVudHMgdG8gc3Vic2NyaWJlIHRvXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBab29tcyBvZnRlbiBjdWxsIGxhcmdlIHN3YXRocyBvZiB0aGUgbGF5ZXIgdHJlZSwgc28gdGhleSBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgYW5kIGFyZSBjaGVja2VkIGZpcnN0XG4gICAgYnVpbGRab29tcygpIHtcbiAgICAgICAgbGV0IHpvb20gPSB0aGlzLmZpbHRlciAmJiB0aGlzLmZpbHRlci4kem9vbTtcbiAgICAgICAgbGV0IHp0eXBlID0gdHlwZW9mIHpvb207XG4gICAgICAgIGlmICh6b29tICE9IG51bGwgJiYgenR5cGUgIT09ICdmdW5jdGlvbicpIHsgLy8gZG9uJ3QgYWNjZWxlcmF0ZSBmdW5jdGlvbi1iYXNlZCBmaWx0ZXJzXG4gICAgICAgICAgICB0aGlzLnpvb21zID0ge307XG5cbiAgICAgICAgICAgIGlmICh6dHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvb21zW3pvb21dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoem9vbSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6PTA7IHogPCB6b29tLmxlbmd0aDsgeisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbXNbem9vbVt6XV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHp0eXBlID09PSAnb2JqZWN0JyAmJiAoem9vbS5taW4gIT0gbnVsbCB8fCB6b29tLm1heCAhPSBudWxsKSkge1xuICAgICAgICAgICAgICAgIGxldCB6bWluID0gem9vbS5taW4gfHwgMDtcbiAgICAgICAgICAgICAgICBsZXQgem1heCA9IHpvb20ubWF4IHx8IDI1OyAvLyBUT0RPOiByZXBsYWNlIGNvbnN0YW50IGZvciBtYXggcG9zc2libGUgem9vbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHo9em1pbjsgeiA8IHptYXg7IHorKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb21zW3pdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbHRlci4kem9vbTsgLy8gZG9uJ3QgcHJvY2VzcyB6b29tIHRocm91Z2ggdXN1YWwgZ2VuZXJpYyBmaWx0ZXIgbG9naWNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJ1aWxkUHJvcE1hdGNoZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5maWx0ZXIgfHwgQXJyYXkuaXNBcnJheSh0aGlzLmZpbHRlcikgfHwgdHlwZW9mIHRoaXMuZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKGJsYWNrbGlzdC5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMuZmlsdGVyW2tleV07XG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSB0eXBlb2YgdmFsO1xuICAgICAgICAgICAgICAgIGxldCBhcnJheSA9IEFycmF5LmlzQXJyYXkodmFsKTtcblxuICAgICAgICAgICAgICAgIGlmICghKGFycmF5IHx8IHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGtleVswXSA9PT0gJyQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRleHQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcyA9IHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMucHVzaChba2V5LnN1YnN0cmluZygxKSwgYXJyYXkgPyB2YWwgOiBbdmFsXV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmVhdHVyZSBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzID0gdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcy5wdXNoKFtrZXksIGFycmF5ID8gdmFsIDogW3ZhbF1dKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5maWx0ZXJba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZG9Qcm9wTWF0Y2hlcyAoY29udGV4dCkge1xuICAgICAgICBpZiAodGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXNbcl07XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IGNvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzW21hdGNoWzBdXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgbWF0Y2hbMV0uaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHI9MDsgciA8IHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzW3JdO1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBjb250ZXh0W21hdGNoWzBdXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgbWF0Y2hbMV0uaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZG9lc01hdGNoIChjb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc19idWlsdCkge1xuICAgICAgICAgICAgdGhpcy5idWlsZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gem9vbSBwcmUtZmlsdGVyOiBza2lwIHJlc3Qgb2YgZmlsdGVyIGlmIG91dCBvZiBsYXllciB6b29tIHJhbmdlXG4gICAgICAgIGlmICh0aGlzLnpvb21zICE9IG51bGwgJiYgIXRoaXMuem9vbXNbY29udGV4dC56b29tXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGlyZWN0IGZlYXR1cmUgcHJvcGVydHkgbWF0Y2hlc1xuICAgICAgICBpZiAoIXRoaXMuZG9Qcm9wTWF0Y2hlcyhjb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYW55IHJlbWFpbmluZyBmaWx0ZXIgKG1vcmUgY29tcGxleCBtYXRjaGVzIG9yIGR5bmFtaWMgZnVuY3Rpb24pXG4gICAgICAgIGlmICh0aGlzLmZpbHRlciBpbnN0YW5jZW9mIEZ1bmN0aW9uKXtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlsdGVyIGZ1bmN0aW9uIGVycm9yXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBGaWx0ZXIgZm9yIHRoaXMgJHt0aGlzLmZ1bGxfbmFtZX06IFxcYGZpbHRlcjogJHt0aGlzLmZpbHRlcl9vcmlnaW5hbH1cXGAgYDtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYGZhaWxlZCB3aXRoIGVycm9yICcke2Vycm9yLm1lc3NhZ2V9Jywgc3RhY2sgdHJhY2U6ICR7ZXJyb3Iuc3RhY2t9YDtcbiAgICAgICAgICAgICAgICBsb2coJ2Vycm9yJywgbXNnLCBjb250ZXh0LmZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyID09IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuTGF5ZXIuaWQgPSAwO1xuXG5cbmV4cG9ydCBjbGFzcyBMYXllckxlYWYgZXh0ZW5kcyBMYXllciB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICB0aGlzLmlzX2xlYWYgPSB0cnVlO1xuICAgIH1cblxufVxuXG5leHBvcnQgY2xhc3MgTGF5ZXJUcmVlIGV4dGVuZHMgTGF5ZXIge1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgdGhpcy5pc190cmVlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sYXllcnMgPSBjb25maWcubGF5ZXJzIHx8IFtdO1xuICAgIH1cblxuICAgIGFkZExheWVyIChsYXllcikge1xuICAgICAgICB0aGlzLmxheWVycy5wdXNoKGxheWVyKTtcbiAgICB9XG5cbiAgICBidWlsZERyYXdHcm91cHMgKGNvbnRleHQpIHtcbiAgICAgICAgbGV0IGxheWVycyA9IFtdLCBsYXllcl9pZHMgPSBbXTtcbiAgICAgICAgbWF0Y2hGZWF0dXJlKGNvbnRleHQsIFt0aGlzXSwgbGF5ZXJzLCBsYXllcl9pZHMpO1xuXG4gICAgICAgIGlmIChsYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGNhY2hlX2tleSA9IGNhY2hlS2V5KGxheWVyX2lkcyk7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgZXZhbHVhdGUgZWFjaCBsYXllciBjb21iaW5hdGlvbiBvbmNlICh1bmRlZmluZWQgbWVhbnMgbm90IHlldCBldmFsdWF0ZWQsXG4gICAgICAgICAgICAvLyBudWxsIG1lYW5zIGV2YWx1YXRlZCB3aXRoIG5vIGRyYXcgb2JqZWN0KVxuICAgICAgICAgICAgaWYgKGxheWVyX2NhY2hlW2NhY2hlX2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIEZpbmQgYWxsIHRoZSB1bmlxdWUgdmlzaWJsZSBkcmF3IGJsb2NrcyBmb3IgdGhpcyBsYXllciB0cmVlXG4gICAgICAgICAgICAgICAgbGV0IGRyYXdfZ3JvdXBzID0gbGF5ZXJzLm1hcCh4ID0+IHggJiYgeC52aXNpYmxlICE9PSBmYWxzZSAmJiB4LmNhbGN1bGF0ZWREcmF3KTtcbiAgICAgICAgICAgICAgICBsZXQgZHJhd19rZXlzID0ge307XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCByPTA7IHIgPCBkcmF3X2dyb3Vwcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGF5ZXIgPSBkcmF3X2dyb3Vwc1tyXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZz0wOyBnIDwgbGF5ZXIubGVuZ3RoOyBnKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGxheWVyW2ddO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19rZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGVhY2ggZHJhdyBncm91cFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGRyYXdfa2V5IGluIGRyYXdfa2V5cykge1xuICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldID0gbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV0gPSBtZXJnZVRyZWVzKGRyYXdfZ3JvdXBzLCBkcmF3X2tleSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzYXZlIHRoZSBvbmVzIHRoYXQgd2VyZW4ndCBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmICghbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldLmtleSA9IGNhY2hlX2tleSArICcvJyArIGRyYXdfa2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV0ubGF5ZXJzID0gbGF5ZXJzLm1hcCh4ID0+IHggJiYgeC5mdWxsX25hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTm8gbGF5ZXJzIGV2YWx1YXRlZFxuICAgICAgICAgICAgICAgIGlmIChsYXllcl9jYWNoZVtjYWNoZV9rZXldICYmIE9iamVjdC5rZXlzKGxheWVyX2NhY2hlW2NhY2hlX2tleV0pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5jb25zdCBGaWx0ZXJPcHRpb25zID0ge1xuICAgIC8vIEhhbmRsZSB1bml0IGNvbnZlcnNpb25zIG9uIGZpbHRlciByYW5nZXNcbiAgICByYW5nZVRyYW5zZm9ybSh2YWwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIHZhbC50cmltKCkuc2xpY2UoLTMpID09PSAncHgyJykge1xuICAgICAgICAgICAgcmV0dXJuIGAke3BhcnNlRmxvYXQodmFsKX0gKiBjb250ZXh0Lm1ldGVyc19wZXJfcGl4ZWxfc3FgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gaXNXaGl0ZUxpc3RlZChrZXkpIHtcbiAgICByZXR1cm4gd2hpdGVMaXN0LmluZGV4T2Yoa2V5KSA+IC0xO1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5KG9iaikge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwUHJvcHMob2JqKSB7XG4gICAgbGV0IHdoaXRlTGlzdGVkID0ge30sIG5vbldoaXRlTGlzdGVkID0ge307XG5cbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChpc1doaXRlTGlzdGVkKGtleSkpIHtcbiAgICAgICAgICAgIHdoaXRlTGlzdGVkW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vbldoaXRlTGlzdGVkW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3doaXRlTGlzdGVkLCBub25XaGl0ZUxpc3RlZF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVEcmF3KGxheWVyKSB7XG5cbiAgICBsZXQgZHJhdyAgPSBbXTtcblxuICAgIGlmIChsYXllci5wYXJlbnQpIHtcbiAgICAgICAgbGV0IGNzID0gbGF5ZXIucGFyZW50LmNhbGN1bGF0ZWREcmF3IHx8IFtdO1xuICAgICAgICBkcmF3LnB1c2goLi4uY3MpO1xuICAgIH1cblxuICAgIGRyYXcucHVzaChsYXllci5kcmF3KTtcbiAgICByZXR1cm4gZHJhdztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGF5ZXJUcmVlKG5hbWUsIGxheWVyLCBwYXJlbnQsIHN0eWxlcykge1xuXG4gICAgbGV0IHByb3BlcnRpZXMgPSB7IG5hbWUsIGxheWVyLCBwYXJlbnQgfTtcbiAgICBsZXQgW3doaXRlTGlzdGVkLCBub25XaGl0ZUxpc3RlZF0gPSBncm91cFByb3BzKGxheWVyKTtcbiAgICBsZXQgZW1wdHkgPSBpc0VtcHR5KG5vbldoaXRlTGlzdGVkKTtcbiAgICBsZXQgQ3JlYXRlO1xuXG4gICAgaWYgKGVtcHR5ICYmIHBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgIENyZWF0ZSA9IExheWVyTGVhZjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBDcmVhdGUgPSBMYXllclRyZWU7XG4gICAgfVxuXG4gICAgbGV0IHIgPSBuZXcgQ3JlYXRlKE9iamVjdC5hc3NpZ24ocHJvcGVydGllcywgd2hpdGVMaXN0ZWQpKTtcblxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcGFyZW50LmFkZExheWVyKHIpO1xuICAgIH1cblxuICAgIGlmICghZW1wdHkpIHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIG5vbldoaXRlTGlzdGVkKSB7XG4gICAgICAgICAgICBsZXQgcHJvcGVydHkgPSBub25XaGl0ZUxpc3RlZFtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VMYXllclRyZWUoa2V5LCBwcm9wZXJ0eSwgciwgc3R5bGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW52YWxpZCBsYXllclxuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgTGF5ZXIgdmFsdWUgbXVzdCBiZSBhbiBvYmplY3Q6IGNhbm5vdCBjcmVhdGUgbGF5ZXIgJyR7a2V5fTogJHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eSl9J2A7XG4gICAgICAgICAgICAgICAgbXNnICs9IGAsIHVuZGVyIHBhcmVudCBsYXllciAnJHtyLmZ1bGxfbmFtZX0nLmA7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGFyZW50IGlzIGEgc3R5bGUgbmFtZSwgdGhpcyBtYXkgYmUgYW4gaW5jb3JyZWN0bHkgbmVzdGVkIGxheWVyXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlc1tyLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIG1zZyArPSBgIFRoZSBwYXJlbnQgbmFtZSAnJHtyLm5hbWV9JyBpcyBhbHNvIHRoZSBuYW1lIG9mIGEgc3R5bGUsIGRpZCB5b3UgbWVhbiB0byBjcmVhdGUgYSAnZHJhdycgZ3JvdXBgO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYCB1bmRlciAnJHtwYXJlbnQubmFtZX0nYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYCBpbnN0ZWFkP2A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7IC8vIFRPRE86IGZpcmUgZXh0ZXJuYWwgZXZlbnQgdGhhdCBjbGllbnRzIHRvIHN1YnNjcmliZSB0b1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMYXllcnMgKGxheWVycywgc3R5bGVzKSB7XG4gICAgbGV0IGxheWVyX3RyZWVzID0ge307XG5cbiAgICBmb3IgKGxldCBrZXkgaW4gbGF5ZXJzKSB7XG4gICAgICAgIGxldCBsYXllciA9IGxheWVyc1trZXldO1xuICAgICAgICBpZiAobGF5ZXIpIHtcbiAgICAgICAgICAgIGxheWVyX3RyZWVzW2tleV0gPSBwYXJzZUxheWVyVHJlZShrZXksIGxheWVyLCBudWxsLCBzdHlsZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxheWVyX3RyZWVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGZWF0dXJlKGNvbnRleHQsIGxheWVycywgY29sbGVjdGVkX2xheWVycywgY29sbGVjdGVkX2xheWVyc19pZHMpIHtcbiAgICBsZXQgbWF0Y2hlZCA9IGZhbHNlO1xuICAgIGxldCBjaGlsZE1hdGNoZWQgPSBmYWxzZTtcblxuICAgIGlmIChsYXllcnMubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuXG4gICAgZm9yIChsZXQgcj0wOyByIDwgbGF5ZXJzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gbGF5ZXJzW3JdO1xuXG4gICAgICAgIGlmIChjdXJyZW50LmlzX2xlYWYpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50LmRvZXNNYXRjaChjb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnMucHVzaChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzX2lkcy5wdXNoKGN1cnJlbnQuaWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5pc190cmVlKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5kb2VzTWF0Y2goY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGNoaWxkTWF0Y2hlZCA9IG1hdGNoRmVhdHVyZShcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5sYXllcnMsXG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnMsXG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnNfaWRzXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghY2hpbGRNYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnMucHVzaChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVyc19pZHMucHVzaChjdXJyZW50LmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hlZDtcbn1cbiIsIi8vIFJlbmRlcnMgYW4gYXJyYXkgc3BlY2lmeWluZyBhIGxpbmUgcGF0dGVybiBvZiBhbHRlcm5hdGluZyBkYXNoZXMgYW5kIHNwYWNlcyxcbi8vIHNpbWlsYXIgdG8gYW4gU1ZHIGBkYXNoYXJyYXlgIG9yIENhbnZhcyBzZXRMaW5lRGFzaCgpLCBpbnRvIGEgYnl0ZSBhcnJheSBvZiBSR0JBIHBpeGVsc1xuLy8gUmV0dXJuczpcbi8vIHtcbi8vICAgIHBpeGVsOiByZW5kZXJlZCBpbWFnZSBpbiBVaW50OEFycmF5IGJ1ZmZlclxuLy8gICAgbGVuZ3RoOiBwaXhlbCBsZW5ndGggb2YgcmVuZGVyZWQgZGFzaCBwYXR0ZXJuIChzdW0gb2YgYWxsIGRhc2hlcyBhbmQgc3BhY2VzKVxuLy8gfVxuLy9cbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9TVkcvcGFpbnRpbmcuaHRtbCNTdHJva2VEYXNoYXJyYXlQcm9wZXJ0eVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvU1ZHL0F0dHJpYnV0ZS9zdHJva2UtZGFzaGFycmF5XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEL3NldExpbmVEYXNoXG5cbmNvbnN0IGRlZmF1bHRfZGFzaF9jb2xvciA9IFsyNTUsIDI1NSwgMjU1LCAyNTVdO1xuY29uc3QgZGVmYXVsdF9iYWNrZ3JvdW5kX2NvbG9yID0gWzAsIDAsIDAsIDBdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZW5kZXJEYXNoQXJyYXkgKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGRhc2hfcGl4ZWwgPSBvcHRpb25zLmRhc2hfY29sb3IgfHwgZGVmYXVsdF9kYXNoX2NvbG9yO1xuICAgIGNvbnN0IGJhY2tncm91bmRfY29sb3IgPSBvcHRpb25zLmJhY2tncm91bmRfY29sb3IgfHwgZGVmYXVsdF9iYWNrZ3JvdW5kX2NvbG9yO1xuICAgIGNvbnN0IGRhc2hlcyA9IHBhdHRlcm47XG4gICAgY29uc3Qgc2NhbGUgPSBvcHRpb25zLnNjYWxlIHx8IDE7XG5cbiAgICAvLyBJZiBwYXR0ZXJuIGlzIG9kZCwgcmVwZWF0IGl0IHRvIG1ha2UgaXQgZXZlbiAoc2VlIFNWRyBzcGVjKVxuICAgIGlmIChkYXNoZXMubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkYXNoZXMsIGRhc2hlcyk7XG4gICAgfVxuXG4gICAgbGV0IGRhc2ggPSB0cnVlO1xuICAgIGxldCBwaXhlbHMgPSBbXTtcbiAgICBmb3IgKGxldCBpPTA7IGkgPCBkYXNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNlZ21lbnQgPSBNYXRoLmZsb29yKGRhc2hlc1tpXSAqIHNjYWxlKTtcbiAgICAgICAgZm9yIChsZXQgcz0wOyBzIDwgc2VnbWVudDsgcysrKSB7XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShwaXhlbHMsIGRhc2ggPyBkYXNoX3BpeGVsIDogYmFja2dyb3VuZF9jb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgZGFzaCA9ICFkYXNoOyAvLyBhbHRlcm5hdGUgYmV0d2VlbiBkYXNoZXMgYW5kIHNwYWNlc1xuICAgIH1cblxuICAgIHBpeGVscyA9IG5ldyBVaW50OEFycmF5KHBpeGVscyk7IC8vIGNvbnZlcnQgdG8gdHlwZWQgYXJyYXlcbiAgICBjb25zdCBsZW5ndGggPSBwaXhlbHMubGVuZ3RoIC8gNDsgLy8gb25lIFJHQkEgYnl0ZSBzZXF1ZW5jZXMgdG8gb25lIHBpeGVsXG5cbiAgICByZXR1cm4geyBwaXhlbHMsIGxlbmd0aCB9O1xufVxuIiwiLy8gTGluZSByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IHtTdHlsZX0gZnJvbSAnLi4vc3R5bGUnO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBnbCBmcm9tICcuLi8uLi9nbC9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vLi4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgVmVydGV4TGF5b3V0IGZyb20gJy4uLy4uL2dsL3ZlcnRleF9sYXlvdXQnO1xuaW1wb3J0IHtidWlsZFBvbHlsaW5lc30gZnJvbSAnLi4vLi4vYnVpbGRlcnMvcG9seWxpbmVzJztcbmltcG9ydCByZW5kZXJEYXNoQXJyYXkgZnJvbSAnLi9kYXNoYXJyYXknO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IHtzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXgsIHNoYWRlclNyY19wb2x5Z29uc0ZyYWdtZW50fSBmcm9tICcuLi9wb2x5Z29ucy9wb2x5Z29ucyc7XG5cbmV4cG9ydCB2YXIgTGluZXMgPSBPYmplY3QuY3JlYXRlKFN0eWxlKTtcblxuT2JqZWN0LmFzc2lnbihMaW5lcywge1xuICAgIG5hbWU6ICdsaW5lcycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgdmVydGV4X3NoYWRlcl9zcmM6IHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCxcbiAgICBmcmFnbWVudF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudCxcbiAgICBzZWxlY3Rpb246IHRydWUsIC8vIHR1cm4gZmVhdHVyZSBzZWxlY3Rpb24gb25cblxuICAgIGluaXQoKSB7XG4gICAgICAgIFN0eWxlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBCYXNpYyBhdHRyaWJ1dGVzLCBvdGhlcnMgY2FuIGJlIGFkZGVkIChzZWUgdGV4dHVyZSBVVnMgYmVsb3cpXG4gICAgICAgIHZhciBhdHRyaWJzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9wb3NpdGlvbicsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9leHRydWRlJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9XG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gVGVsbCB0aGUgc2hhZGVyIHdlIHdhbnQgYSBvcmRlciBpbiB2ZXJ0ZXggYXR0cmlidXRlcywgYW5kIHRvIGV4dHJ1ZGUgbGluZXNcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTEFZRVJfT1JERVIgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9FWFRSVURFX0xJTkVTID0gdHJ1ZTtcblxuICAgICAgICAvLyBPcHRpb25hbCBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3NlbGVjdGlvbl9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCBsaW5lIHRleHR1cmUgb3IgZGFzaCBhcnJheVxuICAgICAgICAvLyAobGF0dGVyIHdpbGwgYmUgcmVuZGVyZWQgYXQgY29tcGlsZS10aW1lLCB3aGVuIEdMIGNvbnRleHQgYXZhaWxhYmxlKVxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlIHx8IHRoaXMuZGFzaCkge1xuICAgICAgICAgICAgdGhpcy50ZXhjb29yZHMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgdGV4dHVyZSBVVnNcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9URVhUVVJFX0NPT1JEUyA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIFNjYWxpbmcgZmFjdG9yIHRvIGFkZCBwcmVjaXNpb24gdG8gbGluZSB0ZXh0dXJlIFYgY29vcmRpbmF0ZSBwYWNrZWQgYXMgbm9ybWFsaXplZCBzaG9ydFxuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fREFTSF9TQ0FMRSA9IDE7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9WX1NDQUxFX0FESlVTVCA9IEdlby50aWxlX3NjYWxlICogdGhpcy5kZWZpbmVzLlRBTkdSQU1fREFTSF9TQ0FMRTtcblxuICAgICAgICAgICAgLy8gQWRkIHZlcnRleCBhdHRyaWJ1dGUgZm9yIFVWcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV90ZXhjb29yZCcsIHNpemU6IDIsIHR5cGU6IGdsLlVOU0lHTkVEX1NIT1JULCBub3JtYWxpemVkOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gbmV3IFZlcnRleExheW91dChhdHRyaWJzKTtcblxuICAgICAgICAvLyBBZGRpdGlvbmFsIHNpbmdsZS1hbGxvY2F0ZWQgb2JqZWN0IHVzZWQgZm9yIGhvbGRpbmcgb3V0bGluZSBzdHlsZSBhcyBpdCBpcyBwcm9jZXNzZWRcbiAgICAgICAgLy8gU2VwYXJhdGUgZnJvbSB0aGlzLmZlYXR1cmVfc3R5bGUgc28gdGhhdCBvdXRsaW5lIHByb3BlcnRpZXMgZG8gbm90IG92ZXJ3cml0ZSBjYWxjdWxhdGVkXG4gICAgICAgIC8vIGlubGluZSBwcm9wZXJ0aWVzIChvdXRsaW5lIGNhbGwgaXMgbWFkZSAqd2l0aGluKiB0aGUgaW5saW5lIGNhbGwpXG4gICAgICAgIHRoaXMub3V0bGluZV9mZWF0dXJlX3N0eWxlID0ge307XG4gICAgICAgIHRoaXMuaW5saW5lX2ZlYXR1cmVfc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7IC8vIHNhdmUgcmVmZXJlbmNlIHRvIG1haW4gY29tcHV0ZWQgc3R5bGUgb2JqZWN0XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgY29tcGlsZSAoKSB7XG4gICAgICAgIHRoaXMucGFyc2VMaW5lVGV4dHVyZSgpO1xuICAgICAgICByZXR1cm4gU3R5bGUuY29tcGlsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICAvLyBPcHRpb25hbGx5IGFwcGx5IGEgZGFzaCBhcnJheSBwYXR0ZXJuIHRvIHRoaXMgbGluZVxuICAgIHBhcnNlTGluZVRleHR1cmUgKCkge1xuICAgICAgICAvLyBTcGVjaWZ5IGEgbGluZSBwYXR0ZXJuXG4gICAgICAgIGlmICh0aGlzLmRhc2gpIHtcbiAgICAgICAgICAgIC8vIE9wdGlvbmFsIGJhY2tncm91bmQgY29sb3IgZm9yIGRhc2ggcGF0dGVybiAoZGVmYXVsdHMgdHJhbnNwYXJlbnQpXG4gICAgICAgICAgICBpZiAodGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvciA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IodGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xJTkVfQkFDS0dST1VORF9DT0xPUiA9XG4gICAgICAgICAgICAgICAgICAgIGB2ZWMzKCR7dGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3Iuc2xpY2UoMCwgMykuam9pbignLCAnKX0pYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRqdXN0IHRleGNvb3JkIHNjYWxlIHRvIGFsbG93IGZvciBkYXNoIHBhdHRlcm5zIHRoYXQgYXJlIGEgZnJhY3Rpb24gb2YgbGluZSB3aWR0aFxuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fREFTSF9TQ0FMRSA9IDIwO1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVl9TQ0FMRV9BREpVU1QgPSBHZW8udGlsZV9zY2FsZSAqIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEU7XG5cbiAgICAgICAgICAgIC8vIFJlbmRlciBsaW5lIHBhdHRlcm5cbiAgICAgICAgICAgIGNvbnN0IGRhc2ggPSByZW5kZXJEYXNoQXJyYXkodGhpcy5kYXNoLCB7IHNjYWxlOiB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFIH0pO1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gJ18nICsgdGhpcy5uYW1lICsgJ19kYXNoYXJyYXknO1xuICAgICAgICAgICAgVGV4dHVyZS5jcmVhdGUodGhpcy5nbCwgdGhpcy50ZXh0dXJlLCB7XG4gICAgICAgICAgICAgICAgZGF0YTogZGFzaC5waXhlbHMsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBkYXNoLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6ICduZWFyZXN0J1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTcGVjaWZ5IGEgbGluZSB0ZXh0dXJlIChlaXRoZXIgZGlyZWN0bHksIG9yIHJlbmRlcmVkIGRhc2ggcGF0dGVybiBmcm9tIGFib3ZlKVxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9MSU5FX1RFWFRVUkUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fQUxQSEFfVEVTVCA9IDAuNTsgLy8gcGl4ZWxzIGJlbG93IHRoaXMgdGhyZXNob2xkIGFyZSB0cmFuc3BhcmVudFxuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zID0gdGhpcy5zaGFkZXJzLnVuaWZvcm1zIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfdGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmVfcmF0aW8gPSAxO1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgbGluZSBwYXR0ZXJuIGFzcGVjdCByYXRpbyBhZnRlciB0ZXh0dXJlIGxvYWRzXG4gICAgICAgICAgICBUZXh0dXJlLmdldEluZm8odGhpcy50ZXh0dXJlKS50aGVuKHRleHR1cmUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmVfcmF0aW8gPSB0ZXh0dXJlLmhlaWdodCAvIHRleHR1cmUud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQ2FsY3VsYXRlIHdpZHRoIGF0IHpvb20gZ2l2ZW4gaW4gYGNvbnRleHRgXG4gICAgY2FsY1dpZHRoICh3aWR0aCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gKHdpZHRoICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KHdpZHRoLCBjb250ZXh0KSkgfHwgMDtcbiAgICB9LFxuXG4gICAgLy8gQ2FsY3VsYXRlIHdpZHRoIGF0IG5leHQgem9vbSAodXNlZCBmb3IgbGluZSB3aWR0aCBpbnRlcnBvbGF0aW9uKVxuICAgIGNhbGNXaWR0aE5leHRab29tICh3aWR0aCwgY29udGV4dCkge1xuICAgICAgICBjb250ZXh0Lnpvb20rKztcbiAgICAgICAgbGV0IHZhbCA9IHRoaXMuY2FsY1dpZHRoKHdpZHRoLCBjb250ZXh0KTtcbiAgICAgICAgY29udGV4dC56b29tLS07XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIF9wYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlO1xuXG4gICAgICAgIC8vIGxpbmUgd2lkdGggaW4gbWV0ZXJzXG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuY2FsY1dpZHRoKGRyYXcud2lkdGgsIGNvbnRleHQpO1xuICAgICAgICBpZiAod2lkdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIHNraXAgbGluZXMgd2l0aCBuZWdhdGl2ZSB3aWR0aFxuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0X3dpZHRoID0gdGhpcy5jYWxjV2lkdGhOZXh0Wm9vbShkcmF3Lm5leHRfd2lkdGgsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICgod2lkdGggPT09IDAgJiYgbmV4dF93aWR0aCA9PT0gMCkgfHwgbmV4dF93aWR0aCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCBsaW5lcyB0aGF0IGRvbid0IGludGVycG9sYXRlIHRvIGEgcG9zaXRpdmUgdmFsdWUgYXQgbmV4dCB6b29tXG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb252ZXJ0IHRvIHVuaXRzIGFuZCByZWxhdGl2ZSBjaGFuZ2UgZnJvbSBwcmV2aW91cyB6b29tXG4gICAgICAgIC8vIE5COiBtdWx0aXBseSBieSAyIGJlY2F1c2UgYSBnaXZlbiB3aWR0aCBpcyB0d2ljZSBhcyBiaWcgaW4gc2NyZWVuIHNwYWNlIGF0IHRoZSBuZXh0IHpvb21cbiAgICAgICAgc3R5bGUud2lkdGggPSB3aWR0aCAqIGNvbnRleHQudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tO1xuICAgICAgICBzdHlsZS5uZXh0X3dpZHRoID0gKG5leHRfd2lkdGggKiAyKSAtIHdpZHRoO1xuICAgICAgICBzdHlsZS5uZXh0X3dpZHRoICo9IGNvbnRleHQudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tO1xuICAgICAgICBzdHlsZS5uZXh0X3dpZHRoIC89IDI7IC8vIE5COiBkaXZpZGUgYnkgMiBiZWNhdXNlIGV4dHJ1c2lvbiB3aWR0aCBpcyBoYWx2ZWQgaW4gYnVpbGRlciAtIHJlbW92ZT9cblxuICAgICAgICBzdHlsZS5jb2xvciA9IHRoaXMucGFyc2VDb2xvcihkcmF3LmNvbG9yLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzdHlsZS5jb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGVpZ2h0IGRlZmF1bHRzIHRvIGZlYXR1cmUgaGVpZ2h0LCBidXQgZXh0cnVkZSBzdHlsZSBjYW4gZHluYW1pY2FsbHkgYWRqdXN0IGhlaWdodCBieSByZXR1cm5pbmcgYSBudW1iZXIgb3IgYXJyYXkgKGluc3RlYWQgb2YgYSBib29sZWFuKVxuICAgICAgICBzdHlsZS56ID0gKGRyYXcueiAmJiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkRGlzdGFuY2VQcm9wZXJ0eShkcmF3LnogfHwgMCwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG4gICAgICAgIHN0eWxlLmhlaWdodCA9IGZlYXR1cmUucHJvcGVydGllcy5oZWlnaHQgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuaGVpZ2h0O1xuICAgICAgICBzdHlsZS5leHRydWRlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuZXh0cnVkZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHN0eWxlLmV4dHJ1ZGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc3R5bGUuZXh0cnVkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUuZXh0cnVkZSkpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmFpc2UgbGluZSBoZWlnaHQgaWYgZXh0cnVkZWRcbiAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUgJiYgc3R5bGUuaGVpZ2h0KSB7XG4gICAgICAgICAgICBzdHlsZS56ICs9IHN0eWxlLmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnogKj0gR2VvLmhlaWdodF9zY2FsZTsgICAgICAgIC8vIHByb3ZpZGUgc3ViLW1ldGVyIHByZWNpc2lvbiBvZiBoZWlnaHQgdmFsdWVzXG4gICAgICAgIHN0eWxlLmhlaWdodCAqPSBHZW8uaGVpZ2h0X3NjYWxlO1xuXG4gICAgICAgIHN0eWxlLmNhcCA9IGRyYXcuY2FwO1xuICAgICAgICBzdHlsZS5qb2luID0gZHJhdy5qb2luO1xuICAgICAgICBzdHlsZS5taXRlcl9saW1pdCA9IGRyYXcubWl0ZXJfbGltaXQ7XG4gICAgICAgIHN0eWxlLnRpbGVfZWRnZXMgPSBkcmF3LnRpbGVfZWRnZXM7IC8vIHVzdWFsbHkgYWN0aXZhdGVkIGZvciBkZWJ1Z2dpbmcsIG9yIHJhcmUgdmlzdWFsaXphdGlvbiBuZWVkc1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhbiBvdXRsaW5lIHN0eWxlXG4gICAgICAgIC8vIFJldXNhYmxlIG91dGxpbmUgc3R5bGUgb2JqZWN0LCBtYXJrZWQgYXMgYWxyZWFkeSB3cmFwcGVkIGluIGNhY2hlIG9iamVjdHMgKHByZXByb2Nlc3NlZCA9IHRydWUpXG4gICAgICAgIHN0eWxlLm91dGxpbmUgPSBzdHlsZS5vdXRsaW5lIHx8IHsgd2lkdGg6IHt9LCBuZXh0X3dpZHRoOiB7fSwgcHJlcHJvY2Vzc2VkOiB0cnVlIH07XG5cbiAgICAgICAgaWYgKGRyYXcub3V0bGluZSAmJiBkcmF3Lm91dGxpbmUudmlzaWJsZSAhPT0gZmFsc2UgJiYgZHJhdy5vdXRsaW5lLmNvbG9yICYmIGRyYXcub3V0bGluZS53aWR0aCkge1xuICAgICAgICAgICAgLy8gb3V0bGluZSB3aWR0aCBpbiBtZXRlcnNcbiAgICAgICAgICAgIC8vIE5COiBtdWx0aXBseSBieSAyIGJlY2F1c2Ugb3V0bGluZSBpcyBhcHBsaWVkIG9uIGJvdGggc2lkZXMgb2YgbGluZVxuICAgICAgICAgICAgbGV0IG91dGxpbmVfd2lkdGggPSB0aGlzLmNhbGNXaWR0aChkcmF3Lm91dGxpbmUud2lkdGgsIGNvbnRleHQpICogMjtcbiAgICAgICAgICAgIGxldCBvdXRsaW5lX25leHRfd2lkdGggPSB0aGlzLmNhbGNXaWR0aE5leHRab29tKGRyYXcub3V0bGluZS5uZXh0X3dpZHRoLCBjb250ZXh0KSAqIDI7XG5cbiAgICAgICAgICAgIGlmICgob3V0bGluZV93aWR0aCA9PT0gMCAmJiBvdXRsaW5lX25leHRfd2lkdGggPT09IDApIHx8IG91dGxpbmVfd2lkdGggPCAwIHx8IG91dGxpbmVfbmV4dF93aWR0aCA8IDApIHtcbiAgICAgICAgICAgICAgICAvLyBza2lwIGxpbmVzIHRoYXQgZG9uJ3QgaW50ZXJwb2xhdGUgYmV0d2VlbiB6ZXJvIG9yIGdyZWF0ZXIgd2lkdGhcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm5leHRfd2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuY29sb3IgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTWFpbnRhaW4gY29uc2lzdGVudCBvdXRsaW5lIHdpZHRoIGFyb3VuZCB0aGUgbGluZSBmaWxsXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSA9IG91dGxpbmVfd2lkdGggKyB3aWR0aDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm5leHRfd2lkdGgudmFsdWUgPSBvdXRsaW5lX25leHRfd2lkdGggKyBuZXh0X3dpZHRoO1xuXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jb2xvciA9IGRyYXcub3V0bGluZS5jb2xvcjtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmNhcCA9IGRyYXcub3V0bGluZS5jYXAgfHwgZHJhdy5jYXA7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5qb2luID0gZHJhdy5vdXRsaW5lLmpvaW4gfHwgZHJhdy5qb2luO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUubWl0ZXJfbGltaXQgPSBkcmF3Lm91dGxpbmUubWl0ZXJfbGltaXQgfHwgZHJhdy5taXRlcl9saW1pdDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLnN0eWxlID0gZHJhdy5vdXRsaW5lLnN0eWxlIHx8IHRoaXMubmFtZTtcblxuICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgZGVmaW5lZCBvdXRsaW5lIG9yZGVyLCBvciBpbmhlcml0ZWQgZnJvbSBpbm5lciBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKGRyYXcub3V0bGluZS5vcmRlcikge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyID0gdGhpcy5wYXJzZU9yZGVyKGRyYXcub3V0bGluZS5vcmRlciwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyID0gc3R5bGUub3JkZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgbGV0IG91dGxpbmUgYmUgYWJvdmUgaW5uZXIgbGluZVxuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5vdXRsaW5lLm9yZGVyID4gc3R5bGUub3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5vcmRlciA9IHN0eWxlLm9yZGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE91dGxpbmVzIGFyZSBhbHdheXMgYXQgaGFsZi1sYXllciBpbnRlcnZhbHMgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aCBpbm5lciBsaW5lc1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUub3JkZXIgLT0gMC41O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm5leHRfd2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jb2xvciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgfSxcblxuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIGRyYXcuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5jb2xvcik7XG4gICAgICAgIGRyYXcud2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuICAgICAgICBkcmF3Lm5leHRfd2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpOyAvLyB3aWR0aCB3aWxsIGJlIGNvbXB1dGVkIGZvciBuZXh0IHpvb21cbiAgICAgICAgZHJhdy56ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnosIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuXG4gICAgICAgIGlmIChkcmF3Lm91dGxpbmUpIHtcbiAgICAgICAgICAgIGRyYXcub3V0bGluZS5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZUNvbG9yUHJvcGVydHlDYWNoZShkcmF3Lm91dGxpbmUuY29sb3IpO1xuICAgICAgICAgICAgZHJhdy5vdXRsaW5lLndpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm91dGxpbmUud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuICAgICAgICAgICAgZHJhdy5vdXRsaW5lLm5leHRfd2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub3V0bGluZS53aWR0aCwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7IC8vIHdpZHRoIHJlLWNvbXB1dGVkIGZvciBuZXh0IHpvb21cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBcInRlbXBsYXRlXCIgdGhhdCBzZXRzIGNvbnN0YW50IGF0dGlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXgsIHdoaWNoIGlzIHRoZW4gbW9kaWZpZWQgcGVyIHZlcnRleCBvciBwZXIgZmVhdHVyZS5cbiAgICAgKiBBIHBsYWluIEpTIGFycmF5IG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAgKi9cbiAgICBtYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuXG4gICAgICAgIC8vIHBvc2l0aW9uIC0geCAmIHkgY29vcmRzIHdpbGwgYmUgZmlsbGVkIGluIHBlci12ZXJ0ZXggYmVsb3dcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUueiB8fCAwO1xuXG4gICAgICAgIC8vIGxheWVyIG9yZGVyIC0gdyBjb29yZCBvZiAncG9zaXRpb24nIGF0dHJpYnV0ZSAoZm9yIHBhY2tpbmcgZWZmaWNpZW5jeSlcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHRoaXMuc2NhbGVPcmRlcihzdHlsZS5vcmRlcik7XG5cbiAgICAgICAgLy8gZXh0cnVzaW9uIHZlY3RvclxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuXG4gICAgICAgIC8vIHNjYWxpbmcgdG8gcHJldmlvdXMgYW5kIG5leHQgem9vbVxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUubmV4dF93aWR0aDtcblxuICAgICAgICAvLyBjb2xvclxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMF0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsxXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzJdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbM10gKiAyNTU7XG5cbiAgICAgICAgLy8gc2VsZWN0aW9uIGNvbG9yXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclswXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMV0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzJdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclszXSAqIDI1NTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0ZXh0dXJlIFVWcyB0byB0ZW1wbGF0ZSBvbmx5IGlmIG5lZWRlZFxuICAgICAgICBpZiAodGhpcy50ZXhjb29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy52ZXJ0ZXhfdGVtcGxhdGU7XG4gICAgfSxcblxuICAgIGJ1aWxkTGluZXMobGluZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICAvLyBPdXRsaW5lIChidWlsZCBmaXJzdCBzbyB0aGF0IGJsZW5kZWQgZ2VvbWV0cnkgd2l0aG91dCBhIGRlcHRoIHRlc3QgaXMgZHJhd24gZmlyc3QvdW5kZXIgdGhlIGlubmVyIGxpbmUpXG4gICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHRoaXMub3V0bGluZV9mZWF0dXJlX3N0eWxlOyAvLyBzd2FwIGluIG91dGxpbmUtc3BlY2lmaWMgc3R5bGUgaG9sZGVyXG4gICAgICAgIGlmIChzdHlsZS5vdXRsaW5lICYmIHN0eWxlLm91dGxpbmUuY29sb3IgIT0gbnVsbCAmJiBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBvdXRsaW5lX3N0eWxlID0gdGhpcy5zdHlsZXNbc3R5bGUub3V0bGluZS5zdHlsZV07XG4gICAgICAgICAgICBpZiAob3V0bGluZV9zdHlsZSkge1xuICAgICAgICAgICAgICAgIG91dGxpbmVfc3R5bGUuYWRkRmVhdHVyZShjb250ZXh0LmZlYXR1cmUsIHN0eWxlLm91dGxpbmUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFpbiBsaW5lXG4gICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHRoaXMuaW5saW5lX2ZlYXR1cmVfc3R5bGU7IC8vIHJlc3RvcmUgY2FsY3VsYXRlZCBzdHlsZSBmb3IgaW5saW5lXG4gICAgICAgIGxldCB2ZXJ0ZXhfdGVtcGxhdGUgPSB0aGlzLm1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSk7XG4gICAgICAgIGJ1aWxkUG9seWxpbmVzKFxuICAgICAgICAgICAgbGluZXMsXG4gICAgICAgICAgICBzdHlsZS53aWR0aCxcbiAgICAgICAgICAgIHZlcnRleF9kYXRhLFxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhcDogc3R5bGUuY2FwLFxuICAgICAgICAgICAgICAgIGpvaW46IHN0eWxlLmpvaW4sXG4gICAgICAgICAgICAgICAgbWl0ZXJfbGltaXQ6IHN0eWxlLm1pdGVyX2xpbWl0LFxuICAgICAgICAgICAgICAgIHNjYWxpbmdfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX2V4dHJ1ZGUsXG4gICAgICAgICAgICAgICAgc2NhbGluZ19ub3JtYWxpemU6IDI1NiwgLy8gdmFsdWVzIGhhdmUgYW4gOC1iaXQgZnJhY3Rpb25cbiAgICAgICAgICAgICAgICB0ZXhjb29yZF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfdGV4Y29vcmQsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfd2lkdGg6IChzdHlsZS53aWR0aCB8fCBzdHlsZS5uZXh0X3dpZHRoKSAvIGNvbnRleHQudGlsZS5vdmVyem9vbTIsIC8vIFVWcyBjYW4ndCBjYWxjIGZvciB6ZXJvLXdpZHRoLCB1c2UgbmV4dCB6b29tIHdpZHRoIGluIHRoYXQgY2FzZVxuICAgICAgICAgICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZTogNjU1MzUsIC8vIHNjYWxlIFVWcyB0byB1bnNpZ25lZCBzaG9ydHNcbiAgICAgICAgICAgICAgICBjbG9zZWRfcG9seWdvbjogb3B0aW9ucyAmJiBvcHRpb25zLmNsb3NlZF9wb2x5Z29uLFxuICAgICAgICAgICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzOiAhc3R5bGUudGlsZV9lZGdlcyAmJiBvcHRpb25zICYmIG9wdGlvbnMucmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgICAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZTogR2VvLnRpbGVfc2NhbGUgKiBjb250ZXh0LnRpbGUucGFkX3NjYWxlICogNFxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBidWlsZFBvbHlnb25zKHBvbHlnb25zLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gUmVuZGVyIHBvbHlnb25zIGFzIGluZGl2aWR1YWwgbGluZXNcbiAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgcG9seWdvbnMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lcyhwb2x5Z29uc1twXSwgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0LCB7IGNsb3NlZF9wb2x5Z29uOiB0cnVlLCByZW1vdmVfdGlsZV9lZGdlczogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxufSk7XG4iLCIvLyBQb2ludCArIHRleHQgbGFiZWwgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCBsb2cgZnJvbSAnLi4vLi4vdXRpbHMvbG9nJztcbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgZ2wgZnJvbSAnLi4vLi4vZ2wvY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBWZXJ0ZXhMYXlvdXQgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2xheW91dCc7XG5pbXBvcnQge2J1aWxkUXVhZHNGb3JQb2ludHN9IGZyb20gJy4uLy4uL2J1aWxkZXJzL3BvaW50cyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi8uLi9nbC90ZXh0dXJlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi4vLi4vdmVjdG9yJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi4vLi4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgTGFiZWxQb2ludCBmcm9tICcuLi8uLi9sYWJlbHMvbGFiZWxfcG9pbnQnO1xuaW1wb3J0IHBsYWNlUG9pbnRzT25MaW5lIGZyb20gJy4uLy4uL2xhYmVscy9wb2ludF9wbGFjZW1lbnQnO1xuaW1wb3J0IHtUZXh0TGFiZWxzfSBmcm9tICcuLi90ZXh0L3RleHRfbGFiZWxzJztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoYWRlclNyY19wb2ludHNWZXJ0ZXggPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2ludHNfdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3BvaW50c0ZyYWdtZW50ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9pbnRzX2ZyYWdtZW50Lmdsc2wnLCAndXRmOCcpO1xuXG5jb25zdCBQTEFDRU1FTlQgPSBMYWJlbFBvaW50LlBMQUNFTUVOVDtcblxuZXhwb3J0IHZhciBQb2ludHMgPSBPYmplY3QuY3JlYXRlKFN0eWxlKTtcblxuLy8gTWl4aW4gdGV4dCBsYWJlbCBtZXRob2RzXG5PYmplY3QuYXNzaWduKFBvaW50cywgVGV4dExhYmVscyk7XG5cbk9iamVjdC5hc3NpZ24oUG9pbnRzLCB7XG4gICAgbmFtZTogJ3BvaW50cycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgc2VsZWN0aW9uOiB0cnVlLCAgLy8gc3R5bGUgZW5hYmxlcyBmZWF0dXJlIHNlbGVjdGlvblxuICAgIGNvbGxpc2lvbjogdHJ1ZSwgIC8vIHN0eWxlIGluY2x1ZGVzIGEgY29sbGlzaW9uIHBhc3NcbiAgICBibGVuZDogJ292ZXJsYXknLCAvLyBvdmVybGF5cyBkcmF3biBvbiB0b3Agb2YgYWxsIG90aGVyIHN0eWxlcywgd2l0aCBibGVuZGluZ1xuXG4gICAgaW5pdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgU3R5bGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIEJhc2Ugc2hhZGVyc1xuICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjID0gc2hhZGVyU3JjX3BvaW50c1ZlcnRleDtcbiAgICAgICAgdGhpcy5mcmFnbWVudF9zaGFkZXJfc3JjID0gc2hhZGVyU3JjX3BvaW50c0ZyYWdtZW50O1xuXG4gICAgICAgIHZhciBhdHRyaWJzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9wb3NpdGlvbicsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9zaGFwZScsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV90ZXhjb29yZCcsIHNpemU6IDIsIHR5cGU6IGdsLlVOU0lHTkVEX1NIT1JULCBub3JtYWxpemVkOiB0cnVlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX29mZnNldCcsIHNpemU6IDIsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2Ffc2VsZWN0aW9uX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG5cbiAgICAgICAgLy8gSWYgd2UncmUgbm90IHJlbmRlcmluZyBhcyBvdmVybGF5LCB3ZSBuZWVkIGEgbGF5ZXIgYXR0cmlidXRlXG4gICAgICAgIGlmICh0aGlzLmJsZW5kICE9PSAnb3ZlcmxheScpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xBWUVSX09SREVSID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuc3VyZSBhIGxhYmVsIHRleHR1cmUgaXMgYWx3YXlzIGJvdW5kIChhdm9pZCBDaHJvbWUgJ25vIHRleHR1cmUgYm91bmQgdG8gdW5pdCcgd2FybmluZ3MpXG4gICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3JtcyA9IHRoaXMuc2hhZGVycy51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfbGFiZWxfdGV4dHVyZSA9IFRleHR1cmUuZGVmYXVsdDtcblxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9QT0lOVF9URVhUVVJFID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmFibGUgZHVhbCBwb2ludC90ZXh0IG1vZGVcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTVVMVElfU0FNUExFUiA9IHRydWU7XG5cbiAgICAgICAgLy8gRmFkZSBvdXQgd2hlbiB0aWxlIGlzIHpvb21pbmcgb3V0LCBlLmcuIGFjdGluZyBhcyBwcm94eSB0aWxlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9PTl9aT09NX09VVF9SQVRFID0gMjsgLy8gZmFkZSBhdCAyeCwgZS5nLiBmdWxseSB0cmFuc3BhcmVudCBhdCAwLjUgem9vbSBsZXZlbCBhd2F5XG5cbiAgICAgICAgLy8gRmFkZSBpbiAoZGVwZW5kaW5nIG9uIHRpbGUgcHJveHkgc3RhdHVzKVxuICAgICAgICBpZiAoZGVidWdTZXR0aW5ncy5zdXBwcmVzc19sYWJlbF9mYWRlX2luID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IDA7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX0lOX1JBVEUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mYWRlX2luX3RpbWUgPSAwLjE1OyAvLyB0aW1lIGluIHNlY29uZHNcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfSU5fUkFURSA9IDEgLyB0aGlzLmZhZGVfaW5fdGltZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29sbGlzaW9uX2dyb3VwX3BvaW50cyA9IHRoaXMubmFtZSsnLXBvaW50cyc7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQgPSB0aGlzLm5hbWUrJy10ZXh0JztcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSxcblxuICAgIHJlc2V0ICgpIHtcbiAgICAgICAgdGhpcy5xdWV1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNldFRleHQoKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlcyA9IHt9OyAvLyB0cmFjayB3aGljaCBtaXNzaW5nIHNwcml0ZXMgd2UndmUgZm91bmQgKHJlZHVjZSBkdXBlIGxvZyBtZXNzYWdlcylcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGUgdG8gcXVldWUgZmVhdHVyZXMgaW5zdGVhZCBvZiBwcm9jZXNzaW5nIGltbWVkaWF0ZWx5XG4gICAgYWRkRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgdGlsZSA9IGNvbnRleHQudGlsZTtcbiAgICAgICAgaWYgKHRpbGUuZ2VuZXJhdGlvbiAhPT0gdGhpcy5nZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsZWQgaGVyZSBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRlbGF5ZWQgdW50aWwgdGhlIGZlYXR1cmUgcXVldWUgaXMgcGFyc2VkLFxuICAgICAgICAvLyBhbmQgd2Ugd2FudCB0aGUgcHJlcHJvY2Vzc2luZyBkb25lIGJlZm9yZSB3ZSBldmFsdWF0ZSB0ZXh0IHN0eWxlIGJlbG93XG4gICAgICAgIGRyYXcgPSB0aGlzLnByZXByb2Nlc3MoZHJhdyk7XG4gICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0eWxlID0ge307XG4gICAgICAgIHN0eWxlLmNvbG9yID0gdGhpcy5wYXJzZUNvbG9yKGRyYXcuY29sb3IsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFBvaW50IHN0eWxpbmdcblxuICAgICAgICAvLyByZXF1aXJlIGNvbG9yIG9yIHRleHR1cmVcbiAgICAgICAgaWYgKCFzdHlsZS5jb2xvciAmJiAhdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzcHJpdGUgPSBzdHlsZS5zcHJpdGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoZHJhdy5zcHJpdGUsIGNvbnRleHQpO1xuICAgICAgICBzdHlsZS5zcHJpdGVfZGVmYXVsdCA9IGRyYXcuc3ByaXRlX2RlZmF1bHQ7IC8vIG9wdGlvbmFsIGZhbGxiYWNrIGlmICdzcHJpdGUnIG5vdCBmb3VuZFxuXG4gICAgICAgIC8vIGlmIHBvaW50IGhhcyB0ZXh0dXJlIGFuZCBzcHJpdGVzLCByZXF1aXJlIGEgdmFsaWQgc3ByaXRlIHRvIGRyYXdcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSAmJiBUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0gJiYgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLnRleHR1cmVdLnNwcml0ZXMpIHtcbiAgICAgICAgICAgIGlmICghc3ByaXRlICYmICFzdHlsZS5zcHJpdGVfZGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0uc3ByaXRlc1tzcHJpdGVdKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc3ByaXRlIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGRlZmF1bHQgc3ByaXRlXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLnNwcml0ZV9kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNwcml0ZSA9IHN0eWxlLnNwcml0ZV9kZWZhdWx0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHR1cmUudGV4dHVyZXNbdGhpcy50ZXh0dXJlXS5zcHJpdGVzW3Nwcml0ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTdHlsZTogaW4gc3R5bGUgJyR7dGhpcy5uYW1lfScsIGNvdWxkIG5vdCBmaW5kIGRlZmF1bHQgc3ByaXRlICcke3Nwcml0ZX0nIGZvciB0ZXh0dXJlICcke3RoaXMudGV4dHVyZX0nYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlc1tzcHJpdGVdKSB7IC8vIG9ubHkgbG9nIGVhY2ggbWlzc2luZyBzcHJpdGUgb25jZVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBTdHlsZTogaW4gc3R5bGUgJyR7dGhpcy5uYW1lfScsIGNvdWxkIG5vdCBmaW5kIHNwcml0ZSAnJHtzcHJpdGV9JyBmb3IgdGV4dHVyZSAnJHt0aGlzLnRleHR1cmV9J2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlc1tzcHJpdGVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNwcml0ZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYFN0eWxlOiBpbiBzdHlsZSAnJHt0aGlzLm5hbWV9Jywgc3ByaXRlICcke3Nwcml0ZX0nIHdhcyBzcGVjaWZpZWQsIGJ1dCB0ZXh0dXJlICcke3RoaXMudGV4dHVyZX0nIGhhcyBubyBzcHJpdGVzYCk7XG4gICAgICAgICAgICBzcHJpdGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0cyB0ZXhjb29yZCBzY2FsZSBpZiBuZWVkZWQgKGUuZy4gZm9yIHNwcml0ZSBzdWItYXJlYSlcbiAgICAgICAgbGV0IHNwcml0ZV9pbmZvO1xuICAgICAgICBpZiAodGhpcy50ZXh0dXJlICYmIHNwcml0ZSkge1xuICAgICAgICAgICAgc3ByaXRlX2luZm8gPSBUZXh0dXJlLmdldFNwcml0ZUluZm8odGhpcy50ZXh0dXJlLCBzcHJpdGUpO1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gc3ByaXRlX2luZm8udGV4Y29vcmRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBvaW50cyBjYW4gYmUgcGxhY2VkIG9mZiB0aGUgZ3JvdW5kXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG5cbiAgICAgICAgLy8gcG9pbnQgc2l6ZSBkZWZpbmVkIGV4cGxpY2l0bHksIG9yIGRlZmF1bHRzIHRvIHNwcml0ZSBzaXplLCBvciBnZW5lcmljIGZhbGxiYWNrXG4gICAgICAgIHN0eWxlLnNpemUgPSBkcmF3LnNpemU7XG4gICAgICAgIGlmICghc3R5bGUuc2l6ZSkge1xuICAgICAgICAgICAgaWYgKHNwcml0ZV9pbmZvKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHNwcml0ZV9pbmZvLnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gWzE2LCAxNl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS5zaXplID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KHN0eWxlLnNpemUsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2l6ZSB3aWxsIGJlIHNjYWxlZCB0byAxNi1iaXQgc2lnbmVkIGludCwgc28gbWF4IGFsbG93ZWQgd2lkdGggKyBoZWlnaHQgb2YgMjU2IHBpeGVsc1xuICAgICAgICBzdHlsZS5zaXplID0gW1xuICAgICAgICAgICAgTWF0aC5taW4oKHN0eWxlLnNpemVbMF0gfHwgc3R5bGUuc2l6ZSksIDI1NiksXG4gICAgICAgICAgICBNYXRoLm1pbigoc3R5bGUuc2l6ZVsxXSB8fCBzdHlsZS5zaXplKSwgMjU2KVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFBsYWNlbWVudCBzdHJhdGVneVxuICAgICAgICBzdHlsZS5wbGFjZW1lbnQgPSBkcmF3LnBsYWNlbWVudDtcbiAgICAgICAgc3R5bGUucGxhY2VtZW50X211c3RfZml0ID0gZHJhdy5wbGFjZW1lbnRfbXVzdF9maXQ7XG4gICAgICAgIHN0eWxlLnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8sIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNwYWNpbmcgcGFyYW1ldGVyIChpbiBwaXhlbHMpIHRvIGVxdWFsbHkgc3BhY2UgcG9pbnRzIGFsb25nIGEgbGluZVxuICAgICAgICBpZiAoc3R5bGUucGxhY2VtZW50ID09PSBQTEFDRU1FTlQuU1BBQ0VEICYmIGRyYXcucGxhY2VtZW50X3NwYWNpbmcpIHtcbiAgICAgICAgICAgIHN0eWxlLnBsYWNlbWVudF9zcGFjaW5nID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcucGxhY2VtZW50X3NwYWNpbmcsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQW5nbGUgcGFyYW1ldGVyIChjYW4gYmUgYSBudW1iZXIgb3IgdGhlIHN0cmluZyBcImF1dG9cIilcbiAgICAgICAgc3R5bGUuYW5nbGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoZHJhdy5hbmdsZSwgY29udGV4dCk7XG5cbiAgICAgICAgc3R5bGUudGlsZV9lZGdlcyA9IGRyYXcudGlsZV9lZGdlczsgLy8gdXN1YWxseSBhY3RpdmF0ZWQgZm9yIGRlYnVnZ2luZywgb3IgcmFyZSB2aXN1YWxpemF0aW9uIG5lZWRzXG5cbiAgICAgICAgc3R5bGUuc2FtcGxlciA9IDA7IC8vIDAgPSBzcHJpdGVzXG5cbiAgICAgICAgdGhpcy5jb21wdXRlTGF5b3V0KHN0eWxlLCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICAvLyBUZXh0IHN0eWxpbmdcbiAgICAgICAgbGV0IHRmID1cbiAgICAgICAgICAgIGRyYXcudGV4dCAmJlxuICAgICAgICAgICAgZHJhdy50ZXh0LnZpc2libGUgIT09IGZhbHNlICYmIC8vIGV4cGxpY2l0bHkgaGFuZGxlIGB2aXNpYmxlYCBwcm9wZXJ0eSBmb3IgbmVzdGVkIHRleHRcbiAgICAgICAgICAgIHRoaXMucGFyc2VUZXh0RmVhdHVyZShmZWF0dXJlLCBkcmF3LnRleHQsIGNvbnRleHQsIHRpbGUpO1xuXG4gICAgICAgIGlmICh0Zikge1xuICAgICAgICAgICAgdGYubGF5b3V0LnBhcmVudCA9IHN0eWxlOyAvLyBwYXJlbnQgcG9pbnQgd2lsbCBhcHBseSBhZGRpdGlvbmFsIGFuY2hvci9vZmZzZXQgdG8gdGV4dFxuXG4gICAgICAgICAgICAvLyBUZXh0IGxhYmVscyBoYXZlIGEgZGVmYXVsdCBwcmlvcml0eSBvZiAwLjUgYmVsb3cgdGhlaXIgcGFyZW50IHBvaW50ICgrMC41LCBwcmlvcml0eSBpcyBsb3dlci1pcy1iZXR0ZXIpXG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBiZSBvdmVycmlkZW4sIGFzIGxvbmcgYXMgaXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICB0Zi5sYXlvdXQucHJpb3JpdHkgPSBkcmF3LnRleHQucHJpb3JpdHkgPyBNYXRoLm1heCh0Zi5sYXlvdXQucHJpb3JpdHksIHN0eWxlLnByaW9yaXR5ICsgMC41KSA6IChzdHlsZS5wcmlvcml0eSArIDAuNSk7XG5cbiAgICAgICAgICAgIC8vIFRleHQgbGFiZWxzIGF0dGFjaGVkIHRvIHBvaW50cyBzaG91bGQgbm90IGJlIG1vdmVkIGludG8gdGlsZVxuICAgICAgICAgICAgLy8gKHRoZXkgc2hvdWxkIHN0YXkgZml4ZWQgcmVsYXRpdmUgdG8gdGhlIHBvaW50KVxuICAgICAgICAgICAgdGYubGF5b3V0Lm1vdmVfaW50b190aWxlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIENvbGxpc2lvbi5hZGRTdHlsZSh0aGlzLmNvbGxpc2lvbl9ncm91cF90ZXh0LCB0aWxlLmtleSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBRdWV1ZSB0aGUgZmVhdHVyZSBmb3IgcHJvY2Vzc2luZ1xuICAgICAgICBpZiAoIXRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGEodGlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0ucHVzaCh7XG4gICAgICAgICAgICBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCBzdHlsZSxcbiAgICAgICAgICAgIHRleHRfZmVhdHVyZTogdGZcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCBjb2xsaXNpb24gbWFuYWdlclxuICAgICAgICBDb2xsaXNpb24uYWRkU3R5bGUodGhpcy5jb2xsaXNpb25fZ3JvdXBfcG9pbnRzLCB0aWxlLmtleSk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgc3RhcnREYXRhICh0aWxlKSB7XG4gICAgICAgIHRoaXMucXVldWVzW3RpbGUua2V5XSA9IFtdO1xuICAgICAgICByZXR1cm4gU3R5bGUuc3RhcnREYXRhLmNhbGwodGhpcywgdGlsZSk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgZW5kRGF0YSAodGlsZSkge1xuICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZSAke3RoaXMubmFtZX06IHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHF1ZXVlID0gdGhpcy5xdWV1ZXNbdGlsZS5rZXldO1xuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0gPSBbXTtcblxuICAgICAgICAvLyBGb3IgZWFjaCBwb2ludCBmZWF0dXJlLCBjcmVhdGUgb25lIG9yIG1vcmUgbGFiZWxzXG4gICAgICAgIGxldCB0ZXh0X29ianMgPSBbXTtcbiAgICAgICAgbGV0IHBvaW50X29ianMgPSBbXTtcblxuICAgICAgICBxdWV1ZS5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gcS5zdHlsZTtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlID0gcS5mZWF0dXJlO1xuICAgICAgICAgICAgbGV0IGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeTtcblxuICAgICAgICAgICAgbGV0IGZlYXR1cmVfbGFiZWxzID0gdGhpcy5idWlsZExhYmVscyhzdHlsZS5zaXplLCBnZW9tZXRyeSwgc3R5bGUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0dXJlX2xhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGZlYXR1cmVfbGFiZWxzW2ldO1xuICAgICAgICAgICAgICAgIGxldCBwb2ludF9vYmogPSB7XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgIGRyYXc6IHEuZHJhdyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogcS5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHBvaW50X29ianMucHVzaChwb2ludF9vYmopO1xuXG4gICAgICAgICAgICAgICAgaWYgKHEudGV4dF9mZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X29iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkcmF3OiBxLnRleHRfZmVhdHVyZS5kcmF3LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogcS5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogcS50ZXh0X2ZlYXR1cmUudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfc2V0dGluZ3Nfa2V5OiBxLnRleHRfZmVhdHVyZS50ZXh0X3NldHRpbmdzX2tleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dDogcS50ZXh0X2ZlYXR1cmUubGF5b3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VkOiBwb2ludF9vYmogICAvLyBsaW5rIHNvIHRleHQgb25seSByZW5kZXJzIHdoZW4gcGFyZW50IHBvaW50IGlzIHBsYWNlZFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X29ianMucHVzaCh0ZXh0X29iaik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVW5sZXNzIHRleHQgZmVhdHVyZSBpcyBvcHRpb25hbCwgY3JlYXRlIGEgdHdvLXdheSBsaW5rIHNvIHRoYXQgcGFyZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHdpbGwgb25seSByZW5kZXIgd2hlbiB0ZXh0IGlzIGFsc28gcGxhY2VkXG4gICAgICAgICAgICAgICAgICAgIGlmICghcS5kcmF3LnRleHQub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X29iai5saW5rZWQgPSB0ZXh0X29iajsgLy8gdHdvLXdheSBsaW5rXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENvbGxpZGUgYm90aCBwb2ludHMgYW5kIHRleHQsIHRoZW4gYnVpbGQgZmVhdHVyZXNcbiAgICAgICAgcmV0dXJuIFByb21pc2UuXG4gICAgICAgICAgICBhbGwoW1xuICAgICAgICAgICAgICAgIC8vIFBvaW50c1xuICAgICAgICAgICAgICAgIENvbGxpc2lvbi5jb2xsaWRlKHBvaW50X29ianMsIHRoaXMuY29sbGlzaW9uX2dyb3VwX3BvaW50cywgdGlsZS5rZXkpLnRoZW4ocG9pbnRfb2JqcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50X29ianMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHEuc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUubGFiZWwgPSBxLmxhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUuYWRkRmVhdHVyZS5jYWxsKHRoaXMsIHEuZmVhdHVyZSwgcS5kcmF3LCBxLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAvLyBMYWJlbHNcbiAgICAgICAgICAgICAgICB0aGlzLnByZXBhcmVUZXh0TGFiZWxzKHRpbGUsIHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQsIHRleHRfb2JqcykuXG4gICAgICAgICAgICAgICAgICAgIHRoZW4obGFiZWxzID0+IHRoaXMuY29sbGlkZUFuZFJlbmRlclRleHRMYWJlbHModGlsZSwgdGhpcy5jb2xsaXNpb25fZ3JvdXBfdGV4dCwgbGFiZWxzKSlcbiAgICAgICAgICAgIF0pLnRoZW4oKFssIHsgbGFiZWxzLCB0ZXh0cywgdGV4dHVyZSB9XSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgbGFiZWxzXG4gICAgICAgICAgICAgICAgaWYgKGxhYmVscyAmJiB0ZXh0cykge1xuICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBxdWV1ZWQgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5nc19rZXkgPSBxLnRleHRfc2V0dGluZ3Nfa2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRzW3RleHRfc2V0dGluZ3Nfa2V5XSAmJiB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV1bcS50ZXh0XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgc3R5bGluZyBvYmplY3QgZXhwZWN0ZWQgYnkgU3R5bGUgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmxhYmVsID0gcS5sYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSB0ZXh0X2luZm8uc2l6ZS5sb2dpY2FsX3NpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSB0ZXh0X2luZm8uYWxpZ25bcS5sYWJlbC5hbGlnbl0udGV4Y29vcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuYW5nbGUgPSBxLmxhYmVsLmFuZ2xlIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zYW1wbGVyID0gMTsgLy8gbm9uLTAgPSBsYWJlbHNcblxuICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUuYWRkRmVhdHVyZS5jYWxsKHRoaXMsIHEuZmVhdHVyZSwgcS5kcmF3LCBxLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5mcmVlVGV4dCh0aWxlKTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmlzaCB0aWxlIG1lc2hcbiAgICAgICAgICAgICAgICByZXR1cm4gU3R5bGUuZW5kRGF0YS5jYWxsKHRoaXMsIHRpbGUpLnRoZW4odGlsZV9kYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoIHRpbGUtc3BlY2lmaWMgbGFiZWwgYXRsYXMgdG8gbWVzaCBhcyBhIHRleHR1cmUgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSAmJiB0aWxlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3JtcyA9IHRpbGVfZGF0YS51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcyA9IHRpbGVfZGF0YS50ZXh0dXJlcyB8fCBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnVuaWZvcm1zLnVfbGFiZWxfdGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMucHVzaCh0ZXh0dXJlKTsgLy8gYXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIGRyYXcuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5jb2xvcik7XG4gICAgICAgIGRyYXcueiA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy56LCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcblxuICAgICAgICAvLyBTaXplICgxZCB2YWx1ZSBvciAyZCBhcnJheSlcbiAgICAgICAgZHJhdy5zaXplID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnNpemUsIHYgPT4gQXJyYXkuaXNBcnJheSh2KSA/IHYubWFwKHBhcnNlRmxvYXQpIDogcGFyc2VGbG9hdCh2KSk7XG5cbiAgICAgICAgLy8gT2Zmc2V0ICgyZCBhcnJheSlcbiAgICAgICAgZHJhdy5vZmZzZXQgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub2Zmc2V0LCB2ID0+IChBcnJheS5pc0FycmF5KHYpICYmIHYubWFwKHBhcnNlRmxvYXQpKSB8fCAwKTtcblxuICAgICAgICAvLyBCdWZmZXIgKDFkIHZhbHVlIG9yIDJkIGFycmF5LCBleHBhbmQgMWQgdG8gMmQpXG4gICAgICAgIGRyYXcuYnVmZmVyID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmJ1ZmZlciwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdiwgdl0pLm1hcChwYXJzZUZsb2F0KSB8fCAwKTtcblxuICAgICAgICAvLyBSZXBlYXQgcnVsZXMgLSBubyByZXBlYXQgbGltaXRhdGlvbiBmb3IgcG9pbnRzIGJ5IGRlZmF1bHRcbiAgICAgICAgZHJhdy5yZXBlYXRfZGlzdGFuY2UgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcucmVwZWF0X2Rpc3RhbmNlLCBwYXJzZUZsb2F0KTtcblxuICAgICAgICAvLyBQbGFjZW1lbnQgc3RyYXRlZ2llc1xuICAgICAgICBkcmF3LnBsYWNlbWVudCA9IFBMQUNFTUVOVFtkcmF3LnBsYWNlbWVudCAmJiBkcmF3LnBsYWNlbWVudC50b1VwcGVyQ2FzZSgpXTtcbiAgICAgICAgaWYgKGRyYXcucGxhY2VtZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgIGRyYXcucGxhY2VtZW50ID0gUExBQ0VNRU5ULlZFUlRFWDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRyYXcucGxhY2VtZW50X3NwYWNpbmcgPSBkcmF3LnBsYWNlbWVudF9zcGFjaW5nICE9IG51bGwgPyBkcmF3LnBsYWNlbWVudF9zcGFjaW5nIDogODA7IC8vIGRlZmF1bHQgc3BhY2luZ1xuICAgICAgICBkcmF3LnBsYWNlbWVudF9zcGFjaW5nID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnBsYWNlbWVudF9zcGFjaW5nLCBwYXJzZUZsb2F0KTtcblxuICAgICAgICBkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvID0gZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyAhPSBudWxsID8gZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA6IDE7XG4gICAgICAgIGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8sIHBhcnNlRmxvYXQpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZHJhdy5hbmdsZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGRyYXcuYW5nbGUgPSBkcmF3LmFuZ2xlICogTWF0aC5QSSAvIDE4MDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRyYXcuYW5nbGUgPSBkcmF3LmFuZ2xlIHx8IDA7IC8vIGFuZ2xlIGNhbiBiZSBhIHN0cmluZyBsaWtlIFwiYXV0b1wiICh1c2UgYW5nbGUgb2YgZ2VvbWV0cnkpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCB0ZXh0IHN0eWxpbmdcbiAgICAgICAgZHJhdy50ZXh0ID0gdGhpcy5wcmVwcm9jZXNzVGV4dChkcmF3LnRleHQpOyAvLyB3aWxsIHJldHVybiBudWxsIGlmIHZhbGlkIHRleHQgc3R5bGluZyB3YXNuJ3QgcHJvdmlkZWRcbiAgICAgICAgaWYgKGRyYXcudGV4dCkge1xuICAgICAgICAgICAgZHJhdy50ZXh0LmtleSA9IGRyYXcua2V5OyAvLyBjb3B5IGxheWVyIGtleSBmb3IgdXNlIGFzIGxhYmVsIHJlcGVhdCBncm91cFxuICAgICAgICAgICAgZHJhdy50ZXh0LnJlcGVhdF9ncm91cCA9IGRyYXcudGV4dC5yZXBlYXRfZ3JvdXAgfHwgZHJhdy5yZXBlYXRfZ3JvdXA7IC8vIGluaGVyaXQgcmVwZWF0IGdyb3VwIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIGRyYXcudGV4dC5hbmNob3IgPSBkcmF3LnRleHQuYW5jaG9yIHx8IHRoaXMuZGVmYXVsdF9hbmNob3I7XG4gICAgICAgICAgICBkcmF3LnRleHQub3B0aW9uYWwgPSAodHlwZW9mIGRyYXcudGV4dC5vcHRpb25hbCA9PT0gJ2Jvb2xlYW4nKSA/IGRyYXcudGV4dC5vcHRpb25hbCA6IGZhbHNlOyAvLyBkZWZhdWx0IHRleHQgdG8gcmVxdWlyZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBEZWZhdWx0IHRvIHRyeWluZyBhbGwgYW5jaG9yIHBsYWNlbWVudHNcbiAgICBkZWZhdWx0X2FuY2hvcjogWydib3R0b20nLCAndG9wJywgJ3JpZ2h0JywgJ2xlZnQnXSxcblxuICAgIC8vIENvbXB1dGUgbGFiZWwgbGF5b3V0LXJlbGF0ZWQgcHJvcGVydGllc1xuICAgIGNvbXB1dGVMYXlvdXQgKHRhcmdldCwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSkge1xuICAgICAgICBsZXQgbGF5b3V0ID0gdGFyZ2V0IHx8IHt9O1xuICAgICAgICBsYXlvdXQuaWQgPSBmZWF0dXJlO1xuICAgICAgICBsYXlvdXQudW5pdHNfcGVyX3BpeGVsID0gdGlsZS51bml0c19wZXJfcGl4ZWwgfHwgMTtcblxuICAgICAgICAvLyBjb2xsaXNpb24gZmxhZ1xuICAgICAgICBsYXlvdXQuY29sbGlkZSA9IChkcmF3LmNvbGxpZGUgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTtcblxuICAgICAgICAvLyB0aWxlIGJvdW5kYXJ5IGhhbmRsaW5nXG4gICAgICAgIGxheW91dC5jdWxsX2Zyb21fdGlsZSA9IChkcmF3LmN1bGxfZnJvbV90aWxlICE9IG51bGwpID8gZHJhdy5jdWxsX2Zyb21fdGlsZSA6IGZhbHNlO1xuXG4gICAgICAgIC8vIHBvaW50cyBzaG91bGQgbm90IG1vdmUgaW50byB0aWxlIGlmIG92ZXIgdGlsZSBib3VuZGFyeVxuICAgICAgICBsYXlvdXQubW92ZV9pbnRvX3RpbGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBsYWJlbCBhbmNob3JzIChwb2ludCBsYWJlbHMgb25seSlcbiAgICAgICAgLy8gbGFiZWwgcG9zaXRpb24gd2lsbCBiZSBhZGp1c3RlZCBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLCByZWxhdGl2ZSB0byBpdHMgb3JpZ2luYWwgcG9pbnRcbiAgICAgICAgLy8gb25lIG9mOiBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRvcC1sZWZ0LCB0b3AtcmlnaHQsIGJvdHRvbS1sZWZ0LCBib3R0b20tcmlnaHRcbiAgICAgICAgbGF5b3V0LmFuY2hvciA9IGRyYXcuYW5jaG9yO1xuXG4gICAgICAgIC8vIGxhYmVsIG9mZnNldCBhbmQgYnVmZmVyIGluIHBpeGVsIChhcHBsaWVkIGluIHNjcmVlbiBzcGFjZSlcbiAgICAgICAgbGF5b3V0Lm9mZnNldCA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3Lm9mZnNldCwgY29udGV4dCkgfHwgU3R5bGVQYXJzZXIuemVyb1BhaXI7XG4gICAgICAgIGxheW91dC5idWZmZXIgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5idWZmZXIsIGNvbnRleHQpIHx8IFN0eWxlUGFyc2VyLnplcm9QYWlyO1xuXG4gICAgICAgIC8vIHJlcGVhdCBydWxlc1xuICAgICAgICBsYXlvdXQucmVwZWF0X2Rpc3RhbmNlID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcucmVwZWF0X2Rpc3RhbmNlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGxheW91dC5yZXBlYXRfZGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZGlzdGFuY2UgKj0gbGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBkcmF3LnJlcGVhdF9ncm91cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZ3JvdXAgPSBkcmF3LnJlcGVhdF9ncm91cChjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkcmF3LnJlcGVhdF9ncm91cCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5yZXBlYXRfZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5rZXk7IC8vIGRlZmF1bHQgdG8gdW5pcXVlIHNldCBvZiBtYXRjaGluZyBsYXllcnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxhYmVsIHByaW9yaXR5IChsb3dlciBpcyBoaWdoZXIpXG4gICAgICAgIGxldCBwcmlvcml0eSA9IGRyYXcucHJpb3JpdHk7XG4gICAgICAgIGlmIChwcmlvcml0eSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByaW9yaXR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBwcmlvcml0eShjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByaW9yaXR5ID0gLTEgPj4+IDA7IC8vIGRlZmF1bHQgdG8gbWF4IHByaW9yaXR5IHZhbHVlIGlmIG5vbmUgc2V0XG4gICAgICAgIH1cbiAgICAgICAgbGF5b3V0LnByaW9yaXR5ID0gcHJpb3JpdHk7XG5cbiAgICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9LFxuXG4gICAgLy8gSW1wbGVtZW50cyBsYWJlbCBidWlsZGluZyBmb3IgVGV4dExhYmVscyBtaXhpblxuICAgIGJ1aWxkVGV4dExhYmVscyAodGlsZV9rZXksIGZlYXR1cmVfcXVldWUpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmPTA7IGYgPCBmZWF0dXJlX3F1ZXVlLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICBsZXQgZnEgPSBmZWF0dXJlX3F1ZXVlW2ZdO1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRoaXMudGV4dHNbdGlsZV9rZXldW2ZxLnRleHRfc2V0dGluZ3Nfa2V5XVtmcS50ZXh0XTtcbiAgICAgICAgICAgIGxldCBzaXplID0gdGV4dF9pbmZvLnNpemUuY29sbGlzaW9uX3NpemU7XG4gICAgICAgICAgICBmcS5sYWJlbCA9IG5ldyBMYWJlbFBvaW50KGZxLnBvaW50X2xhYmVsLnBvc2l0aW9uLCBzaXplLCBmcS5sYXlvdXQpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2goZnEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkcyBvbmUgb3IgbW9yZSBwb2ludCBsYWJlbHMgZm9yIGEgZ2VvbWV0cnlcbiAgICBidWlsZExhYmVscyAoc2l6ZSwgZ2VvbWV0cnksIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuXG4gICAgICAgIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvaW50XCIpIHtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGdlb21ldHJ5LmNvb3JkaW5hdGVzLCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvaW50XCIpIHtcbiAgICAgICAgICAgIGxldCBwb2ludHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KHBvaW50LCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBsZXQgcG9pbnRfbGFiZWxzID0gcGxhY2VQb2ludHNPbkxpbmUobGluZSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aUxpbmVTdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IGxpbmVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBsbiA9IDA7IGxuIDwgbGluZXMubGVuZ3RoOyBsbisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tsbl07XG4gICAgICAgICAgICAgICAgbGV0IHBvaW50X2xhYmVscyA9IHBsYWNlUG9pbnRzT25MaW5lKGxpbmUsIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRfbGFiZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiUG9seWdvblwiKSB7XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBwb2x5Z29uIGNlbnRyb2lkIChvZiBvdXRlciByaW5nKVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGxhY2VtZW50ID09PSBQTEFDRU1FTlQuQ0VOVFJPSUQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8uY2VudHJvaWQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBlYWNoIHBvbHlnb24gdmVydGV4IChhbGwgcmluZ3MpXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcmluZ3MgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBsbiA9IDA7IGxuIDwgcmluZ3MubGVuZ3RoOyBsbisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb2ludF9sYWJlbHMgPSBwbGFjZVBvaW50c09uTGluZShyaW5nc1tsbl0sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gocG9pbnRfbGFiZWxzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9seWdvblwiKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5wbGFjZW1lbnQgPT09IFBMQUNFTUVOVC5DRU5UUk9JRCkge1xuICAgICAgICAgICAgICAgIGxldCBjZW50cm9pZCA9IEdlby5tdWx0aUNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvbHlzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBwb2x5cy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmluZ3MgPSBwb2x5c1twXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbG4gPSAwOyBsbiA8IHJpbmdzLmxlbmd0aDsgbG4rKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvaW50X2xhYmVscyA9IHBsYWNlUG9pbnRzT25MaW5lKHJpbmdzW2xuXSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIFwidGVtcGxhdGVcIiB0aGF0IHNldHMgY29uc3RhbnQgYXR0aWJ1dGVzIGZvciBlYWNoIHZlcnRleCwgd2hpY2ggaXMgdGhlbiBtb2RpZmllZCBwZXIgdmVydGV4IG9yIHBlciBmZWF0dXJlLlxuICAgICAqIEEgcGxhaW4gSlMgYXJyYXkgbWF0Y2hpbmcgdGhlIG9yZGVyIG9mIHRoZSB2ZXJ0ZXggbGF5b3V0LlxuICAgICAqL1xuICAgIG1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSkge1xuICAgICAgICBsZXQgY29sb3IgPSBzdHlsZS5jb2xvciB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5jb2xvcjtcblxuICAgICAgICAvLyBwb3NpdGlvbiAtIHggJiB5IGNvb3JkcyB3aWxsIGJlIGZpbGxlZCBpbiBwZXItdmVydGV4IGJlbG93XG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3Bvc2l0aW9uJywgMCwgeyBzaXplOiAyIH0pO1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9wb3NpdGlvbicsIHN0eWxlLnogfHwgMCwgeyBzaXplOiAxLCBvZmZzZXQ6IDIgfSk7XG4gICAgICAgIC8vIGxheWVyIG9yZGVyIC0gdyBjb29yZCBvZiAncG9zaXRpb24nIGF0dHJpYnV0ZSAoZm9yIHBhY2tpbmcgZWZmaWNpZW5jeSlcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfcG9zaXRpb24nLCB0aGlzLnNjYWxlT3JkZXIoc3R5bGUub3JkZXIpLCB7IHNpemU6IDEsIG9mZnNldDogMyB9KTtcblxuICAgICAgICAvLyBzY2FsaW5nIHZlY3RvciAtICh4LCB5KSBjb21wb25lbnRzIHBlciBwaXhlbCwgeiA9IGFuZ2xlLCB3ID0gc2NhbGluZyBmYWN0b3JcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2Ffc2hhcGUnLCAwLCB7IHNpemU6IDQgfSk7XG5cbiAgICAgICAgLy8gdGV4dHVyZSBjb29yZHNcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfdGV4Y29vcmQnLCAwLCB7IHNpemU6IDIgfSk7XG5cbiAgICAgICAgLy8gb2Zmc2V0c1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9vZmZzZXQnLCAwLCB7IHNpemU6IDIgfSk7XG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfY29sb3InLCBWZWN0b3IubXVsdChjb2xvciwgMjU1KSwgeyBzaXplOiA0IH0pO1xuXG4gICAgICAgIC8vIHNlbGVjdGlvbiBjb2xvclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3NlbGVjdGlvbl9jb2xvcicsIFZlY3Rvci5tdWx0KHN0eWxlLnNlbGVjdGlvbl9jb2xvciwgMjU1KSwgeyBzaXplOiA0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4X3RlbXBsYXRlO1xuICAgIH0sXG5cbiAgICBidWlsZFF1YWQocG9pbnRzLCBzaXplLCBhbmdsZSwgc2FtcGxlciwgb2Zmc2V0LCB0ZXhjb29yZF9zY2FsZSwgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSkge1xuICAgICAgICBidWlsZFF1YWRzRm9yUG9pbnRzKFxuICAgICAgICAgICAgcG9pbnRzLFxuICAgICAgICAgICAgdmVydGV4X2RhdGEsXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3RleGNvb3JkLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9wb3NpdGlvbixcbiAgICAgICAgICAgICAgICBzaGFwZV9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfc2hhcGUsXG4gICAgICAgICAgICAgICAgb2Zmc2V0X2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9vZmZzZXRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcXVhZDogc2l6ZSxcbiAgICAgICAgICAgICAgICBxdWFkX25vcm1hbGl6ZTogMjU2LCAgICAvLyB2YWx1ZXMgaGF2ZSBhbiA4LWJpdCBmcmFjdGlvblxuICAgICAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICAgICAgICBhbmdsZTogYW5nbGUgKiA0MDk2LCAgICAvLyB2YWx1ZXMgaGF2ZSBhIDEyLWJpdCBmcmFjdGlvblxuICAgICAgICAgICAgICAgIHNoYXBlX3c6IHNhbXBsZXIsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfc2NhbGUsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplOiA2NTUzNVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBxdWFkIGZvciBwb2ludCBzcHJpdGVcbiAgICBidWlsZCAoc3R5bGUsIHZlcnRleF9kYXRhKSB7XG4gICAgICAgIGxldCBsYWJlbCA9IHN0eWxlLmxhYmVsO1xuICAgICAgICBpZiAobGFiZWwubnVtX3NlZ21lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkQXJ0aWN1bGF0ZWRMYWJlbChsYWJlbCwgc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMYWJlbChsYWJlbCwgc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBidWlsZExhYmVsIChsYWJlbCwgc3R5bGUsIHZlcnRleF9kYXRhKSB7XG4gICAgICAgIGxldCB2ZXJ0ZXhfdGVtcGxhdGUgPSB0aGlzLm1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSk7XG4gICAgICAgIGxldCBhbmdsZSA9IGxhYmVsLmFuZ2xlIHx8IHN0eWxlLmFuZ2xlO1xuXG4gICAgICAgIHRoaXMuYnVpbGRRdWFkKFxuICAgICAgICAgICAgW2xhYmVsLnBvc2l0aW9uXSwgICAgICAgICAgICAgICAvLyBwb3NpdGlvblxuICAgICAgICAgICAgc3R5bGUuc2l6ZSwgICAgICAgICAgICAgICAgICAgICAvLyBzaXplIGluIHBpeGVsc1xuICAgICAgICAgICAgYW5nbGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmdsZSBpbiByYWRpYW5zXG4gICAgICAgICAgICBzdHlsZS5zYW1wbGVyLCAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgc2FtcGxlciB0byB1c2VcbiAgICAgICAgICAgIGxhYmVsLm9mZnNldCwgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGZyb20gY2VudGVyIGluIHBpeGVsc1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzLCAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSAgICAvLyBWQk8gYW5kIGRhdGEgZm9yIGN1cnJlbnQgdmVydGV4XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGJ1aWxkQXJ0aWN1bGF0ZWRMYWJlbCAobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFiZWwubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgbGV0IGFuZ2xlID0gbGFiZWwuYW5nbGVbaV07XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHN0eWxlLnNpemVbaV07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gbGFiZWwub2Zmc2V0c1tpXTtcbiAgICAgICAgICAgIGxldCB0ZXhjb29yZCA9IHN0eWxlLnRleGNvb3Jkc1tpXTtcblxuICAgICAgICAgICAgdGhpcy5idWlsZFF1YWQoXG4gICAgICAgICAgICAgICAgW2xhYmVsLnBvc2l0aW9uXSwgICAgICAgICAgICAgICAvLyBwb3NpdGlvblxuICAgICAgICAgICAgICAgIHNpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBpbiBwaXhlbHNcbiAgICAgICAgICAgICAgICBhbmdsZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZ2xlIGluIGRlZ3JlZXNcbiAgICAgICAgICAgICAgICBzdHlsZS5zYW1wbGVyLCAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgc2FtcGxlciB0byB1c2VcbiAgICAgICAgICAgICAgICBvZmZzZXQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBmcm9tIGNlbnRlciBpbiBwaXhlbHNcbiAgICAgICAgICAgICAgICB0ZXhjb29yZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgVVZzXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSAgICAvLyBWQk8gYW5kIGRhdGEgZm9yIGN1cnJlbnQgdmVydGV4XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlIHRvIHBhc3MtdGhyb3VnaCB0byBnZW5lcmljIHBvaW50IGJ1aWxkZXJcbiAgICBidWlsZExpbmVzIChsaW5lcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVpbGQoc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2ludHMgKHBvaW50cywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVpbGQoc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2x5Z29ucyAocG9pbnRzLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5idWlsZChzdHlsZSwgdmVydGV4X2RhdGEpO1xuICAgIH0sXG5cbiAgICBtYWtlTWVzaCAodmVydGV4X2RhdGEsIHZlcnRleF9lbGVtZW50cywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIEFkZCBsYWJlbCBmYWRlIHRpbWVcbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHsgZmFkZV9pbl90aW1lOiB0aGlzLmZhZGVfaW5fdGltZSB9KTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLm1ha2VNZXNoLmNhbGwodGhpcywgdmVydGV4X2RhdGEsIHZlcnRleF9lbGVtZW50cywgb3B0aW9ucyk7XG4gICAgfVxuXG59KTtcbiIsIi8vIFBvbHlnb24gcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgZ2wgZnJvbSAnLi4vLi4vZ2wvY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBWZXJ0ZXhMYXlvdXQgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2xheW91dCc7XG5pbXBvcnQge2J1aWxkUG9seWdvbnMsIGJ1aWxkRXh0cnVkZWRQb2x5Z29uc30gZnJvbSAnLi4vLi4vYnVpbGRlcnMvcG9seWdvbnMnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX3BvbHlnb25zVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9seWdvbnNfdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2x5Z29uc19mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKTtcblxuZXhwb3J0IHZhciBQb2x5Z29ucyA9IE9iamVjdC5jcmVhdGUoU3R5bGUpO1xuXG4vLyBleHBvcnQgc2hhZGVycyBmb3IgdXNlIGluIGxpbmVzLmpzXG5leHBvcnQge1xuICAgIHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCxcbiAgICBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudFxufTtcblxuT2JqZWN0LmFzc2lnbihQb2x5Z29ucywge1xuICAgIG5hbWU6ICdwb2x5Z29ucycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgdmVydGV4X3NoYWRlcl9zcmM6IHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCxcbiAgICBmcmFnbWVudF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudCxcbiAgICBzZWxlY3Rpb246IHRydWUsIC8vIHR1cm4gZmVhdHVyZSBzZWxlY3Rpb24gb25cblxuICAgIGluaXQoKSB7XG4gICAgICAgIFN0eWxlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBCYXNpYyBhdHRyaWJ1dGVzLCBvdGhlcnMgY2FuIGJlIGFkZGVkIChzZWUgdGV4dHVyZSBVVnMgYmVsb3cpXG4gICAgICAgIHZhciBhdHRyaWJzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9wb3NpdGlvbicsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9ub3JtYWwnLCBzaXplOiAzLCB0eXBlOiBnbC5CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0sIC8vIGdldHMgcGFkZGVkIHRvIDQtYnl0ZXNcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBUZWxsIHRoZSBzaGFkZXIgd2UgaGF2ZSBhIG5vcm1hbCBhbmQgb3JkZXIgYXR0cmlidXRlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9OT1JNQUxfQVRUUklCVVRFID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTEFZRVJfT1JERVIgPSB0cnVlO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2Ffc2VsZWN0aW9uX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIHRleHR1cmUgVVZzXG4gICAgICAgIGlmICh0aGlzLnRleGNvb3Jkcykge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVEVYVFVSRV9DT09SRFMgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBBZGQgdmVydGV4IGF0dHJpYnV0ZSBmb3IgVVZzIG9ubHkgd2hlbiBuZWVkZWRcbiAgICAgICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3RleGNvb3JkJywgc2l6ZTogMiwgdHlwZTogZ2wuVU5TSUdORURfU0hPUlQsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQgPSBuZXcgVmVydGV4TGF5b3V0KGF0dHJpYnMpO1xuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICBzdHlsZS5jb2xvciA9IHRoaXMucGFyc2VDb2xvcihkcmF3LmNvbG9yLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzdHlsZS5jb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS56ID0gKGRyYXcueiAmJiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkRGlzdGFuY2VQcm9wZXJ0eShkcmF3LnosIGNvbnRleHQpKSB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy56O1xuICAgICAgICBzdHlsZS56ICo9IEdlby5oZWlnaHRfc2NhbGU7IC8vIHByb3ZpZGUgc3ViLW1ldGVyIHByZWNpc2lvbiBvZiBoZWlnaHQgdmFsdWVzXG5cbiAgICAgICAgc3R5bGUuZXh0cnVkZSA9IFN0eWxlUGFyc2VyLmV2YWxQcm9wZXJ0eShkcmF3LmV4dHJ1ZGUsIGNvbnRleHQpO1xuICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSkge1xuICAgICAgICAgICAgLy8gdXNlIGZlYXR1cmUncyBoZWlnaHQgYW5kIG1pbl9oZWlnaHQgcHJvcGVydGllc1xuICAgICAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBmZWF0dXJlLnByb3BlcnRpZXMuaGVpZ2h0IHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLmhlaWdodDtcbiAgICAgICAgICAgICAgICBzdHlsZS5taW5faGVpZ2h0ID0gZmVhdHVyZS5wcm9wZXJ0aWVzLm1pbl9oZWlnaHQgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMubWluX2hlaWdodDtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXhwbGljaXQgaGVpZ2h0LCBubyBtaW5faGVpZ2h0XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc3R5bGUuZXh0cnVkZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlO1xuICAgICAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXhwbGljaXQgaGVpZ2h0IGFuZCBtaW5faGVpZ2h0XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHN0eWxlLmV4dHJ1ZGUpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUubWluX2hlaWdodCA9IHN0eWxlLmV4dHJ1ZGVbMF07XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc3R5bGUuZXh0cnVkZVsxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ICo9IEdlby5oZWlnaHRfc2NhbGU7ICAgICAgIC8vIHByb3ZpZGUgc3ViLW1ldGVyIHByZWNpc2lvbiBvZiBoZWlnaHQgdmFsdWVzXG4gICAgICAgICAgICBzdHlsZS5taW5faGVpZ2h0ICo9IEdlby5oZWlnaHRfc2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS50aWxlX2VkZ2VzID0gZHJhdy50aWxlX2VkZ2VzOyAvLyB1c3VhbGx5IGFjdGl2YXRlZCBmb3IgZGVidWdnaW5nLCBvciByYXJlIHZpc3VhbGl6YXRpb24gbmVlZHNcblxuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgfSxcblxuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIGRyYXcuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5jb2xvcik7XG4gICAgICAgIGRyYXcueiA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy56LCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgXCJ0ZW1wbGF0ZVwiIHRoYXQgc2V0cyBjb25zdGFudCBhdHRpYnV0ZXMgZm9yIGVhY2ggdmVydGV4LCB3aGljaCBpcyB0aGVuIG1vZGlmaWVkIHBlciB2ZXJ0ZXggb3IgcGVyIGZlYXR1cmUuXG4gICAgICogQSBwbGFpbiBKUyBhcnJheSBtYXRjaGluZyB0aGUgb3JkZXIgb2YgdGhlIHZlcnRleCBsYXlvdXQuXG4gICAgICovXG4gICAgbWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKSB7XG4gICAgICAgIGxldCBpID0gMDtcblxuICAgICAgICAvLyBwb3NpdGlvbiAtIHggJiB5IGNvb3JkcyB3aWxsIGJlIGZpbGxlZCBpbiBwZXItdmVydGV4IGJlbG93XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnogfHwgMDtcblxuICAgICAgICAvLyBsYXllciBvcmRlciAtIHcgY29vcmQgb2YgJ3Bvc2l0aW9uJyBhdHRyaWJ1dGUgKGZvciBwYWNraW5nIGVmZmljaWVuY3kpXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSB0aGlzLnNjYWxlT3JkZXIoc3R5bGUub3JkZXIpO1xuXG4gICAgICAgIC8vIG5vcm1hbFxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAxICogMTI3O1xuXG4gICAgICAgIC8vIGNvbG9yXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclswXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzFdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMl0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclszXSAqIDI1NTtcblxuICAgICAgICAvLyBzZWxlY3Rpb24gY29sb3JcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzBdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclsxXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMl0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzNdICogMjU1O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRleHR1cmUgVVZzIHRvIHRlbXBsYXRlIG9ubHkgaWYgbmVlZGVkXG4gICAgICAgIGlmICh0aGlzLnRleGNvb3Jkcykge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRleF90ZW1wbGF0ZTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2x5Z29ucyhwb2x5Z29ucywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB2ZXJ0ZXhfdGVtcGxhdGUgPSB0aGlzLm1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSk7XG4gICAgICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICAgICAgdGV4Y29vcmRfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3RleGNvb3JkLFxuICAgICAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplOiA2NTUzNSwgLy8gc2NhbGUgVVZzIHRvIHVuc2lnbmVkIHNob3J0c1xuICAgICAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXM6ICFzdHlsZS50aWxlX2VkZ2VzLFxuICAgICAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZTogR2VvLnRpbGVfc2NhbGUgKiBjb250ZXh0LnRpbGUucGFkX3NjYWxlICogNCxcbiAgICAgICAgICAgIHdpbmRpbmc6IGNvbnRleHQud2luZGluZ1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEV4dHJ1ZGVkIHBvbHlnb25zIChlLmcuIDNEIGJ1aWxkaW5ncylcbiAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUgJiYgc3R5bGUuaGVpZ2h0KSB7XG4gICAgICAgICAgICBidWlsZEV4dHJ1ZGVkUG9seWdvbnMoXG4gICAgICAgICAgICAgICAgcG9seWdvbnMsXG4gICAgICAgICAgICAgICAgc3R5bGUueiwgc3R5bGUuaGVpZ2h0LCBzdHlsZS5taW5faGVpZ2h0LFxuICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfbm9ybWFsLFxuICAgICAgICAgICAgICAgIDEyNywgLy8gc2NhbGUgbm9ybWFscyB0byBzaWduZWQgYnl0ZXNcbiAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZ3VsYXIgcG9seWdvbnNcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWlsZFBvbHlnb25zKFxuICAgICAgICAgICAgICAgIHBvbHlnb25zLFxuICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxufSk7XG4iLCIvLyBSYXN0ZXIgdGlsZSByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCB7UG9seWdvbnN9IGZyb20gJy4uL3BvbHlnb25zL3BvbHlnb25zJztcblxuZXhwb3J0IGxldCBSYXN0ZXJTdHlsZSA9IE9iamVjdC5jcmVhdGUoUG9seWdvbnMpO1xuXG5PYmplY3QuYXNzaWduKFJhc3RlclN0eWxlLCB7XG4gICAgbmFtZTogJ3Jhc3RlcicsXG4gICAgc3VwZXI6IFBvbHlnb25zLFxuICAgIGJ1aWx0X2luOiB0cnVlLFxuICAgIHNlbGVjdGlvbjogZmFsc2UsIC8vIG5vIGZlYXR1cmUgc2VsZWN0aW9uIGJ5IGRlZmF1bHRcblxuICAgIGluaXQoKSB7XG4gICAgICAgIC8vIFJlcXVpcmVkIGZvciByYXN0ZXIgdGlsZXNcbiAgICAgICAgdGhpcy5yYXN0ZXIgPSB0aGlzLnJhc3RlciB8fCAnY29sb3InO1xuXG4gICAgICAgIHRoaXMuc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICAvLyBSYXN0ZXIgdGlsZXMgZGVmYXVsdCB0byB3aGl0ZSB2ZXJ0ZXggY29sb3IsIGFzIHRoaXMgY29sb3Igd2lsbCB0aW50IHRoZSB1bmRlcmx5aW5nIHRleHR1cmVcbiAgICAgICAgZHJhdy5jb2xvciA9IGRyYXcuY29sb3IgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgICAgIHJldHVybiB0aGlzLnN1cGVyLl9wcmVwcm9jZXNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG59KTtcbiIsIi8vIFJlbmRlcmluZyBzdHlsZXNcblxuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi4vc2VsZWN0aW9uJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4uL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWQk9NZXNoIGZyb20gJy4uL2dsL3Zib19tZXNoJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IE1hdGVyaWFsIGZyb20gJy4uL21hdGVyaWFsJztcbmltcG9ydCBMaWdodCBmcm9tICcuLi9saWdodCc7XG5pbXBvcnQge1Jhc3RlclRpbGVTb3VyY2V9IGZyb20gJy4uL3NvdXJjZXMvcmFzdGVyJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uRnJhZ21lbnQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9nbC9zaGFkZXJzL3NlbGVjdGlvbl9mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19yYXN0ZXJzID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9yYXN0ZXJzLmdsc2wnLCAndXRmOCcpO1xuXG4vLyBCYXNlIGNsYXNzXG5cbmV4cG9ydCB2YXIgU3R5bGUgPSB7XG4gICAgaW5pdCAoeyBnZW5lcmF0aW9uLCBzdHlsZXMsIHNvdXJjZXMgPSB7fSwgaW50cm9zcGVjdGlvbiB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsgICAgICAgICAgICAgICAvLyBzY2VuZSBnZW5lcmF0aW9uIGlkIHRoaXMgc3R5bGUgd2FzIGNyZWF0ZWQgZm9yXG4gICAgICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzOyAgICAgICAgICAgICAgICAgICAgICAgLy8gc3R5bGVzIGZvciBzY2VuZVxuICAgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzOyAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgc291cmNlcyBmb3Igc2NlbmVcbiAgICAgICAgdGhpcy5kZWZpbmVzID0gKHRoaXMuaGFzT3duUHJvcGVydHkoJ2RlZmluZXMnKSAmJiB0aGlzLmRlZmluZXMpIHx8IHt9OyAvLyAjZGVmaW5lcyB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBzaGFkZXJzXG4gICAgICAgIHRoaXMuc2hhZGVycyA9ICh0aGlzLmhhc093blByb3BlcnR5KCdzaGFkZXJzJykgJiYgdGhpcy5zaGFkZXJzKSB8fCB7fTsgLy8gc2hhZGVyIGN1c3RvbWl6YXRpb24gKHVuaWZvcm1zLCBkZWZpbmVzLCBibG9ja3MsIGV0Yy4pXG4gICAgICAgIHRoaXMuaW50cm9zcGVjdGlvbiA9IGludHJvc3BlY3Rpb24gfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24gfHwgdGhpcy5pbnRyb3NwZWN0aW9uIHx8IGZhbHNlOyAgIC8vIGZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIHN0eWxlIHN1cHBvcnRzIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgLy8gcHJvZ3JhbXMgYXJlIGN1cnJlbnRseSBjb21waWxpbmdcbiAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9ncmFtcyBhcmUgZmluaXNoZWQgY29tcGlsaW5nXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0wgcHJvZ3JhbSByZWZlcmVuY2UgKGZvciBtYWluIHJlbmRlciBwYXNzKVxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbnVsbDsgICAgICAgICAgICAgIC8vIEdMIHByb2dyYW0gcmVmZXJlbmNlIGZvciBmZWF0dXJlIHNlbGVjdGlvbiByZW5kZXIgcGFzc1xuICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSB7fTsgICAgICAgICAgICAgICAgICAgIC8vIHN0eWxlIGZvciBmZWF0dXJlIGN1cnJlbnRseSBiZWluZyBwYXJzZWQsIHNoYXJlZCB0byBsZXNzZW4gR0MvbWVtb3J5IHRocmFzaFxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZSA9IFtdOyAgICAgICAgICAgICAgICAgIC8vIHNoYXJlZCBzaW5nbGUtdmVydGV4IHRlbXBsYXRlLCBmaWxsZWQgb3V0IGJ5IGVhY2ggc3R5bGVcbiAgICAgICAgdGhpcy50aWxlX2RhdGEgPSB7fTtcblxuICAgICAgICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdGhpcyBvYmplY3QgdG8gYmUgY2FsbGVkIGZyb20gd29ya2VyIHRocmVhZHNcbiAgICAgICAgdGhpcy5tYWluX3RocmVhZF90YXJnZXQgPSBbJ1N0eWxlJywgdGhpcy5uYW1lLCB0aGlzLmdlbmVyYXRpb25dLmpvaW4oJy8nKTtcbiAgICAgICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0LCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgd29ybGQgY29vcmRzIHRvIHdyYXAgZXZlcnkgMTAwLDAwMCBtZXRlcnMsIGNhbiB0dXJuIG9mZiBieSBzZXR0aW5nIHRoaXMgdG8gJ2ZhbHNlJ1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9XT1JMRF9QT1NJVElPTl9XUkFQID0gMTAwMDAwO1xuXG4gICAgICAgIC8vIEJsZW5kaW5nXG4gICAgICAgIHRoaXMuYmxlbmQgPSB0aGlzLmJsZW5kIHx8ICdvcGFxdWUnOyAgICAgICAgLy8gZGVmYXVsdDogb3BhcXVlIHN0eWxlcyBhcmUgZHJhd24gZmlyc3QsIHdpdGhvdXQgYmxlbmRpbmdcbiAgICAgICAgdGhpcy5kZWZpbmVzW2BUQU5HUkFNX0JMRU5EXyR7dGhpcy5ibGVuZC50b1VwcGVyQ2FzZSgpfWBdID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuYmxlbmRfb3JkZXIgPT0gbnVsbCkgeyAvLyBjb250cm9scyBvcmRlciBvZiByZW5kZXJpbmcgZm9yIHN0eWxlcyB3L25vbi1vcGFxdWUgYmxlbmRpbmdcbiAgICAgICAgICAgIHRoaXMuYmxlbmRfb3JkZXIgPSAtMTsgLy8gZGVmYXVsdHMgdG8gZmlyc3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBzdHlsZSBkZWZpbmVzIGl0cyBvd24gbWF0ZXJpYWwsIHJlcGxhY2UgdGhlIGluaGVyaXRlZCBtYXRlcmlhbCBpbnN0YW5jZVxuICAgICAgICBpZiAoISh0aGlzLm1hdGVyaWFsIGluc3RhbmNlb2YgTWF0ZXJpYWwpKSB7XG4gICAgICAgICAgICBpZiAoIU1hdGVyaWFsLmlzVmFsaWQodGhpcy5tYXRlcmlhbCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMubWF0ZXJpYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHRoaXMubWF0ZXJpYWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuaW5qZWN0KHRoaXMpO1xuXG4gICAgICAgIC8vIFNldCBsaWdodGluZyBtb2RlOiBmcmFnbWVudCwgdmVydGV4LCBvciBub25lIChzcGVjaWZpZWQgYXMgJ2ZhbHNlJylcbiAgICAgICAgTGlnaHQuc2V0TW9kZSh0aGlzLmxpZ2h0aW5nLCB0aGlzKTtcblxuICAgICAgICAvLyBTZXR1cCByYXN0ZXIgc2FtcGxlcnMgaWYgbmVlZGVkXG4gICAgICAgIHRoaXMuc2V0dXBSYXN0ZXJzKCk7XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSxcblxuICAgIGRlc3Ryb3kgKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0uZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbl9wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgcmVzZXQgKCkge1xuICAgIH0sXG5cbiAgICBiYXNlU3R5bGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlIHx8IHRoaXMubmFtZTtcbiAgICB9LFxuXG4gICAgZmlsbFZlcnRleFRlbXBsYXRlKGF0dHJpYnV0ZSwgdmFsdWUsIHsgc2l6ZSwgb2Zmc2V0IH0pIHtcbiAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCA9PT0gdW5kZWZpbmVkKSA/IDAgOiBvZmZzZXQ7XG5cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4W2F0dHJpYnV0ZV07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBubyBpbmRleCBmb3VuZCBpbiB2ZXJ0ZXggbGF5b3V0IGZvciBhdHRyaWJ1dGUgJyR7YXR0cmlidXRlfSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbHVlLmxlbmd0aCA+IGkgPyB2YWx1ZVtpXSA6IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaW5kZXggKyBpICsgb2Zmc2V0XSA9IHY7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqKiBTdHlsZSBwYXJzaW5nIGFuZCBnZW9tZXRyeSBjb25zdHJ1Y3Rpb24gKioqL1xuXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3QgdG8gaG9sZCBmZWF0dXJlIGRhdGEgKGZvciBhIHRpbGUgb3Igb3RoZXIgb2JqZWN0KVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogbnVsbCxcbiAgICAgICAgICAgIHVuaWZvcm1zOiB7fSxcbiAgICAgICAgICAgIHRleHR1cmVzOiBbXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldO1xuICAgIH0sXG5cbiAgICAvLyBGaW5hbGl6ZXMgYW4gb2JqZWN0IGhvbGRpbmcgZmVhdHVyZSBkYXRhIChmb3IgYSB0aWxlIG9yIG90aGVyIG9iamVjdClcbiAgICBlbmREYXRhICh0aWxlKSB7XG4gICAgICAgIHZhciB0aWxlX2RhdGEgPSB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV07XG4gICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRpbGVfZGF0YSAmJiB0aWxlX2RhdGEudmVydGV4X2RhdGEgJiYgdGlsZV9kYXRhLnZlcnRleF9kYXRhLnZlcnRleF9jb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIE9ubHkga2VlcCBmaW5hbCBieXRlIGJ1ZmZlclxuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9kYXRhLmVuZCgpO1xuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS5lbGVtZW50X2J1ZmZlcjtcbiAgICAgICAgICAgIHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YSA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfYnVmZmVyOyAvLyBjb252ZXJ0IGZyb20gaW5zdGFuY2UgdG8gcmF3IHR5cGVkIGFycmF5XG5cbiAgICAgICAgICAgIC8vIExvYWQgcmFzdGVyIHRpbGVzIHBhc3NlZCBmcm9tIGRhdGEgc291cmNlXG4gICAgICAgICAgICAvLyBCbG9ja3MgbWVzaCBjb21wbGV0aW9uIHRvIGF2b2lkIGZsaWNrZXJpbmdcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmFzdGVyVGV4dHVyZXModGlsZSwgdGlsZV9kYXRhKS50aGVuKCgpID0+IHRpbGVfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOyAvLyBkb24ndCBzZW5kIHRpbGUgZGF0YSBiYWNrIGlmIGRvZXNuJ3QgaGF2ZSBnZW9tZXRyeVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEhhcyBtZXNoIGRhdGEgZm9yIGEgZ2l2ZW4gdGlsZT9cbiAgICBoYXNEYXRhRm9yVGlsZSAodGlsZV9rZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZV9kYXRhW3RpbGVfa2V5XSAhPSBudWxsO1xuICAgIH0sXG5cbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0YSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHlsZSA9IHRoaXMucGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNraXAgZmVhdHVyZT9cbiAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyc3QgZmVhdHVyZSBpbiB0aGlzIHJlbmRlciBzdHlsZT9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSA9IHRoaXMudmVydGV4X2xheW91dC5jcmVhdGVWZXJ0ZXhEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1aWxkR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgc3R5bGUsIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIGJ1aWxkR2VvbWV0cnkgKGdlb21ldHJ5LCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvbHlnb25zKFtnZW9tZXRyeS5jb29yZGluYXRlc10sIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQb2x5Z29ucyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lcyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZXMoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgICAgICBzdHlsZS5vcmRlciA9IHRoaXMucGFyc2VPcmRlcihkcmF3Lm9yZGVyLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gKG9ubHkgaWYgc3R5bGUgc3VwcG9ydHMgaXQpXG4gICAgICAgICAgICB2YXIgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgc3R5bGUuaW50ZXJhY3RpdmUgPSB0aGlzLmludHJvc3BlY3Rpb24gfHwgZHJhdy5pbnRlcmFjdGl2ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoc3R5bGUuaW50ZXJhY3RpdmUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBmZWF0dXJlIGlzIG1hcmtlZCBhcyBzZWxlY3RhYmxlXG4gICAgICAgICAgICBpZiAoc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNlbGVjdGlvbl9jb2xvciA9IEZlYXR1cmVTZWxlY3Rpb24ubWFrZUNvbG9yKGZlYXR1cmUsIGNvbnRleHQudGlsZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zZWxlY3Rpb25fY29sb3IgPSBGZWF0dXJlU2VsZWN0aW9uLmRlZmF1bHRDb2xvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5fcGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCAnU3R5bGUucGFyc2VGZWF0dXJlOiBzdHlsZSBwYXJzaW5nIGVycm9yJywgZmVhdHVyZSwgc3R5bGUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgfSxcblxuICAgIHByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgLy8gUHJlcHJvY2VzcyBmaXJzdCB0aW1lXG4gICAgICAgIGlmICghZHJhdy5wcmVwcm9jZXNzZWQpIHtcbiAgICAgICAgICAgIGRyYXcgPSB0aGlzLl9wcmVwcm9jZXNzKGRyYXcpOyAvLyBvcHRpb25hbCBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHJhdy5wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBvcHRpb25hbGx5IGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIFBhcnNlIGFuIG9yZGVyIHZhbHVlXG4gICAgcGFyc2VPcmRlciAob3JkZXIsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgIGlmICh0eXBlb2Ygb3JkZXIgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gU3R5bGVQYXJzZXIuY2FsY3VsYXRlT3JkZXIob3JkZXIsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIGZpbmFsIHByZWNpc2lvbiBmb3IgaGFsZi1sYXllcnMgKGZvciBvdXRsaW5lcylcbiAgICBzY2FsZU9yZGVyIChvcmRlcikge1xuICAgICAgICByZXR1cm4gb3JkZXIgKiAyO1xuICAgIH0sXG5cbiAgICAvLyBQYXJzZSBhIGNvbG9yIG9mIGNob29zZSBhIGRlZmF1bHQgaWYgYWNjZXB0YWJsZSwgcmV0dXJuIHVuZGVmaW5lZCBpZiBjb2xvciBtaXNzaW5nXG4gICAgcGFyc2VDb2xvcihjb2xvciwgY29udGV4dCkge1xuICAgICAgICAvLyBOZWVkIGVpdGhlciBhIGNvbG9yLCBvciBhIHNoYWRlciBibG9jayBmb3IgJ2NvbG9yJyBvciAnZmlsdGVyJ1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShjb2xvciwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcy5jb2xvciB8fCB0aGlzLnNoYWRlcnMuYmxvY2tzLmZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmRlZmF1bHRzLmNvbG9yO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIGZ1bmN0aW9ucyBhcmUgbm8tb3BzIHVudGlsIG92ZXJyaWRlblxuICAgIGJ1aWxkUG9seWdvbnMgKCkge30sXG4gICAgYnVpbGRMaW5lcyAoKSB7fSxcbiAgICBidWlsZFBvaW50cyAoKSB7fSxcblxuXG4gICAgLyoqKiBHTCBzdGF0ZSBhbmQgcmVuZGVyaW5nICoqKi9cblxuICAgIHNldEdMIChnbCkge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMubWF4X3RleHR1cmVfc2l6ZSA9IFRleHR1cmUuZ2V0TWF4VGV4dHVyZVNpemUodGhpcy5nbCk7XG4gICAgfSxcblxuICAgIG1ha2VNZXNoICh2ZXJ0ZXhfZGF0YSwgdmVydGV4X2VsZW1lbnRzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWQk9NZXNoKHRoaXMuZ2wsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIHRoaXMudmVydGV4X2xheW91dCwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIHJlbmRlciAobWVzaCkge1xuICAgICAgICByZXR1cm4gbWVzaC5yZW5kZXIoKTtcbiAgICB9LFxuXG4gICAgY29tcGlsZSAoKSB7XG4gICAgICAgIGlmICghdGhpcy5nbCkge1xuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBzdHlsZS5jb21waWxlKCk6IHNraXBwaW5nIGZvciAke3RoaXMubmFtZX0gYmVjYXVzZSBubyBHTCBjb250ZXh0YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcGlsaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyhuZXcgRXJyb3IoYHN0eWxlLmNvbXBpbGUoKTogc2tpcHBpbmcgZm9yICR7dGhpcy5uYW1lfSBiZWNhdXNlIHN0eWxlIGlzIGFscmVhZHkgY29tcGlsaW5nYCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tcGlsaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEJ1aWxkIGRlZmluZXMgJiBmb3Igc2VsZWN0aW9uIChuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgc2luY2UgdGhlIGZpcnN0IGlzIHN0b3JlZCBhcyBhIHJlZmVyZW5jZSBieSB0aGUgcHJvZ3JhbSlcbiAgICAgICAgdmFyIGRlZmluZXMgPSB0aGlzLmJ1aWxkRGVmaW5lTGlzdCgpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb25fZGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmluZXMpO1xuICAgICAgICAgICAgc2VsZWN0aW9uX2RlZmluZXMuVEFOR1JBTV9GRUFUVVJFX1NFTEVDVElPTiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgYW55IGN1c3RvbSBjb2RlIGJsb2NrcywgdW5pZm9ybSBkZXBlbmRlbmNpZXMsIGV0Yy5cbiAgICAgICAgdmFyIGJsb2NrcyA9ICh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLmJsb2Nrcyk7XG4gICAgICAgIHZhciBibG9ja19zY29wZXMgPSAodGhpcy5zaGFkZXJzICYmIHRoaXMuc2hhZGVycy5ibG9ja19zY29wZXMpO1xuICAgICAgICB2YXIgdW5pZm9ybXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLnVuaWZvcm1zKTtcblxuICAgICAgICAvLyBBY2NlcHQgYSBzaW5nbGUgZXh0ZW5zaW9uLCBvciBhbiBhcnJheSBvZiBleHRlbnNpb25zXG4gICAgICAgIHZhciBleHRlbnNpb25zID0gKHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMuZXh0ZW5zaW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgZXh0ZW5zaW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBbZXh0ZW5zaW9uc107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgc2hhZGVyc1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gbmV3IFNoYWRlclByb2dyYW0oXG4gICAgICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjLFxuICAgICAgICAgICAgICAgIHRoaXMuZnJhZ21lbnRfc2hhZGVyX3NyYyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lcyxcbiAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrcyxcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tfc2NvcGVzLFxuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbS5jb21waWxlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBuZXcgU2hhZGVyUHJvZ3JhbShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfc2hhZGVyX3NyYyxcbiAgICAgICAgICAgICAgICAgICAgc2hhZGVyU3JjX3NlbGVjdGlvbkZyYWdtZW50LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAodGhpcy5uYW1lICsgJyAoc2VsZWN0aW9uKScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lczogc2VsZWN0aW9uX2RlZmluZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbS5jb21waWxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRocm93KG5ldyBFcnJvcihgc3R5bGUuY29tcGlsZSgpOiBzdHlsZSAke3RoaXMubmFtZX0gZXJyb3I6YCwgZXJyb3IpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzaGFkZXIgYmxvY2tcbiAgICBhZGRTaGFkZXJCbG9jayAoa2V5LCBibG9jaywgc2NvcGUgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3MgPSB0aGlzLnNoYWRlcnMuYmxvY2tzIHx8IHt9O1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gPSB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gfHwgW107XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3Nba2V5XS5wdXNoKGJsb2NrKTtcblxuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3BlcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldIHx8IFtdO1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tleV0ucHVzaChzY29wZSk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSBhbGwgc2hhZGVyIGJsb2NrcyBmb3Iga2V5XG4gICAgcmVtb3ZlU2hhZGVyQmxvY2sgKGtleSkge1xuICAgICAgICBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2Nrc1trZXldID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZXBsYWNlU2hhZGVyQmxvY2sgKGtleSwgYmxvY2ssIHNjb3BlID0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZVNoYWRlckJsb2NrKGtleSk7XG4gICAgICAgIHRoaXMuYWRkU2hhZGVyQmxvY2soa2V5LCBibG9jaywgc2NvcGUpO1xuICAgIH0sXG5cbiAgICAvKiogVE9ETzogY291bGQgcHJvYmFibHkgY29tYmluZSBhbmQgZ2VuZXJhbGl6ZSB0aGlzIHdpdGggc2ltaWxhciBtZXRob2QgaW4gU2hhZGVyUHJvZ3JhbVxuICAgICAqIChsaXN0IG9mIGRlZmluZSBvYmplY3RzIHRoYXQgaW5oZXJpdCBmcm9tIGVhY2ggb3RoZXIpXG4gICAgICovXG4gICAgYnVpbGREZWZpbmVMaXN0ICgpIHtcbiAgICAgICAgLy8gQWRkIGFueSBjdXN0b20gZGVmaW5lcyB0byBidWlsdC1pbiBzdHlsZSBkZWZpbmVzXG4gICAgICAgIHZhciBkZWZpbmVzID0ge307IC8vIGNyZWF0ZSBhIG5ldyBvYmplY3QgdG8gYXZvaWQgbXV0YXRpbmcgYSBwcm90b3R5cGUgdmFsdWUgdGhhdCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgc3R5bGVzXG4gICAgICAgIGlmICh0aGlzLmRlZmluZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgZCBpbiB0aGlzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5kZWZpbmVzW2RdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNoYWRlcnMgIT0gbnVsbCAmJiB0aGlzLnNoYWRlcnMuZGVmaW5lcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKGQgaW4gdGhpcy5zaGFkZXJzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5zaGFkZXJzLmRlZmluZXNbZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZXM7XG5cbiAgICB9LFxuXG4gICAgLy8gRGV0ZXJtaW5lcyBpZiAncmFzdGVyJyBwYXJhbWV0ZXIgaXMgc2V0IHRvIGEgdmFsaWQgdmFsdWVcbiAgICBoYXNSYXN0ZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIChbJ2NvbG9yJywgJ25vcm1hbCcsICdjdXN0b20nXS5pbmRleE9mKHRoaXMucmFzdGVyKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgLy8gU2V0dXAgcmFzdGVyIGFjY2VzcyBpbiBzaGFkZXJzXG4gICAgc2V0dXBSYXN0ZXJzICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Jhc3RlcnMoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5hYmxlIHJhc3RlciB0ZXh0dXJlcyBhbmQgY29uZmlndXJlIGhvdyBmaXJzdCByYXN0ZXIgaXMgYXBwbGllZFxuICAgICAgICBpZiAodGhpcy5yYXN0ZXIgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX0NPTE9SID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnJhc3RlciA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX05PUk1BTCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBjdXN0b20gcmFzdGVyIChzYW1wbGVycyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGJ1dCBub3QgYXV0b21hdGljYWxseSBhcHBsaWVkKVxuXG4gICAgICAgIC8vIEEgZ2l2ZW4gc3R5bGUgbWF5IGJlIGJ1aWx0IHdpdGggbXVsdGlwbGUgZGF0YSBzb3VyY2VzLCBlYWNoIG9mIHdoaWNoIG1heSBhdHRhY2hcbiAgICAgICAgLy8gYSB2YXJpYWJsZSBudW1iZXIgb2YgcmFzdGVyIHNvdXJjZXMgKDAgdG8gTiwgd2hlcmUgTiBpcyB0aGUgbWF4IG51bWJlciBvZiByYXN0ZXIgc291cmNlc1xuICAgICAgICAvLyBkZWZpbmVkIGZvciB0aGUgc2NlbmUpLiBUaGlzIG1lYW5zIHdlIGRvbid0IGtub3cgKndoaWNoKiBvciAqaG93IG1hbnkqIHJhc3RlcnMgd2lsbCBiZVxuICAgICAgICAvLyBib3VuZCBub3csIGF0IGluaXRpYWwgY29tcGlsZS10aW1lOyB3ZSBvbmx5IGtub3cgdGhpcyBhdCBnZW9tZXRyeSBidWlsZC10aW1lLiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB3ZSBjYW4gYmluZCBhcyBtYW55IHJhc3RlciBzb3VyY2VzIGFzIG5lZWRlZCwgd2UgZGVjbGFyZSBvdXIgdW5pZm9ybSBhcnJheXMgdG8gaG9sZFxuICAgICAgICAvLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9zc2libGUgc291cmNlcy4gQXQgcmVuZGVyIHRpbWUsIG9ubHkgdGhlIG5lY2Vzc2FyeSBudW1iZXIgb2YgcmFzdGVyc1xuICAgICAgICAvLyBhcmUgYm91bmQgKHRoZSByZW1haW5pbmcgc2xvdHMgYXJlbid0IGludGVuZGVkIHRvIGJlIGFjY2Vzc2VkKS5cbiAgICAgICAgbGV0IG51bV9yYXN0ZXJfc291cmNlcyA9XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpXG4gICAgICAgICAgICAuZmlsdGVyKHMgPT4gdGhpcy5zb3VyY2VzW3NdIGluc3RhbmNlb2YgUmFzdGVyVGlsZVNvdXJjZSlcbiAgICAgICAgICAgIC5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTlVNX1JBU1RFUl9TT1VSQ0VTID0gYGludCgke251bV9yYXN0ZXJfc291cmNlc30pYDtcbiAgICAgICAgaWYgKG51bV9yYXN0ZXJfc291cmNlcyA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBtb2RlbCBwb3NpdGlvbiBvZiB0aWxlJ3MgY29vcmRpbmF0ZSB6b29tIGZvciByYXN0ZXIgdGlsZSB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTU9ERUxfUE9TSVRJT05fQkFTRV9aT09NX1ZBUllJTkcgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBVbmlmb3JtcyBhbmQgbWFjcm9zIGZvciByYXN0ZXIgc2FtcGxlcnNcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZVNoYWRlckJsb2NrKCdyYXN0ZXInLCBzaGFkZXJTcmNfcmFzdGVycywgJ1Jhc3RlcicpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIExvYWQgcmFzdGVyIHRpbGUgdGV4dHVyZXMgYW5kIHNldCB1bmlmb3Jtc1xuICAgIGJ1aWxkUmFzdGVyVGV4dHVyZXMgKHRpbGUsIHRpbGVfZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzUmFzdGVycygpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29uZmlncyA9IHt9OyAvLyB0ZXh0dXJlIGNvbmZpZ3MgdG8gcGFzcyB0byB0ZXh0dXJlIGJ1aWxkZXIsIGtleWVkIGJ5IHRleHR1cmUgbmFtZVxuICAgICAgICBsZXQgaW5kZXggPSB7fTsgICAvLyBpbmRleCBpbnRvIHJhc3RlciBzYW1wbGVyIGFycmF5LCBrZXllZCBieSB0ZXh0dXJlIG5hbWVcblxuICAgICAgICAvLyBUT0RPOiBkYXRhIHNvdXJjZSBjb3VsZCByZXRyaWV2ZSByYXN0ZXIgdGV4dHVyZSBVUkxzXG4gICAgICAgIHRpbGUucmFzdGVycy5tYXAociA9PiB0aGlzLnNvdXJjZXNbcl0pLmZpbHRlcih4ID0+IHgpLmZvckVhY2goKHNvdXJjZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFJhc3RlclRpbGVTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gc291cmNlLnRpbGVUZXh0dXJlKHRpbGUpO1xuICAgICAgICAgICAgICAgIGNvbmZpZ3NbY29uZmlnLnVybF0gPSBjb25maWc7XG4gICAgICAgICAgICAgICAgaW5kZXhbY29uZmlnLnVybF0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlncykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIHRleHR1cmVzIG9uIG1haW4gdGhyZWFkIGFuZCByZXR1cm4gd2hlbiBkb25lXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gYmxvY2sgdGhlIGJ1aWxkaW5nIG9mIGEgcmFzdGVyIHRpbGUgbWVzaCB1bnRpbCBpdHMgdGV4dHVyZSBpcyBsb2FkZWQsXG4gICAgICAgIC8vIHRvIGF2b2lkIGZsaWNrZXJpbmcgd2hpbGUgbG9hZGluZyAodGV4dHVyZSB3aWxsIHJlbmRlciBhcyBibGFjaylcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLmxvYWRUZXh0dXJlcycsIGNvbmZpZ3MpXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0dXJlcyB8fCB0ZXh0dXJlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgdGV4dHVyZSB1bmlmb3JtcyAocmV0dXJuZWQgYWZ0ZXIgbG9hZGluZyBmcm9tIG1haW4gdGhyZWFkKVxuICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3JtcyA9IHRpbGVfZGF0YS51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMgPSB0aWxlX2RhdGEudGV4dHVyZXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBsZXQgdV9zYW1wbGVycyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJzJ10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdV9zaXplcyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJfc2l6ZXMnXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCB1X29mZnNldHMgPSB0aWxlX2RhdGEudW5pZm9ybXNbJ3VfcmFzdGVyX29mZnNldHMnXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCgoW3RuYW1lLCB0d2lkdGgsIHRoZWlnaHRdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXhbdG5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFzdGVyX2Nvb3JkcyA9IGNvbmZpZ3NbdG5hbWVdLmNvb3JkczsgLy8gdGlsZSBjb29yZHMgb2YgcmFzdGVyIHRpbGVcblxuICAgICAgICAgICAgICAgICAgICB1X3NhbXBsZXJzW2ldID0gdG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcy5wdXNoKHRuYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICB1X3NpemVzW2ldID0gW3R3aWR0aCwgdGhlaWdodF07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGlsZSBnZW9tZXRyeSBtYXkgYmUgYXQgYSBoaWdoZXIgem9vbSB0aGFuIHRoZSByYXN0ZXIgdGlsZSB0ZXh0dXJlLFxuICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBhbiBvdmVyem9vbWVkIHJhc3RlciB0aWxlKSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFkanVzdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmFzdGVyIHRleHR1cmUgVVZzIHRvIG9mZnNldCB0byB0aGUgYXBwcm9wcmlhdGUgc3RhcnRpbmcgcG9pbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZ2VvbWV0cnkgdGlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuY29vcmRzLnogPiByYXN0ZXJfY29vcmRzLnopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkeiA9IHRpbGUuY29vcmRzLnogLSByYXN0ZXJfY29vcmRzLno7IC8vICMgb2YgbGV2ZWxzIHJhc3RlciBzb3VyY2UgaXMgb3Zlcnpvb21lZFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR6MiA9IE1hdGgucG93KDIsIGR6KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVfb2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGlsZS5jb29yZHMueCAlIGR6MikgLyBkejIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR6MiAtIDEgLSAodGlsZS5jb29yZHMueSAlIGR6MikpIC8gZHoyLCAvLyBHTCB0ZXh0dXJlIGNvb3JkcyBhcmUgK1kgdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8gZHoyXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdV9vZmZzZXRzW2ldID0gWzAsIDAsIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWRcbiAgICBsb2FkVGV4dHVyZXMgKHRleHR1cmVzKSB7XG4gICAgICAgIC8vIE5COiBvbmx5IHJldHVybiBuYW1lIGFuZCBzaXplIG9mIHRleHR1cmVzIGxvYWRlZCwgYmVjYXVzZSB3ZSBjYW4ndCBzZW5kIGFjdHVhbCB0ZXh0dXJlIG9iamVjdHMgdG8gd29ya2VyXG4gICAgICAgIHJldHVybiBUZXh0dXJlLmNyZWF0ZUZyb21PYmplY3QodGhpcy5nbCwgdGV4dHVyZXMpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHRleHR1cmVzKS5tYXAodCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnRleHR1cmVzW3RdICYmIFRleHR1cmUudGV4dHVyZXNbdF0ubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHgpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHQucmV0YWluKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlcy5tYXAodCA9PiBbdC5uYW1lLCB0LndpZHRoLCB0LmhlaWdodF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFNldHVwIGFueSBHTCBzdGF0ZSBmb3IgcmVuZGVyaW5nXG4gICAgc2V0dXAgKCkge1xuICAgICAgICB0aGlzLnNldFVuaWZvcm1zKCk7XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuc2V0dXBQcm9ncmFtKFNoYWRlclByb2dyYW0uY3VycmVudCk7XG4gICAgfSxcblxuICAgIC8vIFNldCBzdHlsZSB1bmlmb3JtcyBvbiBjdXJyZW50bHkgYm91bmQgcHJvZ3JhbVxuICAgIHNldFVuaWZvcm1zICgpIHtcbiAgICAgICAgdmFyIHByb2dyYW0gPSBTaGFkZXJQcm9ncmFtLmN1cnJlbnQ7XG4gICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3Jtcyh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLCB0cnVlKTsgLy8gcmVzZXQgdGV4dHVyZSB1bml0IHRvIDBcbiAgICB9LFxuXG4gICAgLy8gUmVuZGVyIHN0YXRlIHNldHRpbmdzIGJ5IGJsZW5kIG1vZGVcbiAgICByZW5kZXJfc3RhdGVzOiB7XG4gICAgICAgIG9wYXF1ZTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogdHJ1ZSB9LFxuICAgICAgICBhZGQ6IHsgZGVwdGhfdGVzdDogdHJ1ZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH0sXG4gICAgICAgIG11bHRpcGx5OiB7IGRlcHRoX3Rlc3Q6IHRydWUsIGRlcHRoX3dyaXRlOiBmYWxzZSB9LFxuICAgICAgICBpbmxheTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogZmFsc2UgfSxcbiAgICAgICAgb3ZlcmxheTogeyBkZXB0aF90ZXN0OiBmYWxzZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH1cbiAgICB9LFxuXG4gICAgLy8gRGVmYXVsdCBzb3J0IG9yZGVyIGZvciBibGVuZCBtb2Rlc1xuICAgIGRlZmF1bHRfYmxlbmRfb3JkZXJzOiB7XG4gICAgICAgIG9wYXF1ZTogMCxcbiAgICAgICAgYWRkOiAxLFxuICAgICAgICBtdWx0aXBseTogMixcbiAgICAgICAgaW5sYXk6IDMsXG4gICAgICAgIG92ZXJsYXk6IDRcbiAgICB9LFxuXG4gICAgLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3Igc29ydGluZyBzdHlsZXMgYnkgYmxlbmRcbiAgICBibGVuZE9yZGVyU29ydCAoYSwgYikge1xuICAgICAgICAvLyBvcGFxdWUgYWx3YXlzIGNvbWVzIGZpcnN0XG4gICAgICAgIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJyB8fCBiLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgaWYgKGEuYmxlbmQgPT09ICdvcGFxdWUnICYmIGIuYmxlbmQgPT09ICdvcGFxdWUnKSB7IC8vIGlmIGJvdGggYXJlIG9wYXF1ZVxuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUgPCBiLm5hbWUgPyAtMSA6IDE7IC8vIHVzZSBuYW1lIGFzIHRpZSBicmVha2VyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gb25seSBgYWAgd2FzIG9wYXF1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIG9ubHkgYGJgIHdhcyBvcGFxdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzZSBleHBsaWNpdCBibGVuZCBvcmRlciBpZiBwb3NzaWJsZVxuICAgICAgICBpZiAoYS5ibGVuZF9vcmRlciA8IGIuYmxlbmRfb3JkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmJsZW5kX29yZGVyID4gYi5ibGVuZF9vcmRlcikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBibGVuZCBvcmRlcnMgYXJlIGVxdWFsLCB1c2UgZGVmYXVsdCBvcmRlciBieSBibGVuZCBtb2RlXG4gICAgICAgIGlmIChTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1thLmJsZW5kXSA8IFN0eWxlLmRlZmF1bHRfYmxlbmRfb3JkZXJzW2IuYmxlbmRdKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoU3R5bGUuZGVmYXVsdF9ibGVuZF9vcmRlcnNbYS5ibGVuZF0gPiBTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1tiLmJsZW5kXSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxOyAvLyB1c2UgbmFtZSBhcyB0aWUgYnJlYWtlclxuICAgIH0sXG5cbiAgICB1cGRhdGUgKCkge1xuICAgICAgICAvLyBTdHlsZS1zcGVjaWZpYyBhbmltYXRpb25cbiAgICAgICAgLy8gaWYgKHR5cGVvZiB0aGlzLmFuaW1hdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyAgICAgdGhpcy5hbmltYXRpb24oKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxufTtcbiIsIi8vIE1hbmFnZSByZW5kZXJpbmcgc3R5bGVzXG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4uL3V0aWxzL21lcmdlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuaW1wb3J0IHtQb2x5Z29uc30gZnJvbSAnLi9wb2x5Z29ucy9wb2x5Z29ucyc7XG5pbXBvcnQge0xpbmVzfSBmcm9tICcuL2xpbmVzL2xpbmVzJztcbmltcG9ydCB7UG9pbnRzfSBmcm9tICcuL3BvaW50cy9wb2ludHMnO1xuaW1wb3J0IHtUZXh0U3R5bGV9IGZyb20gJy4vdGV4dC90ZXh0JztcbmltcG9ydCB7UmFzdGVyU3R5bGV9IGZyb20gJy4vcmFzdGVyL3Jhc3Rlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfYWNjZXNzb3JzID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9hY2Nlc3NvcnMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfbGF5ZXJPcmRlciA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvbGF5ZXJfb3JkZXIuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvc2VsZWN0aW9uX2dsb2JhbHMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9zZWxlY3Rpb25fdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5zdHlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlX3N0eWxlcyA9IHt9O1xuXG4gICAgICAgIC8vIEFkZCBidWlsdC1pbiByZW5kZXJpbmcgc3R5bGVzXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShQb2x5Z29ucykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoTGluZXMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihPYmplY3QuY3JlYXRlKFBvaW50cykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoVGV4dFN0eWxlKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShSYXN0ZXJTdHlsZSkpO1xuICAgIH1cblxuICAgIC8vIEdsb2JhbCBjb25maWd1cmF0aW9uIGZvciBhbGwgc3R5bGVzXG4gICAgaW5pdCAoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soJ2dsb2JhbCcpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKCdzZXR1cCcpO1xuXG4gICAgICAgIC8vIE1vZGVsIGFuZCB3b3JsZCBwb3NpdGlvbiBhY2Nlc3NvcnNcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2FjY2Vzc29ycyk7XG5cbiAgICAgICAgLy8gTGF5ZXIgcmUtb3JkZXJpbmcgZnVuY3Rpb25cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2xheWVyT3JkZXIpO1xuXG4gICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uIGdsb2JhbFxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKCdnbG9iYWwnLCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyk7XG5cbiAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gdmVydGV4IHNoYWRlciBzdXBwb3J0XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdzZXR1cCcsIHNoYWRlclNyY19zZWxlY3Rpb25WZXJ0ZXgpO1xuXG4gICAgICAgIC8vIE1pbmltdW0gdmFsdWUgZm9yIGZsb2F0IGNvbXBhcmlzb25zXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0VQU0lMT04gPSAwLjAwMDAxO1xuXG4gICAgICAgIC8vIE1pbmltdW0gZGVwdGggYnVmZmVyIHZhbHVlIHNlcGFyYXRpbmcgZWFjaCBgb3JkZXJgIHVuaXRcbiAgICAgICAgLy8gQXNzdW1lIG1pbiAxNi1iaXQgZGVwdGggYnVmZmVyLCBpbiBwcmFjdGljZSB1c2VzIDE0LWJpdHMsIDEgZXh0cmEgYml0IHRvIGhhbmRsZSB2aXJ0dWFsIGhhbGYtbGF5ZXJzXG4gICAgICAgIC8vIGZvciBvdXRsaW5lcyAoaW5zZXJ0ZWQgaW4gYmV0d2VlbiBsYXllcnMpLCBhbm90aGVyIGV4dHJhIGJpdCB0byBwcmV2ZW50IHByZWNpc2lvbiBsb3NzXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0xBWUVSX0RFTFRBID0gMSAvICgxIDw8IDE0KTtcblxuICAgICAgICAvLyBJbnRlcm5hbCB0aWxlIHNjYWxlXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX1RJTEVfU0NBTEUgPVxuICAgICAgICAgICAgYHZlYzMoJHtHZW8udGlsZV9zY2FsZX0uLCAke0dlby50aWxlX3NjYWxlfS4sIHVfbWV0ZXJzX3Blcl9waXhlbCAqICR7R2VvLnRpbGVfc2l6ZX0uKWA7XG5cbiAgICAgICAgLy8gSW5jcmVhc2VzIHByZWNpc2lvbiBmb3IgaGVpZ2h0IHZhbHVlc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXMuVEFOR1JBTV9IRUlHSFRfU0NBTEUgPSBHZW8uaGVpZ2h0X3NjYWxlO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgYWxsIHN0eWxlcyBmb3IgYSBnaXZlbiBHTCBjb250ZXh0XG4gICAgZGVzdHJveSAoZ2wpIHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdHlsZXMpLmZvckVhY2goKF9uYW1lKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLnN0eWxlc1tfbmFtZV07XG4gICAgICAgICAgICBpZiAoc3R5bGUuZ2wgPT09IGdsKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZU1hbmFnZXIuZGVzdHJveTogZGVzdHJveWluZyByZW5kZXIgc3R5bGUgJHtzdHlsZS5uYW1lfWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmJhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0eWxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgYSBzdHlsZVxuICAgIHJlZ2lzdGVyIChzdHlsZSkge1xuICAgICAgICB0aGlzLnN0eWxlc1tzdHlsZS5uYW1lXSA9IHN0eWxlO1xuICAgICAgICB0aGlzLmJhc2Vfc3R5bGVzW3N0eWxlLm5hbWVdID0gc3R5bGU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgc3R5bGVcbiAgICByZW1vdmUgKG5hbWUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGVzW25hbWVdO1xuICAgIH1cblxuICAgIG1peCAoc3R5bGUsIHN0eWxlcykge1xuICAgICAgICAvLyBFeGl0IGVhcmx5IGlmIHdlIGhhdmUgYWxyZWFkeSBhcHBsaWVkIG1peGlucyB0byB0aGlzIHN0eWxlXG4gICAgICAgIGlmIChzdHlsZS5taXhlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLm1peGVkID0ge307XG5cbiAgICAgICAgLy8gTWl4aW4gc291cmNlcywgaW4gb3JkZXJcbiAgICAgICAgbGV0IHNvdXJjZXMgPSBbXTtcbiAgICAgICAgaWYgKHN0eWxlLm1peCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUubWl4KSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaCguLi5zdHlsZS5taXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKHN0eWxlLm1peCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb3VyY2VzID0gc291cmNlcy5tYXAoeCA9PiBzdHlsZXNbeF0pLmZpbHRlcih4ID0+IHggJiYgeCAhPT0gc3R5bGUpOyAvLyBUT0RPOiB3YXJuaW5nIG9uIHRyeWluZyB0byBtaXggaW50byBzZWxmXG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHdoaWNoIHN0eWxlcyB3ZXJlIG1peGVkIGludG8gdGhpcyBvbmVcbiAgICAgICAgICAgIHNvdXJjZXMuZm9yRWFjaChzID0+IHN0eWxlLm1peGVkW3MubmFtZV0gPSB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzLnB1c2goc3R5bGUpO1xuXG4gICAgICAgIC8vIEZsYWdzIC0gT1InZCwgdHJ1ZSBpZiBhbnkgc3R5bGUgaGFzIGl0IHNldFxuICAgICAgICBzdHlsZS5hbmltYXRlZCA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC5hbmltYXRlZCk7XG4gICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC50ZXhjb29yZHMpO1xuXG4gICAgICAgIC8vIE92ZXJ3cml0ZXMgLSBsYXN0IGRlZmluaXRpb24gd2luc1xuICAgICAgICBzdHlsZS5iYXNlID0gc291cmNlcy5tYXAoeCA9PiB4LmJhc2UpLmZpbHRlcih4ID0+IHgpLnBvcCgpO1xuICAgICAgICBzdHlsZS5saWdodGluZyA9IHNvdXJjZXMubWFwKHggPT4geC5saWdodGluZykuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUudGV4dHVyZSA9IHNvdXJjZXMubWFwKHggPT4geC50ZXh0dXJlKS5maWx0ZXIoeCA9PiB4KS5wb3AoKTtcbiAgICAgICAgc3R5bGUucmFzdGVyID0gc291cmNlcy5tYXAoeCA9PiB4LnJhc3RlcikuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUuZGFzaCA9IHNvdXJjZXMubWFwKHggPT4geC5kYXNoKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBzdHlsZS5kYXNoX2JhY2tncm91bmRfY29sb3IgPSBzb3VyY2VzLm1hcCh4ID0+IHguZGFzaF9iYWNrZ3JvdW5kX2NvbG9yKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBpZiAoc291cmNlcy5zb21lKHggPT4geC5oYXNPd25Qcm9wZXJ0eSgnYmxlbmQnKSAmJiB4LmJsZW5kKSkge1xuICAgICAgICAgICAgLy8gb25seSBtaXggYmxlbmQgaWYgZXhwbGljaXRseSBzZXQsIG90aGVyd2lzZSBsZXQgYmFzZSBzdHlsZSBjaG9vc2UgYmxlbmRpbmcgbW9kZVxuICAgICAgICAgICAgLy8gaGFzT3duUHJvcGVydHkgY2hlY2sgZ2l2ZXMgcHJlZmVyZW5jZSB0byBiYXNlIHN0eWxlIHByb3RvdHlwZVxuICAgICAgICAgICAgc3R5bGUuYmxlbmQgPSBzb3VyY2VzLm1hcCh4ID0+IHguaGFzT3duUHJvcGVydHkoJ2JsZW5kJykgJiYgeC5ibGVuZCkuZmlsdGVyKHggPT4geCkucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3R5bGUuYmxlbmRfb3JkZXIgPSBzb3VyY2VzLm1hcCh4ID0+IHguYmxlbmRfb3JkZXIpLmZpbHRlcih4ID0+IHggIT0gbnVsbCkucG9wKCk7XG5cbiAgICAgICAgLy8gTWVyZ2VzIC0gcHJvcGVydHktc3BlY2lmaWMgcnVsZXMgZm9yIG1lcmdpbmcgdmFsdWVzXG4gICAgICAgIHN0eWxlLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zb3VyY2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpOyAvLyBpbnRlcm5hbCBkZWZpbmVzIChub3QgdXNlci1kZWZpbmVkKVxuICAgICAgICBzdHlsZS5tYXRlcmlhbCA9IE9iamVjdC5hc3NpZ24oe30sIC4uLnNvdXJjZXMubWFwKHggPT4geC5tYXRlcmlhbCkuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIE1peCBzaGFkZXIgcHJvcGVydGllc1xuICAgICAgICB0aGlzLm1peFNoYWRlcnMoc3R5bGUsIHN0eWxlcywgc291cmNlcyk7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBNaXggdGhlIHByb3BlcnRlcyBpbiB0aGUgXCJzaGFkZXJzXCIgYmxvY2tcbiAgICBtaXhTaGFkZXJzIChzdHlsZSwgc3R5bGVzLCBzb3VyY2VzKSB7XG4gICAgICAgIGxldCBzaGFkZXJzID0ge307IC8vIG5ld2x5IG1peGVkIHNoYWRlcnMgcHJvcGVydGllc1xuICAgICAgICBsZXQgc2hhZGVyX21lcmdlcyA9IHNvdXJjZXMubWFwKHggPT4geC5zaGFkZXJzKS5maWx0ZXIoeCA9PiB4KTsgLy8ganVzdCB0aGUgc291cmNlIHN0eWxlcyB3aXRoIHNoYWRlciBwcm9wZXJ0aWVzXG5cbiAgICAgICAgLy8gRGVmaW5lc1xuICAgICAgICBzaGFkZXJzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zaGFkZXJfbWVyZ2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIFVuaWZvcm1zXG4gICAgICAgIHNoYWRlcnMudW5pZm9ybXMgPSB7fTsgIC8vIHVuaWZvcm1zIGZvciB0aGlzIHN0eWxlLCBib3RoIGV4cGxpY2l0bHkgZGVmaW5lZCwgYW5kIG1peGVkIGZyb20gb3RoZXIgc3R5bGVzXG4gICAgICAgIHNoYWRlcnMuX3VuaWZvcm1zID0gKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3JtcykgfHwge307IC8vIHVuaWZvcm1zIGV4cGxpY2l0bHkgZGVmaW5lZCBieSAqdGhpcyogc3R5bGVcbiAgICAgICAgc2hhZGVycy5fdW5pZm9ybV9zY29wZXMgPSB7fTsgLy8gdHJhY2tzIHdoaWNoIHN0eWxlIGVhY2ggdW5pZm9ybSBvcmlnaW5hdGVkIGZyb20gKHRoaXMgb25lLCBvciBhbmNlc3RvcilcblxuICAgICAgICAvLyBNaXggaW4gdW5pZm9ybXMgZnJvbSBhbmNlc3RvcnMsIHByb3ZpZGluZyBtZWFucyB0byBhY2Nlc3NcbiAgICAgICAgc291cmNlc1xuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHguc2hhZGVycyAmJiB4LnNoYWRlcnMudW5pZm9ybXMpXG4gICAgICAgICAgICAuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB1IGluIHguc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3JtX3Njb3Blc1t1XSA9IHgubmFtZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZpbmUgZ2V0dGVyIGFuZCBzZXR0ZXIgZm9yIHRoaXMgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICAvLyBHZXR0ZXIgcmV0dXJucyB2YWx1ZSBmb3IgdGhpcyBzdHlsZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgYXNrcyBhcHByb3ByaWF0ZSBhbmNlc3RvciBmb3IgaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0dGVyIHNldHMgdGhlIHZhbHVlIGZvciB0aGlzIHN0eWxlICh3aGV0aGVyIHByZXZpb3VzbHkgcHJlc2VudCBpbiB0aGlzIHN0eWxlIG9yIG5vdClcbiAgICAgICAgICAgICAgICAgICAgLy8gTWltaWNzIEpTIHByb3RvdHlwZS9oYXNPd25Qcm9wZXJ0eSBiZWhhdmlvciwgYnV0IHdpdGggbXVsdGlwbGUgYW5jZXN0b3JzICh2aWEgbWl4aW5zKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hhZGVycy51bmlmb3JtcywgdSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gaXMgZXhwbGljaXRseSBkZWZpbmVkIG9uIHRoaXMgc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hhZGVycy5fdW5pZm9ybXNbdV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hhZGVycy5fdW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gd2FzIG1peGVkIGZyb20gYW5vdGhlciBzdHlsZSwgZm9yd2FyZCByZXF1ZXN0IHRoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgY2hlY2sgaXMgbmVlZGVkIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgcHJldmlvdXNseSBkZWZpbmVkIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzZXQgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVzW3NoYWRlcnMuX3VuaWZvcm1fc2NvcGVzW3VdXS5zaGFkZXJzLnVuaWZvcm1zICE9PSBzaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXNbc2hhZGVycy5fdW5pZm9ybV9zY29wZXNbdV1dLnNoYWRlcnMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3Jtc1t1XSA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4dGVuc2lvbnM6IGJ1aWxkIGEgbGlzdCBvZiB1bmlxdWUgZXh0ZW5zaW9uc1xuICAgICAgICBzaGFkZXJzLmV4dGVuc2lvbnMgPSBPYmplY3Qua2V5cyhzaGFkZXJfbWVyZ2VzXG4gICAgICAgICAgICAubWFwKHggPT4geC5leHRlbnNpb25zKVxuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHgpXG4gICAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZbY3VyXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyLmZvckVhY2goeCA9PiBwcmV2W3hdID0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgfSwge30pIHx8IHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2hhZGVyIGJsb2Nrc1xuICAgICAgICAvLyBNYXJrIGFsbCBzaGFkZXIgYmxvY2tzIGZvciB0aGUgdGFyZ2V0IHN0eWxlIGFzIG9yaWdpbmF0aW5nIHdpdGggaXRzIG93biBuYW1lXG4gICAgICAgIGlmIChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMuYmxvY2tzKSB7XG4gICAgICAgICAgICBzdHlsZS5zaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgayBpbiBzdHlsZS5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHN0eWxlLnNoYWRlcnMuYmxvY2tzW2tdO1xuICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdID0gc3R5bGUuc2hhZGVycy5ibG9ja19zY29wZXNba10gfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmxvY2spKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goLi4uYmxvY2subWFwKCgpID0+IHN0eWxlLm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2Ugc2hhZGVyIGJsb2Nrcywga2VlcGluZyB0cmFjayBvZiB3aGljaCBzdHlsZSBlYWNoIGJsb2NrIG9yaWdpbmF0ZWQgZnJvbVxuICAgICAgICBsZXQgbWl4ZWQgPSB7fTsgLy8gYWxsIHNjb3BlcyBtaXhlZCBzbyBmYXJcbiAgICAgICAgc2hhZGVyX21lcmdlcy5mb3JFYWNoKHNvdXJjZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzID0gc2hhZGVycy5ibG9ja3MgfHwge307XG4gICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgbGV0IG1peGVkX3NvdXJjZSA9IHt9OyAvLyBzY29wZXMgbWl4ZWQgZm9yIHRoaXMgc291cmNlIHN0eWxlXG5cbiAgICAgICAgICAgIGZvciAobGV0IHQgaW4gc291cmNlLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHNvdXJjZS5ibG9ja3NbdF07XG4gICAgICAgICAgICAgICAgbGV0IGJsb2NrX3Njb3BlID0gc291cmNlLmJsb2NrX3Njb3Blc1t0XTtcblxuICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdID0gc2hhZGVycy5ibG9ja3NbdF0gfHwgW107XG4gICAgICAgICAgICAgICAgc2hhZGVycy5ibG9ja19zY29wZXNbdF0gPSBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XSB8fCBbXTtcblxuICAgICAgICAgICAgICAgIC8vIHN0YW5kYXJkaXplIG9uIGFycmF5cyAoYmxvY2sgY2FuIGJlIHNpbmdsZSBvciBtdWx0aS12YWx1ZSlcbiAgICAgICAgICAgICAgICBibG9jayA9IEFycmF5LmlzQXJyYXkoYmxvY2spID8gYmxvY2sgOiBbYmxvY2tdO1xuICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlID0gQXJyYXkuaXNBcnJheShibG9ja19zY29wZSkgPyBibG9ja19zY29wZSA6IFtibG9ja19zY29wZV07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiPTA7IGIgPCBibG9jay5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGJsb2NrcyB3ZSd2ZSBhbHJlYWR5IG1peGVkIGluIGZyb20gdGhlIHNhbWUgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwZWF0aW5nIHNjb3BlIGluZGljYXRlcyBhIGRpYW1vbmQgcGF0dGVybiB3aGVyZSBhIHN0eWxlIGlzIGJlaW5nIG1peGVkIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaXhlZFtibG9ja19zY29wZVtiXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1peGVkX3NvdXJjZVtibG9ja19zY29wZVtiXV0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdLnB1c2goYmxvY2tbYl0pO1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XS5wdXNoKGJsb2NrX3Njb3BlW2JdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBzdHlsZXMgbWl4ZWQgaW4gZnJvbSB0aGlzIHNvdXJjZSAtIHRoZXkgY291bGQgYmUgbXVsdGktbGV2ZWwgYW5jZXN0b3JzLFxuICAgICAgICAgICAgLy8gYmV5b25kIHRoZSBmaXJzdC1sZXZlbCBcInBhcmVudHNcIiBkZWZpbmVkIGluIHRoaXMgc3R5bGUncyBgbWl4YCBsaXN0XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1peGVkLCBtaXhlZF9zb3VyY2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlLm1peGVkLCBtaXhlZCk7IC8vIGFkZCBhbGwgbmV3bHkgbWl4ZWQgc3R5bGVzXG5cbiAgICAgICAgc3R5bGUuc2hhZGVycyA9IHNoYWRlcnM7IC8vIGFzc2lnbiBiYWNrIHRvIHN0eWxlXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgc3R5bGVcbiAgICAvLyBuYW1lOiBuYW1lIG9mIG5ldyBzdHlsZVxuICAgIC8vIGNvbmZpZzogcHJvcGVydGllcyBvZiBuZXcgc3R5bGVcbiAgICAvLyBzdHlsZXM6IHdvcmtpbmcgc2V0IG9mIHN0eWxlcyBiZWluZyBidWlsdCAodXNlZCBmb3IgbWl4aW5nIGluIGV4aXN0aW5nIHN0eWxlcylcbiAgICBjcmVhdGUgKG5hbWUsIGNvbmZpZywgc3R5bGVzID0ge30pIHtcbiAgICAgICAgbGV0IHN0eWxlID0gbWVyZ2VPYmplY3RzKHt9LCBjb25maWcpOyAvLyBkZWVwIGNvcHlcbiAgICAgICAgc3R5bGUubmFtZSA9IG5hbWU7XG5cbiAgICAgICAgLy8gU3R5bGUgbWl4aW5zXG4gICAgICAgIHN0eWxlID0gdGhpcy5taXgoc3R5bGUsIHN0eWxlcyk7XG5cbiAgICAgICAgLy8gSGFzIGJhc2Ugc3R5bGU/XG4gICAgICAgIC8vIE9ubHkgcmVuZGVyYWJsZSAoaW5zdGFudGlhdGVkKSBzdHlsZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBydW4tdGltZSB1c2VcbiAgICAgICAgLy8gT3RoZXJzIGFyZSBpbnRlcm1lZGlhcnkvYWJzdHJhY3QsIHVzZWQgZHVyaW5nIHN0eWxlIGNvbXBvc2l0aW9uIGJ1dCBub3QgZXhlY3V0aW9uXG4gICAgICAgIGlmIChzdHlsZS5iYXNlICYmIHRoaXMuYmFzZV9zdHlsZXNbc3R5bGUuYmFzZV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzW25hbWVdID0gc3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUodGhpcy5iYXNlX3N0eWxlc1tzdHlsZS5iYXNlXSksIHN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLmJhc2UgPSBudWxsOyAvLyBudWxsIG91dCBpbnZhbGlkIGJhc2Ugc3R5bGVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXplIHN0eWxlc1xuICAgIGJ1aWxkIChzdHlsZXMpIHtcbiAgICAgICAgLy8gU29ydCBzdHlsZXMgYnkgZGVwZW5kZW5jeSwgdGhlbiBidWlsZCB0aGVtXG4gICAgICAgIGxldCBzdHlsZV9kZXBzID0gT2JqZWN0LmtleXMoc3R5bGVzKS5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+IHRoaXMuaW5oZXJpdGFuY2VEZXB0aChhLCBzdHlsZXMpIC0gdGhpcy5pbmhlcml0YW5jZURlcHRoKGIsIHN0eWxlcylcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBPbmx5IGtlZXAgYnVpbHQtaW4gYmFzZSBzdHlsZXNcbiAgICAgICAgZm9yIChsZXQgc25hbWUgaW4gdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5iYXNlX3N0eWxlc1tzbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZXNbc25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXb3JraW5nIHNldCBvZiBzdHlsZXMgYmVpbmcgYnVpbHRcbiAgICAgICAgbGV0IHdzID0ge307XG4gICAgICAgIHN0eWxlX2RlcHMuZm9yRWFjaChzbmFtZSA9PiB7XG4gICAgICAgICAgICB3c1tzbmFtZV0gPSB0aGlzLmNyZWF0ZShzbmFtZSwgc3R5bGVzW3NuYW1lXSwgd3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZXM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgc3R5bGVzXG4gICAgaW5pdFN0eWxlcyAoc2NlbmUgPSB7fSkge1xuICAgICAgICAvLyBJbml0aWFsaXplIGFsbFxuICAgICAgICBmb3IgKGxldCBzbmFtZSBpbiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLmluaXQoc2NlbmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYSBzdHlsZSBrZXkgaW4gYSBzZXQgb2Ygc3R5bGVzIHRvIGFkZCwgY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgaW5oZXJpdGFuY2UgY2hhaW5cbiAgICBpbmhlcml0YW5jZURlcHRoIChrZXksIHN0eWxlcykge1xuICAgICAgICBsZXQgcGFyZW50cyA9IDA7XG5cbiAgICAgICAgd2hpbGUodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHNjZW5lIGRlZiBlcnJvciwgdHJ5aW5nIHRvIGV4dGVuZCBhIHN0eWxlIHRoYXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZXBlbmRlbmN5IGNoYWluIGVuZHMgd2hlbiB0aGlzIHN0eWxlIGlzbid0IG1peGluZyBpbiBhbnkgb3RoZXJzXG4gICAgICAgICAgICBpZiAoIXN0eWxlLm1peCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmF2ZXJzZSBuZXh0IHBhcmVudCBzdHlsZVxuICAgICAgICAgICAgcGFyZW50cysrO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5taXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbXVsdGlwbGUgbWl4aW5zLCBmaW5kIHRoZSBkZWVwZXN0IG9uZVxuICAgICAgICAgICAgICAgIHBhcmVudHMgKz0gTWF0aC5tYXgoLi4uc3R5bGUubWl4Lm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIG1peCBpbnRvIGl0c2VsZiFcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5oZXJpdGFuY2VEZXB0aChzLCBzdHlsZXMpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRyeWluZyB0byBtaXggaW50byBpdHNlbGYhXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gc3R5bGUubWl4KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIHNpbmdsZSBtaXhpbiwgY29udGludWUgbG9vcCB1cCB0aGUgdHJlZVxuICAgICAgICAgICAgICAgIGtleSA9IHN0eWxlLm1peDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9XG5cbiAgICAvLyBDb21waWxlIGFsbCBzdHlsZXNcbiAgICBjb21waWxlIChrZXlzLCBzY2VuZSkge1xuICAgICAgICBrZXlzID0ga2V5cyB8fCBPYmplY3Qua2V5cyh0aGlzLnN0eWxlcyk7XG4gICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gdGhpcy5zdHlsZXNba2V5XTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuY29tcGlsZSgpO1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU3R5bGVNYW5hZ2VyLmNvbXBpbGUoKTogY29tcGlsZWQgc3R5bGUgJHtrZXl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBgU3R5bGVNYW5hZ2VyLmNvbXBpbGUoKTogZXJyb3IgY29tcGlsaW5nIHN0eWxlICR7a2V5fTpgLCBlcnJvcik7XG5cbiAgICAgICAgICAgICAgICBzY2VuZS50cmlnZ2VyKCd3YXJuaW5nJywge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3R5bGVzJyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGNvbXBpbGluZyBzdHlsZSAke2tleX1gLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgc2hhZGVyX2Vycm9yczogc3R5bGUucHJvZ3JhbSAmJiBzdHlsZS5wcm9ncmFtLnNoYWRlcl9lcnJvcnNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbG9nKCdkZWJ1ZycsIGBTdHlsZU1hbmFnZXIuY29tcGlsZSgpOiBjb21waWxlZCBhbGwgc3R5bGVzYCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGFsbCBzdHlsZXMgd2l0aCBtZXNoIGRhdGEgZm9yIGEgZ2l2ZW4gdGlsZVxuICAgIHN0YXRpYyBzdHlsZXNGb3JUaWxlICh0aWxlX2tleSwgc3R5bGVzKSB7XG4gICAgICAgIGxldCB0aWxlX3N0eWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzIGluIHN0eWxlcykge1xuICAgICAgICAgICAgaWYgKHN0eWxlc1tzXS5oYXNEYXRhRm9yVGlsZSh0aWxlX2tleSkpIHtcbiAgICAgICAgICAgICAgICB0aWxlX3N0eWxlcy5wdXNoKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWxlX3N0eWxlcztcbiAgICB9XG5cbn1cbiIsImltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmltcG9ydCBwYXJzZUNTU0NvbG9yIGZyb20gJ2Nzc2NvbG9ycGFyc2VyJztcblxuZXhwb3J0IHZhciBTdHlsZVBhcnNlciA9IHt9O1xuXG4vLyBXcmFwcyBzdHlsZSBmdW5jdGlvbnMgYW5kIHByb3ZpZGVzIGEgc2NvcGUgb2YgY29tbW9ubHkgYWNjZXNzaWJsZSBkYXRhOlxuLy8gLSBmZWF0dXJlOiB0aGUgJ3Byb3BlcnRpZXMnIG9mIHRoZSBmZWF0dXJlLCBlLmcuIGFjY2Vzc2VkIGFzICdmZWF0dXJlLm5hbWUnXG4vLyAtIGdsb2JhbDogdXNlci1kZWZpbmVkIHByb3BlcnRpZXMgb24gdGhlIGBnbG9iYWxgIG9iamVjdCBpbiB0aGUgc2NlbmUgZmlsZVxuLy8gLSAkem9vbTogdGhlIGN1cnJlbnQgbWFwIHpvb20gbGV2ZWxcbi8vIC0gJGdlb21ldHJ5OiB0aGUgdHlwZSBvZiBnZW9tZXRyeSwgJ3BvaW50JywgJ2xpbmUnLCBvciAncG9seWdvbidcbi8vIC0gJG1ldGVyc19wZXJfcGl4ZWw6IGNvbnZlcnNpb24gZm9yIG1ldGVycy9waXhlbHMgYXQgY3VycmVudCBtYXAgem9vbVxuU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgZiA9IGBcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllcztcbiAgICAgICAgdmFyIGdsb2JhbCA9IGNvbnRleHQuZ2xvYmFsO1xuICAgICAgICB2YXIgJHpvb20gPSBjb250ZXh0Lnpvb207XG4gICAgICAgIHZhciAkbGF5ZXIgPSBjb250ZXh0LmxheWVyO1xuICAgICAgICB2YXIgJGdlb21ldHJ5ID0gY29udGV4dC5nZW9tZXRyeTtcbiAgICAgICAgdmFyICRtZXRlcnNfcGVyX3BpeGVsID0gY29udGV4dC5tZXRlcnNfcGVyX3BpeGVsO1xuXG4gICAgICAgIHZhciB2YWwgPSAoZnVuY3Rpb24oKXsgJHtmdW5jfSB9KCkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpKSB7XG4gICAgICAgICAgICB2YWwgPSBudWxsOyAvLyBjb252ZXJ0IE5hTnMgdG8gbnVsbHNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgYDtcbiAgICByZXR1cm4gZjtcbn07XG5cblxuLy8gU3R5bGUgcGFyc2luZ1xuXG5TdHlsZVBhcnNlci56ZXJvUGFpciA9IE9iamVjdC5mcmVlemUoWzAsIDBdKTsgLy8gc2luZ2xlIGFsbG9jYXRpb24gZm9yIHplcm8gdmFsdWVzIHRoYXQgd29uJ3QgYmUgbW9kaWZpZWRcblxuLy8gU3R5bGUgZGVmYXVsdHNcblN0eWxlUGFyc2VyLmRlZmF1bHRzID0ge1xuICAgIGNvbG9yOiBbMSwgMSwgMSwgMV0sXG4gICAgd2lkdGg6IDEsXG4gICAgc2l6ZTogMSxcbiAgICBleHRydWRlOiBmYWxzZSxcbiAgICBoZWlnaHQ6IDIwLFxuICAgIG1pbl9oZWlnaHQ6IDAsXG4gICAgb3JkZXI6IDAsXG4gICAgejogMCxcbiAgICBtYXRlcmlhbDoge1xuICAgICAgICBhbWJpZW50OiAxLFxuICAgICAgICBkaWZmdXNlOiAxXG4gICAgfVxufTtcblxuLy8gU3R5bGUgbWFjcm9zXG5TdHlsZVBhcnNlci5tYWNyb3MgPSB7XG4gICAgLy8gcHNldWRvLXJhbmRvbSBjb2xvciBieSBnZW9tZXRyeSBpZFxuICAgICdTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvcic6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgMC43ICogKHBhcnNlSW50KGZlYXR1cmUuaWQsIDE2KSAvIDEwMCAlIDEpLCAgICAgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICAwLjcgKiAocGFyc2VJbnQoZmVhdHVyZS5pZCwgMTYpIC8gMTAwMDAgJSAxKSwgICAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIDAuNyAqIChwYXJzZUludChmZWF0dXJlLmlkLCAxNikgLyAxMDAwMDAwICUgMSksIC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgMVxuICAgICAgICBdO1xuICAgIH0sXG5cbiAgICAvLyByYW5kb20gY29sb3JcbiAgICAnU3R5bGUuY29sb3IucmFuZG9tQ29sb3InOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFswLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAxXTtcbiAgICB9XG59O1xuXG4vLyBBIGNvbnRleHQgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHRvIHN0eWxlIHBhcnNpbmcgZnVuY3Rpb25zIHRvIHByb3ZpZGUgYSBzY29wZSBvZiBjb21tb25seSB1c2VkIHZhbHVlc1xuU3R5bGVQYXJzZXIuZ2V0RmVhdHVyZVBhcnNlQ29udGV4dCA9IGZ1bmN0aW9uIChmZWF0dXJlLCB0aWxlLCBnbG9iYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmZWF0dXJlLFxuICAgICAgICB0aWxlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIHpvb206IHRpbGUuc3R5bGVfem9vbSxcbiAgICAgICAgZ2VvbWV0cnk6IEdlby5nZW9tZXRyeVR5cGUoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSxcbiAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGlsZS5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICBtZXRlcnNfcGVyX3BpeGVsX3NxOiB0aWxlLm1ldGVyc19wZXJfcGl4ZWxfc3EsXG4gICAgICAgIHVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTogdGlsZS51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb21cbiAgICB9O1xufTtcblxuLy8gQnVpbGQgYSBzdHlsZSBwYXJhbSBjYWNoZSBvYmplY3Rcbi8vIGB2YWx1ZWAgaXMgcmF3IHZhbHVlLCBjYWNoZSBtZXRob2RzIHdpbGwgYWRkIG90aGVyIHByb3BlcnRpZXMgYXMgbmVlZGVkXG4vLyBgdHJhbnNmb3JtYCBpcyBvcHRpb25hbCB0cmFuc2Zvcm0gZnVuY3Rpb24gdG8gcnVuIG9uIHZhbHVlcyAoZXhjZXB0IGZ1bmN0aW9uIHZhbHVlcylcblN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUgPSBmdW5jdGlvbiAob2JqLCB0cmFuc2Zvcm0gPSBudWxsKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2JqLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiBvYmoudmFsdWUsIHpvb206IChvYmouem9vbSA/IHt9IDogbnVsbCkgfTsgLy8gY2xvbmUgZXhpc3RpbmcgY2FjaGUgb2JqZWN0XG4gICAgfVxuXG4gICAgbGV0IGMgPSB7IHZhbHVlOiBvYmogfTtcblxuICAgIC8vIGRvZXMgdmFsdWUgY29udGFpbiB6b29tIHN0b3BzIHRvIGJlIGludGVycG9sYXRlZD9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KGMudmFsdWVbMF0pKSB7XG4gICAgICAgIGMuem9vbSA9IHt9OyAvLyB3aWxsIGhvbGQgdmFsdWVzIGludGVycG9sYXRlZCBieSB6b29tXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgb3B0aW9uYWwgdHJhbnNmb3JtIGZ1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGMuem9vbSkgeyAvLyBhcHBseSB0byBlYWNoIHpvb20gc3RvcCB2YWx1ZVxuICAgICAgICAgICAgYy52YWx1ZSA9IGMudmFsdWUubWFwKHYgPT4gW3ZbMF0sIHRyYW5zZm9ybSh2WzFdKV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7IC8vIGRvbid0IHRyYW5zZm9ybSBmdW5jdGlvbnNcbiAgICAgICAgICAgIGMudmFsdWUgPSB0cmFuc2Zvcm0oYy52YWx1ZSk7IC8vIHNpbmdsZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGM7XG59O1xuXG4vLyBDb252ZXJ0IG9sZC1zdHlsZSBjb2xvciBtYWNybyBpbnRvIGEgZnVuY3Rpb25cbi8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIG1hY3JvIHN5bnRheFxuU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKG9iaiwgdiA9PiB7XG4gICAgICAgIGlmICh2ID09PSAnU3R5bGUuY29sb3IucHNldWRvUmFuZG9tQ29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24oU3R5bGVQYXJzZXIubWFjcm9zWydTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvciddKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodiA9PT0gJ1N0eWxlLmNvbG9yLnJhbmRvbUNvbG9yJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLm1hY3Jvc1snU3R5bGUuY29sb3IucmFuZG9tQ29sb3InXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xufTtcblxuLy8gSW50ZXJwb2xhdGlvbiBhbmQgY2FjaGluZyBmb3IgYSBnZW5lcmljIHByb3BlcnR5IChub3QgYSBjb2xvciBvciBkaXN0YW5jZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IHZhbCwgem9vbTogeyAxOiB2YWwxLCAyOiB2YWwyLCAuLi4gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKHZhbCwgY29udGV4dCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5keW5hbWljKSB7IC8vIGZ1bmN0aW9uLCBjb21wdXRlIGVhY2ggdGltZSAobm8gY2FjaGluZylcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHsgLy8gc2luZ2xlIHN0YXRpYyB2YWx1ZVxuICAgICAgICByZXR1cm4gdmFsLnN0YXRpYztcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsLnpvb20gJiYgdmFsLnpvb21bY29udGV4dC56b29tXSkgeyAvLyBpbnRlcnBvbGF0ZWQsIGNhY2hlZFxuICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIG5vdCB5ZXQgZXZhdWxhdGVkIGZvciBjYWNoZVxuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbC52YWx1ZVswXSkpIHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB2YWx1ZSBmb3IgY3VycmVudCB6b29tXG4gICAgICAgICAgICB2YWwuem9vbSA9IHZhbC56b29tIHx8IHt9O1xuICAgICAgICAgICAgdmFsLnpvb20gPSB7fTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RhdGljIHZhbHVlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsLnN0YXRpYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuU3R5bGVQYXJzZXIuY29udmVydFVuaXRzID0gZnVuY3Rpb24odmFsLCBjb250ZXh0KSB7XG4gICAgLy8gcHJlLXBhcnNlZCB1bml0c1xuICAgIGlmICh2YWwudmFsICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbC51bml0cyA9PT0gJ3B4JykgeyAvLyBjb252ZXJ0IGZyb20gcGl4ZWxzXG4gICAgICAgICAgICByZXR1cm4gdmFsLnZhbCAqIEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWwudmFsO1xuICAgIH1cbiAgICAvLyB1bi1wYXJzZWQgdW5pdCBzdHJpbmdcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgdW5pdHMgPSB2YWwubWF0Y2goLyhbMC05Li1dKykoW2Etel0rKS8pO1xuICAgICAgICBpZiAodW5pdHMgJiYgdW5pdHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHVuaXRzWzFdKTtcbiAgICAgICAgICAgIHVuaXRzID0gdW5pdHNbMl07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5pdHMgPT09ICdweCcpIHsgLy8gY29udmVydCBmcm9tIHBpeGVsc1xuICAgICAgICAgICAgdmFsICo9IEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG11bHRpcGxlIHZhbHVlcyBvciBzdG9wc1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAvLyBBcnJheSBvZiBhcnJheXMsIGUuZy4gem9vbS1pbnRlcnBvbGF0ZWQgc3RvcHNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsWzBdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBbdlswXSwgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHZbMV0sIGNvbnRleHQpXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2YgdmFsdWVzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModiwgY29udGV4dCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBQcmUtcGFyc2UgdW5pdHMgZnJvbSBzdHJpbmcgdmFsdWVzXG5TdHlsZVBhcnNlci5wYXJzZVVuaXRzID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBvYmogPSB7IHZhbDogcGFyc2VGbG9hdCh2YWwpIH07XG4gICAgaWYgKG9iai52YWwgIT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKS5zbGljZSgtMikgPT09ICdweCcpIHtcbiAgICAgICAgb2JqLnVuaXRzID0gJ3B4JztcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIFRha2VzIGEgZGlzdGFuY2UgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgZGlzdGFuY2UgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCB6b29tOiB7IHo6IG1ldGVycyB9LCBkeW5hbWljOiBmdW5jdGlvbigpey4uLn0gfVxuU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkgPSBmdW5jdGlvbih2YWwsIGNvbnRleHQpIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKHZhbC56b29tKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdmFsdWUgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgLy8gRG8gZmluYWwgdW5pdCBjb252ZXJzaW9uIGFzIGxhdGUgYXMgcG9zc2libGUsIHdoZW4gaW50ZXJwb2xhdGlvbiB2YWx1ZXMgaGF2ZSBiZWVuIGRldGVybWluZWRcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSxcbiAgICAgICAgICAgICAgICB2ID0+IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2LCBjb250ZXh0KSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2YWwudmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gQ2FjaGUgcHJldmlvdXNseSBwYXJzZWQgY29sb3Igc3RyaW5nc1xuU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9ycyA9IHt9O1xuU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAvLyBDYWNoZWRcbiAgICBpZiAoU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9yc1tzdHJpbmddKSB7XG4gICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5zdHJpbmdfY29sb3JzW3N0cmluZ107XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZCBjYWNoZVxuICAgIGxldCBjb2xvciA9IHBhcnNlQ1NTQ29sb3IucGFyc2VDU1NDb2xvcihzdHJpbmcpO1xuICAgIGlmIChjb2xvciAmJiBjb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgY29sb3JbMF0gLz0gMjU1O1xuICAgICAgICBjb2xvclsxXSAvPSAyNTU7XG4gICAgICAgIGNvbG9yWzJdIC89IDI1NTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbG9yID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgfVxuICAgIFN0eWxlUGFyc2VyLnN0cmluZ19jb2xvcnNbc3RyaW5nXSA9IGNvbG9yO1xuICAgIHJldHVybiBjb2xvcjtcbn07XG5cbi8vIFRha2VzIGEgY29sb3IgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgY29sb3IgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IFtyLGcsYixhXSwgem9vbTogeyB6OiBbcixnLGIsYV0gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRDb2xvclByb3BlcnR5ID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodiAmJiB2WzNdID09IG51bGwpIHtcbiAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkIGNvbG9yXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2ICYmIHZbM10gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RyaW5nIGNvbG9yXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWwuc3RhdGljID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZWxzZSBpZiAodmFsLnpvb20pIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIGFueSBzdHJpbmcgY29sb3JzIGluc2lkZSBzdG9wcywgdGhlIGZpcnN0IHRpbWUgd2UgZW5jb3VudGVyIHRoaXMgcHJvcGVydHlcbiAgICAgICAgICAgIGlmICghdmFsLnpvb21fcHJlcHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2ID0gdmFsLnZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0gPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwuem9vbV9wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgY29sb3IgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgdmFsLnpvb21bY29udGV4dC56b29tXSA9IFV0aWxzLmludGVycG9sYXRlKGNvbnRleHQuem9vbSwgdmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV1bM10gPSB2YWwuem9vbVtjb250ZXh0Lnpvb21dWzNdIHx8IDE7IC8vIGRlZmF1bHQgYWxwaGFcbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmdsZSBhcnJheSBjb2xvclxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhbC5zdGF0aWMgPSB2YWwudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsLnN0YXRpYyAmJiB2YWwuc3RhdGljWzNdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YWwuc3RhdGljWzNdID0gMTsgLy8gZGVmYXVsdCBhbHBoYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5TdHlsZVBhcnNlci5wYXJzZUNvbG9yID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSB2YWwoY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgQ1NTLXN0eWxlIGNvbG9yc1xuICAgIC8vIFRPRE86IGNoYW5nZSBhbGwgY29sb3JzIHRvIHVzZSAwLTI1NSByYW5nZSBpbnRlcm5hbGx5IHRvIGF2b2lkIGRpdmlkaW5nIGFuZCB0aGVuIHJlLW11bHRpcGx5aW5nIGluIGdlb20gYnVpbGRlclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWwgPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2YWwpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkgJiYgQXJyYXkuaXNBcnJheSh2YWxbMF0pKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbFtpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2WzFdID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodlsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC56b29tKSB7XG4gICAgICAgICAgICB2YWwgPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0c1xuICAgIGlmICh2YWwpIHtcbiAgICAgICAgLy8gYWxwaGFcbiAgICAgICAgaWYgKHZhbFszXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWxbM10gPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWwgPSBbMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbn07XG5cblN0eWxlUGFyc2VyLmNhbGN1bGF0ZU9yZGVyID0gZnVuY3Rpb24ob3JkZXIsIGNvbnRleHQpIHtcbiAgICAvLyBDb21wdXRlZCBvcmRlclxuICAgIGlmICh0eXBlb2Ygb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3JkZXIgPSBvcmRlcihjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIG9yZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBPcmRlciB0aWVkIHRvIGZlYXR1cmUgcHJvcGVydHlcbiAgICAgICAgaWYgKGNvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzW29yZGVyXSkge1xuICAgICAgICAgICAgb3JkZXIgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1tvcmRlcl07XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwbGljaXQgb3JkZXIgdmFsdWVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcmRlciA9IHBhcnNlRmxvYXQob3JkZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xufTtcblxuLy8gRXZhbHVhdGUgYSBmdW5jdGlvbi1iYXNlZCBwcm9wZXJ0eSwgb3IgcGFzcy10aHJvdWdoIHN0YXRpYyB2YWx1ZVxuU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gcHJvcChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3A7XG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vZm9udF9tYW5hZ2VyJztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FudmFzVGV4dCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7IC8vIHJlbmRlciB0ZXh0IG9uIHRyYW5zcGFyZW50IGJhY2tncm91bmRcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciA9IDg7IC8vIHZlcnRpY2FsIHBpeGVsIHBhZGRpbmcgYXJvdW5kIHRleHRcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyID0gNDsgLy8gdGV4dCBzdHlsaW5nIHN1Y2ggYXMgaXRhbGljIGVtcGhhc2lzIGlzIG5vdCBtZWFzdXJlZCBieSB0aGUgQ2FudmFzIEFQSSwgc28gcGFkZGluZyBpcyBuZWNlc3NhcnlcbiAgICB9XG5cbiAgICByZXNpemUgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIFNldCBmb250IHN0eWxlIHBhcmFtcyBmb3IgY2FudmFzIGRyYXdpbmdcbiAgICBzZXRGb250ICh7IGZvbnRfY3NzLCBmaWxsLCBzdHJva2UsIHN0cm9rZV93aWR0aCwgcHhfc2l6ZSB9KSB7XG4gICAgICAgIHRoaXMucHhfc2l6ZSA9IHB4X3NpemU7XG4gICAgICAgIGxldCBjdHggPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBkcHIgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG5cbiAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2Vfd2lkdGggPiAwKSB7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2U7XG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gc3Ryb2tlX3dpZHRoICogZHByO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsO1xuXG4gICAgICAgIGN0eC5mb250ID0gZm9udF9jc3M7XG4gICAgICAgIGN0eC5taXRlckxpbWl0ID0gMjtcbiAgICB9XG5cbiAgICB0ZXh0U2l6ZXMgKHRleHRzKSB7XG4gICAgICAgIGxldCBkcHIgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIHJldHVybiBGb250TWFuYWdlci5sb2FkRm9udHMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV0gfHwge307XG5cbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBzcGFjZV93aWR0aDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSB0ZXh0X2luZm8udGV4dF9zZXR0aW5ncztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlX3dpZHRoID0gdGhpcy5jb250ZXh0Lm1lYXN1cmVUZXh0KCcgJykud2lkdGggLyBkcHI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNwYWNlX3dpZHRoID0gc3BhY2Vfd2lkdGg7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlZ21lbnRzID0gc3BsaXRMYWJlbFRleHQodGV4dCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zZWdtZW50cyA9IHNlZ21lbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNpemUgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bc2VnbWVudF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVtzZWdtZW50XSA9IHRoaXMudGV4dFNpemUoc2VnbWVudCwgdGV4dF9zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMubWlzc2VzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLmhpdHMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNpemUucHVzaChDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3NlZ21lbnRdLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3RleHRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XSA9IHRoaXMudGV4dFNpemUodGV4dCwgdGV4dF9zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC5jYWNoZV9zdGF0cy5taXNzZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMuaGl0cysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzZW5kIHRleHQgc2l6ZXMgYmFjayB0byB3b3JrZXIgKGtlZXAgY29tcHV0ZWQgdGV4dCBsaW5lIGluZm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG1haW4gdGhyZWFkLCBmb3IgZnV0dXJlIHJlbmRlcmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XS5zaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGV4dHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGVzIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGV4dCBiYXNlZCBvbiBjdXJyZW50IGZvbnQgc3R5bGVcbiAgICAvLyBJbmNsdWRlcyB3b3JkIHdyYXBwaW5nLCByZXR1cm5zIHNpemUgaW5mbyBmb3Igd2hvbGUgdGV4dCBibG9jayBhbmQgaW5kaXZpZHVhbCBsaW5lc1xuICAgIHRleHRTaXplICh0ZXh0LCB7dHJhbnNmb3JtLCB0ZXh0X3dyYXAsIG1heF9saW5lcywgc3Ryb2tlX3dpZHRoID0gMH0pIHtcbiAgICAgICAgbGV0IGRwciA9IFV0aWxzLmRldmljZV9waXhlbF9yYXRpbztcbiAgICAgICAgbGV0IHN0ciA9IHRoaXMuYXBwbHlUZXh0VHJhbnNmb3JtKHRleHQsIHRyYW5zZm9ybSk7XG4gICAgICAgIGxldCBjdHggPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCB2ZXJ0aWNhbF9idWZmZXIgPSB0aGlzLnZlcnRpY2FsX3RleHRfYnVmZmVyICogZHByO1xuICAgICAgICBsZXQgaG9yaXpvbnRhbF9idWZmZXIgPSBkcHIgKiAoc3Ryb2tlX3dpZHRoICsgdGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyKTtcbiAgICAgICAgbGV0IGxlYWRpbmcgPSAyICogZHByOyAvLyBtYWtlIGNvbmZpZ3VyYWJsZSBhbmQvb3IgdXNlIENhbnZhcyBUZXh0TWV0cmljcyB3aGVuIGF2YWlsYWJsZVxuICAgICAgICBsZXQgbGluZV9oZWlnaHQgPSB0aGlzLnB4X3NpemUgKyBsZWFkaW5nOyAvLyBweF9zaXplIGFscmVhZHkgaW4gZGV2aWNlIHBpeGVsc1xuXG4gICAgICAgIC8vIFBhcnNlIHN0cmluZyBpbnRvIHNlcmllcyBvZiBsaW5lcyBpZiBpdCBleGNlZWRzIHRoZSB0ZXh0IHdyYXBwaW5nIHZhbHVlIG9yIGNvbnRhaW5zIGxpbmUgYnJlYWtzXG4gICAgICAgIGxldCBtdWx0aWxpbmUgPSBNdWx0aUxpbmUucGFyc2Uoc3RyLCB0ZXh0X3dyYXAsIG1heF9saW5lcywgbGluZV9oZWlnaHQsIGN0eCk7XG5cbiAgICAgICAgLy8gRmluYWwgZGltZW5zaW9ucyBvZiB0ZXh0XG4gICAgICAgIGxldCBoZWlnaHQgPSBtdWx0aWxpbmUuaGVpZ2h0O1xuICAgICAgICBsZXQgd2lkdGggPSBtdWx0aWxpbmUud2lkdGg7XG4gICAgICAgIGxldCBsaW5lcyA9IG11bHRpbGluZS5saW5lcztcblxuICAgICAgICBsZXQgY29sbGlzaW9uX3NpemUgPSBbXG4gICAgICAgICAgICB3aWR0aCAvIGRwcixcbiAgICAgICAgICAgIGhlaWdodCAvIGRwclxuICAgICAgICBdO1xuXG4gICAgICAgIGxldCB0ZXh0dXJlX3NpemUgPSBbXG4gICAgICAgICAgICB3aWR0aCArIDIgKiBob3Jpem9udGFsX2J1ZmZlcixcbiAgICAgICAgICAgIGhlaWdodCArIDIgKiB2ZXJ0aWNhbF9idWZmZXJcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgbG9naWNhbF9zaXplID0gW1xuICAgICAgICAgICAgdGV4dHVyZV9zaXplWzBdIC8gZHByLFxuICAgICAgICAgICAgdGV4dHVyZV9zaXplWzFdIC8gZHByLFxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFJldHVybnMgbGluZXMgKHcvcGVyLWxpbmUgaW5mbyBmb3IgZHJhd2luZykgYW5kIHRleHQncyBvdmVyYWxsIGJvdW5kaW5nIGJveCArIGNhbnZhcyBzaXplXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIHNpemU6IHsgY29sbGlzaW9uX3NpemUsIHRleHR1cmVfc2l6ZSwgbG9naWNhbF9zaXplLCBsaW5lX2hlaWdodCB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRHJhdyBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0XG4gICAgZHJhd1RleHRNdWx0aUxpbmUgKGxpbmVzLCBbeCwgeV0sIHNpemUsIHsgc3Ryb2tlLCBzdHJva2Vfd2lkdGggPSAwLCB0cmFuc2Zvcm0sIGFsaWduIH0pIHtcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gc2l6ZS5saW5lX2hlaWdodDtcbiAgICAgICAgbGV0IGhlaWdodCA9IHk7XG4gICAgICAgIGZvciAobGV0IGxpbmVfbnVtPTA7IGxpbmVfbnVtIDwgbGluZXMubGVuZ3RoOyBsaW5lX251bSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2xpbmVfbnVtXTtcbiAgICAgICAgICAgIHRoaXMuZHJhd1RleHRMaW5lKGxpbmUsIFt4LCBoZWlnaHRdLCBzaXplLCB7IHN0cm9rZSwgc3Ryb2tlX3dpZHRoLCB0cmFuc2Zvcm0sIGFsaWduIH0pO1xuICAgICAgICAgICAgaGVpZ2h0ICs9IGxpbmVfaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHJhdyBib3VuZGluZyBib3hlcyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLmRyYXdfbGFiZWxfY29sbGlzaW9uX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICAgICAgbGV0IGhvcml6b250YWxfYnVmZmVyID0gZHByICogKHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlciArIHN0cm9rZV93aWR0aCk7XG4gICAgICAgICAgICBsZXQgdmVydGljYWxfYnVmZmVyID0gZHByICogdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlcjtcbiAgICAgICAgICAgIGxldCBjb2xsaXNpb25fc2l6ZSA9IHNpemUuY29sbGlzaW9uX3NpemU7XG4gICAgICAgICAgICBsZXQgbGluZVdpZHRoID0gMjtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gJ2JsdWUnO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJva2VSZWN0KHggKyBob3Jpem9udGFsX2J1ZmZlciwgeSArIHZlcnRpY2FsX2J1ZmZlciwgZHByICogY29sbGlzaW9uX3NpemVbMF0sIGRwciAqIGNvbGxpc2lvbl9zaXplWzFdKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLmRyYXdfbGFiZWxfdGV4dHVyZV9ib3hlcykge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnNhdmUoKTtcblxuICAgICAgICAgICAgbGV0IHRleHR1cmVfc2l6ZSA9IHNpemUudGV4dHVyZV9zaXplO1xuICAgICAgICAgICAgbGV0IGxpbmVXaWR0aCA9IDI7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJva2VTdHlsZSA9ICdncmVlbic7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgICAgICAgLy8gc3Ryb2tlIGlzIGFwcGxpZWQgaW50ZXJuYWxseSwgc28gdGhlIG91dGVyIGJvcmRlciBpcyB0aGUgZWRnZSBvZiB0aGUgdGV4dHVyZVxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVJlY3QoeCArIGxpbmVXaWR0aCwgeSArIGxpbmVXaWR0aCwgdGV4dHVyZV9zaXplWzBdIC0gMiAqIGxpbmVXaWR0aCwgdGV4dHVyZV9zaXplWzFdIC0gMiAqIGxpbmVXaWR0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEcmF3IHNpbmdsZSBsaW5lIG9mIHRleHQgYXQgc3BlY2lmaWVkIGxvY2F0aW9uLCBhZGp1c3RpbmcgZm9yIGJ1ZmZlciBhbmQgYmFzZWxpbmVcbiAgICBkcmF3VGV4dExpbmUgKGxpbmUsIFt4LCB5XSwgc2l6ZSwgeyBzdHJva2UsIHN0cm9rZV93aWR0aCA9IDAsIHRyYW5zZm9ybSwgYWxpZ24gfSkge1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICBhbGlnbiA9IGFsaWduIHx8ICdjZW50ZXInO1xuXG4gICAgICAgIGxldCB2ZXJ0aWNhbF9idWZmZXIgPSB0aGlzLnZlcnRpY2FsX3RleHRfYnVmZmVyICogZHByO1xuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gc2l6ZS50ZXh0dXJlX3NpemU7XG4gICAgICAgIGxldCBsaW5lX2hlaWdodCA9IHNpemUubGluZV9oZWlnaHQ7XG4gICAgICAgIGxldCBob3Jpem9udGFsX2J1ZmZlciA9IGRwciAqIChzdHJva2Vfd2lkdGggKyB0aGlzLmhvcml6b250YWxfdGV4dF9idWZmZXIpO1xuXG4gICAgICAgIGxldCBzdHIgPSB0aGlzLmFwcGx5VGV4dFRyYW5zZm9ybShsaW5lLnRleHQsIHRyYW5zZm9ybSk7XG5cbiAgICAgICAgLy8gVGV4dCBhbGlnbm1lbnRcbiAgICAgICAgbGV0IHR4O1xuICAgICAgICBpZiAoYWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgdHggPSB4ICsgaG9yaXpvbnRhbF9idWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICB0eCA9IHggKyB0ZXh0dXJlX3NpemVbMF0vMiAtIGxpbmUud2lkdGgvMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgdHggPSB4ICsgdGV4dHVyZV9zaXplWzBdIC0gbGluZS53aWR0aCAtIGhvcml6b250YWxfYnVmZmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW4gdGhlIGFic2VuY2Ugb2YgYmV0dGVyIENhbnZhcyBUZXh0TWV0cmljcyAobm90IHN1cHBvcnRlZCBieSBicm93c2VycyB5ZXQpLFxuICAgICAgICAvLyAwLjc1IGJ1ZmZlciBwcm9kdWNlcyBhIGJldHRlciBhcHByb3hpbWF0ZSB2ZXJ0aWNhbCBjZW50ZXJpbmcgb2YgdGV4dFxuICAgICAgICBsZXQgdHkgPSB5ICsgdmVydGljYWxfYnVmZmVyICogMC43NSArIGxpbmVfaGVpZ2h0O1xuXG4gICAgICAgIGlmIChzdHJva2UgJiYgc3Ryb2tlX3dpZHRoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVRleHQoc3RyLCB0eCwgdHkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dC5maWxsVGV4dChzdHIsIHR4LCB0eSk7XG4gICAgfVxuXG4gICAgcmFzdGVyaXplICh0ZXh0cywgdGV4dHVyZV9zaXplLCB0aWxlX2tleSkge1xuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mb3MgPSB0ZXh0c1tzdHlsZV07XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRfaW5mb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5ncyA9IHRleHRfaW5mby50ZXh0X3NldHRpbmdzO1xuXG4gICAgICAgICAgICAgICAgLy8gc2V0IGZvbnQgb24gZmlyc3Qgb2NjdXJlbmNlIG9mIG5ldyBmb250IHN0eWxlXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3b3JkcyA9IHRleHRfaW5mby5zZWdtZW50cztcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnRleGNvb3JkcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmQgPSB3b3Jkc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXhjb29yZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXhjb29yZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4Y29vcmQgPSBDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV1bd29yZF0udGV4Y29vcmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZV9wb3NpdGlvbiA9IENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXh0dXJlX3Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt3b3JkXS5zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt3b3JkXS5saW5lcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd1RleHRNdWx0aUxpbmUobGluZSwgdGV4dHVyZV9wb3NpdGlvbiwgc2l6ZSwgdGV4dF9zZXR0aW5ncyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhjb29yZCA9IFRleHR1cmUuZ2V0VGV4Y29vcmRzRm9yU3ByaXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLnRleHR1cmVfc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9zaXplXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXhjb29yZCA9IHRleGNvb3JkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8udGV4Y29vcmRzLnB1c2godGV4Y29vcmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGluZXMgPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3RleHRdLmxpbmVzOyAvLyBnZXQgcHJldmlvdXNseSBjb21wdXRlZCBsaW5lcyBvZiB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGFsaWduIGluIHRleHRfaW5mby5hbGlnbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3VGV4dE11bHRpTGluZShsaW5lcywgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uLCB0ZXh0X2luZm8uc2l6ZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogdGV4dF9zZXR0aW5ncy5zdHJva2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlX3dpZHRoOiB0ZXh0X3NldHRpbmdzLnN0cm9rZV93aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRleHRfc2V0dGluZ3MudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiBhbGlnblxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4Y29vcmRzID0gVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplLnRleHR1cmVfc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3NpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQbGFjZSB0ZXh0IGxhYmVscyB3aXRoaW4gYW4gYXRsYXMgb2YgdGhlIGdpdmVuIG1heCBzaXplXG4gICAgc2V0VGV4dHVyZVRleHRQb3NpdGlvbnMgKHRleHRzLCBtYXhfdGV4dHVyZV9zaXplLCB0aWxlX2tleSkge1xuICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldKSB7XG4gICAgICAgICAgICBDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBjb2x1bW4gd2lkdGhcbiAgICAgICAgbGV0IGNvbHVtbl93aWR0aCA9IDA7XG5cbiAgICAgICAgLy8gTGF5b3V0IGxhYmVscywgc3RhY2tlZCBpbiBjb2x1bW5zXG4gICAgICAgIGxldCBjeCA9IDAsIGN5ID0gMDsgLy8gY3VycmVudCB4L3kgcG9zaXRpb24gaW4gYXRsYXNcbiAgICAgICAgbGV0IGhlaWdodCA9IDA7ICAgICAvLyBvdmVyYWxsIGF0bGFzIGhlaWdodFxuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV0pIHtcbiAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXSA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgdGV4dCBpbiB0ZXh0X2luZm9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRfaW5mb3NbdGV4dF07XG5cbiAgICAgICAgICAgICAgICBpZiAodGV4dF9pbmZvLnRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZV9wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0X2luZm8uc2l6ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmQgPSB0ZXh0X2luZm8uc2VnbWVudHNbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0ZXh0X2luZm8uc2l6ZVtpXS50ZXh0dXJlX3NpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVbMF0gPiBjb2x1bW5fd2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoID0gc2l6ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ICsgc2l6ZVsxXSA8IG1heF90ZXh0dXJlX3NpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5ICs9IHNpemVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSA+IGhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gY3k7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vIHN0YXJ0IG5ldyBjb2x1bW4gaWYgdGFsbGVyIHRoYW4gdGV4dHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeCArPSBjb2x1bW5fd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl93aWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9wb3NpdGlvbjogdGV4dHVyZV9wb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcmVkIHNpemUgaXMgc2FtZSBmb3IgYWxsIGFsaWdubWVudHNcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0ZXh0X2luZm8uc2l6ZS50ZXh0dXJlX3NpemU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaXplWzBdID4gY29sdW1uX3dpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5fd2lkdGggPSBzaXplWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGVhY2ggYWxpZ25tZW50IG5lZWRzIHRvIGJlIHJlbmRlcmVkIHNlcGFyYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYWxpZ24gaW4gdGV4dF9pbmZvLmFsaWduKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3kgKyBzaXplWzFdIDwgbWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldOyAvLyBhZGQgbGFiZWwgdG8gY3VycmVudCBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeSArPSBzaXplWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSA+IGhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBjeTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gc3RhcnQgbmV3IGNvbHVtbiBpZiB0YWxsZXIgdGhhbiB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ggKz0gY29sdW1uX3dpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl93aWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtjeCArIGNvbHVtbl93aWR0aCwgaGVpZ2h0XTsgLy8gb3ZlcmFsbCBhdGxhcyBzaXplXG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIGJlZm9yZSByYXN0ZXJpemF0aW9uXG4gICAgYXBwbHlUZXh0VHJhbnNmb3JtICh0ZXh0LCB0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRyYW5zZm9ybSA9PT0gJ2NhcGl0YWxpemUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHdcXFMqL2csIGZ1bmN0aW9uICh0eHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHh0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdHh0LnN1YnN0cigxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybSA9PT0gJ3VwcGVyY2FzZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtID09PSAnbG93ZXJjYXNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IGZvbnQgQ1NTLXN0eWxlIHNpemUgKCcxMnB4JywgJzE0cHQnLCAnMS41ZW0nLCBldGMuKSB0byBwaXhlbCBzaXplIChhZGp1c3RlZCBmb3IgZGV2aWNlIHBpeGVsIHJhdGlvKVxuICAgIC8vIERlZmF1bHRzIHVuaXRzIHRvIHBpeGVscyBpZiBub3Qgc3BlY2lmaWVkXG4gICAgc3RhdGljIGZvbnRQaXhlbFNpemUgKHNpemUpIHtcbiAgICAgICAgaWYgKHNpemUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNpemUgPSAodHlwZW9mIHNpemUgPT09ICdzdHJpbmcnKSA/IHNpemUgOiBTdHJpbmcoc2l6ZSk7IC8vIG5lZWQgYSBzdHJpbmcgZm9yIHJlZ2V4XG5cbiAgICAgICAgbGV0IFssIHB4X3NpemUsIHVuaXRzXSA9IHNpemUubWF0Y2goQ2FudmFzVGV4dC5mb250X3NpemVfcmUpIHx8IFtdO1xuICAgICAgICB1bml0cyA9IHVuaXRzIHx8ICdweCc7XG5cbiAgICAgICAgaWYgKHVuaXRzID09PSBcImVtXCIpIHtcbiAgICAgICAgICAgIHB4X3NpemUgKj0gMTY7XG4gICAgICAgIH0gZWxzZSBpZiAodW5pdHMgPT09IFwicHRcIikge1xuICAgICAgICAgICAgcHhfc2l6ZSAvPSAwLjc1O1xuICAgICAgICB9IGVsc2UgaWYgKHVuaXRzID09PSBcIiVcIikge1xuICAgICAgICAgICAgcHhfc2l6ZSAvPSA2LjI1O1xuICAgICAgICB9XG5cbiAgICAgICAgcHhfc2l6ZSA9IHBhcnNlRmxvYXQocHhfc2l6ZSk7XG4gICAgICAgIHB4X3NpemUgKj0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICByZXR1cm4gcHhfc2l6ZTtcbiAgICB9XG5cbiAgICBjbGVhclRleGNvb3JkQ2FjaGUgKHRpbGVfa2V5KSB7XG4gICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldID0ge307XG4gICAgfVxuXG59XG5cbi8vIEV4dHJhY3QgZm9udCBzaXplIGFuZCB1bml0c1xuQ2FudmFzVGV4dC5mb250X3NpemVfcmUgPSAvKCg/OlswLTldKlxcLik/WzAtOV0rKVxccyoocHh8cHR8ZW18JSk/LztcblxuLy8gQ2FjaGUgc2l6ZXMgb2YgcmVuZGVyZWQgdGV4dFxuQ2FudmFzVGV4dC50ZXh0X2NhY2hlID0ge307IC8vIGJ5IHRleHQgc3R5bGUsIHRoZW4gdGV4dCBzdHJpbmdcbkNhbnZhc1RleHQuY2FjaGVfc3RhdHMgPSB7IGhpdHM6IDAsIG1pc3NlczogMCB9O1xuQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZSA9IHt9O1xuXG4vLyBSaWdodC10by1sZWZ0IC8gYmktZGlyZWN0aW9uYWwgdGV4dCBoYW5kbGluZ1xuLy8gVGFrZW4gZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEyMDA2MDk1L2phdmFzY3JpcHQtaG93LXRvLWNoZWNrLWlmLWNoYXJhY3Rlci1pcy1ydGwjYW5zd2VyLTE5MTQzMjU0XG5sZXQgcnRsUmVnRXggPSAvXlteXFx1MDU5MS1cXHUwN0ZGXFx1MjAwRlxcdTIwMkJcXHUyMDJFXFx1RkIxRC1cXHVGREZEXFx1RkU3MC1cXHVGRUZDXSo/W1xcdTA1OTEtXFx1MDdGRlxcdTIwMEZcXHUyMDJCXFx1MjAyRVxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ10vO1xuZnVuY3Rpb24gaXNSVEwocyl7XG4gICAgcmV0dXJuIHJ0bFJlZ0V4LnRlc3Qocyk7XG59XG5cbmZ1bmN0aW9uIHJlb3JkZXJXb3Jkc0xUUih3b3Jkcykge1xuICAgIGxldCB3b3Jkc19MVFIgPSBbXTtcbiAgICBsZXQgd29yZHNfUlRMID0gW107XG5cbiAgICAvLyBsb29wIHRocm91Z2ggd29yZHMgYW5kIHJlLW9yZGVyIFJUTCBncm91cHMgaW4gcmV2ZXJzZSBvcmRlciAoYnV0IGluIExUUiB2aXN1YWwgb3JkZXIpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBzdHIgPSB3b3Jkc1tpXTtcbiAgICAgICAgdmFyIHJ0bCA9IGlzUlRMKHN0cik7XG4gICAgICAgIGlmIChydGwpe1xuICAgICAgICAgICAgd29yZHNfUlRMLnB1c2goc3RyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlICh3b3Jkc19SVEwubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgd29yZHNfTFRSLnB1c2god29yZHNfUlRMLnBvcCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdvcmRzX0xUUi5wdXNoKHN0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB3aGlsZSAod29yZHNfUlRMLmxlbmd0aCA+IDApe1xuICAgICAgICB3b3Jkc19MVFIucHVzaCh3b3Jkc19SVEwucG9wKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB3b3Jkc19MVFI7XG59XG5cbi8vIFNwbGl0dGluZyBzdHJhdGVneSBmb3IgY2hvcHBpbmcgYSBsYWJlbCBpbnRvIHNlZ21lbnRzXG5mdW5jdGlvbiBzcGxpdExhYmVsVGV4dCh0ZXh0KXtcbiAgICBsZXQgd29yZHMgPSB0ZXh0LnNwbGl0KCcgJyk7XG4gICAgcmV0dXJuIHJlb3JkZXJXb3Jkc0xUUih3b3Jkcyk7XG59XG5cbi8vIFByaXZhdGUgY2xhc3MgdG8gYXJyYW5nZSB0ZXh0IGxhYmVscyBpbnRvIG11bHRpcGxlIGxpbmVzIGJhc2VkIG9uXG4vLyBcInRleHQgd3JhcFwiIGFuZCBcIm1heCBsaW5lXCIgdmFsdWVzXG5jbGFzcyBNdWx0aUxpbmUge1xuICAgIGNvbnN0cnVjdG9yIChjb250ZXh0LCBtYXhfbGluZXMgPSBJbmZpbml0eSwgdGV4dF93cmFwID0gSW5maW5pdHkpIHtcbiAgICAgICAgdGhpcy53aWR0aCA9IDA7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy5saW5lcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuZWxsaXBzaXMgPSAnLi4uJztcbiAgICAgICAgdGhpcy5lbGxpcHNpc193aWR0aCA9IGNvbnRleHQubWVhc3VyZVRleHQodGhpcy5lbGxpcHNpcykud2lkdGg7XG5cbiAgICAgICAgdGhpcy5tYXhfbGluZXMgPSBtYXhfbGluZXM7XG4gICAgICAgIHRoaXMudGV4dF93cmFwID0gdGV4dF93cmFwO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIH1cblxuICAgIGNyZWF0ZUxpbmUgKGxpbmVfaGVpZ2h0KXtcbiAgICAgICAgaWYgKHRoaXMubGluZXMubGVuZ3RoIDwgdGhpcy5tYXhfbGluZXMpe1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5lKGxpbmVfaGVpZ2h0LCB0aGlzLnRleHRfd3JhcCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoIChsaW5lKXtcbiAgICAgICAgaWYgKHRoaXMubGluZXMubGVuZ3RoIDwgdGhpcy5tYXhfbGluZXMpe1xuICAgICAgICAgICAgLy8gbWVhc3VyZSBsaW5lIHdpZHRoXG4gICAgICAgICAgICBsZXQgbGluZV93aWR0aCA9IHRoaXMuY29udGV4dC5tZWFzdXJlVGV4dChsaW5lLnRleHQpLndpZHRoO1xuICAgICAgICAgICAgbGluZS53aWR0aCA9IGxpbmVfd2lkdGg7XG5cbiAgICAgICAgICAgIGlmIChsaW5lX3dpZHRoID4gdGhpcy53aWR0aCl7XG4gICAgICAgICAgICAgICAgdGhpcy53aWR0aCA9IE1hdGguY2VpbChsaW5lX3dpZHRoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWRkIHRvIGxpbmVzIGFuZCBpbmNyZW1lbnQgaGVpZ2h0XG4gICAgICAgICAgICB0aGlzLmxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCArPSBsaW5lLmhlaWdodDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGRFbGxpcHNpcygpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcHVzaGVzIHRvIHRoZSBsaW5lcyBhcnJheSBhbmQgcmV0dXJucyBhIG5ldyBsaW5lIGlmIHBvc3NpYmxlIChmYWxzZSBvdGhlcndpc2UpXG4gICAgYWR2YW5jZSAobGluZSwgbGluZV9oZWlnaHQpIHtcbiAgICAgICAgbGV0IGNhbl9wdXNoID0gdGhpcy5wdXNoKGxpbmUpO1xuICAgICAgICBpZiAoY2FuX3B1c2gpe1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTGluZShsaW5lX2hlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRFbGxpcHNpcyAoKXtcbiAgICAgICAgbGV0IGxhc3RfbGluZSA9IHRoaXMubGluZXNbdGhpcy5saW5lcy5sZW5ndGggLSAxXTtcblxuICAgICAgICBsYXN0X2xpbmUuYXBwZW5kKHRoaXMuZWxsaXBzaXMpO1xuICAgICAgICBsYXN0X2xpbmUud2lkdGggKz0gdGhpcy5lbGxpcHNpc193aWR0aDtcblxuICAgICAgICBpZiAobGFzdF9saW5lLndpZHRoID4gdGhpcy53aWR0aCkge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IGxhc3RfbGluZS53aWR0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZpbmlzaCAobGluZSl7XG4gICAgICAgIGlmIChsaW5lKXtcbiAgICAgICAgICAgIHRoaXMucHVzaChsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRWxsaXBzaXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZSAoc3RyLCB0ZXh0X3dyYXAsIG1heF9saW5lcywgbGluZV9oZWlnaHQsIGN0eCkge1xuICAgICAgICAvLyBXb3JkIHdyYXBwaW5nXG4gICAgICAgIC8vIExpbmUgYnJlYWtzIGNhbiBiZSBjYXVzZWQgYnk6XG4gICAgICAgIC8vICAtIGltcGxpY2l0IGxpbmUgYnJlYWsgd2hlbiBhIG1heGltdW0gY2hhcmFjdGVyIHRocmVzaG9sZCBpcyBleGNlZWRlZCBwZXIgbGluZSAodGV4dF93cmFwKVxuICAgICAgICAvLyAgLSBleHBsaWNpdCBsaW5lIGJyZWFrIGluIHRoZSBsYWJlbCB0ZXh0IChcXG4pXG4gICAgICAgIGxldCB3b3JkcztcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0X3dyYXAgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB3b3JkcyA9IHN0ci5zcGxpdCgnICcpOyAvLyBzcGxpdCB3b3JkcyBvbiBzcGFjZXNcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdvcmRzID0gW3N0cl07IC8vIG5vIG1heCBsaW5lIHdvcmQgd3JhcHBpbmcgKGJ1dCBuZXcgbGluZXMgd2lsbCBzdGlsbCBiZSBpbiBlZmZlY3QpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbXVsdGlsaW5lID0gbmV3IE11bHRpTGluZShjdHgsIG1heF9saW5lcywgdGV4dF93cmFwKTtcbiAgICAgICAgbGV0IGxpbmUgPSBtdWx0aWxpbmUuY3JlYXRlTGluZShsaW5lX2hlaWdodCk7XG5cbiAgICAgICAgLy8gRmlyc3QgaXRlcmF0ZSBvbiBzcGFjZS1icmVhayBncm91cHMgKHdpbGwgYmUgb25lIGlmIG1heCBsaW5lIGxlbmd0aCBvZmYpLCB0aGVuIGl0ZXJhdGUgb24gbGluZS1icmVhayBncm91cHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGJyZWFrcyA9IHdvcmRzW2ldLnNwbGl0KCdcXG4nKTsgLy8gc3BsaXQgb24gbGluZSBicmVha3NcbiAgICAgICAgICAgIGxldCBuZXdfbGluZSA9IChpID09PSAwKSA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAgICAgZm9yIChsZXQgbj0wOyBuIDwgYnJlYWtzLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsaW5lKXtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHdvcmQgPSBicmVha3Nbbl0udHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBzcGFjZWRfd29yZCA9IChuZXdfbGluZSkgPyB3b3JkIDogJyAnICsgd29yZDtcblxuICAgICAgICAgICAgICAgIC8vIGlmIGFkZGluZyBjdXJyZW50IHdvcmQgd291bGQgb3ZlcmZsb3csIGFkZCBhIG5ldyBsaW5lIGluc3RlYWRcbiAgICAgICAgICAgICAgICAvLyBmaXJzdCB3b3JkIChpID09PSAwKSBhbHdheXMgYXBwZW5kc1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0X3dyYXAgJiYgaSA+IDAgJiYgbGluZS5leGNlZWRzVGV4dHdyYXAoc3BhY2VkX3dvcmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBtdWx0aWxpbmUuYWR2YW5jZShsaW5lLCBsaW5lX2hlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbGluZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCh3b3JkKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3X2xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQoc3BhY2VkX3dvcmQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGlmIGxpbmUgYnJlYWtzIHByZXNlbnQsIGFkZCBuZXcgbGluZSAodW5sZXNzIG9uIGxhc3QgbGluZSlcbiAgICAgICAgICAgICAgICBpZiAobiA8IGJyZWFrcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBtdWx0aWxpbmUuYWR2YW5jZShsaW5lLCBsaW5lX2hlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld19saW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpID09PSB3b3Jkcy5sZW5ndGggLSAxKXtcbiAgICAgICAgICAgICAgICBtdWx0aWxpbmUuZmluaXNoKGxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtdWx0aWxpbmU7XG4gICAgfVxufVxuXG4vLyBBIFByaXZhdGUgY2xhc3MgdXNlZCBieSBNdWx0aUxpbmUgdG8gY29udGFpbiB0aGUgbG9naWMgZm9yIGEgc2luZ2xlIGxpbmVcbi8vIGluY2x1ZGluZyBjaGFyYWN0ZXIgY291bnQsIHdpZHRoLCBoZWlnaHQgYW5kIHRleHRcbmNsYXNzIExpbmUge1xuICAgIGNvbnN0cnVjdG9yIChoZWlnaHQgPSAwLCB0ZXh0X3dyYXAgPSAwKXtcbiAgICAgICAgdGhpcy5jaGFycyA9IDA7XG4gICAgICAgIHRoaXMudGV4dCA9ICcnO1xuXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcbiAgICB9XG5cbiAgICBhcHBlbmQgKHRleHQpe1xuICAgICAgICB0aGlzLmNoYXJzICs9IHRleHQubGVuZ3RoO1xuICAgICAgICB0aGlzLnRleHQgKz0gdGV4dDtcbiAgICB9XG5cbiAgICBleGNlZWRzVGV4dHdyYXAgKHRleHQpe1xuICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggKyB0aGlzLmNoYXJzID4gdGhpcy50ZXh0X3dyYXA7XG4gICAgfVxufVxuIiwiLyogZ2xvYmFsIEZvbnRGYWNlICovXG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEZvbnRGYWNlT2JzZXJ2ZXIgZnJvbSAnZm9udGZhY2VvYnNlcnZlcic7XG5cbmNvbnN0IEZvbnRNYW5hZ2VyID0ge1xuXG4gICAgLy8gRm9udCBkZXRlY3Rpb25cbiAgICBmb250c19sb2FkZWQ6IFByb21pc2UucmVzb2x2ZSgpLCAvLyByZXNvbHZlcyB3aGVuIGFsbCByZXF1ZXN0ZWQgZm9udHMgaGF2ZSBiZWVuIGRldGVjdGVkXG5cbiAgICAvLyBMb2FkIHNldCBvZiBjdXN0b20gZm9udCBmYWNlc1xuICAgIC8vIGBmb250c2AgaXMgYW4gb2JqZWN0IHdoZXJlIHRoZSBrZXkgaXMgYSBmb250IGZhbWlseSBuYW1lLCBhbmQgdGhlIHZhbHVlIGlzIG9uZSBvciBtb3JlIGZvbnQgZmFjZVxuICAgIC8vIGRlZmluaXRpb25zLiBUaGUgdmFsdWUgY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBvYmplY3QsIG9yIGFuIGFycmF5IG9mIHN1Y2ggb2JqZWN0cy5cbiAgICAvLyBJZiB0aGUgc3BlY2lhbCBzdHJpbmcgdmFsdWUgJ2V4dGVybmFsJyBpcyB1c2VkLCBpdCBpbmRpY2F0ZXMgdGhlIHRoZSBmb250IHdpbGwgYmUgbG9hZGVkIHZpYSBleHRlcm5hbCBDU1MuXG4gICAgbG9hZEZvbnRzIChmb250cykge1xuICAgICAgICBpZiAoZm9udHMpIHtcbiAgICAgICAgICAgIGxldCBxdWV1ZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgZmFtaWx5IGluIGZvbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZm9udHNbZmFtaWx5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9udHNbZmFtaWx5XS5mb3JFYWNoKGZhY2UgPT4gcXVldWUucHVzaCh0aGlzLmxvYWRGb250RmFjZShmYW1pbHksIGZhY2UpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKHRoaXMubG9hZEZvbnRGYWNlKGZhbWlseSwgZm9udHNbZmFtaWx5XSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5mb250c19sb2FkZWQgPSBQcm9taXNlLmFsbChxdWV1ZS5maWx0ZXIoeCA9PiB4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9udHNfbG9hZGVkO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkIGEgc2luZ2xlIGZvbnQgZmFjZVxuICAgIC8vIGBmYWNlYCBjb250YWlucyB0aGUgZm9udCBmYWNlIGRlZmluaXRpb24sIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgYHdlaWdodGAsIGBzdHlsZWAsIGFuZCBgdXJsYC5cbiAgICAvLyBJZiB0aGUgYHVybGAgaXMgZGVmaW5lZCwgdGhlIGZvbnQgaXMgaW5qZWN0ZWQgaW50byB0aGUgZG9jdW1lbnQgYXMgYSBDU1MgZm9udC1mYWNlLlxuICAgIC8vIElmIHRoZSBvYmplY3QncyB2YWx1ZSBpcyB0aGUgc3BlY2lhbCBzdHJpbmcgJ2V4dGVybmFsJywgb3IgaWYgbm8gYHVybGAgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZm9udCBmYWNlXG4gICAgLy8gaXMgYXNzdW1lZCBpcyBhc3N1bWVkIHRvIGJlZW4gbG9hZGVkIHZpYSBleHRlcm5hbCBDU1MuIEluIGVpdGhlciBjYXNlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2VcbiAgICAvLyB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZvbnQgZmFjZSBoYXMgbG9hZGVkLCBvciB0aW1lcyBvdXQuXG4gICAgbG9hZEZvbnRGYWNlIChmYW1pbHksIGZhY2UpIHtcbiAgICAgICAgaWYgKGZhY2UgPT0gbnVsbCB8fCAodHlwZW9mIGZhY2UgIT09ICdvYmplY3QnICYmIGZhY2UgIT09ICdleHRlcm5hbCcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3B0aW9ucyA9IHsgZmFtaWx5IH07XG4gICAgICAgIGxldCBpbmplY3QgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGZhY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMsIGZhY2UpO1xuXG4gICAgICAgICAgICAvLyBJZiBVUkwgaXMgZGVmaW5lZCwgaW5qZWN0IGZvbnQgaW50byBkb2N1bWVudFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmYWNlLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbmplY3QgPSB0aGlzLmluamVjdEZvbnRGYWNlKG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgZm9udCB0byBsb2FkXG4gICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBGb250RmFjZU9ic2VydmVyKGZhbWlseSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBpbmplY3QudGhlbigoKSA9PiBvYnNlcnZlci5sb2FkKCkpLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlcywgZm9udCBpcyBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYEZvbnQgZmFjZSAnJHtmYW1pbHl9JyBpcyBhdmFpbGFibGVgLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUHJvbWlzZSByZWplY3RzLCBmb250IGlzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYEZvbnQgZmFjZSAnJHtmYW1pbHl9JyBpcyBOT1QgYXZhaWxhYmxlYCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8vIExvYWRzIGEgZm9udCBmYWNlIHZpYSBlaXRoZXIgdGhlIG5hdGl2ZSBGb250RmFjZSBBUEksIG9yIENTUyBpbmplY3Rpb25cbiAgICAvLyBUT0RPOiBjb25zaWRlciBzdXBwb3J0IGZvciBtdWx0aXBsZSBmb3JtYXQgVVJMcyBwZXIgZmFjZSwgdW5pY29kZSByYW5nZXNcbiAgICBpbmplY3RGb250RmFjZSAoeyBmYW1pbHksIHVybCwgd2VpZ2h0LCBzdHlsZSB9KSB7XG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzX25hdGl2ZV9mb250X2xvYWRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nID0gKHdpbmRvdy5Gb250RmFjZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgYmxvYiBVUkxzLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmF0aXZlIEZvbnRGYWNlIEFQSSB3aWxsIGJlIHVzZWQgb3Igbm90LlxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVuIHRoZSBGb250RmFjZSBBUEkgKmlzKiBzdXBwb3J0ZWQsIHRoZSBibG9iIFVSTCBpcyByZWFkIGludG8gYSByYXcgZGF0YSBhcnJheS5cbiAgICAgICAgLy8gTkI6IGl0J3MgaW5lZmZpY2llbnQgdG8gYmUgY29udmVydGluZyBibG9iIFVSTHMgaW50byB0eXBlZCBhcnJheXMgaGVyZSwgc2luY2UgdGhleSBvcmlnaW5hdGVkXG4gICAgICAgIC8vIGFzIHJhdyBkYXRhICpiZWZvcmUqIHRoZXkgd2VyZSBjb252ZXJ0ZWQgaW50byBibG9iIFVSTHMuIEhvd2V2ZXIsIHRoaXMgcHJvY2VzcyBzaG91bGQgYmUgZmFzdCBzaW5jZVxuICAgICAgICAvLyB0aGVzZSBhcmUgbmF0aXZlIGJyb3dzZXIgZnVuY3Rpb25zIGFuZCBhbGwgZGF0YSBpcyBsb2NhbCAobm8gbmV0d29yayByZXF1ZXN0KSwgYW5kIGl0IGtlZXBzIHRoZVxuICAgICAgICAvLyBsb2dpYyBzdHJlYW1saW5lZCBieSBhbGxvd2luZyB1cyB0byBjb250aW51ZSB0byB1c2UgYSBVUkwtYmFzZWQgaW50ZXJmYWNlIGZvciBhbGwgc2NlbmUgcmVzb3VyY2VzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVuIHRoZSBGb250RmFjZSBBUEkgaXMgKm5vdCogc3VwcG9ydGVkLCB0aGUgYmxvYiBVUkwgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gYSBiYXNlNjQgZGF0YSBVUkwuXG4gICAgICAgIC8vIFRoaXMgYXZvaWRzIHNlY3VyaXR5IHJlc3RyaWNpb25zIGluIHNvbWUgYnJvd3NlcnMuXG4gICAgICAgIC8vIEFsc28gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9icmFtc3RlaW4vZm9udGxvYWRlci9ibG9iLzU5OGU5Mzk5MTE3YmRjOTQ2ZmY3ODZmYTJjNTAwN2E2YmQ3ZDNiOWUvc3JjL2ZvbnRmYWNlLmpzI0wxNDUtTDE1M1xuICAgICAgICBsZXQgcHJlcHJvY2VzcyA9IFByb21pc2UucmVzb2x2ZSh1cmwpO1xuICAgICAgICBpZiAodXJsLnNsaWNlKDAsIDUpID09PSAnYmxvYjonKSB7XG4gICAgICAgICAgICBwcmVwcm9jZXNzID0gVXRpbHMuaW8odXJsLCA2MDAwMCwgJ2FycmF5YnVmZmVyJykudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBieXRlczsgLy8gdXNlIHJhdyBiaW5hcnkgZGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LCcgKyBidG9hKHN0cik7IC8vIGJhc2U2NCBlbmNvZGUgYXMgZGF0YSBVUkxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmVwcm9jZXNzLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIG5hdGl2ZSBGb250RmFjZSBBUElcbiAgICAgICAgICAgICAgICBsZXQgZmFjZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7IC8vIGFkZCBhcyBVUkxcbiAgICAgICAgICAgICAgICAgICAgZmFjZSA9IG5ldyBGb250RmFjZShmYW1pbHksIGB1cmwoJHtlbmNvZGVVUkkoZGF0YSl9KWAsIHsgd2VpZ2h0LCBzdHlsZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsgLy8gYWRkIGFzIGJpbmFyeSBkYXRhXG4gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBuZXcgRm9udEZhY2UoZmFtaWx5LCBkYXRhLCB7IHdlaWdodCwgc3R5bGUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChmYWNlKTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0FkZGluZyBGb250RmFjZSB0byBkb2N1bWVudC5mb250czonLCBmYWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBDU1MgaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgbGV0IGNzcyA9IGBcbiAgICAgICAgICAgICAgICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogJyR7ZmFtaWx5fSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogJHt3ZWlnaHQgfHwgJ25vcm1hbCd9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zdHlsZTogJHtzdHlsZSB8fCAnbm9ybWFsJ307XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHVybCgke2VuY29kZVVSSShkYXRhKX0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICAgIGxldCBzdHlsZV9lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgc3R5bGVfZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIikpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVfZWwpO1xuICAgICAgICAgICAgICAgIHN0eWxlX2VsLnNoZWV0Lmluc2VydFJ1bGUoY3NzLCAwKTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0luamVjdGluZyBDU1MgZm9udCBmYWNlOicsIGNzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgRm9udE1hbmFnZXI7XG4iLCIvLyBUZXh0IHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1BvaW50c30gZnJvbSAnLi4vcG9pbnRzL3BvaW50cyc7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4uLy4uL2xhYmVscy9jb2xsaXNpb24nO1xuaW1wb3J0IExhYmVsUG9pbnQgZnJvbSAnLi4vLi4vbGFiZWxzL2xhYmVsX3BvaW50JztcbmltcG9ydCBMYWJlbExpbmUgZnJvbSAnLi4vLi4vbGFiZWxzL2xhYmVsX2xpbmUnO1xuXG5leHBvcnQgbGV0IFRleHRTdHlsZSA9IE9iamVjdC5jcmVhdGUoUG9pbnRzKTtcblxuT2JqZWN0LmFzc2lnbihUZXh0U3R5bGUsIHtcbiAgICBuYW1lOiAndGV4dCcsXG4gICAgc3VwZXI6IFBvaW50cyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcbiAgICBzZWxlY3Rpb246IGZhbHNlLCAvLyBubyBmZWF0dXJlIHNlbGVjdGlvbiBmb3IgdGV4dCBieSBkZWZhdWx0XG5cbiAgICBpbml0KCkge1xuICAgICAgICB0aGlzLnN1cGVyLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBQb2ludCBzdHlsZSAocGFyZW50IGNsYXNzKSByZXF1aXJlcyB0ZXh0dXJpbmcgdG8gYmUgdHVybmVkIG9uXG4gICAgICAgIC8vIChsYWJlbHMgYXJlIGFsd2F5cyBkcmF3biB3aXRoIHRleHR1cmVzKVxuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9QT0lOVF9URVhUVVJFID0gdHJ1ZTtcblxuICAgICAgICAvLyBEaXNhYmxlIGR1YWwgcG9pbnQvdGV4dCBtb2RlXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX01VTFRJX1NBTVBMRVIgPSBmYWxzZTtcblxuICAgICAgICAvLyBNYW51YWxseSB1bi1tdWx0aXBseSBhbHBoYSwgYmVjYXVzZSBDYW52YXMgdGV4dCByYXN0ZXJpemF0aW9uIGlzIHByZS1tdWx0aXBsaWVkXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1VOTVVMVElQTFlfQUxQSEEgPSB0cnVlO1xuXG4gICAgICAgIC8vIEZhZGUgb3V0IHRleHQgd2hlbiB0aWxlIGlzIHpvb21pbmcgb3V0LCBlLmcuIGFjdGluZyBhcyBwcm94eSB0aWxlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9PTl9aT09NX09VVF9SQVRFID0gMjsgLy8gZmFkZSBhdCAyeCwgZS5nLiBmdWxseSB0cmFuc3BhcmVudCBhdCAwLjUgem9vbSBsZXZlbCBhd2F5XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH0sXG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5xdWV1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNldFRleHQoKTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGUgdG8gcXVldWUgZmVhdHVyZXMgaW5zdGVhZCBvZiBwcm9jZXNzaW5nIGltbWVkaWF0ZWx5XG4gICAgYWRkRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgdGlsZSA9IGNvbnRleHQudGlsZTtcbiAgICAgICAgaWYgKHRpbGUuZ2VuZXJhdGlvbiAhPT0gdGhpcy5nZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsZWQgaGVyZSBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRlbGF5ZWQgdW50aWwgdGhlIGZlYXR1cmUgcXVldWUgaXMgcGFyc2VkLFxuICAgICAgICAvLyBhbmQgd2Ugd2FudCB0aGUgcHJlcHJvY2Vzc2luZyBkb25lIGJlZm9yZSB3ZSBldmFsdWF0ZSB0ZXh0IHN0eWxlIGJlbG93XG4gICAgICAgIGRyYXcgPSB0aGlzLnByZXByb2Nlc3MoZHJhdyk7XG4gICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHR5cGUgPSBmZWF0dXJlLmdlb21ldHJ5LnR5cGU7XG4gICAgICAgIGRyYXcuY2FuX2FydGljdWxhdGUgPSAodHlwZSA9PT0gXCJMaW5lU3RyaW5nXCIgfHwgdHlwZSA9PT0gXCJNdWx0aUxpbmVTdHJpbmdcIik7XG5cbiAgICAgICAgbGV0IHEgPSB0aGlzLnBhcnNlVGV4dEZlYXR1cmUoZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSk7XG4gICAgICAgIGlmICghcSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcS5mZWF0dXJlID0gZmVhdHVyZTtcbiAgICAgICAgcS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgcS5sYXlvdXQudmVydGV4ID0gZmFsc2U7IC8vIHZlcnRleCBwbGFjZW1lbnQgb3B0aW9uIG5vdCBhcHBsaWNhYmxlIHRvIHN0YW5kYWxvbmUgbGFiZWxzXG5cbiAgICAgICAgLy8gUXVldWUgdGhlIGZlYXR1cmUgZm9yIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRhKHRpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVldWVzW3RpbGUua2V5XS5wdXNoKHEpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggY29sbGlzaW9uIG1hbmFnZXJcbiAgICAgICAgQ29sbGlzaW9uLmFkZFN0eWxlKHRoaXMubmFtZSwgdGlsZS5rZXkpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0gPSBbXTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLnN0YXJ0RGF0YS5jYWxsKHRoaXMsIHRpbGUpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIGVuZERhdGEgKHRpbGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZVRleHRMYWJlbHModGlsZSwgdGhpcy5uYW1lLCB0aGlzLnF1ZXVlc1t0aWxlLmtleV0pLlxuICAgICAgICAgICAgdGhlbihsYWJlbHMgPT4gdGhpcy5jb2xsaWRlQW5kUmVuZGVyVGV4dExhYmVscyh0aWxlLCB0aGlzLm5hbWUsIGxhYmVscykpLlxuICAgICAgICAgICAgdGhlbigoeyBsYWJlbHMsIHRleHRzLCB0ZXh0dXJlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV0gPSB0ZXh0cztcblxuICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBxdWV1ZWQgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5nc19rZXkgPSBxLnRleHRfc2V0dGluZ3Nfa2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldW3EudGV4dF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIHN0eWxpbmcgb2JqZWN0IGV4cGVjdGVkIGJ5IFN0eWxlIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5sYWJlbCA9IHEubGFiZWw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2luZm8udGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGxvZ2ljYWwgc2l6ZXMgb2YgZWFjaCBzZWdtZW50IGludG8gYW4gYXJyYXkgZm9yIHRoZSBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSB0ZXh0X2luZm8uc2l6ZS5tYXAoZnVuY3Rpb24oc2l6ZSl7IHJldHVybiBzaXplLmxvZ2ljYWxfc2l6ZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gdGV4dF9pbmZvLnRleGNvb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSB0ZXh0X2luZm8uc2l6ZS5sb2dpY2FsX3NpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuYW5nbGUgPSBxLmxhYmVsLmFuZ2xlIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gdGV4dF9pbmZvLmFsaWduW3EubGFiZWwuYWxpZ25dLnRleGNvb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUuYWRkRmVhdHVyZS5jYWxsKHRoaXMsIHEuZmVhdHVyZSwgcS5kcmF3LCBxLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5mcmVlVGV4dCh0aWxlKTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmlzaCB0aWxlIG1lc2hcbiAgICAgICAgICAgICAgICByZXR1cm4gU3R5bGUuZW5kRGF0YS5jYWxsKHRoaXMsIHRpbGUpLnRoZW4odGlsZV9kYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoIHRpbGUtc3BlY2lmaWMgbGFiZWwgYXRsYXMgdG8gbWVzaCBhcyBhIHRleHR1cmUgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSAmJiB0aWxlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3Jtcy51X3RleHR1cmUgPSB0ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnRleHR1cmVzLnB1c2godGV4dHVyZSk7IC8vIGFzc2lnbiB0ZXh0dXJlIG93bmVyc2hpcCB0byB0aWxlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gU2V0cyB1cCBjYWNoaW5nIGZvciBkcmF3IHByb3BlcnRpZXNcbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVwcm9jZXNzVGV4dChkcmF3KTtcbiAgICB9LFxuXG4gICAgLy8gSW1wbGVtZW50cyBsYWJlbCBidWlsZGluZyBmb3IgVGV4dExhYmVscyBtaXhpblxuICAgIGJ1aWxkVGV4dExhYmVscyAodGlsZV9rZXksIGZlYXR1cmVfcXVldWUpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmPTA7IGYgPCBmZWF0dXJlX3F1ZXVlLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICBsZXQgZnEgPSBmZWF0dXJlX3F1ZXVlW2ZdO1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRoaXMudGV4dHNbdGlsZV9rZXldW2ZxLnRleHRfc2V0dGluZ3Nfa2V5XVtmcS50ZXh0XTtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlX2xhYmVscztcbiAgICAgICAgICAgIGlmICh0ZXh0X2luZm8udGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgdmFyIHNpemVzID0gdGV4dF9pbmZvLnNpemUubWFwKGZ1bmN0aW9uKHNpemUpeyByZXR1cm4gc2l6ZS5jb2xsaXNpb25fc2l6ZTsgfSk7XG4gICAgICAgICAgICAgICAgZnEubGF5b3V0LnNwYWNlX3dpZHRoID0gdGV4dF9pbmZvLnNwYWNlX3dpZHRoO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVfbGFiZWxzID0gdGhpcy5idWlsZExhYmVscyhzaXplcywgZnEuZmVhdHVyZS5nZW9tZXRyeSwgZnEubGF5b3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZlYXR1cmVfbGFiZWxzID0gdGhpcy5idWlsZExhYmVscyh0ZXh0X2luZm8uc2l6ZS5jb2xsaXNpb25fc2l6ZSwgZnEuZmVhdHVyZS5nZW9tZXRyeSwgZnEubGF5b3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdHVyZV9sYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZnFsID0gT2JqZWN0LmNyZWF0ZShmcSk7XG4gICAgICAgICAgICAgICAgZnFsLmxhYmVsID0gZmVhdHVyZV9sYWJlbHNbaV07XG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2goZnFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZHMgb25lIG9yIG1vcmUgbGFiZWxzIGZvciBhIGdlb21ldHJ5XG4gICAgYnVpbGRMYWJlbHMgKHNpemUsIGdlb21ldHJ5LCBsYXlvdXQpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuXG4gICAgICAgIGlmIChnZW9tZXRyeS50eXBlID09PSBcIkxpbmVTdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5idWlsZExpbmVMYWJlbHMoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHNpemUsIGxheW91dCwgbGFiZWxzKTtcbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpTGluZVN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsZXQgbGluZXMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkTGluZUxhYmVscyhsaW5lc1tpXSwgc2l6ZSwgbGF5b3V0LCBsYWJlbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiUG9pbnRcIikge1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHNpemUsIGxheW91dCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlQb2ludFwiKSB7XG4gICAgICAgICAgICBsZXQgcG9pbnRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KHBvaW50c1tpXSwgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2x5Z29uXCIpIHtcbiAgICAgICAgICAgIGxldCBjZW50cm9pZCA9IEdlby5jZW50cm9pZChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvbHlnb25cIikge1xuICAgICAgICAgICAgbGV0IGNlbnRyb2lkID0gR2VvLm11bHRpQ2VudHJvaWQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoY2VudHJvaWQsIHNpemUsIGxheW91dCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxhYmVscztcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgb25lIG9yIG1vcmUgbGFiZWxzIGZvciBhIGxpbmUgZ2VvbWV0cnlcbiAgICBidWlsZExpbmVMYWJlbHMgKGxpbmUsIHNpemUsIGxheW91dCwgbGFiZWxzKSB7XG4gICAgICAgIGxldCBzdWJkaXYgPSBNYXRoLm1pbihsYXlvdXQuc3ViZGl2LCBsaW5lLmxlbmd0aCAtIDEpO1xuICAgICAgICBpZiAoc3ViZGl2ID4gMSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIG11bHRpcGxlIGxhYmVscyBmb3IgbGluZSwgd2l0aCBlYWNoIGFsbG90dGVkIGEgcmFuZ2Ugb2Ygc2VnbWVudHNcbiAgICAgICAgICAgIC8vIGluIHdoaWNoIGl0IHdpbGwgYXR0ZW1wdCB0byBwbGFjZVxuICAgICAgICAgICAgbGV0IHNlZ19wZXJfZGl2ID0gKGxpbmUubGVuZ3RoIC0gMSkgLyBzdWJkaXY7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YmRpdjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfc3RhcnQgPSBNYXRoLmZsb29yKGkgKiBzZWdfcGVyX2Rpdik7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfZW5kID0gTWF0aC5mbG9vcigoaSArIDEpICogc2VnX3Blcl9kaXYpO1xuXG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsTGluZShzaXplLCBsaW5lLCBsYXlvdXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxheW91dC5zZWdtZW50X3N0YXJ0ID0gbnVsbDtcbiAgICAgICAgICAgIGxheW91dC5zZWdtZW50X2VuZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBuZXcgTGFiZWxMaW5lKHNpemUsIGxpbmUsIGxheW91dCk7XG4gICAgICAgICAgICBpZiAoIWxhYmVsLnRocm93X2F3YXkpe1xuICAgICAgICAgICAgICAgIGxldCBjaG9zZW5fbGFiZWwgPSBwbGFjZW1lbnRTdHJhdGVneShsYWJlbCk7XG4gICAgICAgICAgICAgICAgaWYgKGNob3Nlbl9sYWJlbCl7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGNob3Nlbl9sYWJlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59KTtcblxuY29uc3QgVEFSR0VUX1NUUkFJR0hUID0gMC40OyAvLyBPcHRpbWlzdGljIHRhcmdldCByYXRpbyBmb3Igc3RyYWlnaHQgbGFiZWxzIChsYWJlbCBsZW5ndGggLyBsaW5lIGxlbmd0aClcbmNvbnN0IFRBUkdFVF9LSU5LRUQgPSAwLjU7IC8vIE9wdGltaXN0aWMgdGFyZ2V0IHJhdGlvIGZvciBraW5rZWQgbGFiZWxzIChsYWJlbCBsZW5ndGggLyBsaW5lIGxlbmd0aClcblxuLy8gUGxhY2UgbGFiZWxzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5OlxuLy8gLSBjaG9vc2UgdGhlIGJlc3Qgc3RyYWlnaHQgbGFiZWwgdGhhdCBzYXRpc2ZpZXMgdGhlIG9wdGltaXN0aWMgc3RyYWlnaHQgY3V0b2ZmIChpZiBhbnkpXG4vLyAtIGVsc2UgY2hvb3NlIHRoZSBiZXN0IGtpbmtlZCBsYWJlbCB0aGF0IHNhdGlzZmllcyB0aGUgb3B0aW1pc3RpYyBraW5rZWQgY3V0b2ZmIChpZiBhbnkpXG4vLyAtIGVsc2UgY2hvb3NlIHRoZSBiZXN0IHN0cmFpZ2h0IGxhYmVsIHRoYXQgc2F0aXNmaWVzIGl0cyBpbnRlcm5hbCAobGVzcyBvcHRpbWlzdGljKSBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBjaG9vc2UgdGhlIGJlc3Qga2lua2VkIGxhYmVscyB0aGF0IHNhdGlzZmllcyBpdHMgaW50ZXJuYWwgKGxlc3Mgb3B0aW1pc3RpYykgY3V0b2ZmIChpZiBhbnkpXG4vLyAtIGVsc2UgZG9uJ3QgcGxhY2UgYSBsYWJlbFxuZnVuY3Rpb24gcGxhY2VtZW50U3RyYXRlZ3kobGFiZWwpe1xuICAgIGxldCBsYWJlbHNfc3RyYWlnaHQgPSBbXTtcbiAgICBsZXQgbGFiZWxzX2tpbmtlZCA9IFtdO1xuICAgIGxldCBiZXN0X3N0cmFpZ2h0X2ZpdG5lc3MgPSBJbmZpbml0eTtcbiAgICBsZXQgYmVzdF9raW5rZWRfZml0bmVzcyA9IEluZmluaXR5O1xuXG4gICAgLy8gbG9vcCB0aHJvdWdoIGFsbCBsYWJlbHNcbiAgICB3aGlsZSAobGFiZWwgJiYgIWxhYmVsLnRocm93X2F3YXkpIHtcbiAgICAgICAgaWYgKGxhYmVsLmtpbmtfaW5kZXggPiAwKXtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFydGljdWxhdGVkIGxhYmVsIGlzIGFib3ZlIGxvd2VzdCBjdXRvZmZcbiAgICAgICAgICAgIGlmIChsYWJlbC5maXRuZXNzIDwgYmVzdF9raW5rZWRfZml0bmVzcyl7XG4gICAgICAgICAgICAgICAgYmVzdF9raW5rZWRfZml0bmVzcyA9IGxhYmVsLmZpdG5lc3M7XG4gICAgICAgICAgICAgICAgbGFiZWxzX2tpbmtlZC51bnNoaWZ0KGxhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHN0cmFpZ2h0IGxhYmVsIGlzIGFib3ZlIGxvd2VzdCBzdHJhaWdodCBjdXRvZmZcbiAgICAgICAgICAgIGlmIChsYWJlbC5maXRuZXNzIDwgYmVzdF9zdHJhaWdodF9maXRuZXNzKXtcbiAgICAgICAgICAgICAgICBiZXN0X3N0cmFpZ2h0X2ZpdG5lc3MgPSBsYWJlbC5maXRuZXNzO1xuICAgICAgICAgICAgICAgIGxhYmVsc19zdHJhaWdodC51bnNoaWZ0KGxhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhYmVsID0gTGFiZWxMaW5lLm5leHRMYWJlbChsYWJlbCk7XG4gICAgfVxuXG4gICAgbGV0IGJlc3Rfc3RyYWlnaHQgPSBsYWJlbHNfc3RyYWlnaHRbMF07XG4gICAgbGV0IGJlc3Rfa2lua2VkID0gbGFiZWxzX2tpbmtlZFswXTtcblxuICAgIGlmIChsYWJlbHNfc3RyYWlnaHQubGVuZ3RoICYmIGJlc3Rfc3RyYWlnaHQuZml0bmVzcyA8IFRBUkdFVF9TVFJBSUdIVCl7XG4gICAgICAgIC8vIHJldHVybiB0aGUgYmVzdCBzdHJhaWdodCBzZWdtZW50IGlmIGl0IGlzIGFib3ZlIHRoZSBzdHJpY3RlciBzdHJhaWdodCBjdXRvZmZcbiAgICAgICAgcmV0dXJuIGJlc3Rfc3RyYWlnaHQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGxhYmVsc19raW5rZWQubGVuZ3RoICYmIGJlc3Rfa2lua2VkLmZpdG5lc3MgPCBUQVJHRVRfS0lOS0VEKXtcbiAgICAgICAgLy8gcmV0dXJuIHRoZSBiZXN0IGtpbmtlZCBzZWdtZW50IGlmIGl0IGlzIGFib3ZlIHRoZSBzdHJpY3RlciBraW5rZWQgY3V0b2ZmXG4gICAgICAgIHJldHVybiBiZXN0X2tpbmtlZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSByZXR1cm4gYmVzdCBvZiB3aGF0J3MgbGVmdCAoaWYgYW55KVxuICAgICAgICByZXR1cm4gYmVzdF9zdHJhaWdodCB8fCBiZXN0X2tpbmtlZDtcbiAgICB9XG59XG5cblRleHRTdHlsZS50ZXh0dXJlX2lkID0gMDsgLy8gbmFtZXNwYWNlcyBwZXItdGlsZSBsYWJlbCB0ZXh0dXJlc1xuIiwiLy8gVGV4dCBsYWJlbCByZW5kZXJpbmcgbWV0aG9kcywgY2FuIGJlIG1peGVkIGludG8gYSByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IGxvZyBmcm9tICcuLi8uLi91dGlscy9sb2cnO1xuaW1wb3J0IFRocmVhZCBmcm9tICcuLi8uLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuLi8uLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi4vLi4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgVGV4dFNldHRpbmdzIGZyb20gJy4uL3RleHQvdGV4dF9zZXR0aW5ncyc7XG5pbXBvcnQgQ2FudmFzVGV4dCBmcm9tICcuLi90ZXh0L2NhbnZhc190ZXh0JztcblxuLy8gbmFtZXNwYWNlcyBsYWJlbCB0ZXh0dXJlcyAoZW5zdXJlcyBuZXcgdGV4dHVyZSBuYW1lIHdoZW4gYSB0aWxlIGlzIGJ1aWx0IG11bHRpcGxlIHRpbWVzKVxubGV0IHRleHRfdGV4dHVyZV9pZCA9IDA7XG5cbmV4cG9ydCBjb25zdCBUZXh0TGFiZWxzID0ge1xuXG4gICAgcmVzZXRUZXh0ICgpIHtcbiAgICAgICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcyA9IG5ldyBDYW52YXNUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoVGhyZWFkLmlzX3dvcmtlcikge1xuICAgICAgICAgICAgdGhpcy50ZXh0cyA9IHt9OyAvLyB1bmlxdWUgdGV4dHMsIGdyb3VwZWQgYnkgdGlsZSwgYnkgc3R5bGVcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBmcmVlVGV4dCAodGlsZSkge1xuICAgICAgICBkZWxldGUgdGhpcy50ZXh0c1t0aWxlLmtleV07XG4gICAgfSxcblxuICAgIHBhcnNlVGV4dEZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpIHtcbiAgICAgICAgLy8gQ29tcHV0ZSBsYWJlbCB0ZXh0XG4gICAgICAgIGxldCB0ZXh0ID0gdGhpcy5wYXJzZVRleHRTb3VyY2UoZmVhdHVyZSwgZHJhdywgY29udGV4dCk7XG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gbm8gdGV4dCBmb3IgdGhpcyBmZWF0dXJlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21wdXRlIHRleHQgc3R5bGUgYW5kIGxheW91dCBzZXR0aW5ncyBmb3IgdGhpcyBmZWF0dXJlIGxhYmVsXG4gICAgICAgIGxldCB0ZXh0X3NldHRpbmdzID0gVGV4dFNldHRpbmdzLmNvbXB1dGUoZmVhdHVyZSwgZHJhdywgY29udGV4dCk7XG4gICAgICAgIGxldCB0ZXh0X3NldHRpbmdzX2tleSA9IFRleHRTZXR0aW5ncy5rZXkodGV4dF9zZXR0aW5ncyk7XG4gICAgICAgIGxldCBsYXlvdXQgPSB0aGlzLmNvbXB1dGVUZXh0TGF5b3V0KHt9LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlLCB0ZXh0LCB0ZXh0X3NldHRpbmdzKTtcblxuICAgICAgICAvLyBmaXJzdCBsYWJlbCBpbiB0aWxlLCBvciB3aXRoIHRoaXMgc3R5bGU/XG4gICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldID0gdGhpcy50ZXh0c1t0aWxlLmtleV0gfHwge307XG4gICAgICAgIGxldCBzaXplcyA9IHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XSA9IHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XSB8fCB7fTtcblxuICAgICAgICAvLyB1bmlxdWUgdGV4dCBzdHJpbmdzLCBncm91cGVkIGJ5IHRleHQgZHJhd2luZyBzdHlsZVxuICAgICAgICBpZiAoIXNpemVzW3RleHRdKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCBsYWJlbCB3aXRoIHRoaXMgdGV4dC9zdHlsZS90aWxlIGNvbWJpbmF0aW9uLCBtYWtlIGEgbmV3IGxhYmVsIGVudHJ5XG4gICAgICAgICAgICBzaXplc1t0ZXh0XSA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0X3NldHRpbmdzLFxuICAgICAgICAgICAgICAgIHJlZjogMCAvLyAjIG9mIHRpbWVzIHRoaXMgdGV4dC9zdHlsZSBjb21ibyBhcHBlYXJzIGluIHRpbGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZHJhdywgdGV4dCwgdGV4dF9zZXR0aW5nc19rZXksIGxheW91dFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyBDb21wdXRlIHRoZSBsYWJlbCB0ZXh0LCBkZWZhdWx0IGlzIHZhbHVlIG9mIGZlYXR1cmUucHJvcGVydGllcy5uYW1lXG4gICAgLy8gLSBTdHJpbmcgdmFsdWUgaW5kaWNhdGVzIGEgZmVhdHVyZSBwcm9wZXJ0eSBsb29rLXVwLCBlLmcuIGBzaG9ydF9uYW1lYCBtZWFucyB1c2UgZmVhdHVyZS5wcm9wZXJ0aWVzLnNob3J0X25hbWVcbiAgICAvLyAtIEZ1bmN0aW9uIHdpbGwgdXNlIHRoZSByZXR1cm4gdmFsdWUgYXMgdGhlIGxhYmVsIHRleHQgKGZvciBjdXN0b20gbGFiZWxzKVxuICAgIC8vIC0gQXJyYXkgKG9mIHN0cmluZ3MgYW5kL29yIGZ1bmN0aW9ucykgZGVmaW5lcyBhIGxpc3Qgb2YgZmFsbGJhY2tzLCBldmFsdWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBydWxlcyxcbiAgICAvLyAgIHdpdGggdGhlIGZpcnN0IG5vbi1udWxsIHZhbHVlIHVzZWQgYXMgdGhlIGxhYmVsIHRleHRcbiAgICAvLyAgIGUuZy4gYFtuYW1lOmVzLCBuYW1lOmVuLCBuYW1lXWAgcHJlZmVycyBTcGFuaXNoIG5hbWVzLCBmb2xsb3dlZCBieSBFbmdsaXNoLCBhbmQgbGFzdCB0aGUgZGVmYXVsdCBsb2NhbCBuYW1lXG4gICAgcGFyc2VUZXh0U291cmNlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0ZXh0O1xuICAgICAgICBsZXQgc291cmNlID0gZHJhdy50ZXh0X3NvdXJjZSB8fCAnbmFtZSc7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgcz0wOyBzIDwgc291cmNlLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2Vbc10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBmZWF0dXJlLnByb3BlcnRpZXNbc291cmNlW3NdXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2Vbc10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHNvdXJjZVtzXShjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gc3RvcCBpZiB3ZSBmb3VuZCBhIHRleHQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRleHQgPSBmZWF0dXJlLnByb3BlcnRpZXNbc291cmNlXTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0ZXh0ID0gc291cmNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH0sXG5cbiAgICBwcmVwYXJlVGV4dExhYmVscyAodGlsZSwgY29sbGlzaW9uX2dyb3VwLCBxdWV1ZSkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy50ZXh0c1t0aWxlLmtleV18fHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlyc3QgY2FsbCB0byBtYWluIHRocmVhZCwgYXNrIGZvciB0ZXh0IHBpeGVsIHNpemVzXG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy5tYWluX3RocmVhZF90YXJnZXQrJy5jYWxjVGV4dFNpemVzJywgdGhpcy50ZXh0c1t0aWxlLmtleV0pLnRoZW4odGV4dHMgPT4ge1xuXG4gICAgICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU3R5bGUgJHt0aGlzLm5hbWV9OiBzdG9wIHRpbGUgYnVpbGQgYmVjYXVzZSB0aWxlIHdhcyBjYW5jZWxlZDogJHt0aWxlLmtleX0sIHBvc3QtY2FsY1RleHRTaXplcygpYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XSA9IHRleHRzO1xuICAgICAgICAgICAgaWYgKCF0ZXh0cykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRUZXh0TGFiZWxzKHRpbGUua2V5LCBxdWV1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBjb2xsaWRlQW5kUmVuZGVyVGV4dExhYmVscyAodGlsZSwgY29sbGlzaW9uX2dyb3VwLCBsYWJlbHMpIHtcbiAgICAgICAgaWYgKCFsYWJlbHMpIHtcbiAgICAgICAgICAgIENvbGxpc2lvbi5jb2xsaWRlKHt9LCBjb2xsaXNpb25fZ3JvdXAsIHRpbGUua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIENvbGxpc2lvbi5jb2xsaWRlKGxhYmVscywgY29sbGlzaW9uX2dyb3VwLCB0aWxlLmtleSkudGhlbihsYWJlbHMgPT4ge1xuICAgICAgICAgICAgaWYgKHRpbGUuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fSwgcG9zdC1jb2xsaWRlKClgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdGV4dHMgPSB0aGlzLnRleHRzW3RpbGUua2V5XTtcbiAgICAgICAgICAgIHRoaXMuY3VsbFRleHRTdHlsZXModGV4dHMsIGxhYmVscyk7XG5cbiAgICAgICAgICAgIC8vIHNldCBhbGlnbm1lbnRzXG4gICAgICAgICAgICBsYWJlbHMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5nc19rZXkgPSBxLnRleHRfc2V0dGluZ3Nfa2V5O1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV0gJiYgdGV4dHNbdGV4dF9zZXR0aW5nc19rZXldW3EudGV4dF07XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0X2luZm8udGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnbiA9IHRleHRfaW5mby5hbGlnbiB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW3EubGFiZWwuYWxpZ25dID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIHNlY29uZCBjYWxsIHRvIG1haW4gdGhyZWFkLCBmb3IgcmFzdGVyaXppbmcgdGhlIHNldCBvZiB0ZXh0c1xuICAgICAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLnJhc3Rlcml6ZVRleHRzJywgdGlsZS5rZXksIHRleHRzKS50aGVuKCh7IHRleHRzLCB0ZXh0dXJlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fSwgcG9zdC1yYXN0ZXJpemVUZXh0cygpYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBsYWJlbHMsIHRleHRzLCB0ZXh0dXJlIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSB1bnVzZWQgdGV4dC9zdHlsZSBjb21iaW5hdGlvbnMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmFzdGVyaXphdGlvblxuICAgIGN1bGxUZXh0U3R5bGVzKHRleHRzLCBsYWJlbHMpIHtcbiAgICAgICAgLy8gQ291bnQgaG93IG1hbnkgdGltZXMgZWFjaCB0ZXh0L3N0eWxlIGNvbWJpbmF0aW9uIGlzIHVzZWRcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBsYWJlbHNbaV07XG4gICAgICAgICAgICB0ZXh0c1tsYWJlbC50ZXh0X3NldHRpbmdzX2tleV1bbGFiZWwudGV4dF0ucmVmKys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGV4dC9zdHlsZSBjb21iaW5hdGlvbnMgdGhhdCBoYXZlIG5vIHZpc2libGUgbGFiZWxzXG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRzW3N0eWxlXSkge1xuICAgICAgICAgICAgICAgIC8vIG5vIGxhYmVscyBmb3IgdGhpcyB0ZXh0XG4gICAgICAgICAgICAgICAgaWYgKHRleHRzW3N0eWxlXVt0ZXh0XS5yZWYgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0ZXh0c1tzdHlsZV1bdGV4dF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGV4dHMpIHtcbiAgICAgICAgICAgIC8vIG5vIGxhYmVscyBmb3IgdGhpcyBzdHlsZVxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRleHRzW3N0eWxlXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWQgZnJvbSB3b3JrZXIsIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgZWFjaCB0ZXh0IHN0cmluZyxcbiAgICAvLyB3ZXJlIGl0IHRvIGJlIHJlbmRlcmVkLiBUaGlzIGluZm8gaXMgdGhlbiB1c2VkIHRvIHBlcmZvcm0gaW5pdGlhbCBsYWJlbCBjdWxsaW5nLCAqYmVmb3JlKlxuICAgIC8vIGxhYmVscyBhcmUgYWN0dWFsbHkgcmVuZGVyZWQuXG4gICAgY2FsY1RleHRTaXplcyAodGV4dHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FudmFzLnRleHRTaXplcyh0ZXh0cyk7XG4gICAgfSxcblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCBmcm9tIHdvcmtlciwgdG8gY3JlYXRlIGF0bGFzIG9mIGxhYmVscyBmb3IgYSB0aWxlXG4gICAgcmFzdGVyaXplVGV4dHMgKHRpbGVfa2V5LCB0ZXh0cykge1xuICAgICAgICBsZXQgY2FudmFzID0gbmV3IENhbnZhc1RleHQoKTtcbiAgICAgICAgY2FudmFzLmNsZWFyVGV4Y29vcmRDYWNoZSh0aWxlX2tleSk7XG5cbiAgICAgICAgbGV0IHRleHR1cmVfc2l6ZSA9IGNhbnZhcy5zZXRUZXh0dXJlVGV4dFBvc2l0aW9ucyh0ZXh0cywgdGhpcy5tYXhfdGV4dHVyZV9zaXplLCB0aWxlX2tleSk7XG4gICAgICAgIGxvZygndHJhY2UnLCBgdGV4dCBzdW1tYXJ5IGZvciB0aWxlICR7dGlsZV9rZXl9OiBmaXRzIGluICR7dGV4dHVyZV9zaXplWzBdfXgke3RleHR1cmVfc2l6ZVsxXX1weGApO1xuXG4gICAgICAgIC8vIGZpdHMgaW4gbWF4IHRleHR1cmUgc2l6ZT9cbiAgICAgICAgaWYgKHRleHR1cmVfc2l6ZVswXSA8IHRoaXMubWF4X3RleHR1cmVfc2l6ZSAmJiB0ZXh0dXJlX3NpemVbMV0gPCB0aGlzLm1heF90ZXh0dXJlX3NpemUpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBjYW52YXMgc2l6ZSAmIHJhc3Rlcml6ZSBhbGwgdGhlIHRleHQgc3RyaW5ncyB3ZSBuZWVkXG4gICAgICAgICAgICBjYW52YXMucmVzaXplKC4uLnRleHR1cmVfc2l6ZSk7XG4gICAgICAgICAgICBjYW52YXMucmFzdGVyaXplKHRleHRzLCB0ZXh0dXJlX3NpemUsIHRpbGVfa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBbXG4gICAgICAgICAgICAgICAgYExhYmVsIGF0bGFzIGZvciB0aWxlICR7dGlsZV9rZXl9IGlzICR7dGV4dHVyZV9zaXplWzBdfXgke3RleHR1cmVfc2l6ZVsxXX1weCwgYCxcbiAgICAgICAgICAgICAgICBgYnV0IG1heCBHTCB0ZXh0dXJlIHNpemUgaXMgJHt0aGlzLm1heF90ZXh0dXJlX3NpemV9eCR7dGhpcy5tYXhfdGV4dHVyZV9zaXplfXB4YF0uam9pbignJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY3JlYXRlIGEgdGV4dHVyZVxuICAgICAgICBsZXQgdCA9ICdsYWJlbHMtJyArIHRpbGVfa2V5ICsgJy0nICsgKHRleHRfdGV4dHVyZV9pZCsrKTtcbiAgICAgICAgVGV4dHVyZS5jcmVhdGUodGhpcy5nbCwgdCwge1xuICAgICAgICAgICAgZWxlbWVudDogY2FudmFzLmNhbnZhcyxcbiAgICAgICAgICAgIGZpbHRlcmluZzogJ2xpbmVhcicsXG4gICAgICAgICAgICBVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0w6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFRleHR1cmUucmV0YWluKHQpO1xuXG4gICAgICAgIHJldHVybiB7IHRleHRzLCB0ZXh0dXJlOiB0IH07IC8vIHRleHR1cmUgaXMgcmV0dXJuZWQgYnkgbmFtZSAobm90IGluc3RhbmNlKVxuICAgIH0sXG5cbiAgICBwcmVwcm9jZXNzVGV4dCAoZHJhdykge1xuICAgICAgICAvLyBGb250IHNldHRpbmdzIGFyZSByZXF1aXJlZFxuICAgICAgICBpZiAoIWRyYXcgfHwgIWRyYXcuZm9udCB8fCB0eXBlb2YgZHJhdy5mb250ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29sb3JzXG4gICAgICAgIGRyYXcuZm9udC5maWxsID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmZvbnQuZmlsbCk7XG4gICAgICAgIGlmIChkcmF3LmZvbnQuc3Ryb2tlKSB7XG4gICAgICAgICAgICBkcmF3LmZvbnQuc3Ryb2tlLmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmZvbnQuc3Ryb2tlLmNvbG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgZm9udCBhbmQgdGV4dCBzdHJva2Ugc2l6ZXNcbiAgICAgICAgZHJhdy5mb250LnB4X3NpemUgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5zaXplIHx8IFRleHRTZXR0aW5ncy5kZWZhdWx0cy5zaXplLCBDYW52YXNUZXh0LmZvbnRQaXhlbFNpemUpO1xuICAgICAgICBpZiAoZHJhdy5mb250LnN0cm9rZSAmJiBkcmF3LmZvbnQuc3Ryb2tlLndpZHRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRyYXcuZm9udC5zdHJva2Uud2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5zdHJva2Uud2lkdGgsIHBhcnNlRmxvYXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT2Zmc2V0ICgyZCBhcnJheSlcbiAgICAgICAgZHJhdy5vZmZzZXQgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub2Zmc2V0LCB2ID0+IChBcnJheS5pc0FycmF5KHYpICYmIHYubWFwKHBhcnNlRmxvYXQpKSB8fCAwKTtcblxuICAgICAgICAvLyBCdWZmZXIgKDFkIHZhbHVlIG9yIG9yIDJkIGFycmF5KVxuICAgICAgICBkcmF3LmJ1ZmZlciA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5idWZmZXIsIHYgPT4gKEFycmF5LmlzQXJyYXkodikgPyB2IDogW3YsIHZdKS5tYXAocGFyc2VGbG9hdCkgfHwgMCk7XG5cbiAgICAgICAgLy8gUmVwZWF0IHJ1bGVzIC0gZm9yIHRleHQgbGFiZWxzLCBkZWZhdWx0cyB0byB0aWxlIHNpemVcbiAgICAgICAgZHJhdy5yZXBlYXRfZGlzdGFuY2UgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcucmVwZWF0X2Rpc3RhbmNlIHx8IEdlby50aWxlX3NpemUsIHBhcnNlRmxvYXQpO1xuXG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBBZGRpdGlvbmFsIHRleHQtc3BlY2lmaWMgbGF5b3V0IHNldHRpbmdzXG4gICAgY29tcHV0ZVRleHRMYXlvdXQgKHRhcmdldCwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSwgdGV4dCwgdGV4dF9zZXR0aW5ncykge1xuICAgICAgICBsZXQgbGF5b3V0ID0gdGFyZ2V0IHx8IHt9O1xuXG4gICAgICAgIC8vIGNvbW1vbiBzZXR0aW5ncyB3L3BvaW50c1xuICAgICAgICBsYXlvdXQgPSB0aGlzLmNvbXB1dGVMYXlvdXQobGF5b3V0LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICAvLyB0aWxlIGJvdW5kYXJ5IGhhbmRsaW5nXG4gICAgICAgIGxheW91dC5jdWxsX2Zyb21fdGlsZSA9IChkcmF3LmN1bGxfZnJvbV90aWxlICE9IG51bGwpID8gZHJhdy5jdWxsX2Zyb21fdGlsZSA6IHRydWU7XG5cbiAgICAgICAgLy8gc3RhbmRhbG9uZSB0ZXh0IGNhbiBtb3ZlIGludG8gdGlsZSBpZiBzcGVjaWZpZWRcbiAgICAgICAgbGF5b3V0Lm1vdmVfaW50b190aWxlID0gKGRyYXcubW92ZV9pbnRvX3RpbGUgIT0gbnVsbCkgPyBkcmF3Lm1vdmVfaW50b190aWxlIDogdHJ1ZTtcblxuICAgICAgICAvLyByZXBlYXQgcnVsZXMgaW5jbHVkZSB0aGUgdGV4dFxuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSkge1xuICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9ncm91cCArPSAnLycgKyB0ZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWF4IG51bWJlciBvZiBzdWJkaXZpc2lvbnMgdG8gdHJ5XG4gICAgICAgIGxheW91dC5zdWJkaXYgPSB0aWxlLm92ZXJ6b29tMjtcblxuICAgICAgICBsYXlvdXQuYWxpZ24gPSBkcmF3LmFsaWduO1xuXG4gICAgICAgIC8vIHVzZWQgdG8gZnVkZ2Ugd2lkdGggdmFsdWUgYXMgdGV4dCBtYXkgb3ZlcmZsb3cgYm91bmRpbmcgYm94IGlmIGl0IGhhcyBpdGFsaWMsIGJvbGQsIGV0YyBzdHlsZVxuICAgICAgICBsYXlvdXQuaXRhbGljID0gKHRleHRfc2V0dGluZ3Muc3R5bGUgIT09ICdub3JtYWwnKTtcblxuICAgICAgICByZXR1cm4gbGF5b3V0O1xuICAgIH1cblxufTtcbiIsImltcG9ydCBVdGlscyBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuXG52YXIgVGV4dFNldHRpbmdzO1xuXG5leHBvcnQgZGVmYXVsdCBUZXh0U2V0dGluZ3MgPSB7XG5cbiAgICAvLyBBIGtleSBmb3IgZ3JvdXBpbmcgYWxsIGxhYmVscyBvZiB0aGUgc2FtZSB0ZXh0IHN0eWxlIChlLmcuIHNhbWUgQ2FudmFzIHN0YXRlLCB0byBtaW5pbWl6ZSBzdGF0ZSBjaGFuZ2VzKVxuICAgIGtleSAoc2V0dGluZ3MpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHNldHRpbmdzLnN0eWxlLFxuICAgICAgICAgICAgc2V0dGluZ3Mud2VpZ2h0LFxuICAgICAgICAgICAgc2V0dGluZ3MuZmFtaWx5LFxuICAgICAgICAgICAgc2V0dGluZ3MucHhfc2l6ZSxcbiAgICAgICAgICAgIHNldHRpbmdzLmZpbGwsXG4gICAgICAgICAgICBzZXR0aW5ncy5zdHJva2UsXG4gICAgICAgICAgICBzZXR0aW5ncy5zdHJva2Vfd2lkdGgsXG4gICAgICAgICAgICBzZXR0aW5ncy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBzZXR0aW5ncy50ZXh0X3dyYXAsXG4gICAgICAgICAgICBzZXR0aW5ncy5tYXhfbGluZXMsXG4gICAgICAgICAgICBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW9cbiAgICAgICAgXS5qb2luKCcvJyk7XG4gICAgfSxcblxuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIHN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgd2VpZ2h0OiBudWxsLFxuICAgICAgICBzaXplOiAnMTJweCcsXG4gICAgICAgIHB4X3NpemU6IDEyLFxuICAgICAgICBmYW1pbHk6ICdIZWx2ZXRpY2EnLFxuICAgICAgICBmaWxsOiAnd2hpdGUnLFxuICAgICAgICB0ZXh0X3dyYXA6IDE1LFxuICAgICAgICBtYXhfbGluZXM6IDUsXG4gICAgICAgIGFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgc3Ryb2tlOiBudWxsLFxuICAgICAgICBzdHJva2Vfd2lkdGg6IDBcbiAgICB9LFxuXG4gICAgY29tcHV0ZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgc3R5bGUgPSB7fTtcblxuICAgICAgICBkcmF3LmZvbnQgPSBkcmF3LmZvbnQgfHwgdGhpcy5kZWZhdWx0cztcblxuICAgICAgICAvLyBMaW5lU3RyaW5nIGxhYmVscyBjYW4gYXJ0aWN1bGF0ZSB3aGlsZSBwb2ludCBsYWJlbHMgY2Fubm90LiBOZWVkZWQgZm9yIGZ1dHVyZSB0ZXh0dXJlIGNvb3JkaW5hdGUgY2FsY3VsYXRpb25zLlxuICAgICAgICBzdHlsZS5jYW5fYXJ0aWN1bGF0ZSA9IGRyYXcuY2FuX2FydGljdWxhdGU7XG5cbiAgICAgICAgLy8gVXNlIGZpbGwgaWYgc3BlY2lmaWVkLCBvciBkZWZhdWx0XG4gICAgICAgIHN0eWxlLmZpbGwgPSAoZHJhdy5mb250LmZpbGwgJiYgVXRpbHMudG9DU1NDb2xvcihTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShkcmF3LmZvbnQuZmlsbCwgY29udGV4dCkpKSB8fCB0aGlzLmRlZmF1bHRzLmZpbGw7XG5cbiAgICAgICAgLy8gRm9udCBwcm9wZXJ0aWVzIGFyZSBtb2RlbGVkIGFmdGVyIENTUyBuYW1lczpcbiAgICAgICAgLy8gLSBmYW1pbHk6IEhlbHZldGljYSwgRnV0dXJhLCBldGMuXG4gICAgICAgIC8vIC0gc2l6ZTogaW4gcHQsIHB4LCBvciBlbVxuICAgICAgICAvLyAtIHN0eWxlOiBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZVxuICAgICAgICAvLyAtIHdlaWdodDogbm9ybWFsLCBib2xkLCBldGMuXG4gICAgICAgIC8vIC0gdHJhbnNmb3JtOiBjYXBpdGFsaXplLCB1cHBlcmNhc2UsIGxvd2VyY2FzZVxuICAgICAgICBzdHlsZS5zdHlsZSA9IGRyYXcuZm9udC5zdHlsZSB8fCB0aGlzLmRlZmF1bHRzLnN0eWxlO1xuICAgICAgICBzdHlsZS53ZWlnaHQgPSBkcmF3LmZvbnQud2VpZ2h0IHx8IHRoaXMuZGVmYXVsdHMud2VpZ2h0O1xuICAgICAgICBpZiAoZHJhdy5mb250LmZhbWlseSkge1xuICAgICAgICAgICAgc3R5bGUuZmFtaWx5ID0gZHJhdy5mb250LmZhbWlseTtcbiAgICAgICAgICAgIGlmIChzdHlsZS5mYW1pbHkgIT09IHRoaXMuZGVmYXVsdHMuZmFtaWx5KSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuZmFtaWx5ICs9ICcsICcgKyB0aGlzLmRlZmF1bHRzLmZhbWlseTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLmZhbWlseSA9IHRoaXMuZGVmYXVsdHMuZmFtaWx5O1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUudHJhbnNmb3JtID0gZHJhdy5mb250LnRyYW5zZm9ybTtcblxuICAgICAgICAvLyBvcmlnaW5hbCBzaXplIChub3QgY3VycmVudGx5IHVzZWQsIGJ1dCB1c2VmdWwgZm9yIGRlYnVnZ2luZylcbiAgICAgICAgc3R5bGUuc2l6ZSA9IGRyYXcuZm9udC5zaXplIHx8IHRoaXMuZGVmYXVsdHMuc2l6ZTtcblxuICAgICAgICAvLyBjYWxjdWxhdGVkIHBpeGVsIHNpemVcbiAgICAgICAgc3R5bGUucHhfc2l6ZSA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LmZvbnQucHhfc2l6ZSwgY29udGV4dCk7XG5cbiAgICAgICAgLy8gVXNlIHN0cm9rZSBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKGRyYXcuZm9udC5zdHJva2UgJiYgZHJhdy5mb250LnN0cm9rZS5jb2xvcikge1xuICAgICAgICAgICAgc3R5bGUuc3Ryb2tlID0gVXRpbHMudG9DU1NDb2xvcihTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShkcmF3LmZvbnQuc3Ryb2tlLmNvbG9yLCBjb250ZXh0KSB8fCB0aGlzLmRlZmF1bHRzLnN0cm9rZSk7XG4gICAgICAgICAgICBzdHlsZS5zdHJva2Vfd2lkdGggPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5mb250LnN0cm9rZS53aWR0aCwgY29udGV4dCkgfHwgdGhpcy5kZWZhdWx0cy5zdHJva2Vfd2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS5mb250X2NzcyA9IHRoaXMuZm9udENTUyhzdHlsZSk7XG5cbiAgICAgICAgLy8gV29yZCB3cmFwIGFuZCB0ZXh0IGFsaWdubWVudFxuICAgICAgICAvLyBOb3QgYSBmb250IHByb3BlcnRpZXMsIGJ1dCBhZmZlY3QgYXRsYXMgb2YgdW5pcXVlIHRleHQgdGV4dHVyZXNcbiAgICAgICAgbGV0IHRleHRfd3JhcCA9IGRyYXcudGV4dF93cmFwOyAvLyB1c2UgZXhwbGljaXRseSBzZXQgdmFsdWVcblxuICAgICAgICBpZiAodGV4dF93cmFwID09IG51bGwgJiYgR2VvLmdlb21ldHJ5VHlwZShmZWF0dXJlLmdlb21ldHJ5LnR5cGUpICE9PSAnbGluZScpIHtcbiAgICAgICAgICAgIC8vIHBvaW50IGxhYmVscyAoZm9yIHBvaW50IGFuZCBwb2x5Z29uIGZlYXR1cmVzKSBoYXZlIHdvcmQgd3JhcCBvbiB3L2RlZmF1bHQgbWF4IGxlbmd0aCxcbiAgICAgICAgICAgIC8vIGxpbmUgbGFiZWxzIGRlZmF1bHQgb2ZmXG4gICAgICAgICAgICB0ZXh0X3dyYXAgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0dGluZyB0byAndHJ1ZScgY2F1c2VzIGRlZmF1bHQgd3JhcCB2YWx1ZSB0byBiZSB1c2VkXG4gICAgICAgIGlmICh0ZXh0X3dyYXAgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRleHRfd3JhcCA9IHRoaXMuZGVmYXVsdHMudGV4dF93cmFwO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcblxuICAgICAgICAvLyBtYXhfbGluZXMgc2V0dGluZyB0byB0cnVuY2F0ZSB2ZXJ5IGxvbmcgbGFiZWxzIHdpdGggYW4gZWxsaXBzaXNcbiAgICAgICAgc3R5bGUubWF4X2xpbmVzID0gZHJhdy5tYXhfbGluZXMgfHwgdGhpcy5kZWZhdWx0cy5tYXhfbGluZXM7XG5cbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBDU1Mtc3R5bGUgZm9udCBzdHJpbmcgKHRvIHNldCBDYW52YXMgZHJhdyBzdGF0ZSlcbiAgICBmb250Q1NTICh7IHN0eWxlLCB3ZWlnaHQsIHB4X3NpemUsIGZhbWlseSB9KSB7XG4gICAgICAgIHJldHVybiBbc3R5bGUsIHdlaWdodCwgcHhfc2l6ZSArICdweCcsIGZhbWlseV1cbiAgICAgICAgICAgIC5maWx0ZXIoeCA9PiB4KSAvLyByZW1vdmUgbnVsbCBwcm9wc1xuICAgICAgICAgICAgLmpvaW4oJyAnKTtcbiAgICB9XG5cbn07XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcbmltcG9ydCB7U3R5bGVNYW5hZ2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5cbmltcG9ydCB7bWF0NCwgdmVjM30gZnJvbSAnLi91dGlscy9nbC1tYXRyaXgnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaWxlIHtcblxuICAgIC8qKlxuICAgICAgICBUaWxlXG4gICAgICAgIEBjb25zdHJ1Y3RvclxuICAgICAgICBSZXF1aXJlZCBwcm9wZXJ0aWVzOlxuICAgICAgICBjb29yZHM6IG9iamVjdCB3aXRoIHt4LCB5LCB6fSBwcm9wZXJ0aWVzIGlkZW50aWZ5aW5nIHRpbGUgY29vcmRpbmF0ZSBsb2NhdGlvblxuICAgICAgICB3b3JrZXI6IHdlYiB3b3JrZXIgdG8gaGFuZGxlIHRpbGUgY29uc3RydWN0aW9uXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih7IGNvb3Jkcywgc3R5bGVfem9vbSwgc291cmNlLCB3b3JrZXIsIHZpZXcgfSkge1xuICAgICAgICB0aGlzLndvcmtlciA9IHdvcmtlcjtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IG51bGw7XG5cbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJveHlfZm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5wcm94eV9kZXB0aCA9IDA7XG4gICAgICAgIHRoaXMucHJveGllZF9hcyA9IG51bGw7XG4gICAgICAgIHRoaXMuZmFkZV9pbiA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLmRlYnVnID0ge307XG5cbiAgICAgICAgdGhpcy5jb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVXaXRoTWF4Wm9vbShjb29yZHMsIHRoaXMuc291cmNlLm1heF96b29tKTtcbiAgICAgICAgdGhpcy5zdHlsZV96b29tID0gc3R5bGVfem9vbTsgLy8gem9vbSBsZXZlbCB0byBiZSB1c2VkIGZvciBzdHlsaW5nXG4gICAgICAgIHRoaXMub3Zlcnpvb20gPSBNYXRoLm1heCh0aGlzLnN0eWxlX3pvb20gLSB0aGlzLmNvb3Jkcy56LCAwKTsgLy8gbnVtYmVyIG9mIGxldmVscyBvZiBvdmVyem9vbWluZ1xuICAgICAgICB0aGlzLm92ZXJ6b29tMiA9IE1hdGgucG93KDIsIHRoaXMub3Zlcnpvb20pO1xuICAgICAgICB0aGlzLmtleSA9IFRpbGUua2V5KHRoaXMuY29vcmRzLCB0aGlzLnNvdXJjZSwgdGhpcy5zdHlsZV96b29tKTtcbiAgICAgICAgdGhpcy5taW4gPSBHZW8ubWV0ZXJzRm9yVGlsZSh0aGlzLmNvb3Jkcyk7XG4gICAgICAgIHRoaXMubWF4ID0gR2VvLm1ldGVyc0ZvclRpbGUoe3g6IHRoaXMuY29vcmRzLnggKyAxLCB5OiB0aGlzLmNvb3Jkcy55ICsgMSwgejogdGhpcy5jb29yZHMueiB9KSxcbiAgICAgICAgdGhpcy5zcGFuID0geyB4OiAodGhpcy5tYXgueCAtIHRoaXMubWluLngpLCB5OiAodGhpcy5tYXgueSAtIHRoaXMubWluLnkpIH07XG4gICAgICAgIHRoaXMuYm91bmRzID0geyBzdzogeyB4OiB0aGlzLm1pbi54LCB5OiB0aGlzLm1heC55IH0sIG5lOiB7IHg6IHRoaXMubWF4LngsIHk6IHRoaXMubWluLnkgfSB9O1xuICAgICAgICB0aGlzLmNlbnRlcl9kaXN0ID0gMDtcblxuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy5zdHlsZV96b29tKTtcbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsX3NxID0gdGhpcy5tZXRlcnNfcGVyX3BpeGVsICogdGhpcy5tZXRlcnNfcGVyX3BpeGVsO1xuICAgICAgICB0aGlzLnVuaXRzX3Blcl9waXhlbCA9IEdlby51bml0c19wZXJfcGl4ZWwgLyB0aGlzLm92ZXJ6b29tMjsgLy8gYWRqdXN0ZWQgZm9yIG92ZXJ6b29tXG4gICAgICAgIHRoaXMudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tID0gR2VvLnVuaXRzUGVyTWV0ZXIodGhpcy5jb29yZHMueikgKiB0aGlzLm92ZXJ6b29tMjsgLy8gYWRqdXN0ZWQgZm9yIG92ZXJ6b29tXG5cbiAgICAgICAgdGhpcy5tZXNoZXMgPSB7fTsgLy8gcmVuZGVyYWJsZSBWQk8gbWVzaGVzIGtleWVkIGJ5IHN0eWxlXG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSBbXTsgLy8gdGV4dHVyZXMgdGhhdCB0aGUgdGlsZSBvd25zIChsYWJlbHMsIGV0Yy4pXG4gICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMgPSBbXTsgLy8gdGV4dHVyZXMgcmV0YWluZWQgYnkgdGhlIHRpbGUgaW4gdGhlIHByZXZpb3VzIGJ1aWxkIGdlbmVyYXRpb25cbiAgICAgICAgdGhpcy5uZXdfbWVzaF9zdHlsZXMgPSBbXTsgLy8gbWVzaGVzIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0IHNvIGZhciBpbiBjdXJyZW50IGJ1aWxkIGdlbmVyYXRpb25cbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUaWxlKHNwZWMpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjb29yZChjKSB7XG4gICAgICAgIHJldHVybiB7eDogYy54LCB5OiBjLnksIHo6IGMueiwga2V5OiBUaWxlLmNvb3JkS2V5KGMpfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmRLZXkoe3gsIHksIHp9KSB7XG4gICAgICAgIHJldHVybiB4ICsgJy8nICsgeSArICcvJyArIHo7XG4gICAgfVxuXG4gICAgc3RhdGljIGtleSAoY29vcmRzLCBzb3VyY2UsIHN0eWxlX3pvb20pIHtcbiAgICAgICAgY29vcmRzID0gVGlsZS5jb29yZGluYXRlV2l0aE1heFpvb20oY29vcmRzLCBzb3VyY2UubWF4X3pvb20pO1xuICAgICAgICBpZiAoY29vcmRzLnkgPCAwIHx8IGNvb3Jkcy55ID49ICgxIDw8IGNvb3Jkcy56KSB8fCBjb29yZHMueiA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gY3VsbCB0aWxlcyBvdXQgb2YgcmFuZ2UgKHggd2lsbCB3cmFwKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbc291cmNlLm5hbWUsIHN0eWxlX3pvb20sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnpdLmpvaW4oJy8nKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmRpbmF0ZUF0Wm9vbSh7eCwgeSwgeiwga2V5fSwgem9vbSkge1xuICAgICAgICBpZiAoeiAhPT0gem9vbSkge1xuICAgICAgICAgICAgbGV0IHpzY2FsZSA9IE1hdGgucG93KDIsIHogLSB6b29tKTtcbiAgICAgICAgICAgIHggPSBNYXRoLmZsb29yKHggLyB6c2NhbGUpO1xuICAgICAgICAgICAgeSA9IE1hdGguZmxvb3IoeSAvIHpzY2FsZSk7XG4gICAgICAgICAgICB6ID0gem9vbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVGlsZS5jb29yZCh7eCwgeSwgen0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBjb29yZGluYXRlV2l0aE1heFpvb20oe3gsIHksIHp9LCBtYXhfem9vbSkge1xuICAgICAgICBpZiAobWF4X3pvb20gIT09IHVuZGVmaW5lZCAmJiB6ID4gbWF4X3pvb20pIHtcbiAgICAgICAgICAgIHJldHVybiBUaWxlLmNvb3JkaW5hdGVBdFpvb20oe3gsIHksIHp9LCBtYXhfem9vbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGUuY29vcmQoe3gsIHksIHp9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2hpbGRyZW5Gb3JDb29yZGluYXRlKHt4LCB5LCB6LCBrZXl9KSB7XG4gICAgICAgIGlmICghVGlsZS5jb29yZF9jaGlsZHJlbltrZXldKSB7XG4gICAgICAgICAgICB6Kys7XG4gICAgICAgICAgICB4ICo9IDI7XG4gICAgICAgICAgICB5ICo9IDI7XG4gICAgICAgICAgICBUaWxlLmNvb3JkX2NoaWxkcmVuW2tleV0gPSBbXG4gICAgICAgICAgICAgICAgVGlsZS5jb29yZCh7eCwgeSwgICAgICB6fSksIFRpbGUuY29vcmQoe3g6IHgrMSwgeSwgICAgICB6fSksXG4gICAgICAgICAgICAgICAgVGlsZS5jb29yZCh7eCwgeTogeSsxLCB6fSksIFRpbGUuY29vcmQoe3g6IHgrMSwgeTogeSsxLCB6fSlcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGUuY29vcmRfY2hpbGRyZW5ba2V5XTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNEZXNjZW5kYW50KHBhcmVudCwgZGVzY2VuZGFudCkge1xuICAgICAgICBpZiAoZGVzY2VuZGFudC56ID4gcGFyZW50LnopIHtcbiAgICAgICAgICAgIGxldCB7eCwgeX0gPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20oZGVzY2VuZGFudCwgcGFyZW50LnopO1xuICAgICAgICAgICAgcmV0dXJuIChwYXJlbnQueCA9PT0geCAmJiBwYXJlbnQueSA9PT0geSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNvcnQgYSBzZXQgb2YgdGlsZSBpbnN0YW5jZXMgKHdoaWNoIGFscmVhZHkgaGF2ZSBhIGRpc3RhbmNlIGZyb20gY2VudGVyIHRpbGUgY29tcHV0ZWQpXG4gICAgc3RhdGljIHNvcnQodGlsZXMpIHtcbiAgICAgICAgcmV0dXJuIHRpbGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBhZCA9IGEuY2VudGVyX2Rpc3Q7XG4gICAgICAgICAgICBsZXQgYmQgPSBiLmNlbnRlcl9kaXN0O1xuICAgICAgICAgICAgcmV0dXJuIChiZCA+IGFkID8gLTEgOiAoYmQgPT09IGFkID8gMCA6IDEpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRnJlZSByZXNvdXJjZXMgb3duZWQgYnkgdGlsZVxuICAgIGZyZWVSZXNvdXJjZXMgKCkge1xuICAgICAgICBmb3IgKGxldCBtIGluIHRoaXMubWVzaGVzKSB7XG4gICAgICAgICAgICB0aGlzLm1lc2hlc1ttXS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNoZXMgPSB7fTtcblxuICAgICAgICB0aGlzLnRleHR1cmVzLmZvckVhY2godCA9PiBUZXh0dXJlLnJlbGVhc2UodCkpO1xuICAgICAgICB0aGlzLnRleHR1cmVzID0gW107XG5cbiAgICAgICAgdGhpcy5wcmV2aW91c190ZXh0dXJlcy5mb3JFYWNoKHQgPT4gVGV4dHVyZS5yZWxlYXNlKHQpKTtcbiAgICAgICAgdGhpcy5wcmV2aW91c190ZXh0dXJlcyA9IFtdO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMud29ya2VyTWVzc2FnZSgnc2VsZi5yZW1vdmVUaWxlJywgdGhpcy5rZXkpO1xuICAgICAgICB0aGlzLmZyZWVSZXNvdXJjZXMoKTtcbiAgICAgICAgdGhpcy53b3JrZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGJ1aWxkQXNNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiB0aGlzLmtleSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UubmFtZSxcbiAgICAgICAgICAgIGNvb3JkczogdGhpcy5jb29yZHMsXG4gICAgICAgICAgICBtaW46IHRoaXMubWluLFxuICAgICAgICAgICAgbWF4OiB0aGlzLm1heCxcbiAgICAgICAgICAgIHVuaXRzX3Blcl9waXhlbDogdGhpcy51bml0c19wZXJfcGl4ZWwsXG4gICAgICAgICAgICBtZXRlcnNfcGVyX3BpeGVsOiB0aGlzLm1ldGVyc19wZXJfcGl4ZWwsXG4gICAgICAgICAgICBtZXRlcnNfcGVyX3BpeGVsX3NxOiB0aGlzLm1ldGVyc19wZXJfcGl4ZWxfc3EsXG4gICAgICAgICAgICB1bml0c19wZXJfbWV0ZXJfb3Zlcnpvb206IHRoaXMudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tLFxuICAgICAgICAgICAgc3R5bGVfem9vbTogdGhpcy5zdHlsZV96b29tLFxuICAgICAgICAgICAgb3Zlcnpvb206IHRoaXMub3Zlcnpvb20sXG4gICAgICAgICAgICBvdmVyem9vbTI6IHRoaXMub3Zlcnpvb20yLFxuICAgICAgICAgICAgZ2VuZXJhdGlvbjogdGhpcy5nZW5lcmF0aW9uLFxuICAgICAgICAgICAgZGVidWc6IHRoaXMuZGVidWdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB3b3JrZXJNZXNzYWdlICguLi5tZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXIsIC4uLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGJ1aWxkKGdlbmVyYXRpb24sIHsgZmFkZV9pbiA9IHRydWUgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247XG4gICAgICAgIHRoaXMuZmFkZV9pbiA9IGZhZGVfaW47XG4gICAgICAgIGlmICghdGhpcy5sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud29ya2VyTWVzc2FnZSgnc2VsZi5idWlsZFRpbGUnLCB7IHRpbGU6IHRoaXMuYnVpbGRBc01lc3NhZ2UoKSB9KS5jYXRjaChlID0+IHsgdGhyb3cgZTsgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIENhbGxlZCBvbiB3b3JrZXIgdG8gY2FuY2VsIGxvYWRpbmdcbiAgICAgICAgU3RhdGljIG1ldGhvZCBiZWNhdXNlIHRoZSB3b3JrZXIgb25seSBoYXMgb2JqZWN0IHJlcHJlc2VudGF0aW9ucyBvZiB0aWxlIGRhdGEsIHRoZXJlIGlzIG5vXG4gICAgICAgIHRpbGUgaW5zdGFuY2UgY3JlYXRlZCB5ZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgY2FuY2VsKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgIHRpbGUuY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRpbGUuc291cmNlX2RhdGEgJiYgdGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBUaWxlLmFib3J0QnVpbGQodGlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGdlb21ldHJ5IGZvciB0aWxlIC0gY2FsbGVkIGJ5IHdlYiB3b3JrZXJcbiAgICAvLyBSZXR1cm5zIGEgc2V0IG9mIHRpbGUga2V5cyB0aGF0IHNob3VsZCBiZSBzZW50IHRvIHRoZSBtYWluIHRocmVhZCAoc28gdGhhdCB3ZSBjYW4gbWluaW1pemUgZGF0YSBleGNoYW5nZSBiZXR3ZWVuIHdvcmtlciBhbmQgbWFpbiB0aHJlYWQpXG4gICAgc3RhdGljIGJ1aWxkR2VvbWV0cnkgKHRpbGUsIHsgc2NlbmVfaWQsIGxheWVycywgc3R5bGVzLCBnbG9iYWwgfSkge1xuICAgICAgICB0aWxlLmRlYnVnLnJlbmRlcmluZyA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICB0aWxlLmRlYnVnLmZlYXR1cmVzID0gMDtcblxuICAgICAgICBsZXQgZGF0YSA9IHRpbGUuc291cmNlX2RhdGE7XG5cbiAgICAgICAgQ29sbGlzaW9uLnN0YXJ0VGlsZSh0aWxlLmtleSk7XG5cbiAgICAgICAgLy8gUHJvY2VzcyBlYWNoIHRvcC1sZXZlbCBsYXllclxuICAgICAgICBmb3IgKGxldCBsYXllcl9uYW1lIGluIGxheWVycykge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gbGF5ZXJzW2xheWVyX25hbWVdO1xuICAgICAgICAgICAgLy8gU2tpcCBsYXllcnMgd2l0aCBubyBkYXRhIHNvdXJjZSBkZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWxheWVyIHx8ICFsYXllci5jb25maWcuZGF0YSkge1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBMYXllciAke2xheWVyX25hbWV9IHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZW9tZXRyeSBkYXRhIHNvdXJjZSBhbmQgd2lsbCBub3QgYmUgcmVuZGVyZWQuYCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNvdXJjZSBuYW1lcyBkb24ndCBtYXRjaFxuICAgICAgICAgICAgaWYgKGxheWVyLmNvbmZpZy5kYXRhLnNvdXJjZSAhPT0gdGlsZS5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gR2V0IGRhdGEgZm9yIG9uZSBvciBtb3JlIGxheWVycyBmcm9tIHNvdXJjZVxuICAgICAgICAgICAgbGV0IHNvdXJjZV9sYXllcnMgPSBUaWxlLmdldERhdGFGb3JTb3VyY2UoZGF0YSwgbGF5ZXIuY29uZmlnLmRhdGEsIGxheWVyX25hbWUpO1xuXG4gICAgICAgICAgICAvLyBSZW5kZXIgZmVhdHVyZXMgaW4gbGF5ZXJcbiAgICAgICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHNvdXJjZV9sYXllcnMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlX2xheWVyID0gc291cmNlX2xheWVyc1tzXTtcbiAgICAgICAgICAgICAgICBsZXQgZ2VvbSA9IHNvdXJjZV9sYXllci5nZW9tO1xuICAgICAgICAgICAgICAgIGlmICghZ2VvbSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBmID0gMDsgZiA8IGdlb20uZmVhdHVyZXMubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZlYXR1cmUgPSBnZW9tLmZlYXR1cmVzW2ZdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5nZW9tZXRyeSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBmZWF0dXJlcyB3L28gZ2VvbWV0cnkgKHZhbGlkIEdlb0pTT04pXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGV4dCA9IFN0eWxlUGFyc2VyLmdldEZlYXR1cmVQYXJzZUNvbnRleHQoZmVhdHVyZSwgdGlsZSwgZ2xvYmFsKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53aW5kaW5nID0gdGlsZS5kZWZhdWx0X3dpbmRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc291cmNlID0gdGlsZS5zb3VyY2U7ICAgICAgICAvLyBhZGQgZGF0YSBzb3VyY2UgbmFtZVxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxheWVyID0gc291cmNlX2xheWVyLmxheWVyOyAgLy8gYWRkIGRhdGEgc291cmNlIGxheWVyIG5hbWVcblxuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgZHJhdyBncm91cHMgZm9yIHRoaXMgZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgICBsZXQgZHJhd19ncm91cHMgPSBsYXllci5idWlsZERyYXdHcm91cHMoY29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZHJhd19ncm91cHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVuZGVyIGRyYXcgZ3JvdXBzXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGdyb3VwX25hbWUgaW4gZHJhd19ncm91cHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGRyYXdfZ3JvdXBzW2dyb3VwX25hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncm91cC52aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0byBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlX25hbWUgPSBncm91cC5zdHlsZSB8fCBncm91cF9uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW3N0eWxlX25hbWVdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFN0eWxlICcke3N0eWxlX25hbWV9JyBub3QgZm91bmQsIHNraXBwaW5nIGxheWVyICcke2xheWVyX25hbWV9JzpgLCBncm91cCwgZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGF5ZXJzID0gZ3JvdXAubGF5ZXJzOyAgLy8gYWRkIG1hdGNoaW5nIGRyYXcgbGF5ZXJzXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFkZEZlYXR1cmUoZmVhdHVyZSwgZ3JvdXAsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGlsZS5kZWJ1Zy5mZWF0dXJlcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aWxlLmRlYnVnLnJlbmRlcmluZyA9ICtuZXcgRGF0ZSgpIC0gdGlsZS5kZWJ1Zy5yZW5kZXJpbmc7XG5cbiAgICAgICAgLy8gU2VuZCBzdHlsZXMgYmFjayB0byBtYWluIHRocmVhZCBhcyB0aGV5IGZpbmlzaCBidWlsZGluZywgaW4gdHdvIGdyb3VwczogY29sbGlzaW9uIHZzLiBub24tY29sbGlzaW9uXG4gICAgICAgIGxldCB0aWxlX3N0eWxlcyA9IFN0eWxlTWFuYWdlci5zdHlsZXNGb3JUaWxlKHRpbGUua2V5LCBzdHlsZXMpLm1hcChzID0+IHN0eWxlc1tzXSk7XG4gICAgICAgIFRpbGUuc2VuZFN0eWxlR3JvdXBzKHRpbGUsIHRpbGVfc3R5bGVzLCB7IHNjZW5lX2lkIH0sIHN0eWxlID0+IHN0eWxlLmNvbGxpc2lvbiA/ICdjb2xsaXNpb24nIDogJ25vbi1jb2xsaXNpb24nKTtcbiAgICAgICAgLy8gVGlsZS5zZW5kU3R5bGVHcm91cHModGlsZSwgdGlsZV9zdHlsZXMsIHsgc2NlbmVfaWQgfSwgc3R5bGUgPT4gc3R5bGUubmFtZSk7IC8vIGNhbGwgZm9yIGVhY2ggc3R5bGVcbiAgICAgICAgLy8gVGlsZS5zZW5kU3R5bGVHcm91cHModGlsZSwgdGlsZV9zdHlsZXMsIHsgc2NlbmVfaWQgfSwgc3R5bGUgPT4gJ3N0eWxlcycpOyAvLyBhbGwgc3R5bGVzIGluIHNpbmdsZSBjYWxsIChwcmV2aW91cyBiZWhhdmlvcilcbiAgICB9XG5cbiAgICAvLyBTZW5kIGdyb3VwcyBvZiBzdHlsZXMgYmFjayB0byBtYWluIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgKGFzIHRoZXkgZmluaXNoIGJ1aWxkaW5nKSxcbiAgICAvLyBncm91cGVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgIHN0YXRpYyBzZW5kU3R5bGVHcm91cHModGlsZSwgc3R5bGVzLCB7IHNjZW5lX2lkIH0sIGdyb3VwX2J5KSB7XG4gICAgICAgIC8vIEdyb3VwIHN0eWxlc1xuICAgICAgICBsZXQgZ3JvdXBzID0ge307XG4gICAgICAgIHN0eWxlcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgbGV0IGdyb3VwX25hbWUgPSBncm91cF9ieShzKTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IGdyb3Vwc1tncm91cF9uYW1lXSB8fCBbXTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXS5wdXNoKHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJvZ3Jlc3MgPSB7IHN0YXJ0OiB0cnVlIH07XG4gICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBncm91cF9uYW1lIGluIGdyb3Vwcykge1xuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGdyb3Vwc1tncm91cF9uYW1lXTtcblxuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGdyb3VwLm1hcChzdHlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZS5lbmREYXRhKHRpbGUpLnRoZW4oc3R5bGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUubWVzaF9kYXRhW3N0eWxlLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogc3R5bGVfZGF0YS52ZXJ0ZXhfZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzOiBzdHlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHN0eWxlX2RhdGEudW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVzOiBzdHlsZV9kYXRhLnRleHR1cmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYEZpbmlzaGVkIHN0eWxlIGdyb3VwICcke2dyb3VwX25hbWV9JyBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIGdyb3VwIGFuZCBjaGVjayBpZiBhbGwgZ3JvdXBzIGZpbmlzaGVkXG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5ldmVyeShnID0+IGdyb3Vwc1tnXS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgbWVzaGVzIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaWxlTWFuYWdlcl8ke3NjZW5lX2lkfS5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKHsgdGlsZTogVGlsZS5zbGljZSh0aWxlLCBbJ21lc2hfZGF0YSddKSwgcHJvZ3Jlc3MgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc3RhcnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9OyAvLyByZXNldCBzbyBlYWNoIGdyb3VwIHNlbmRzIHNlcGFyYXRlIHNldCBvZiBzdHlsZSBtZXNoZXNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90aGluZyB0byBidWlsZCwgcmV0dXJuIGVtcHR5IHRpbGUgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICBgVGlsZU1hbmFnZXJfJHtzY2VuZV9pZH0uYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkYCxcbiAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMoeyB0aWxlOiBUaWxlLnNsaWNlKHRpbGUpLCBwcm9ncmVzczogeyBzdGFydDogdHJ1ZSwgZG9uZTogdHJ1ZSB9IH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAgICBSZXRyaWV2ZXMgZ2VvbWV0cnkgZnJvbSBhIHRpbGUgYWNjb3JkaW5nIHRvIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvblxuICAgICAgICBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aDpcbiAgICAgICAgICAgIGxheWVyOiBzb3VyY2UgbGF5ZXIgbmFtZVxuICAgICAgICAgICAgZ2VvbTogR2VvSlNPTiBGZWF0dXJlQ29sbGVjdGlvblxuICAgICovXG4gICAgc3RhdGljIGdldERhdGFGb3JTb3VyY2UgKHNvdXJjZV9kYXRhLCBzb3VyY2VfY29uZmlnLCBkZWZhdWx0X2xheWVyID0gbnVsbCkge1xuICAgICAgICB2YXIgbGF5ZXJzID0gW107XG5cbiAgICAgICAgaWYgKHNvdXJjZV9jb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHNvdXJjZSBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGlmICghc291cmNlX2NvbmZpZy5sYXllciAmJiBzb3VyY2VfZGF0YS5sYXllcnMuX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGdlb206IHNvdXJjZV9kYXRhLmxheWVycy5fZGVmYXVsdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHJlcXVlc3RlZCBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGVsc2UgaWYgKCFzb3VyY2VfY29uZmlnLmxheWVyICYmIGRlZmF1bHRfbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyOiBkZWZhdWx0X2xheWVyLFxuICAgICAgICAgICAgICAgICAgICBnZW9tOiBzb3VyY2VfZGF0YS5sYXllcnNbZGVmYXVsdF9sYXllcl1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGEgbGF5ZXIgaXMgc3BlY2lmaWVkIGJ5IG5hbWUsIHVzZSBpdFxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZV9jb25maWcubGF5ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsYXllcjogc291cmNlX2NvbmZpZy5sYXllcixcbiAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW3NvdXJjZV9jb25maWcubGF5ZXJdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBtdWx0aXBsZSBsYXllcnMgYXJlIHNwZWNpZmllZCBieSBuYW1lLCBjb21iaW5lIHRoZW1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlX2NvbmZpZy5sYXllcikpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfY29uZmlnLmxheWVyLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXSAmJiBzb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdLmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGNvbXBsZXRlcyBwcm9jZXNzaW5nXG4gICAgICAgZm9yIGEgc2luZ2xlIHRpbGUuXG4gICAgKi9cbiAgICBidWlsZE1lc2hlcyhzdHlsZXMsIHByb2dyZXNzKSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWJ1Z1xuICAgICAgICB0aGlzLmRlYnVnLmdlb21ldHJpZXMgPSAwO1xuICAgICAgICB0aGlzLmRlYnVnLmJ1ZmZlcl9zaXplID0gMDtcblxuICAgICAgICAvLyBDcmVhdGUgVkJPc1xuICAgICAgICBsZXQgbWVzaGVzID0ge30sIHRleHR1cmVzID0gW107IC8vIG5ldyBkYXRhIHRvIGJlIGFkZGVkIHRvIHRpbGVcbiAgICAgICAgbGV0IG1lc2hfZGF0YSA9IHRoaXMubWVzaF9kYXRhO1xuICAgICAgICBpZiAobWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzIGluIG1lc2hfZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5idWZmZXJfc2l6ZSArPSBtZXNoX2RhdGFbc10udmVydGV4X2RhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuYnVmZmVyX3NpemUgKz0gbWVzaF9kYXRhW3NdLnZlcnRleF9lbGVtZW50cy5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3R5bGVzW3NdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgQ291bGQgbm90IGNyZWF0ZSBtZXNoIGJlY2F1c2Ugc3R5bGUgJyR7c30nIG5vdCBmb3VuZCwgZm9yIHRpbGUgJHt0aGlzLmtleX0sIGFib3J0aW5nIHRpbGVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc2hlc1tzXSA9IHN0eWxlc1tzXS5tYWtlTWVzaChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEsIG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMsIG1lc2hfZGF0YVtzXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuZ2VvbWV0cmllcyArPSBtZXNoZXNbc10uZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVzXG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgdmFsaWQgZm9yIGEgc2luZ2xlIHRleHR1cmUgdG8gYmUgcmVmZXJlbmNlZCBmcm9tIG11bHRpcGxlIHN0eWxlc1xuICAgICAgICAgICAgICAgIC8vIChlLmcuIHNhbWUgcmFzdGVyIHRleHR1cmUgYXR0YWNoZWQgdG8gbXVsdGlwbGUgc291cmNlcykuIFRoaXMgbWVhbnMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIG1heSBiZSBhZGRlZCB0byB0aGUgdGlsZSdzIHRleHR1cmUgbGlzdCBtb3JlIHRoYW4gb25jZSwgd2hpY2ggZW5zdXJlc1xuICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgaXMgcHJvcGVybHkgcmVsZWFzZWQgKHRvIG1hdGNoIGl0cyByZXRhaW4gY291bnQpLlxuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXMucHVzaCguLi5tZXNoX2RhdGFbc10udGV4dHVyZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5tZXNoX2RhdGE7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0cmFja2luZyBmb3IgdGhpcyB0aWxlIGdlbmVyYXRpb25cbiAgICAgICAgaWYgKHByb2dyZXNzLnN0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLm5ld19tZXNoX3N0eWxlcyA9IFtdOyAvLyBrZWVwIHRyYWNrIG9mIHdoaWNoIG1lc2hlcyB3ZXJlIGJ1aWx0IGFzIHBhcnQgb2YgY3VycmVudCBnZW5lcmF0aW9uXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzID0gWy4uLnRoaXMudGV4dHVyZXNdOyAvLyBjb3B5IG9sZCBsaXN0IG9mIHRleHR1cmVzXG4gICAgICAgICAgICB0aGlzLnRleHR1cmVzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXcgbWVzaGVzXG4gICAgICAgIGZvciAobGV0IG0gaW4gbWVzaGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNoZXNbbV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc2hlc1ttXS5kZXN0cm95KCk7IC8vIGZyZWUgb2xkIG1lc2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWVzaGVzW21dID0gbWVzaGVzW21dOyAvLyBzZXQgbmV3IG1lc2hcbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzLnB1c2gobSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXcgdGV4dHVyZXNcbiAgICAgICAgdGhpcy50ZXh0dXJlcy5wdXNoKC4uLnRleHR1cmVzKTtcblxuICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgLy8gUmVsZWFzZSB1bi1yZXBsYWNlZCBtZXNoZXMgKGV4aXN0aW5nIGluIHByZXZpb3VzIGdlbmVyYXRpb24sIGJ1dCB3ZXJlbid0IGJ1aWx0IGZvciB0aGlzIG9uZSlcbiAgICAgICAgICAgIGZvciAobGV0IG0gaW4gdGhpcy5tZXNoZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXdfbWVzaF9zdHlsZXMuaW5kZXhPZihtKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzID0gW107XG5cbiAgICAgICAgICAgIC8vIFJlbGVhc2Ugb2xkIHRleHR1cmVzXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzLmZvckVhY2godCA9PiBUZXh0dXJlLnJlbGVhc2UodCkpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c190ZXh0dXJlcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmRlYnVnLmdlb21fcmF0aW8gPSAodGhpcy5kZWJ1Zy5nZW9tZXRyaWVzIC8gdGhpcy5kZWJ1Zy5mZWF0dXJlcykudG9GaXhlZCgxKTtcbiAgICAgICAgICAgIHRoaXMucHJpbnREZWJ1ZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgY29tcGxldGVzIHByb2Nlc3NpbmcsIGJ1dCB0aWxlIGhhcyBzaW5jZSBiZWVuIGRpc2NhcmRlZFxuICAgICAgICBGcmVlcyByZXNvdXJjZXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIHRpbGUgb2JqZWN0LlxuICAgICAgICBTdGF0aWMgbWV0aG9kIGJlY2F1c2UgdGhlIHRpbGUgb2JqZWN0IG5vIGxvbmdlciBleGlzdHMgKHRoZSB0aWxlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdvcmtlciBpcyBwYXNzZWQgaW5zdGVhZCkuXG4gICAgKi9cbiAgICBzdGF0aWMgYWJvcnRCdWlsZCAodGlsZSkge1xuICAgICAgICAvLyBSZWxlYXNlcyBtZXNoZXNcbiAgICAgICAgaWYgKHRpbGUubWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzIGluIHRpbGUubWVzaF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHR1cmVzID0gdGlsZS5tZXNoX2RhdGFbc10udGV4dHVyZXM7XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmVzLmZvckVhY2godCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgcmVsZWFzaW5nIHRleHR1cmUgJHt0fSBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUucmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcmVsYXRpdmUgdG8gdmlld1xuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSB0aGlzLmNvb3JkcztcbiAgICAgICAgaWYgKGNvb3Jkcy56ICE9PSB0aGlzLnZpZXcuY2VudGVyLnRpbGUueikge1xuICAgICAgICAgICAgY29vcmRzID0gVGlsZS5jb29yZGluYXRlQXRab29tKGNvb3JkcywgdGhpcy52aWV3LmNlbnRlci50aWxlLnopO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2VudGVyX2Rpc3QgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGNvb3Jkcy54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gY29vcmRzLnkpO1xuICAgIH1cblxuICAgIC8vIFNldCBhcyBhIHByb3h5IHRpbGUgZm9yIGFub3RoZXIgdGlsZVxuICAgIHNldFByb3h5Rm9yICh0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IgPSB0aGlzLnByb3h5X2ZvciB8fCBbXTtcbiAgICAgICAgICAgIHRoaXMucHJveHlfZm9yLnB1c2godGlsZSk7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2RlcHRoID0gMTsgLy8gZHJhdyBwcm94aWVzIGEgaGFsZi1sYXllciBiYWNrIChvcmRlciBpcyBzY2FsZWQgMnggdG8gYXZvaWQgaW50ZWdlciB0cnVuY2F0aW9uKVxuICAgICAgICAgICAgdGlsZS5wcm94aWVkX2FzID0gKHRpbGUuc3R5bGVfem9vbSA+IHRoaXMuc3R5bGVfem9vbSA/ICdjaGlsZCcgOiAncGFyZW50Jyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9kZXB0aCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm94eSB0aWxlcyBvbmx5IG5lZWQgdG8gcmVuZGVyIGEgc3BlY2lmaWMgc3R5bGUgaWYgYW55IG9mIHRoZSB0aWxlcyB0aGV5IGFyZSBwcm94eWluZyAqZm9yKlxuICAgIC8vIGhhdmVuJ3QgZmluaXNoZWQgbG9hZGluZyB0aGF0IHN0eWxlIHlldC4gSWYgYWxsIHByb3hpZWQgdGlsZXMgKmhhdmUqIGRhdGEgZm9yIHRoYXQgc3R5bGUsIHRoZW4gaXQnc1xuICAgIC8vIHNhZmUgdG8gaGlkZSB0aGUgcHJveHkgdGlsZSdzIHZlcnNpb24uXG4gICAgc2hvdWxkUHJveHlGb3JTdHlsZSAoc3R5bGUpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnByb3h5X2ZvciB8fCB0aGlzLnByb3h5X2Zvci5zb21lKHQgPT4gdC5tZXNoZXNbc3R5bGVdID09IG51bGwpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtb2RlbCBtYXRyaXggYW5kIHRpbGUgdW5pZm9ybXNcbiAgICBzZXR1cFByb2dyYW0gKHsgbW9kZWwsIG1vZGVsMzIgfSwgcHJvZ3JhbSkge1xuICAgICAgICAvLyBUaWxlIG9yaWdpblxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzRmdicsICd1X3RpbGVfb3JpZ2luJywgW3RoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMuc3R5bGVfem9vbSwgdGhpcy5jb29yZHMuel0pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfdGlsZV9wcm94eV9kZXB0aCcsIHRoaXMucHJveHlfZGVwdGgpO1xuXG4gICAgICAgIC8vIE1vZGVsIC0gdHJhbnNmb3JtIHRpbGUgc3BhY2UgaW50byB3b3JsZCBzcGFjZSAobWV0ZXJzLCBhYnNvbHV0ZSBtZXJjYXRvciBwb3NpdGlvbilcbiAgICAgICAgbWF0NC5pZGVudGl0eShtb2RlbCk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG1vZGVsLCBtb2RlbCwgdmVjMy5mcm9tVmFsdWVzKHRoaXMubWluLngsIHRoaXMubWluLnksIDApKTtcbiAgICAgICAgbWF0NC5zY2FsZShtb2RlbCwgbW9kZWwsIHZlYzMuZnJvbVZhbHVlcyh0aGlzLnNwYW4ueCAvIEdlby50aWxlX3NjYWxlLCAtMSAqIHRoaXMuc3Bhbi55IC8gR2VvLnRpbGVfc2NhbGUsIDEpKTsgLy8gc2NhbGUgdGlsZSBsb2NhbCBjb29yZHMgdG8gbWV0ZXJzXG4gICAgICAgIG1hdDQuY29weShtb2RlbDMyLCBtb2RlbCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfbW9kZWwnLCBtb2RlbDMyKTtcblxuICAgICAgICAvLyBGYWRlIGluIGxhYmVscyBhY2NvcmRpbmcgdG8gcHJveHkgc3RhdHVzLCBhdm9pZGluZyBcImZsaWNrZXJpbmdcIiB3aGVyZVxuICAgICAgICAvLyBsYWJlbHMgcXVpY2tseSBnbyBmcm9tIGludmlzaWJsZSBiYWNrIHRvIHZpc2libGVcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxaScsICd1X2ZhZGVfaW4nLCB0aGlzLmZhZGVfaW4gJiYgdGhpcy5wcm94aWVkX2FzICE9PSAnY2hpbGQnKTtcbiAgICB9XG5cbiAgICAvLyBTbGljZSBhIHN1YnNldCBvZiBrZXlzIG91dCBvZiBhIHRpbGVcbiAgICAvLyBJbmNsdWRlcyBhIG1pbmltdW0gc2V0IG9mIHByZS1kZWZpbmVkIGtleXMgZm9yIGxvYWQgc3RhdGUsIGRlYnVnLiBldGMuXG4gICAgLy8gV2UgdXNlIHRoaXMgdG8gc2VuZCBhIHN1YnNldCBvZiB0aGUgdGlsZSBiYWNrIHRvIHRoZSBtYWluIHRocmVhZCwgdG8gbWluaW1pemUgdW5uZWNlc3NhcnkgZGF0YSB0cmFuc2ZlclxuICAgIC8vIChlLmcuIHZlcnkgbGFyZ2UgaXRlbXMgbGlrZSBmZWF0dXJlIGdlb21ldHJ5IGFyZSBub3QgbmVlZGVkIG9uIHRoZSBtYWluIHRocmVhZClcbiAgICBzdGF0aWMgc2xpY2UgKHRpbGUsIGtleXMpIHtcbiAgICAgICAgbGV0IGtlZXAgPSBbXG4gICAgICAgICAgICAna2V5JyxcbiAgICAgICAgICAgICdsb2FkaW5nJyxcbiAgICAgICAgICAgICdsb2FkZWQnLFxuICAgICAgICAgICAgJ2dlbmVyYXRpb24nLFxuICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICdkZWJ1ZydcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5cykpIHtcbiAgICAgICAgICAgIGtlZXAucHVzaCguLi5rZXlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSB0aWxlIHN1YnNldFxuICAgICAgICB2YXIgdGlsZV9zdWJzZXQgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaz0wOyBrIDwga2VlcC5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2VlcFtrXTtcbiAgICAgICAgICAgIHRpbGVfc3Vic2V0W2tleV0gPSB0aWxlW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGlsZV9zdWJzZXQ7XG4gICAgfVxuXG4gICAgbWVyZ2Uob3RoZXIpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIG90aGVyKSB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAna2V5Jykge1xuICAgICAgICAgICAgICAgIHRoaXNba2V5XSA9IG90aGVyW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJpbnREZWJ1ZyAoKSB7XG4gICAgICAgIGxvZygnZGVidWcnLCBgVGlsZTogZGVidWcgZm9yICR7dGhpcy5rZXl9OiBbICAke0pTT04uc3RyaW5naWZ5KHRoaXMuZGVidWcpfSBdYCk7XG4gICAgfVxuXG59XG5cblRpbGUuY29vcmRfY2hpbGRyZW4gPSB7fTsgLy8gb25seSBhbGxvY2F0ZSBjaGlsZHJlbiBjb29yZGluYXRlcyBvbmNlIHBlciBjb29yZGluYXRlXG4iLCJpbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IFRpbGVQeXJhbWlkIGZyb20gJy4vdGlsZV9weXJhbWlkJztcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaWxlTWFuYWdlciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih7IHNjZW5lLCB2aWV3IH0pIHtcbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnRpbGVzID0ge307XG4gICAgICAgIHRoaXMucHlyYW1pZCA9IG5ldyBUaWxlUHlyYW1pZCgpO1xuICAgICAgICB0aGlzLnZpc2libGVfY29vcmRzID0ge307XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3JkcyA9IFtdO1xuICAgICAgICB0aGlzLmJ1aWxkaW5nX3RpbGVzID0gbnVsbDtcblxuICAgICAgICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdGhpcyBvYmplY3QgdG8gYmUgY2FsbGVkIGZyb20gd29ya2VyIHRocmVhZHNcbiAgICAgICAgdGhpcy5tYWluX3RocmVhZF90YXJnZXQgPSBbJ1RpbGVNYW5hZ2VyJywgdGhpcy5zY2VuZS5pZF0uam9pbignXycpO1xuICAgICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0LCB0aGlzKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmZvckVhY2hUaWxlKHRpbGUgPT4gdGlsZS5kZXN0cm95KCkpO1xuICAgICAgICB0aGlzLnRpbGVzID0ge307XG4gICAgICAgIHRoaXMucHlyYW1pZCA9IG51bGw7XG4gICAgICAgIHRoaXMudmlzaWJsZV9jb29yZHMgPSB7fTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzID0gW107XG4gICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZXcgPSBudWxsO1xuICAgIH1cblxuICAgIGtlZXBUaWxlKHRpbGUpIHtcbiAgICAgICAgdGhpcy50aWxlc1t0aWxlLmtleV0gPSB0aWxlO1xuICAgICAgICB0aGlzLnB5cmFtaWQuYWRkVGlsZSh0aWxlKTtcbiAgICB9XG5cbiAgICBoYXNUaWxlKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlc1trZXldICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZm9yZ2V0VGlsZShrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzVGlsZShrZXkpKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNba2V5XTtcbiAgICAgICAgICAgIHRoaXMucHlyYW1pZC5yZW1vdmVUaWxlKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMudGlsZXNba2V5XTtcbiAgICAgICAgdGhpcy50aWxlQnVpbGRTdG9wKGtleSk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgc2luZ2xlIHRpbGVcbiAgICByZW1vdmVUaWxlKGtleSkge1xuICAgICAgICBsb2coJ3RyYWNlJywgYHRpbGUgdW5sb2FkIGZvciAke2tleX1gKTtcblxuICAgICAgICB2YXIgdGlsZSA9IHRoaXMudGlsZXNba2V5XTtcblxuICAgICAgICBpZiAodGlsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aWxlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9yZ2V0VGlsZSh0aWxlLmtleSk7XG4gICAgICAgIHRoaXMuc2NlbmUucmVxdWVzdFJlZHJhdygpO1xuICAgIH1cblxuICAgIC8vIFJ1biBhIGZ1bmN0aW9uIG9uIGVhY2ggdGlsZVxuICAgIGZvckVhY2hUaWxlKGZ1bmMpIHtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBmdW5jKHRoaXMudGlsZXNbdF0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRpbGVzIHRoYXQgcGFzcyBhIGZpbHRlciBjb25kaXRpb25cbiAgICByZW1vdmVUaWxlcyhmaWx0ZXIpIHtcbiAgICAgICAgbGV0IHJlbW92ZV90aWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB0IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy50aWxlc1t0XTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIodGlsZSkpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVfdGlsZXMucHVzaCh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCByPTA7IHIgPCByZW1vdmVfdGlsZXMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgIGxldCBrZXkgPSByZW1vdmVfdGlsZXNbcl07XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRpbGUoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVRpbGVzRm9yVmlldygpIHtcbiAgICAgICAgLy8gRmluZCB2aXNpYmxlIHRpbGVzIGFuZCBsb2FkIG5ldyBvbmVzXG4gICAgICAgIGxldCBwcmV2X2Nvb3JkcyA9IE9iamVjdC5rZXlzKHRoaXMudmlzaWJsZV9jb29yZHMpO1xuICAgICAgICB0aGlzLnZpc2libGVfY29vcmRzID0ge307XG4gICAgICAgIGxldCB0aWxlX2Nvb3JkcyA9IHRoaXMudmlldy5maW5kVmlzaWJsZVRpbGVDb29yZGluYXRlcygpO1xuICAgICAgICBmb3IgKGxldCBjPTA7IGMgPCB0aWxlX2Nvb3Jkcy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgY29vcmRzID0gdGlsZV9jb29yZHNbY107XG4gICAgICAgICAgICB0aGlzLnF1ZXVlQ29vcmRpbmF0ZShjb29yZHMpO1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3Jkc1tjb29yZHMua2V5XSA9IGNvb3JkcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHZpc2libGUgY29vcmRzIGNoYW5nZWRcbiAgICAgICAgLy8gVE9ETzogbW92ZSB0byBhIG5ldyB2aWV3IG1hbmFnZXIgb2JqZWN0XG4gICAgICAgIGxldCBuZXdfY29vcmRzID0gT2JqZWN0LmtleXModGhpcy52aXNpYmxlX2Nvb3Jkcyk7XG4gICAgICAgIGxldCBjb29yZHNfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAocHJldl9jb29yZHMubGVuZ3RoICE9PSBuZXdfY29vcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29vcmRzX2NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJldl9jb29yZHMuc29ydCgpO1xuICAgICAgICAgICAgbmV3X2Nvb3Jkcy5zb3J0KCk7XG4gICAgICAgICAgICBpZiAoIXByZXZfY29vcmRzLmV2ZXJ5KChjLCBpKSA9PiBuZXdfY29vcmRzW2ldID09PSBjKSkge1xuICAgICAgICAgICAgICAgIGNvb3Jkc19jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgIH1cblxuICAgIHVwZGF0ZVRpbGVTdGF0ZXMgKCkge1xuICAgICAgICB0aGlzLmZvckVhY2hUaWxlKHRpbGUgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KHRpbGUpO1xuICAgICAgICAgICAgdGlsZS51cGRhdGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sb2FkUXVldWVkQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVQcm94eVRpbGVzKCk7XG4gICAgICAgIHRoaXMudmlldy5wcnVuZVRpbGVzRm9yVmlldygpO1xuICAgIH1cblxuICAgIHVwZGF0ZVByb3h5VGlsZXMgKCkge1xuICAgICAgICBpZiAodGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBwcmV2aW91cyBwcm94aWVzXG4gICAgICAgIHRoaXMuZm9yRWFjaFRpbGUodGlsZSA9PiB0aWxlLnNldFByb3h5Rm9yKG51bGwpKTtcblxuICAgICAgICBsZXQgcHJveHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcuem9vbV9kaXJlY3Rpb24gPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmICF0aWxlLmJ1aWx0ICYmIHRpbGUuY29vcmRzLnogPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucHlyYW1pZC5nZXRBbmNlc3Rvcih0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnNldFByb3h5Rm9yKHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJveHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmICh0aWxlLnZpc2libGUgJiYgIXRpbGUuYnVpbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnB5cmFtaWQuZ2V0RGVzY2VuZGFudHModGlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGRlc2NlbmRhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50c1tpXS5zZXRQcm94eUZvcih0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFwcm94eSkge1xuICAgICAgICAgICAgdGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVZpc2liaWxpdHkodGlsZSkge1xuICAgICAgICB0aWxlLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRpbGUuc3R5bGVfem9vbSA9PT0gdGhpcy52aWV3LnRpbGVfem9vbSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlzaWJsZV9jb29yZHNbdGlsZS5jb29yZHMua2V5XSkge1xuICAgICAgICAgICAgICAgIHRpbGUudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBicnV0ZSBmb3JjZVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLnZpc2libGVfY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChUaWxlLmlzRGVzY2VuZGFudCh0aWxlLmNvb3JkcywgdGhpcy52aXNpYmxlX2Nvb3Jkc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZS52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRpbGVzIHRoYXQgYXJlbid0IHZpc2libGUsIGFuZCBmbGFnIHJlbWFpbmluZyB2aXNpYmxlIG9uZXMgdG8gYmUgdXBkYXRlZCAoZm9yIGxvYWRpbmcsIHByb3h5LCBldGMuKVxuICAgIHBydW5lVG9WaXNpYmxlVGlsZXMgKCkge1xuICAgICAgICB0aGlzLnJlbW92ZVRpbGVzKHRpbGUgPT4gIXRpbGUudmlzaWJsZSk7XG4gICAgfVxuXG4gICAgZ2V0UmVuZGVyYWJsZVRpbGVzKCkge1xuICAgICAgICBsZXQgdGlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNbdF07XG4gICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmIHRpbGUubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgdGlsZXMucHVzaCh0aWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGlsZXM7XG4gICAgfVxuXG4gICAgaXNMb2FkaW5nVmlzaWJsZVRpbGVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy50aWxlcykuc29tZShrID0+IHRoaXMudGlsZXNba10udmlzaWJsZSAmJiAhdGhpcy50aWxlc1trXS5idWlsdCk7XG4gICAgfVxuXG4gICAgLy8gUXVldWUgYSB0aWxlIGZvciBsb2FkXG4gICAgcXVldWVDb29yZGluYXRlKGNvb3Jkcykge1xuICAgICAgICB0aGlzLnF1ZXVlZF9jb29yZHNbdGhpcy5xdWV1ZWRfY29vcmRzLmxlbmd0aF0gPSBjb29yZHM7XG4gICAgfVxuXG4gICAgLy8gTG9hZCBhbGwgcXVldWVkIHRpbGVzXG4gICAgbG9hZFF1ZXVlZENvb3JkaW5hdGVzKCkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZWRfY29vcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBxdWV1ZWQgdGlsZXMgZnJvbSBjZW50ZXIgdGlsZVxuICAgICAgICB0aGlzLnF1ZXVlZF9jb29yZHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgbGV0IGFkID0gTWF0aC5hYnModGhpcy52aWV3LmNlbnRlci50aWxlLnggLSBhLngpICsgTWF0aC5hYnModGhpcy52aWV3LmNlbnRlci50aWxlLnkgLSBhLnkpO1xuICAgICAgICAgICAgbGV0IGJkID0gTWF0aC5hYnModGhpcy52aWV3LmNlbnRlci50aWxlLnggLSBiLngpICsgTWF0aC5hYnModGhpcy52aWV3LmNlbnRlci50aWxlLnkgLSBiLnkpO1xuICAgICAgICAgICAgcmV0dXJuIChiZCA+IGFkID8gLTEgOiAoYmQgPT09IGFkID8gMCA6IDEpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3Jkcy5mb3JFYWNoKGNvb3JkcyA9PiB0aGlzLmxvYWRDb29yZGluYXRlKGNvb3JkcykpO1xuICAgICAgICB0aGlzLnF1ZXVlZF9jb29yZHMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIGFsbCB0aWxlcyB0byBjb3ZlciBhIGdpdmVuIGxvZ2ljYWwgdGlsZSBjb29yZGluYXRlXG4gICAgbG9hZENvb3JkaW5hdGUoY29vcmRzKSB7XG4gICAgICAgIC8vIFNraXAgaWYgbm90IGF0IGN1cnJlbnQgc2NlbmUgem9vbVxuICAgICAgICBpZiAoY29vcmRzLnogIT09IHRoaXMudmlldy5jZW50ZXIudGlsZS56KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlcm1pbmUgbmVjZXNzYXJ5IHRpbGVzIGZvciBlYWNoIHNvdXJjZVxuICAgICAgICBmb3IgKGxldCBzIGluIHRoaXMuc2NlbmUuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuc2NlbmUuc291cmNlc1tzXTtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGRhdGEgc291cmNlIHNob3VsZCBidWlsZCB0aGlzIHRpbGVcbiAgICAgICAgICAgIGlmICghc291cmNlLmJ1aWxkc19nZW9tZXRyeV90aWxlcyB8fCAhc291cmNlLmluY2x1ZGVzVGlsZShjb29yZHMsIHRoaXMudmlldy50aWxlX3pvb20pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBrZXkgPSBUaWxlLmtleShjb29yZHMsIHNvdXJjZSwgdGhpcy52aWV3LnRpbGVfem9vbSk7XG4gICAgICAgICAgICBpZiAoa2V5ICYmICF0aGlzLmhhc1RpbGUoa2V5KSkge1xuICAgICAgICAgICAgICAgIGxldCB0aWxlID0gVGlsZS5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGNvb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyOiB0aGlzLnNjZW5lLm5leHRXb3JrZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVfem9vbTogdGhpcy52aWV3LnN0eWxlWm9vbShjb29yZHMueiksXG4gICAgICAgICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlld1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5rZWVwVGlsZSh0aWxlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkVGlsZSh0aWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvcnQgYW5kIGJ1aWxkIGEgbGlzdCBvZiB0aWxlc1xuICAgIGJ1aWxkVGlsZXModGlsZXMpIHtcbiAgICAgICAgVGlsZS5zb3J0KHRpbGVzKS5mb3JFYWNoKHRpbGUgPT4gdGhpcy5idWlsZFRpbGUodGlsZSkpO1xuICAgICAgICB0aGlzLmNoZWNrQnVpbGRRdWV1ZSgpO1xuICAgIH1cblxuICAgIGJ1aWxkVGlsZSh0aWxlLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMudGlsZUJ1aWxkU3RhcnQodGlsZS5rZXkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHkodGlsZSk7XG4gICAgICAgIHRpbGUudXBkYXRlKCk7XG4gICAgICAgIHRpbGUuYnVpbGQodGhpcy5zY2VuZS5nZW5lcmF0aW9uLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWQgd2hlbiBhIHdlYiB3b3JrZXIgY29tcGxldGVzIHByb2Nlc3NpbmcgZm9yIGEgc2luZ2xlIHRpbGUgKGluaXRpYWwgbG9hZCwgb3IgcmVidWlsZClcbiAgICBidWlsZFRpbGVTdHlsZXNDb21wbGV0ZWQoeyB0aWxlLCBwcm9ncmVzcyB9KSB7XG4gICAgICAgIC8vIFJlbW92ZWQgdGhpcyB0aWxlIGR1cmluZyBsb2FkP1xuICAgICAgICBpZiAodGhpcy50aWxlc1t0aWxlLmtleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBkaXNjYXJkZWQgdGlsZSAke3RpbGUua2V5fSBpbiBUaWxlTWFuYWdlci5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWQgYmVjYXVzZSBwcmV2aW91c2x5IHJlbW92ZWRgKTtcbiAgICAgICAgICAgIFRpbGUuYWJvcnRCdWlsZCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJ1aWx0IHdpdGggYW4gb3V0ZGF0ZWQgc2NlbmUgY29uZmlndXJhdGlvbj9cbiAgICAgICAgZWxzZSBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLnNjZW5lLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgZGlzY2FyZGVkIHRpbGUgJHt0aWxlLmtleX0gaW4gVGlsZU1hbmFnZXIuYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkIGJlY2F1c2UgYnVpbHQgd2l0aCBgICtcbiAgICAgICAgICAgICAgICBgc2NlbmUgY29uZmlnIGdlbiAke3RpbGUuZ2VuZXJhdGlvbn0sIGN1cnJlbnQgJHt0aGlzLnNjZW5lLmdlbmVyYXRpb259YCk7XG4gICAgICAgICAgICBUaWxlLmFib3J0QnVpbGQodGlsZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbGVTdGF0ZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aWxlIHdpdGggcHJvcGVydGllcyBmcm9tIHdvcmtlclxuICAgICAgICAgICAgaWYgKHRoaXMudGlsZXNbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICAgICAgdGlsZSA9IHRoaXMudGlsZXNbdGlsZS5rZXldLm1lcmdlKHRpbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgICAgIHRpbGUuYnVpbHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aWxlLmJ1aWxkTWVzaGVzKHRoaXMuc2NlbmUuc3R5bGVzLCBwcm9ncmVzcyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbGVTdGF0ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2NlbmUucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb2dyZXNzLmRvbmUpIHtcbiAgICAgICAgICAgIHRoaXMudGlsZUJ1aWxkU3RvcCh0aWxlLmtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWQgd2hlbiB3ZWIgd29ya2VyIGVuY291bnRlcnMgYW4gZXJyb3IgYnVpbGRpbmcgYSB0aWxlXG4gICAgYnVpbGRUaWxlRXJyb3IodGlsZSkge1xuICAgICAgICBsb2coJ2Vycm9yJywgYEVycm9yIGJ1aWxkaW5nIHRpbGUgJHt0aWxlLmtleX06YCwgdGlsZS5lcnJvcik7XG4gICAgICAgIHRoaXMuZm9yZ2V0VGlsZSh0aWxlLmtleSk7XG4gICAgICAgIFRpbGUuYWJvcnRCdWlsZCh0aWxlKTtcbiAgICB9XG5cbiAgICAvLyBUcmFjayB0aWxlIGJ1aWxkIHN0YXRlXG4gICAgdGlsZUJ1aWxkU3RhcnQoa2V5KSB7XG4gICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXMgPSB0aGlzLmJ1aWxkaW5nX3RpbGVzIHx8IHt9O1xuICAgICAgICB0aGlzLmJ1aWxkaW5nX3RpbGVzW2tleV0gPSB0cnVlO1xuICAgICAgICBsb2coJ3RyYWNlJywgYHRpbGVCdWlsZFN0YXJ0IGZvciAke2tleX06ICR7T2JqZWN0LmtleXModGhpcy5idWlsZGluZ190aWxlcykubGVuZ3RofWApO1xuICAgIH1cblxuICAgIHRpbGVCdWlsZFN0b3Aoa2V5KSB7XG4gICAgICAgIC8vIERvbmUgYnVpbGRpbmc/XG4gICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nX3RpbGVzKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYHRpbGVCdWlsZFN0b3AgZm9yICR7a2V5fTogJHtPYmplY3Qua2V5cyh0aGlzLmJ1aWxkaW5nX3RpbGVzKS5sZW5ndGh9YCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5idWlsZGluZ190aWxlc1trZXldO1xuICAgICAgICAgICAgdGhpcy5jaGVja0J1aWxkUXVldWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIHN0YXR1cyBvZiB0aWxlIGJ1aWxkaW5nIHF1ZXVlIGFuZCBub3RpZnkgc2NlbmUgd2hlbiB3ZSdyZSBkb25lXG4gICAgY2hlY2tCdWlsZFF1ZXVlKCkge1xuICAgICAgICBpZiAoIXRoaXMuYnVpbGRpbmdfdGlsZXMgfHwgT2JqZWN0LmtleXModGhpcy5idWlsZGluZ190aWxlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkaW5nX3RpbGVzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc2NlbmUudGlsZU1hbmFnZXJCdWlsZERvbmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN1bSBvZiBhIGRlYnVnIHByb3BlcnR5IGFjcm9zcyB0aWxlc1xuICAgIGdldERlYnVnU3VtKHByb3AsIGZpbHRlcikge1xuICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50aWxlc1t0XS5kZWJ1Z1twcm9wXSAhPSBudWxsICYmICh0eXBlb2YgZmlsdGVyICE9PSAnZnVuY3Rpb24nIHx8IGZpbHRlcih0aGlzLnRpbGVzW3RdKSA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICBzdW0gKz0gdGhpcy50aWxlc1t0XS5kZWJ1Z1twcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH1cblxuICAgIC8vIEF2ZXJhZ2Ugb2YgYSBkZWJ1ZyBwcm9wZXJ0eSBhY3Jvc3MgdGlsZXNcbiAgICBnZXREZWJ1Z0F2ZXJhZ2UocHJvcCwgZmlsdGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldERlYnVnU3VtKHByb3AsIGZpbHRlcikgLyBPYmplY3Qua2V5cyh0aGlzLnRpbGVzKS5sZW5ndGg7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcbmltcG9ydCBUaWxlIGZyb20gJy4vdGlsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbGVQeXJhbWlkIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNvb3JkcyA9IHt9O1xuICAgICAgICB0aGlzLm1heF9wcm94eV9kZXNjZW5kYW50X2RlcHRoID0gMzsgLy8gIyBvZiBsZXZlbHMgZGVlcCB0byBzZWFyY2ggZm9yIGRlc2NlbmRhbnQgcHJveHkgdGlsZXNcbiAgICB9XG5cbiAgICBzb3VyY2VUaWxlcyhjb29yZCwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmNvb3Jkc1tjb29yZC5rZXldICYmXG4gICAgICAgICAgICB0aGlzLmNvb3Jkc1tjb29yZC5rZXldLnNvdXJjZXMgJiZcbiAgICAgICAgICAgIHRoaXMuY29vcmRzW2Nvb3JkLmtleV0uc291cmNlc1tzb3VyY2UubmFtZV0pO1xuICAgIH1cblxuICAgIGFkZFRpbGUodGlsZSkge1xuICAgICAgICAvLyBBZGQgdGFyZ2V0IHRpbGVcbiAgICAgICAgbGV0IGtleSA9IHRpbGUuY29vcmRzLmtleTtcbiAgICAgICAgbGV0IGNvb3JkID0gdGhpcy5jb29yZHNba2V5XTtcbiAgICAgICAgaWYgKCFjb29yZCkge1xuICAgICAgICAgICAgY29vcmQgPSB0aGlzLmNvb3Jkc1trZXldID0geyBkZXNjZW5kYW50czogMCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb29yZC5zb3VyY2VzKSB7XG4gICAgICAgICAgICBjb29yZC5zb3VyY2VzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvb3JkLnNvdXJjZXNbdGlsZS5zb3VyY2UubmFtZV0pIHtcbiAgICAgICAgICAgIGNvb3JkLnNvdXJjZXNbdGlsZS5zb3VyY2UubmFtZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb29yZC5zb3VyY2VzW3RpbGUuc291cmNlLm5hbWVdW3RpbGUuc3R5bGVfem9vbV0gPSB0aWxlO1xuXG4gICAgICAgIC8vIEluY3JlbWVudCByZWZlcmVuY2UgY291bnQgdXAgdGhlIHRpbGUgcHlyYW1pZFxuICAgICAgICBmb3IgKGxldCB6ID0gdGlsZS5jb29yZHMueiAtIDE7IHogPj0gMDsgei0tKSB7XG4gICAgICAgICAgICBsZXQgdXAgPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20odGlsZS5jb29yZHMsIHopO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvb3Jkc1t1cC5rZXldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb29yZHNbdXAua2V5XSA9IHsgZGVzY2VuZGFudHM6IDAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29vcmRzW3VwLmtleV0uZGVzY2VuZGFudHMrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZVRpbGUodGlsZSkge1xuICAgICAgICAvLyBSZW1vdmUgdGFyZ2V0IHRpbGVcbiAgICAgICAgbGV0IHNvdXJjZV90aWxlcyA9IHRoaXMuc291cmNlVGlsZXModGlsZS5jb29yZHMsIHRpbGUuc291cmNlKTtcbiAgICAgICAgbGV0IGtleSA9IHRpbGUuY29vcmRzLmtleTtcblxuICAgICAgICBpZiAoc291cmNlX3RpbGVzKSB7XG4gICAgICAgICAgICBkZWxldGUgc291cmNlX3RpbGVzW3RpbGUuc3R5bGVfem9vbV07XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoc291cmNlX3RpbGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgc291cmNlXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29vcmRzW2tleV0uc291cmNlc1t0aWxlLnNvdXJjZS5uYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5jb29yZHNba2V5XS5zb3VyY2VzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29vcmRzW2tleV0uc291cmNlcztcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb29yZHNba2V5XS5kZXNjZW5kYW50cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHdob2xlIGNvb3JkXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlY3JlbWVudCByZWZlcmVuY2UgY291bnQgdXAgdGhlIHRpbGUgcHlyYW1pZFxuICAgICAgICBmb3IgKGxldCB6ID0gdGlsZS5jb29yZHMueiAtIDE7IHogPj0gMDsgei0tKSB7XG4gICAgICAgICAgICBsZXQgZG93biA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbSh0aWxlLmNvb3Jkcywgeik7XG4gICAgICAgICAgICBpZiAodGhpcy5jb29yZHNbZG93bi5rZXldICYmIHRoaXMuY29vcmRzW2Rvd24ua2V5XS5kZXNjZW5kYW50cyA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvb3Jkc1tkb3duLmtleV0uZGVzY2VuZGFudHMtLTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb29yZHNbZG93bi5rZXldLmRlc2NlbmRhbnRzID09PSAwICYmICF0aGlzLmNvb3Jkc1tkb3duLmtleV0uc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNbZG93bi5rZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEFuY2VzdG9yICh7IGNvb3Jkcywgc3R5bGVfem9vbSwgc291cmNlIH0pIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgb3Zlcnpvb21lZCB0aWxlcyBhdCBzYW1lIGNvb3JkaW5hdGUgem9vbVxuICAgICAgICBpZiAoc3R5bGVfem9vbSA+IHNvdXJjZS5tYXhfem9vbSkge1xuICAgICAgICAgICAgbGV0IHNvdXJjZV90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMoY29vcmRzLCBzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlcykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHogPSBzdHlsZV96b29tIC0gMTsgeiA+PSBzb3VyY2UubWF4X3pvb207IHotLSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlX3RpbGVzW3pdICYmIHNvdXJjZV90aWxlc1t6XS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VfdGlsZXNbel07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHlsZV96b29tID0gc291cmNlLm1heF96b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGlsZXMgYXQgbmV4dCB6b29tIHVwXG4gICAgICAgIHN0eWxlX3pvb20tLTtcbiAgICAgICAgbGV0IHBhcmVudCA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbShjb29yZHMsIGNvb3Jkcy56IC0gMSk7XG4gICAgICAgIGxldCBwYXJlbnRfdGlsZXMgPSB0aGlzLnNvdXJjZVRpbGVzKHBhcmVudCwgc291cmNlKTtcbiAgICAgICAgaWYgKHBhcmVudF90aWxlcyAmJiBwYXJlbnRfdGlsZXNbc3R5bGVfem9vbV0gJiYgcGFyZW50X3RpbGVzW3N0eWxlX3pvb21dLmxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudF90aWxlc1tzdHlsZV96b29tXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkaWRuJ3QgZmluZCBhbmNlc3RvciwgdHJ5IG5leHQgbGV2ZWxcbiAgICAgICAgLy8gVE9ETzogbWF4IGRlcHRoIGxldmVscyB0byBjaGVja1xuICAgICAgICBpZiAocGFyZW50LnogPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBbmNlc3Rvcih7IGNvb3JkczogcGFyZW50LCBzdHlsZV96b29tLCBzb3VyY2UgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXREZXNjZW5kYW50cyAoeyBjb29yZHMsIHN0eWxlX3pvb20sIHNvdXJjZSB9LCBsZXZlbCA9IDEpIHtcbiAgICAgICAgbGV0IGRlc2NlbmRhbnRzID0gW107XG5cbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgb3Zlcnpvb21lZCB0aWxlcyBhdCBzYW1lIGNvb3JkaW5hdGUgem9vbVxuICAgICAgICBpZiAoc3R5bGVfem9vbSA+PSBzb3VyY2UubWF4X3pvb20pIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2VfdGlsZXMgPSB0aGlzLnNvdXJjZVRpbGVzKGNvb3Jkcywgc291cmNlKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2VhcmNoX21heF96b29tID0gTWF0aC5tYXgoR2VvLmRlZmF1bHRfdmlld19tYXhfem9vbSwgc3R5bGVfem9vbSArIHRoaXMubWF4X3Byb3h5X2Rlc2NlbmRhbnRfZGVwdGgpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHogPSBzdHlsZV96b29tICsgMTsgeiA8PSBzZWFyY2hfbWF4X3pvb207IHorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlX3RpbGVzW3pdICYmIHNvdXJjZV90aWxlc1t6XS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzLnB1c2goc291cmNlX3RpbGVzW3pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRpbGVzIGF0IG5leHQgem9vbSBkb3duXG4gICAgICAgIGlmICh0aGlzLmNvb3Jkc1tjb29yZHMua2V5XSAmJiB0aGlzLmNvb3Jkc1tjb29yZHMua2V5XS5kZXNjZW5kYW50cyA+IDApIHtcbiAgICAgICAgICAgIHN0eWxlX3pvb20rKztcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVGlsZS5jaGlsZHJlbkZvckNvb3JkaW5hdGUoY29vcmRzKTtcbiAgICAgICAgICAgIGZvciAobGV0IGM9MDsgYyA8IGNoaWxkcmVuLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltjXTtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRfdGlsZXMgPSB0aGlzLnNvdXJjZVRpbGVzKGNoaWxkLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZF90aWxlcyAmJiBjaGlsZF90aWxlc1tzdHlsZV96b29tXSAmJiBjaGlsZF90aWxlc1tzdHlsZV96b29tXS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChjaGlsZF90aWxlc1tzdHlsZV96b29tXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRpZG4ndCBmaW5kIGNoaWxkLCB0cnkgbmV4dCBsZXZlbFxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsIDw9IHRoaXMubWF4X3Byb3h5X2Rlc2NlbmRhbnRfZGVwdGggJiYgY2hpbGQueiA8PSBzb3VyY2UubWF4X3pvb20pIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaCguLi50aGlzLmdldERlc2NlbmRhbnRzKHsgY29vcmRzOiBjaGlsZCwgc291cmNlLCBzdHlsZV96b29tIH0sIGxldmVsICsgMSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICB9XG5cbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgICAvLyBkcmF3cyBhIGJsdWUgcmVjdGFuZ2xlIGJvcmRlciBhcm91bmQgdGhlIGNvbGxpc2lvbiBib3ggb2YgYSBsYWJlbFxuICAgIGRyYXdfbGFiZWxfY29sbGlzaW9uX2JveGVzOiBmYWxzZSxcbiAgICAvLyBkcmF3cyBhIGdyZWVuIHJlY3RhbmdsZSBib3JkZXIgd2l0aGluIHRoZSB0ZXh0dXJlIGJveCBvZiBhIGxhYmVsXG4gICAgZHJhd19sYWJlbF90ZXh0dXJlX2JveGVzOiBmYWxzZSxcbiAgICAvLyBzdXBwcmVzZXMgZmFkZS1pbiBvZiBsYWJlbHNcbiAgICBzdXBwcmVzc19sYWJlbF9mYWRlX2luOiBmYWxzZVxufTtcbiIsIlxuXG5leHBvcnQgY2xhc3MgTWV0aG9kTm90SW1wbGVtZW50ZWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kTmFtZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm5hbWUgICAgPSAnTWV0aG9kTm90SW1wbGVtZW50ZWQnO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnTWV0aG9kICcgKyBtZXRob2ROYW1lICsgJyBtdXN0IGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzJztcbiAgICB9XG59XG4iLCIvLyBQYXJ0aWFsIGltcG9ydCBvZiBnbC1tYXRyaXggdmlhIG1vZHVsYXJpemVkIHN0YWNrLWdsIGZvcmtzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdG9qaS9nbC1tYXRyaXhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFja2dsXG5cbi8vIHZlYzNcblxuLy8gU3Vic3RpdHV0ZSA2NC1iaXQgdmVyc2lvblxuLy8gV2UgbmVlZCB0aGUgZXh0cmEgcHJlY2lzaW9uIHdoZW4gbXVsdGlwbHlpbmcgbWF0cmljZXMgdy9tZXJjYXRvciBwcm9qZWN0ZWQgdmFsdWVzXG5jb25zdCB2ZWMzID0ge1xuICAgIGZyb21WYWx1ZXMgKHgsIHksIHopIHtcbiAgICAgICAgdmFyIG91dCA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XG4gICAgICAgIG91dFswXSA9IHg7XG4gICAgICAgIG91dFsxXSA9IHk7XG4gICAgICAgIG91dFsyXSA9IHo7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxufTtcblxuXG4vLyBtYXQzXG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQzX25vcm1hbEZyb21NYXQ0fSBmcm9tICdnbC1tYXQzL25vcm1hbC1mcm9tLW1hdDQnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDNfaW52ZXJ0fSBmcm9tICdnbC1tYXQzL2ludmVydCc7XG5cbmNvbnN0IG1hdDMgPSB7XG4gICAgbm9ybWFsRnJvbU1hdDQ6IG1hdDNfbm9ybWFsRnJvbU1hdDQsXG4gICAgaW52ZXJ0OiBtYXQzX2ludmVydFxufTtcblxuXG4vLyBtYXQ0XG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X211bHRpcGx5fSBmcm9tICdnbC1tYXQ0L211bHRpcGx5JztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X3RyYW5zbGF0ZX0gZnJvbSAnZ2wtbWF0NC90cmFuc2xhdGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfc2NhbGV9IGZyb20gJ2dsLW1hdDQvc2NhbGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfcGVyc3BlY3RpdmV9IGZyb20gJ2dsLW1hdDQvcGVyc3BlY3RpdmUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfbG9va0F0fSBmcm9tICdnbC1tYXQ0L2xvb2tBdCc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9pZGVudGl0eX0gZnJvbSAnZ2wtbWF0NC9pZGVudGl0eSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9jb3B5fSBmcm9tICdnbC1tYXQ0L2NvcHknO1xuXG5jb25zdCBtYXQ0ID0ge1xuICAgIG11bHRpcGx5OiBtYXQ0X211bHRpcGx5LFxuICAgIHRyYW5zbGF0ZTogbWF0NF90cmFuc2xhdGUsXG4gICAgc2NhbGU6IG1hdDRfc2NhbGUsXG4gICAgcGVyc3BlY3RpdmU6IG1hdDRfcGVyc3BlY3RpdmUsXG4gICAgbG9va0F0OiBtYXQ0X2xvb2tBdCxcbiAgICBpZGVudGl0eTogbWF0NF9pZGVudGl0eSxcbiAgICBjb3B5OiBtYXQ0X2NvcHlcbn07XG5cblxuZXhwb3J0IHt2ZWMzLCBtYXQzLCBtYXQ0fTtcbiIsImltcG9ydCB2ZXJzaW9uIGZyb20gJy4vdmVyc2lvbic7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi93b3JrZXJfYnJva2VyJztcblxuY29uc3QgTEVWRUxTID0ge1xuICAgIHNpbGVudDogLTEsXG4gICAgZXJyb3I6IDAsXG4gICAgd2FybjogMSxcbiAgICBpbmZvOiAyLFxuICAgIGRlYnVnOiAzLFxuICAgIHRyYWNlOiA0XG59O1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbmZ1bmN0aW9uIG1ldGhvZEZvckxldmVsIChsZXZlbCkge1xuICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgICAgICBtZXRob2RzW2xldmVsXSA9IG1ldGhvZHNbbGV2ZWxdIHx8IChjb25zb2xlW2xldmVsXSA/IGNvbnNvbGVbbGV2ZWxdIDogY29uc29sZS5sb2cpLmJpbmQoY29uc29sZSk7XG4gICAgICAgIHJldHVybiBtZXRob2RzW2xldmVsXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvZyAobXNnX2xldmVsLCAuLi5tc2cpIHtcbiAgICBpZiAoTEVWRUxTW21zZ19sZXZlbF0gPD0gTEVWRUxTW2xvZy5sZXZlbF0pIHtcbiAgICAgICAgaWYgKFRocmVhZC5pc193b3JrZXIpIHtcbiAgICAgICAgICAgIC8vIFByb3h5IHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ19sb2dQcm94eScsIG1zZ19sZXZlbCwgLi4ubXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsb2dnZXIgPSBtZXRob2RGb3JMZXZlbChtc2dfbGV2ZWwpO1xuXG4gICAgICAgICAgICAvLyBXcml0ZSB0byBjb25zb2xlIChvbiBtYWluIHRocmVhZClcbiAgICAgICAgICAgIGlmIChtc2cubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlcihgVGFuZ3JhbSAke3ZlcnNpb259IFske21zZ19sZXZlbH1dOiAke21zZ1swXX1gLCAuLi5tc2cuc2xpY2UoMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyKGBUYW5ncmFtICR7dmVyc2lvbn0gWyR7bXNnX2xldmVsfV06ICR7bXNnWzBdfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5sb2cubGV2ZWwgPSAnaW5mbyc7XG5sb2cud29ya2VycyA9IG51bGw7XG5cbmxvZy5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkge1xuICAgIGxvZy5sZXZlbCA9IGxldmVsO1xuXG4gICAgaWYgKFRocmVhZC5pc19tYWluICYmIEFycmF5LmlzQXJyYXkobG9nLndvcmtlcnMpKSB7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShsb2cud29ya2VycywgJ19sb2dTZXRMZXZlbFByb3h5JywgbGV2ZWwpO1xuICAgIH1cbn07XG5cbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIGxvZy5zZXRXb3JrZXJzID0gZnVuY3Rpb24gKHdvcmtlcnMpIHtcbiAgICAgICAgbG9nLndvcmtlcnMgPSB3b3JrZXJzO1xuICAgIH07XG5cblxufVxuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdfbG9nUHJveHknLCBsb2cpOyAgICAgICAgICAgICAgICAgICAvLyBwcm94eSBsb2cgbWVzc2FnZXMgZnJvbSB3b3JrZXIgdG8gbWFpbiB0aHJlYWRcbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ19sb2dTZXRMZXZlbFByb3h5JywgbG9nLnNldExldmVsKTsgIC8vIHByb3h5IGxvZyBsZXZlbCBzZXR0aW5nIGZyb20gbWFpbiB0byB3b3JrZXIgdGhyZWFkXG4iLCIvKiBnbG9iYWwgTWVkaWFSZWNvcmRlciAqL1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQge2NyZWF0ZU9iamVjdFVSTH0gZnJvbSAnLi91cmxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVkaWFDYXB0dXJlIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUgPSBudWxsO1xuICAgIH1cblxuICAgIHNldENhbnZhcyAoY2FudmFzKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuICAgIH1cblxuICAgIC8vIFRha2UgYSBzY3JlZW5zaG90LCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNjcmVlbnNob3QgZGF0YSB3aGVuIGF2YWlsYWJsZVxuICAgIHNjcmVlbnNob3QgKCkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZV9zY3JlZW5zaG90ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZTsgLy8gb25seSBjYXB0dXJlIG9uZSBzY3JlZW5zaG90IGF0IGEgdGltZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2lsbCByZXNvbHZlIG9uY2UgcmVuZGVyaW5nIGlzIGNvbXBsZXRlIGFuZCByZW5kZXIgYnVmZmVyIGlzIGNhcHR1cmVkXG4gICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdCA9IHt9O1xuICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnByb21pc2U7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIGFmdGVyIHJlbmRlcmluZywgY2FwdHVyZXMgcmVuZGVyIGJ1ZmZlciBhbmQgcmVzb2x2ZXMgcHJvbWlzZSB3aXRoIHRoZSBpbWFnZSBkYXRhXG4gICAgY29tcGxldGVTY3JlZW5zaG90ICgpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWVfc2NyZWVuc2hvdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBHZXQgZGF0YSBVUkwsIGNvbnZlcnQgdG8gYmxvYlxuICAgICAgICAgICAgLy8gU3RyaXAgaG9zdC9taW1ldHlwZS9ldGMuLCBjb252ZXJ0IGJhc2U2NCB0byBiaW5hcnkgd2l0aG91dCBVVEYtOCBtYW5nbGluZ1xuICAgICAgICAgICAgLy8gQWRhcHRlZCBmcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS91bmNvbmVkLzQzNzA4MjJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXRvYih1cmwuc2xpY2UoMjIpKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiAnaW1hZ2UvcG5nJyB9KTtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSB3aXRoIHNjcmVlbnNob3QgZGF0YVxuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlc29sdmUoeyB1cmwsIGJsb2IsIHR5cGU6ICdwbmcnIH0pO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0YXJ0cyBjYXB0dXJpbmcgYSB2aWRlbyBzdHJlYW0gZnJvbSB0aGUgY2FudmFzXG4gICAgc3RhcnRWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5NZWRpYVJlY29yZGVyICE9PSAnZnVuY3Rpb24nIHx8ICF0aGlzLmNhbnZhcyB8fCB0eXBlb2YgdGhpcy5jYW52YXMuY2FwdHVyZVN0cmVhbSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZpZGVvIGNhcHR1cmUgKENhbnZhcy5jYXB0dXJlU3RyZWFtIGFuZC9vciBNZWRpYVJlY29yZGVyIEFQSXMpIG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3NlcicpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmlkZW9fY2FwdHVyZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZpZGVvIGNhcHR1cmUgYWxyZWFkeSBpbiBwcm9ncmVzcywgY2FsbCBTY2VuZS5zdG9wVmlkZW9DYXB0dXJlKCkgZmlyc3QnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IGEgbmV3IGNhcHR1cmVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjYXAgPSB0aGlzLnZpZGVvX2NhcHR1cmUgPSB7fTtcbiAgICAgICAgICAgIGNhcC5jaHVua3MgPSBbXTtcbiAgICAgICAgICAgIGNhcC5zdHJlYW0gPSB0aGlzLmNhbnZhcy5jYXB0dXJlU3RyZWFtKCk7XG4gICAgICAgICAgICBjYXAub3B0aW9ucyA9IHsgbWltZVR5cGU6ICd2aWRlby93ZWJtJyB9OyAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIGZvcm1hdCBvcHRpb25zXG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlcihjYXAuc3RyZWFtLCBjYXAub3B0aW9ucyk7XG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICBjYXAuY2h1bmtzLnB1c2goZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RvcHBlZCByZWNvcmRpbmc/IENyZWF0ZSB0aGUgZmluYWwgY2FwdHVyZSBmaWxlIGJsb2JcbiAgICAgICAgICAgICAgICBpZiAoY2FwLnJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJsb2IgPSBuZXcgQmxvYihjYXAuY2h1bmtzLCB7IHR5cGU6IGNhcC5vcHRpb25zLm1pbWVUeXBlIH0pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgcmVtb3ZlIGFsbCBzdHJlYW0gdHJhY2tzLCBhbmQgc2V0IG9iamVjdHMgdG8gbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FwLnN0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYWNrcyA9IGNhcC5zdHJlYW0uZ2V0VHJhY2tzKCkgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja3MuZm9yRWFjaCh0cmFjayA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2suc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcC5zdHJlYW0ucmVtb3ZlVHJhY2sodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FwLnN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGNhcC5tZWRpYV9yZWNvcmRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FwLnJlc29sdmUoeyB1cmwsIGJsb2IsIHR5cGU6ICd3ZWJtJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FwLm1lZGlhX3JlY29yZGVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgJ1NjZW5lIHZpZGVvIGNhcHR1cmUgZmFpbGVkJywgZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU3RvcHMgY2FwdHVyaW5nIGEgdmlkZW8gc3RyZWFtIGZyb20gdGhlIGNhbnZhcywgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2aWRlbyB3aGVuIGF2YWlsYWJsZVxuICAgIHN0b3BWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9fY2FwdHVyZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ05vIHNjZW5lIHZpZGVvIGNhcHR1cmUgaW4gcHJvZ3Jlc3MsIGNhbGwgU2NlbmUuc3RhcnRWaWRlb0NhcHR1cmUoKSBmaXJzdCcpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIHdoZW4gZmluYWwgc3RyZWFtIGlzIGF2YWlsYWJsZVxuICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0b3AgcmVjb3JkaW5nXG4gICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5tZWRpYV9yZWNvcmRlci5zdG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW9fY2FwdHVyZS5wcm9taXNlO1xuICAgIH1cblxufVxuIiwiLy8gRGVlcC9yZWN1cnNpdmUgbWVyZ2Ugb2Ygb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgaW50byBhIGRlc3RpbmF0aW9uIG9iamVjdFxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VPYmplY3RzIChkZXN0LCAuLi5zb3VyY2VzKSB7XG4gICAgZm9yIChsZXQgcz0wOyBzIDwgc291cmNlcy5sZW5ndGg7IHMrKykge1xuICAgICAgICBsZXQgc291cmNlID0gc291cmNlc1tzXTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2UgdGhlIHNvdXJjZSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBpZiBpdCBpcyBhIGEgbm9uLW51bGwga2V5L3ZhbHVlIG9iamVjdFxuICAgICAgICAgICAgLy8gKGUuZy4gZG9uJ3QgbWVyZ2UgYXJyYXlzLCB0aG9zZSBhcmUgdHJlYXRlZCBhcyBzY2FsYXIgdmFsdWVzOyBudWxsIHZhbHVlcyB3aWxsIG92ZXJ3cml0ZS9lcmFzZVxuICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzIGRlc3RpbmF0aW9uIHZhbHVlKVxuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3Rba2V5XSAhPT0gbnVsbCAmJiB0eXBlb2YgZGVzdFtrZXldID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkZXN0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IG1lcmdlT2JqZWN0cyhkZXN0W2tleV0sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IG1lcmdlT2JqZWN0cyh7fSwgdmFsdWUpOyAvLyBkZXN0aW5hdGlvbiBub3QgYW4gb2JqZWN0LCBvdmVyd3JpdGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIHByZXZpb3VzIGRlc3RpbmF0aW9uIHZhbHVlIGlmIHRoZSBzb3VyY2UgcHJvcGVydHkgaXM6IGEgc2NhbGFyIChudW1iZXIvc3RyaW5nKSxcbiAgICAgICAgICAgIC8vIGFuIGFycmF5LCBvciBhIG51bGwgdmFsdWVcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZXN0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVuZGVmaW5lZCBzb3VyY2UgcHJvcGVydGllcyBhcmUgaWdub3JlZFxuICAgICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59XG4iLCJpbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9CQiB7XG5cbiAgICBjb25zdHJ1Y3RvciAoeCwgeSwgYSwgdywgaCkge1xuICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IFt3LCBoXTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGE7XG4gICAgICAgIHRoaXMuY2VudHJvaWQgPSBbeCwgeV07XG4gICAgICAgIHRoaXMucXVhZCA9IFtdO1xuICAgICAgICB0aGlzLmF4ZXMgPSBbXTtcblxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIG1vdmUgKHB4LCBweSkge1xuICAgIFx0dGhpcy5jZW50cm9pZCA9IFtweCwgcHldO1xuXG4gICAgXHR0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGdldEV4dGVudCAoKSB7XG4gICAgXHRsZXQgaW5mID0gMWU2O1xuICAgIFx0bGV0IGFhYmIgPSBbaW5mLCBpbmYsIC1pbmYsIC1pbmZdO1xuXG4gICAgXHRmb3IgKGxldCBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgYWFiYlswXSA9IE1hdGgubWluKHRoaXMucXVhZFtpXVswXSwgYWFiYlswXSk7XG4gICAgICAgICAgICBhYWJiWzFdID0gTWF0aC5taW4odGhpcy5xdWFkW2ldWzFdLCBhYWJiWzFdKTtcbiAgICAgICAgICAgIGFhYmJbMl0gPSBNYXRoLm1heCh0aGlzLnF1YWRbaV1bMF0sIGFhYmJbMl0pO1xuICAgICAgICAgICAgYWFiYlszXSA9IE1hdGgubWF4KHRoaXMucXVhZFtpXVsxXSwgYWFiYlszXSk7XG4gICAgXHR9XG5cbiAgICBcdHJldHVybiBhYWJiO1xuICAgIH1cblxuICAgIHBlcnBBeGVzICgpIHtcbiAgICBcdHRoaXMuYXhlc1swXSA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnN1Yih0aGlzLnF1YWRbMl0sIHRoaXMucXVhZFszXSkpO1xuICAgIFx0dGhpcy5heGVzWzFdID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3Iuc3ViKHRoaXMucXVhZFsyXSwgdGhpcy5xdWFkWzFdKSk7XG4gICAgfVxuXG4gICAgdXBkYXRlICgpIHtcbiAgICBcdGxldCB4ID0gWyBNYXRoLmNvcyh0aGlzLmFuZ2xlKSwgTWF0aC5zaW4odGhpcy5hbmdsZSldO1xuICAgIFx0bGV0IHkgPSBbLU1hdGguc2luKHRoaXMuYW5nbGUpLCBNYXRoLmNvcyh0aGlzLmFuZ2xlKV07XG5cbiAgICBcdHggPSBWZWN0b3IubXVsdCh4LCB0aGlzLmRpbWVuc2lvblswXSAvIDIuMCk7XG4gICAgXHR5ID0gVmVjdG9yLm11bHQoeSwgdGhpcy5kaW1lbnNpb25bMV0gLyAyLjApO1xuXG4gICAgXHR0aGlzLnF1YWRbMF0gPSBWZWN0b3Iuc3ViKFZlY3Rvci5zdWIodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyBsb3dlci1sZWZ0XG4gICAgXHR0aGlzLnF1YWRbMV0gPSBWZWN0b3Iuc3ViKFZlY3Rvci5hZGQodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyBsb3dlci1yaWdodFxuICAgIFx0dGhpcy5xdWFkWzJdID0gVmVjdG9yLmFkZChWZWN0b3IuYWRkKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gdXBlci1yaWdodFxuICAgIFx0dGhpcy5xdWFkWzNdID0gVmVjdG9yLmFkZChWZWN0b3Iuc3ViKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gdXBlci1sZWZ0XG5cbiAgICBcdHRoaXMucGVycEF4ZXMoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcHJvamVjdFRvQXhpcyAob2JiLCBheGlzKSB7XG4gICAgXHRsZXQgaW5mID0gMWU2O1xuICAgIFx0bGV0IG1pbiA9IGluZjtcbiAgICBcdGxldCBtYXggPSAtaW5mO1xuXG4gICAgXHRsZXQgcXVhZCA9IG9iYi5xdWFkO1xuXG4gICAgXHQvLyBmb3IgZWFjaCBheGlzLCBwcm9qZWN0IG9iYiBxdWFkIHRvIGl0IGFuZCBmaW5kIG1pbiBhbmQgbWF4IHZhbHVlc1xuICAgIFx0Zm9yIChsZXQgaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgICAgIGxldCBkID0gIFZlY3Rvci5kb3QocXVhZFtpXSwgYXhpcyk7XG4gICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIGQpO1xuICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBkKTtcbiAgICBcdH1cblxuICAgIFx0cmV0dXJuIFttaW4sIG1heF07XG4gICAgfVxuXG4gICAgc3RhdGljIGF4aXNDb2xsaWRlIChvYmJfYSwgb2JiX2IsIGF4ZXMpIHtcbiAgICBcdGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgXHRcdGxldCBhX3Byb2ogPSBPQkIucHJvamVjdFRvQXhpcyhvYmJfYSwgYXhlc1tpXSk7XG4gICAgXHRcdGxldCBiX3Byb2ogPSBPQkIucHJvamVjdFRvQXhpcyhvYmJfYiwgYXhlc1tpXSk7XG5cbiAgICBcdFx0aWYgKGJfcHJvalswXSA+IGFfcHJvalsxXSB8fCBiX3Byb2pbMV0gPCBhX3Byb2pbMF0pIHtcbiAgICBcdFx0XHRyZXR1cm4gZmFsc2U7XG4gICAgXHRcdH1cbiAgICBcdH1cbiAgICBcdHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcnNlY3Qob2JiX2EsIG9iYl9iKSB7XG4gICAgXHRyZXR1cm4gT0JCLmF4aXNDb2xsaWRlKG9iYl9hLCBvYmJfYiwgb2JiX2EuYXhlcykgJiYgT0JCLmF4aXNDb2xsaWRlKG9iYl9hLCBvYmJfYiwgb2JiX2IuYXhlcyk7XG4gICAgfVxuXG59XG5cbiIsIi8vIFByb21pc2VzIHBvbHlmaWxsXG5pbXBvcnQgJ2NvcmUtanMvZXM2L3Byb21pc2UnO1xuXG4vLyBPYmplY3QuYXNzaWduIHBvbHlmaWxsXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICBPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICAgICAgLy8gV2UgbXVzdCBjaGVjayBhZ2FpbnN0IHRoZXNlIHNwZWNpZmljIGNhc2VzLlxuICAgICAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkobmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH0pKCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdWJzY3JpYmVNaXhpbiAodGFyZ2V0KSB7XG5cbiAgICBsZXQgbGlzdGVuZXJzID0gW107XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcblxuICAgICAgICBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHVuc3Vic2NyaWJlQWxsKCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzID0gW107XG4gICAgICAgIH0sXG5cbiAgICAgICAgdHJpZ2dlcihldmVudCwgLi4uZGF0YSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJbZXZlbnRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyW2V2ZW50XSguLi5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBoYXNTdWJzY3JpYmVyc0ZvcihldmVudCkge1xuICAgICAgICAgICAgbGV0IGhhcyA9IGZhbHNlO1xuICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJbZXZlbnRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gaGFzO1xuICAgICAgICB9XG5cbiAgICB9KTtcblxufVxuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuLy8gTWFyayB0aHJlYWQgYXMgbWFpbiBvciB3b3JrZXJcbmNvbnN0IFRocmVhZCA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBUaHJlYWQ7XG5cbnRyeSB7XG4gICAgaWYgKHdpbmRvdy5kb2N1bWVudCAhPT0gSFRNTERvY3VtZW50KSB7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICBUaHJlYWQuaXNfd29ya2VyID0gZmFsc2U7XG4gICAgICAgIFRocmVhZC5pc19tYWluICAgPSB0cnVlO1xuICAgIH1cbn1cbmNhdGNoIChlKSB7XG4gICAgaWYgKHNlbGYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBUaHJlYWQuaXNfd29ya2VyID0gdHJ1ZTtcbiAgICAgICAgVGhyZWFkLmlzX21haW4gICA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFBhdGNoIGZvciAzcmQgcGFydHkgbGlicyB0aGF0IHJlcXVpcmUgdGhlc2UgZ2xvYmFscyB0byBiZSBwcmVzZW50LiBTcGVjaWZpY2FsbHksIEZvbnRGYWNlT2JzZXJ2ZXIuXG4gICAgICAgIC8vIEJyaXR0bGUgc29sdXRpb24gYnV0IGFsbG93cyB0aGF0IGxpYnJhcnkgdG8gbG9hZCBvbiB3b3JrZXIgdGhyZWFkcy5cbiAgICAgICAgc2VsZi53aW5kb3cgPSB7IGRvY3VtZW50OiB7fSB9O1xuICAgICAgICBzZWxmLmRvY3VtZW50ID0gc2VsZi53aW5kb3cuZG9jdW1lbnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5cbi8vIEFkZCBhIGJhc2UgVVJMIGZvciBzY2hlbWVsZXNzIG9yIHByb3RvY29sLWxlc3MgVVJMc1xuLy8gRGVmYXVsdHMgdG8gYWRkaW5nIGN1cnJlbnQgd2luZG93IHByb3RvY29sIGFuZCBiYXNlLCBvciBhZGRzIGEgY3VzdG9tIGJhc2UgaWYgc3BlY2lmaWVkXG4vLyBNYXliZSB1c2UgaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9VUkkuanMgaWYgbW9yZSByb2J1c3QgZnVuY3Rpb25hbGl0eSBpcyBuZWVkZWRcbmV4cG9ydCBmdW5jdGlvbiBhZGRCYXNlVVJMICh1cmwsIGJhc2UpIHtcbiAgICBpZiAoIXVybCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2NoZW1lbGVzcywgYWRkIHByb3RvY29sXG4gICAgaWYgKHVybC5zdWJzdHIoMCwgMikgPT09ICcvLycpIHtcbiAgICAgICAgdXJsID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgdXJsO1xuICAgIH1cbiAgICAvLyBObyBodHRwKHMpIG9yIGRhdGEsIGFkZCBiYXNlXG4gICAgZWxzZSBpZiAodXJsLnNlYXJjaCgvXihodHRwfGh0dHBzfGRhdGF8YmxvYik6LykgPCAwKSB7XG4gICAgICAgIHZhciByZWxhdGl2ZSA9ICh1cmxbMF0gIT09ICcvJyk7XG4gICAgICAgIHZhciBiYXNlX2luZm87XG4gICAgICAgIGlmIChiYXNlKSB7XG4gICAgICAgICAgICBiYXNlX2luZm8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7IC8vIHVzZSBhIHRlbXBvcmFyeSBlbGVtZW50IHRvIHBhcnNlIFVSTFxuICAgICAgICAgICAgYmFzZV9pbmZvLmhyZWYgPSBiYXNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYmFzZV9pbmZvID0gd2luZG93LmxvY2F0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbGF0aXZlKSB7XG4gICAgICAgICAgICBsZXQgcGF0aCA9IHBhdGhGb3JVUkwoYmFzZV9pbmZvLmhyZWYpO1xuICAgICAgICAgICAgdXJsID0gcGF0aCArIHVybDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEVhc3kgd2F5XG4gICAgICAgICAgICBpZiAoYmFzZV9pbmZvLm9yaWdpbikge1xuICAgICAgICAgICAgICAgIHVybCA9IGJhc2VfaW5mby5vcmlnaW4gKyAnLycgKyB1cmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIYXJkIHdheSAoSUUxMSlcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBvcmlnaW4gPSB1cmwubWF0Y2goL14oKGh0dHB8aHR0cHN8ZGF0YXxibG9iKTpcXC9cXC9bXlxcL10qXFwvKS8pO1xuICAgICAgICAgICAgICAgIG9yaWdpbiA9IChvcmlnaW4gJiYgb3JpZ2luLmxlbmd0aCA+IDEpID8gb3JpZ2luWzBdIDogJyc7XG4gICAgICAgICAgICAgICAgdXJsID0gb3JpZ2luICsgdXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoRm9yVVJMICh1cmwpIHtcbiAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLnNlYXJjaCgvXihkYXRhfGJsb2IpOi8pID09PSAtMSkge1xuICAgICAgICBsZXQgcXMgPSB1cmwuaW5kZXhPZignPycpO1xuICAgICAgICBpZiAocXMgPiAtMSkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cigwLCBxcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGFzaCA9IHVybC5pbmRleE9mKCcjJyk7XG4gICAgICAgIGlmIChoYXNoID4gLTEpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgaGFzaCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXJsLnN1YnN0cigwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpIHx8ICcnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbnNpb25Gb3JVUkwgKHVybCkge1xuICAgIHVybCA9IHVybC5zcGxpdCgnLycpLnBvcCgpO1xuICAgIGxldCBsYXN0X2RvdCA9IHVybC5sYXN0SW5kZXhPZignLicpO1xuICAgIGlmIChsYXN0X2RvdCA+IC0xKSB7XG4gICAgICAgIHJldHVybiB1cmwuc3Vic3RyaW5nKGxhc3RfZG90ICsgMSk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWxhdGl2ZVVSTCAodXJsKSB7XG4gICAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuICEodXJsLnNlYXJjaCgvXihodHRwfGh0dHBzfGRhdGF8YmxvYik6LykgPiAtMSB8fCB1cmwuc3Vic3RyKDAsIDIpID09PSAnLy8nKTtcbn1cblxuLy8gUmVzb2x2ZXMgJy4vJyBhbmQgJy4uLycgY29tcG9uZW50cyBmcm9tIHJlbGF0aXZlIHBhdGgsIHRvIGdldCBhIFwiZmxhdHRlbmVkXCIgcGF0aFxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5SZWxhdGl2ZVVSTCAodXJsKSB7XG4gICAgbGV0IGRpcnMgPSAodXJsIHx8ICcnKS5zcGxpdCgnLycpO1xuICAgIGZvciAobGV0IGQgPSAxOyBkIDwgZGlycy5sZW5ndGg7IGQrKykge1xuICAgICAgICBpZiAoZGlyc1tkXSA9PT0gJy4nKSB7XG4gICAgICAgICAgICBkaXJzLnNwbGljZShkLCAxKTtcbiAgICAgICAgICAgIGQtLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkaXJzW2RdID09PSAnLi4nKSB7XG4gICAgICAgICAgICBkID0gZCArIDA7XG4gICAgICAgICAgICBkaXJzLnNwbGljZShkLTEsIDIpO1xuICAgICAgICAgICAgZC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaXJzLmpvaW4oJy8nKTtcbn1cblxuLy8gQWRkIGEgc2V0IG9mIHF1ZXJ5IHN0cmluZyBwYXJhbXMgdG8gYSBVUkxcbi8vIHBhcmFtczogaGFzaCBvZiBrZXkvdmFsdWUgcGFpcnMgb2YgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnNcbmV4cG9ydCBmdW5jdGlvbiBhZGRQYXJhbXNUb1VSTCAodXJsLCBwYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcyB8fCBPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cblxuICAgIHZhciBxc19pbmRleCA9IHVybC5pbmRleE9mKCc/Jyk7XG4gICAgdmFyIGhhc2hfaW5kZXggPSB1cmwuaW5kZXhPZignIycpO1xuXG4gICAgLy8gU2F2ZSBhbmQgdHJpbSBoYXNoXG4gICAgdmFyIGhhc2ggPSAnJztcbiAgICBpZiAoaGFzaF9pbmRleCA+IC0xKSB7XG4gICAgICAgIGhhc2ggPSB1cmwuc2xpY2UoaGFzaF9pbmRleCk7XG4gICAgICAgIHVybCA9IHVybC5zbGljZSgwLCBoYXNoX2luZGV4KTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBxdWVyeSBzdHJpbmdcbiAgICBpZiAocXNfaW5kZXggPT09IC0xKSB7XG4gICAgICAgIHFzX2luZGV4ID0gdXJsLmxlbmd0aDtcbiAgICAgICAgdXJsICs9ICc/JztcbiAgICB9XG4gICAgcXNfaW5kZXgrKzsgLy8gYWR2YW5jZWQgcGFzdCAnPydcblxuICAgIC8vIEJ1aWxkIHF1ZXJ5IHN0cmluZyBwYXJhbXNcbiAgICB2YXIgdXJsX3BhcmFtcyA9ICcnO1xuICAgIGZvciAodmFyIHAgaW4gcGFyYW1zKSB7XG4gICAgICAgIHVybF9wYXJhbXMgKz0gYCR7cH09JHtwYXJhbXNbcF19JmA7XG4gICAgfVxuXG4gICAgLy8gSW5zZXJ0IG5ldyBxdWVyeSBzdHJpbmcgcGFyYW1zIGFuZCByZXN0b3JlIGhhc2hcbiAgICAvLyBOT1RFOiBkb2Vzbid0IHJlcGxhY2UgYW55IHZhbHVlcyBhbHJlYWR5IHByZXNlbnQgb24gcXVlcnkgc3RyaW5nLCBqdXN0IGluc2VydHMgZHVwZSB2YWx1ZXNcbiAgICB1cmwgPSB1cmwuc2xpY2UoMCwgcXNfaW5kZXgpICsgdXJsX3BhcmFtcyArIHVybC5zbGljZShxc19pbmRleCkgKyBoYXNoO1xuXG4gICAgcmV0dXJuIHVybDtcbn1cblxuLy8gUG9seWZpbGwgKGZvciBTYWZhcmkgY29tcGF0aWJpbGl0eSlcbmxldCBfY3JlYXRlT2JqZWN0VVJMO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTCAodXJsKSB7XG4gICAgaWYgKF9jcmVhdGVPYmplY3RVUkwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBfY3JlYXRlT2JqZWN0VVJMID0gKHdpbmRvdy5VUkwgJiYgd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwpIHx8ICh3aW5kb3cud2Via2l0VVJMICYmIHdpbmRvdy53ZWJraXRVUkwuY3JlYXRlT2JqZWN0VVJMKTtcblxuICAgICAgICBpZiAodHlwZW9mIF9jcmVhdGVPYmplY3RVUkwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIF9jcmVhdGVPYmplY3RVUkwgPSBudWxsO1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMIChvciB2ZW5kb3IgcHJlZml4KSBub3QgZm91bmQsIHVuYWJsZSB0byBjcmVhdGUgbG9jYWwgYmxvYiBVUkxzYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoX2NyZWF0ZU9iamVjdFVSTCkge1xuICAgICAgICByZXR1cm4gX2NyZWF0ZU9iamVjdFVSTCh1cmwpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG59XG5cbi8vIEdldCBVUkwgdGhhdCB0aGUgY3VycmVudCBzY3JpcHQgd2FzIGxvYWRlZCBmcm9tXG4vLyBJZiBjdXJyZW50U2NyaXB0IGlzIG5vdCBhdmFpbGFibGUsIGxvb3BzIHRocm91Z2ggPHNjcmlwdD4gZWxlbWVudHMgc2VhcmNoaW5nIGZvciBhIGxpc3Qgb2YgcHJvdmlkZWQgcGF0aHNcbi8vIGUuZy4gZmluZEN1cnJlbnRVUkwoJ3RhbmdyYW0uZGVidWcuanMnLCAndGFuZ3JhbS5taW4uanMnKTtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ3VycmVudFVSTCAoLi4ucGF0aHMpIHtcbiAgICAvLyBGaW5kIGN1cnJlbnRseSBleGVjdXRpbmcgc2NyaXB0XG4gICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQ7XG4gICAgaWYgKHNjcmlwdCkge1xuICAgICAgICByZXR1cm4gc2NyaXB0LnNyYztcbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXRocykpIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgb24gbG9vcGluZyB0aHJvdWdoIDxzY3JpcHQ+IGVsZW1lbnRzIGlmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgaXMgbm90IHN1cHBvcnRlZFxuICAgICAgICB2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcbiAgICAgICAgZm9yICh2YXIgcz0wOyBzIDwgc2NyaXB0cy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgcGF0aHMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0c1tzXS5zcmMuaW5kZXhPZihwYXRoc1twXSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHRzW3NdLnNyYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvLyBNaXNjZWxsYW5lb3VzIHV0aWxpdGllc1xuLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuaW1wb3J0IFRocmVhZCBmcm9tICcuL3RocmVhZCc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG52YXIgVXRpbHM7XG5leHBvcnQgZGVmYXVsdCBVdGlscyA9IHt9O1xuXG4vLyBCYXNpYyBTYWZhcmkgZGV0ZWN0aW9uXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc5NDQ0NjAvZGV0ZWN0LXNhZmFyaS1icm93c2VyXG5VdGlscy5pc1NhZmFyaSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbn07XG5cblV0aWxzLmlvID0gZnVuY3Rpb24gKHVybCwgdGltZW91dCA9IDYwMDAwLCByZXNwb25zZVR5cGUgPSAndGV4dCcsIG1ldGhvZCA9ICdHRVQnLCBoZWFkZXJzID0ge30pIHtcbiAgICB2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXF1ZXN0Lm9wZW4obWV0aG9kLCB1cmwsIHRydWUpO1xuICAgICAgICByZXF1ZXN0LnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTtcbiAgICAgICAgcmVxdWVzdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgIGlmIChbJ3RleHQnLCAnanNvbiddLmluZGV4T2YocmVxdWVzdC5yZXNwb25zZVR5cGUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKCdSZXF1ZXN0IGVycm9yIHdpdGggYSBzdGF0dXMgb2YgJyArIHJlcXVlc3Quc3RhdHVzVGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZ0KSA9PiB7XG4gICAgICAgICAgICByZWplY3QoRXJyb3IoJ1RoZXJlIHdhcyBhIG5ldHdvcmsgZXJyb3InICsgZXZ0LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdC5vbnRpbWVvdXQgPSAoZXZ0KSA9PiB7XG4gICAgICAgICAgICByZWplY3QoRXJyb3IoJ3RpbWVvdXQgJysgZXZ0LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdC5zZW5kKCk7XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvbWlzZSwgJ3JlcXVlc3QnLCB7XG4gICAgICAgIHZhbHVlOiByZXF1ZXN0XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbn07XG5cblV0aWxzLnBhcnNlUmVzb3VyY2UgPSBmdW5jdGlvbiAoYm9keSkge1xuICAgIHZhciBkYXRhO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGpzeWFtbCAnanNvbicgb3B0aW9uIGFsbG93cyBkdXBsaWNhdGUga2V5c1xuICAgICAgICAvLyBLZWVwaW5nIHRoaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgc2hvdWxkIGNvbnNpZGVyIG1pZ3JhdGluZyB0byByZXF1aXJpbmdcbiAgICAgICAgLy8gdW5pcXVlIGtleXMsIGFzIHRoaXMgaXMgWUFNTCBzcGVjLiBCdXQgVGFuZ3JhbSBFUyBjdXJyZW50bHkgYWNjZXB0cyBkdXBlIGtleXMgYXMgd2VsbCxcbiAgICAgICAgLy8gc28gc2hvdWxkIGNvbnNpZGVyIGhvdyBiZXN0IHRvIHVuaWZ5LlxuICAgICAgICBkYXRhID0geWFtbC5zYWZlTG9hZChib2R5LCB7IGpzb246IHRydWUgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbn07XG5cblV0aWxzLmxvYWRSZXNvdXJjZSA9IGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIFV0aWxzLmlvKHNvdXJjZSkudGhlbigoYm9keSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gVXRpbHMucGFyc2VSZXNvdXJjZShib2R5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUoc291cmNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuLy8gTmVlZGVkIGZvciBvbGRlciBicm93c2VycyB0aGF0IHN0aWxsIHN1cHBvcnQgV2ViR0wgKFNhZmFyaSA2IGV0Yy4pXG5VdGlscy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9XG4gICAgICAgICAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgICAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgIHx8XG4gICAgICAgICAgICB3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSAgICAgIHx8XG4gICAgICAgICAgICB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgICAgIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNiLCAxMDAwIC82MCk7XG4gICAgICAgICAgICB9O1xuICAgIH1cbn07XG5cbi8vIFN0cmluZ2lmeSBhbiBvYmplY3QgaW50byBKU09OLCBidXQgY29udmVydCBmdW5jdGlvbnMgdG8gc3RyaW5nc1xuVXRpbHMuc2VyaWFsaXplV2l0aEZ1bmN0aW9ucyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KG9iaiwgZnVuY3Rpb24oaywgdikge1xuICAgICAgICAvLyBDb252ZXJ0IGZ1bmN0aW9ucyB0byBzdHJpbmdzXG4gICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcbiAgICB9KTtcblxuICAgIHJldHVybiBzZXJpYWxpemVkO1xufTtcblxuLy8gUmVjdXJzaXZlbHkgcGFyc2UgYW4gb2JqZWN0LCBhdHRlbXB0aW5nIHRvIGNvbnZlcnQgc3RyaW5nIHByb3BlcnRpZXMgdGhhdCBsb29rIGxpa2UgZnVuY3Rpb25zIGJhY2sgaW50byBmdW5jdGlvbnNcblV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyA9IGZ1bmN0aW9uKG9iaiwgd3JhcCkge1xuICAgIC8vIENvbnZlcnQgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG9iaiA9IFV0aWxzLnN0cmluZ1RvRnVuY3Rpb24ob2JqLCB3cmFwKTtcbiAgICB9XG4gICAgLy8gTG9vcCB0aHJvdWdoIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgZWxzZSBpZiAob2JqICE9IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChsZXQgcCBpbiBvYmopIHtcbiAgICAgICAgICAgIG9ialtwXSA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhvYmpbcF0sIHdyYXApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59O1xuXG4vLyBDb252ZXJ0IHN0cmluZyBiYWNrIGludG8gYSBmdW5jdGlvblxuVXRpbHMuc3RyaW5nVG9GdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbCwgd3JhcCkge1xuICAgIC8vIFBhcnNlIGZ1bmN0aW9uIHNpZ25hdHVyZSBhbmQgYm9keVxuICAgIGxldCBmbWF0Y2ggPVxuICAgICAgICAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgIHZhbC5tYXRjaCgvXlxccypmdW5jdGlvblteKF0qXFwoKFteKV0qKVxcKVxccyo/XFx7KFtcXHNcXFNdKilcXH0kL20pO1xuXG4gICAgaWYgKGZtYXRjaCAmJiBmbWF0Y2gubGVuZ3RoID4gMikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHNyYyA9IGZtYXRjaFsyXTtcbiAgICAgICAgICAgIGxldCBhcmdzID0gZm1hdGNoWzFdLmxlbmd0aCA+IDAgJiYgZm1hdGNoWzFdLnNwbGl0KCcsJykubWFwKHggPT4geC50cmltKCkpLmZpbHRlcih4ID0+IHgpO1xuICAgICAgICAgICAgYXJncyA9IGFyZ3MubGVuZ3RoID4gMCA/IGFyZ3MgOiBbJ2NvbnRleHQnXTsgLy8gZGVmYXVsdCB0byBzaW5nbGUgJ2NvbnRleHQnIGFyZ3VtZW50XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd3JhcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oLi4uYXJncywgd3JhcChzcmMpKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKC4uLmFyZ3MsIHNyYyk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBmYWxsLWJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgaWYgcGFyc2luZyBmYWlsZWRcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn07XG5cbi8vIERlZmF1bHQgdG8gYWxsb3dpbmcgaGlnaCBwaXhlbCBkZW5zaXR5XG4vLyBSZXR1cm5zIHRydWUgaWYgZGlzcGxheSBkZW5zaXR5IGNoYW5nZWRcblV0aWxzLnVzZV9oaWdoX2RlbnNpdHlfZGlzcGxheSA9IHRydWU7XG5VdGlscy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCBwcmV2ID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyA9IChVdGlscy51c2VfaGlnaF9kZW5zaXR5X2Rpc3BsYXkgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8pIHx8IDE7XG4gICAgcmV0dXJuIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAhPT0gcHJldjtcbn07XG5cbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIFV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8oKTtcbn1cblxuLy8gVXNlZCBmb3IgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gcG93ZXItb2YtMiBhbmQgbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXNcbi8vIFZpYTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTcyMjI0Ny93ZWJnbC13YWl0LWZvci10ZXh0dXJlLXRvLWxvYWRcblV0aWxzLmlzUG93ZXJPZjIgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgJiAodmFsdWUgLSAxKSkgPT09IDA7XG59O1xuXG4vLyBJbnRlcnBvbGF0ZSAneCcgYWxvbmcgYSBzZXJpZXMgb2YgY29udHJvbCBwb2ludHNcbi8vICdwb2ludHMnIGlzIGFuIGFycmF5IG9mIGNvbnRyb2wgcG9pbnRzIGluIHRoZSBmb3JtIFt4LCB5XVxuLy9cbi8vIEV4YW1wbGU6XG4vLyAgICAgQ29udHJvbCBwb2ludHM6XG4vLyAgICAgICAgIFswLCA1XTogIHdoZW4geD0wLCB5PTVcbi8vICAgICAgICAgWzQsIDEwXTogd2hlbiB4PTQsIHk9MTBcbi8vXG4vLyAgICAgVXRpbHMuaW50ZXJwb2xhdGUoMiwgW1swLCA1XSwgWzQsIDEwXV0pO1xuLy8gICAgIC0+IGNvbXB1dGVzIHg9MiwgaGFsZndheSBiZXR3ZWVuIHg9MCBhbmQgeD00OiAoMTAgLSA1KSAvIDIgKzVcbi8vICAgICAtPiByZXR1cm5zIDcuNVxuLy9cbi8vIFRPRE86IGFkZCBvdGhlciBpbnRlcnBvbGF0aW9uIG1ldGhvZHMgYmVzaWRlcyBsaW5lYXJcbi8vXG5VdGlscy5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHgsIHBvaW50cywgdHJhbnNmb3JtKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHJlc2VtYmxlIGEgbGlzdCBvZiBjb250cm9sIHBvaW50cywganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHZhbHVlXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBvaW50cykgfHwgIUFycmF5LmlzQXJyYXkocG9pbnRzWzBdKSkge1xuICAgICAgICByZXR1cm4gcG9pbnRzO1xuICAgIH1cbiAgICBlbHNlIGlmIChwb2ludHMubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gcG9pbnRzO1xuICAgIH1cblxuICAgIHZhciB4MSwgeDIsIGQsIHksIHkxLCB5MjtcblxuICAgIC8vIE1pbiBib3VuZHNcbiAgICBpZiAoeCA8PSBwb2ludHNbMF1bMF0pIHtcbiAgICAgICAgeSA9IHBvaW50c1swXVsxXTtcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHkgPSB0cmFuc2Zvcm0oeSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTWF4IGJvdW5kc1xuICAgIGVsc2UgaWYgKHggPj0gcG9pbnRzW3BvaW50cy5sZW5ndGgtMV1bMF0pIHtcbiAgICAgICAgeSA9IHBvaW50c1twb2ludHMubGVuZ3RoLTFdWzFdO1xuICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgeSA9IHRyYW5zZm9ybSh5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBGaW5kIHdoaWNoIGNvbnRyb2wgcG9pbnRzIHggaXMgYmV0d2VlblxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpPTA7IGkgPCBwb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoeCA+PSBwb2ludHNbaV1bMF0gJiYgeCA8IHBvaW50c1tpKzFdWzBdKSB7XG4gICAgICAgICAgICAgICAgLy8gTGluZWFyIGludGVycG9sYXRpb25cbiAgICAgICAgICAgICAgICB4MSA9IHBvaW50c1tpXVswXTtcbiAgICAgICAgICAgICAgICB4MiA9IHBvaW50c1tpKzFdWzBdO1xuXG4gICAgICAgICAgICAgICAgLy8gTXVsdGlwbGUgdmFsdWVzXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocG9pbnRzW2ldWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICB5ID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGM9MDsgYyA8IHBvaW50c1tpXVsxXS5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MSA9IHRyYW5zZm9ybShwb2ludHNbaV1bMV1bY10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyID0gdHJhbnNmb3JtKHBvaW50c1tpKzFdWzFdW2NdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0geTIgLSB5MTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5W2NdID0gZCAqICh4IC0geDEpIC8gKHgyIC0geDEpICsgeTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gcG9pbnRzW2krMV1bMV1bY10gLSBwb2ludHNbaV1bMV1bY107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeVtjXSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHBvaW50c1tpXVsxXVtjXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTaW5nbGUgdmFsdWVcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkxID0gdHJhbnNmb3JtKHBvaW50c1tpXVsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5MiA9IHRyYW5zZm9ybShwb2ludHNbaSsxXVsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkID0geTIgLSB5MTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBkICogKHggLSB4MSkgLyAoeDIgLSB4MSkgKyB5MTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBwb2ludHNbaSsxXVsxXSAtIHBvaW50c1tpXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBkICogKHggLSB4MSkgLyAoeDIgLSB4MSkgKyBwb2ludHNbaV1bMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHk7XG59O1xuXG5VdGlscy50b0NTU0NvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgaWYgKGNvbG9yWzNdID09PSAxKSB7IC8vIGZ1bGwgb3BhY2l0eVxuICAgICAgICByZXR1cm4gYHJnYigke2NvbG9yLnNsaWNlKDAsIDMpLm1hcChjID0+IE1hdGgucm91bmQoYyAqIDI1NSkpLmpvaW4oJywgJyl9KWA7XG4gICAgfVxuICAgIC8vIFJHQiBpcyBiZXR3ZWVuIFswLCAyNTVdIG9wYWNpdHkgaXMgYmV0d2VlbiBbMCwgMV1cbiAgICByZXR1cm4gYHJnYmEoJHtjb2xvci5tYXAoKGMsIGkpID0+IChpIDwgMyAmJiBNYXRoLnJvdW5kKGMgKiAyNTUpKSB8fCBjKS5qb2luKCcsICcpfSlgO1xufTtcblxuVXRpbHMucG9pbnRJblRpbGUgPSBmdW5jdGlvbiAocG9pbnQpIHtcbiAgICByZXR1cm4gcG9pbnRbMF0gPj0gMCAmJsKgcG9pbnRbMV0gPiAtR2VvLnRpbGVfc2NhbGUgJiYgcG9pbnRbMF0gPCBHZW8udGlsZV9zY2FsZSAmJiBwb2ludFsxXSA8PSAwO1xufTtcbiIsImxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5sZXQgcGtnID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi8uLi9wYWNrYWdlLmpzb24nLCAndXRmOCcpKTtcbmxldCB2ZXJzaW9uO1xuZXhwb3J0IGRlZmF1bHQgdmVyc2lvbiA9ICd2JyArIHBrZy52ZXJzaW9uO1xuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuLy8gV29ya2VyQnJva2VyIHJvdXRlcyBtZXNzYWdlcyBiZXR3ZWVuIHdlYiB3b3JrZXJzIGFuZCB0aGUgbWFpbiB0aHJlYWQsIGFsbG93aW5nIGZvciBzaW1wbGVyXG4vLyBhc3luYyBjb2RlIHZpYSBwcm9taXNlcy4gRXhhbXBsZSB1c2FnZTpcbi8vXG4vLyBJbiB3ZWIgd29ya2VyLCByZWdpc3RlciBzZWxmIGFzIGEgY2FsbGFibGUgXCJ0YXJnZXRcIiwgYW5kIGRlZmluZSBhIG1ldGhvZDpcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCgnc2VsZicsIHNlbGYpO1xuLy9cbi8vICAgICBzZWxmLnNxdWFyZSA9IGZ1bmN0aW9uICh4KSB7XG4vLyAgICAgICAgIHJldHVybiB4ICogeDtcbi8vICAgICB9O1xuLy9cbi8vIEluIG1haW4gdGhyZWFkLCBpbnZva2UgdGhhdCBtZXRob2QgYW5kIHJlY2VpdmUgdGhlIHJlc3VsdCAoaWYgYW55KSBhcyBhIHByb21pc2UuXG4vL1xuLy8gICAgIHdvcmtlciA9IG5ldyBXb3JrZXIoLi4uKTtcbi8vICAgICBXb3JrZXJCcm9rZXIuYWRkV29ya2VyKHdvcmtlcik7XG4vL1xuLy8gICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh3b3JrZXIsICdzZWxmLnNxdWFyZScsIDUpLnRoZW4oZnVuY3Rpb24oeSkge1xuLy8gICAgICAgICBjb25zb2xlLmxvZyh5KTtcbi8vICAgICB9KTtcbi8vXG4vLyAgICAgLT4gcHJpbnRzIDI1XG4vL1xuLy8gQXN5bmMgY29kZTpcbi8vXG4vLyBGb3Igc3luY2hyb25vdXMgY29kZSB0aGF0IG11c3QgcGFzcyBhIHJldHVybiB2YWx1ZSB0byB0aGUgbWFpbiB0aHJlYWQsIHRoZSBmdW5jdGlvbiBjYW4gc2ltcGx5XG4vLyByZXR1cm4gYW4gaW1tZWRpYXRlIHZhbHVlIChzZWUgZXhhbXBsZSBhYm92ZSkuIEZvciBjYXNlcyB3aGVyZSB0aGUgd29ya2VyIG1ldGhvZCBuZWVkcyB0byBydW5cbi8vIGFzeW5jaHJvbm91cyBjb2RlLCB0aGUgZnVuY3Rpb24gY2FuIHJldHVybiBhIHByb21pc2UsIGFuZCB0aGUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgdmFsdWUgd2lsbFxuLy8gYmUgc2VudCBiYWNrIHRvIHRoZSBtYWluIHRocmVhZCB3aGVuIHRoZSBwcm9taXNlIGlzIGZ1bGZpbGxlZC5cbi8vXG4vLyBFcnJvciBoYW5kbGluZzpcbi8vXG4vLyBJZiB0aGUgd29ya2VyIG1ldGhvZCBlaXRoZXIgdGhyb3dzIGFuIGVycm9yLCBvciByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkLCBpdCB3aWxsIGJlXG4vLyBzZW50IGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkIGFzIGEgcHJvbWlzZSByZWplY3Rpb24uIFRoZXNlIHR3byBleGFtcGxlcyBhcmUgZXF1aXZhbGVudDpcbi8vXG4vLyAgICAgSW4gd29ya2VyLCB0aHJvd2luZyBhbiBlcnJvcjpcbi8vXG4vLyAgICAgICAgIHNlbGYuYnJva2VuID0gZnVuY3Rpb24gKCkge1xuLy8gICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcnJvciBpbiB3b3JrZXIhJyk7XG4vLyAgICAgICAgIH07XG4vL1xuLy8gICAgIEluIHdvcmtlciwgcmV0dXJuaW5nIGEgcmVqZWN0ZWQgcHJvbWlzZTpcbi8vXG4vLyAgICAgICAgIHNlbGYuYnJva2VuID0gZnVuY3Rpb24gKCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignZXJyb3IgaW4gd29ya2VyIScpKTtcbi8vICAgICAgICAgfTtcbi8vXG4vLyAgICAgSW4gbWFpbiB0aHJlYWQsIGJvdGggZXJyb3JzIGFyZSByZWNlaXZlZCBhcyBhIHByb21pc2UgcmVqZWN0aW9uOlxuLy9cbi8vICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHdvcmtlciwgJ3NlbGYuYnJva2VuJykudGhlbihcbi8vICAgICAgICAgICAgIC8vIFByb21pc2UgcmVzb2x2ZWRcbi8vICAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzdWNjZXNzIScpO1xuLy8gICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgIC8vIFByb21pc2UgcmVqZWN0ZWRcbi8vICAgICAgICAgICAgIGZ1bmN0aW9uKGVycm9yKSB7XG4vLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIScsIGVycm9yKTtcbi8vICAgICAgICAgICAgIH0pO1xuLy9cbi8vICAgICAgICAgLT4gcHJpbnRzICdlcnJvciEgZXJyb3IgaW4gd29ya2VyJ1xuLy9cbi8vIENhbGxpbmcgZnJvbSB3b3JrZXIgdG8gbWFpbiB0aHJlYWQ6XG4vL1xuLy8gVGhlIHNhbWUgc3R5bGUgb2YgY2FsbHMgY2FuIGJlIG1hZGUgKmZyb20qIGEgd2ViIHdvcmtlciwgdG8gdGhlIG1haW4gdGhyZWFkLiBUaGUgQVBJIGlzIHRoZSBzYW1lXG4vLyB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQsICd3b3JrZXInLCBpcyBub3QgbmVlZGVkIGZvciBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoKSxcbi8vIHNpbmNlIHRoZSBtYWluIHRocmVhZCBpcyB0aGUgaW1wbGljaXQgdGFyZ2V0LlxuLy9cbi8vIEluIG1haW4gdGhyZWFkLCBkZWZpbmUgYSBtZXRob2QgYW5kIHJlZ2lzdGVyIGl0OlxuLy9cbi8vICAgICB2YXIgZ2VvbWV0cnkgPSB7XG4vLyAgICAgICAgIGxlbmd0aDogZnVuY3Rpb24oeCwgeSkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbi8vICAgICAgICAgfVxuLy8gICAgIH07XG4vL1xuLy8gICAgIFdvcmtlckJyb2tlci5hZGRUYXJnZXQoJ2dlb21ldHJ5JywgZ2VvbWV0cnkpO1xuLy9cbi8vIEluIHdvcmtlciB0aHJlYWQpOlxuLy9cbi8vICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ2dlb21ldHJ5Lmxlbmd0aCcsIDMsIDQpLnRoZW4oZnVuY3Rpb24oZCkge1xuLy8gICAgICAgICBjb25zb2xlLmxvZyhkKTtcbi8vICAgICB9KTtcbi8vXG4vLyAgICAgLT4gcHJpbnRzIDVcbi8vXG5cbmltcG9ydCBUaHJlYWQgZnJvbSAnLi90aHJlYWQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5cbnZhciBXb3JrZXJCcm9rZXI7XG5leHBvcnQgZGVmYXVsdCBXb3JrZXJCcm9rZXIgPSB7fTtcblxuLy8gR2xvYmFsIGxpc3Qgb2YgYWxsIHdvcmtlciBtZXNzYWdlc1xuLy8gVW5pcXVlbHkgdHJhY2tzIGV2ZXJ5IGNhbGwgbWFkZSBiZXR3ZWVuIG1haW4gdGhyZWFkIGFuZCBhIHdvcmtlclxudmFyIG1lc3NhZ2VfaWQgPSAwO1xudmFyIG1lc3NhZ2VzID0ge307XG5cbi8vIFJlZ2lzdGVyIGFuIG9iamVjdCB0byByZWNlaXZlIGNhbGxzIGZyb20gb3RoZXIgdGhyZWFkXG52YXIgdGFyZ2V0cyA9IHt9O1xuV29ya2VyQnJva2VyLmFkZFRhcmdldCA9IGZ1bmN0aW9uIChuYW1lLCB0YXJnZXQpIHtcbiAgICB0YXJnZXRzW25hbWVdID0gdGFyZ2V0O1xufTtcblxuLy8gR2l2ZW4gYSBkb3Qtbm90YXRpb24tc3R5bGUgbWV0aG9kIG5hbWUsIGUuZy4gJ09iamVjdC5vYmplY3QubWV0aG9kJyxcbi8vIGZpbmQgdGhlIG9iamVjdCB0byBjYWxsIHRoZSBtZXRob2Qgb24gZnJvbSB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIHRhcmdldHNcbmZ1bmN0aW9uIGZpbmRUYXJnZXQgKG1ldGhvZCkge1xuICAgIHZhciBjaGFpbiA9IFtdO1xuICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgICBjaGFpbiA9IG1ldGhvZC5zcGxpdCgnLicpO1xuICAgICAgICBtZXRob2QgPSBjaGFpbi5wb3AoKTtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0ID0gdGFyZ2V0cztcblxuICAgIGZvciAobGV0IG09MDsgbSA8IGNoYWluLmxlbmd0aDsgbSsrKSB7XG4gICAgICAgIGlmICh0YXJnZXRbY2hhaW5bbV1dKSB7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXRbY2hhaW5bbV1dO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFttZXRob2QsIHRhcmdldF07XG59XG5cbi8vIE1haW4gdGhyZWFkOlxuLy8gLSBTZW5kIG1lc3NhZ2VzIHRvIHdvcmtlcnMsIGFuZCBvcHRpb25hbGx5IHJlY2VpdmUgYW4gYXN5bmMgcmVzcG9uc2UgYXMgYSBwcm9taXNlXG4vLyAtIFJlY2VpdmUgbWVzc2FnZXMgZnJvbSB3b3JrZXJzLCBhbmQgb3B0aW9uYWxseSBzZW5kIGFuIGFzeW5jIHJlc3BvbnNlIGJhY2sgYXMgYSBwcm9taXNlXG5mdW5jdGlvbiBzZXR1cE1haW5UaHJlYWQgKCkge1xuXG4gICAgLy8gU2VuZCBhIG1lc3NhZ2UgdG8gYSB3b3JrZXIsIGFuZCBvcHRpb25hbGx5IGdldCBhbiBhc3luYyByZXNwb25zZVxuICAgIC8vIEFyZ3VtZW50czpcbiAgICAvLyAgIC0gd29ya2VyOiBvbmUgb3IgbW9yZSB3ZWIgd29ya2VyIGluc3RhbmNlcyB0byBzZW5kIHRoZSBtZXNzYWdlIHRvIChzaW5nbGUgdmFsdWUgb3IgYXJyYXkpXG4gICAgLy8gICAtIG1ldGhvZDogdGhlIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSwgc3BlY2lmaWVkIHdpdGggZG90LW5vdGF0aW9uLCB3aWxsIGJlIGludm9rZWQgaW4gdGhlIHdvcmtlclxuICAgIC8vICAgLSBtZXNzYWdlOiBzcHJlYWQgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIG1ldGhvZCB3aXRoXG4gICAgLy8gUmV0dXJuczpcbiAgICAvLyAgIC0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgaWYgdGhlIHdvcmtlciBtZXRob2QgcmV0dXJucyBhIHZhbHVlIChjb3VsZCBiZSBpbW1lZGlhdGVseSwgb3IgYXN5bmMpXG4gICAgLy9cbiAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UgPSBmdW5jdGlvbiAod29ya2VyLCBtZXRob2QsIC4uLm1lc3NhZ2UpIHtcbiAgICAgICAgLy8gSWYgbW9yZSB0aGFuIG9uZSB3b3JrZXIgc3BlY2lmaWVkLCBwb3N0IHRvIG11bHRpcGxlXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHdvcmtlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICB3b3JrZXIubWFwKHcgPT4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHcsIG1ldGhvZCwgLi4ubWVzc2FnZSkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2sgc3RhdGUgb2YgdGhpcyBtZXNzYWdlXG4gICAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZXNbbWVzc2FnZV9pZF0gPSB7IG1ldGhvZCwgbWVzc2FnZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgbGV0IHBheWxvYWQsIHRyYW5zZmVyYWJsZXMgPSBbXTtcblxuICAgICAgICBpZiAobWVzc2FnZSAmJiBtZXNzYWdlLmxlbmd0aCA9PT0gMSAmJiBtZXNzYWdlWzBdIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gbWVzc2FnZVswXS50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VbMF0udmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgdHlwZTogJ21haW5fc2VuZCcsICAgICAgLy8gbWFyayBtZXNzYWdlIGFzIG1ldGhvZCBpbnZvY2F0aW9uIGZyb20gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIG1lc3NhZ2VfaWQsICAgICAgICAgICAgIC8vIHVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlLCBmb3IgbGlmZSBvZiBwcm9ncmFtXG4gICAgICAgICAgICBtZXRob2QsICAgICAgICAgICAgICAgICAvLyB3aWxsIGRpc3BhdGNoIHRvIGEgZnVuY3Rpb24gb2YgdGhpcyBuYW1lIHdpdGhpbiB0aGUgd29ya2VyXG4gICAgICAgICAgICBtZXNzYWdlICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHBheWxvYWRcbiAgICAgICAgfTtcblxuICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZH0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gd29ya2VyIHRocmVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVzc2FnZV9pZCsrO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGEgd29ya2VyIHRvIGNvbW11bmljYXRlIHdpdGggLSBlYWNoIHdvcmtlciBtdXN0IGJlIHJlZ2lzdGVyZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWRcbiAgICBXb3JrZXJCcm9rZXIuYWRkV29ya2VyID0gZnVuY3Rpb24gKHdvcmtlcikge1xuICAgICAgICBpZiAoISh3b3JrZXIgaW5zdGFuY2VvZiBXb3JrZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgYWRkIG5vbi1Xb3JrZXIgb2JqZWN0YCwgd29ya2VyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gV29ya2VyQnJva2VyTWFpblRocmVhZEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gbWF5YmVEZWNvZGUoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICBsZXQgaWQgPSBkYXRhLm1lc3NhZ2VfaWQ7XG5cbiAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgY29taW5nIGJhY2sgZnJvbSB0aGUgd29ya2VyLCBhbmQgZnVsZmlsbCB0aGF0IG1lc3NhZ2UncyBwcm9taXNlXG4gICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnd29ya2VyX3JlcGx5Jykge1xuICAgICAgICAgICAgICAgIC8vIFBhc3MgdGhlIHJlc3VsdCB0byB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc1tpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZWplY3QoZGF0YS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpZF0ucmVzb2x2ZShkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlc1tpZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBpbml0aWF0aW5nIGEgY2FsbCBmcm9tIHRoZSB3b3JrZXIsIGRpc3BhdGNoIHRoZW0sXG4gICAgICAgICAgICAvLyBhbmQgc2VuZCBhbnkgcmV0dXJuIHZhbHVlIGJhY2sgdG8gdGhlIHdvcmtlclxuICAgICAgICAgICAgLy8gVW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2UgJiByZXR1cm4gY2FsbCB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgZWxzZSBpZiAoZGF0YS50eXBlID09PSAnd29ya2VyX3NlbmQnICYmIGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBDYWxsIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIGFuZCBzYXZlIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgICAgICB2YXIgW21ldGhvZF9uYW1lLCB0YXJnZXRdID0gZmluZFRhcmdldChkYXRhLm1ldGhvZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdvcmtlciBicm9rZXIgY291bGQgbm90IGRpc3BhdGNoIG1lc3NhZ2UgdHlwZSAke2RhdGEubWV0aG9kfSBvbiB0YXJnZXQgJHtkYXRhLnRhcmdldH0gYmVjYXVzZSBubyBvYmplY3Qgd2l0aCB0aGF0IG5hbWUgaXMgcmVnaXN0ZXJlZCBvbiBtYWluIHRocmVhZGApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSAodHlwZW9mIHRhcmdldFttZXRob2RfbmFtZV0gPT09ICdmdW5jdGlvbicpICYmIHRhcmdldFttZXRob2RfbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdvcmtlciBicm9rZXIgY291bGQgbm90IGRpc3BhdGNoIG1lc3NhZ2UgdHlwZSAke2RhdGEubWV0aG9kfSBvbiB0YXJnZXQgJHtkYXRhLnRhcmdldH0gYmVjYXVzZSBvYmplY3QgaGFzIG5vIG1ldGhvZCB3aXRoIHRoYXQgbmFtZWApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQsIGVycm9yO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1ldGhvZC5hcHBseSh0YXJnZXQsIGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhyb3duIGVycm9ycyB3aWxsIGJlIHBhc3NlZCBiYWNrIChpbiBzdHJpbmcgZm9ybSkgdG8gd29ya2VyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZW5kIHJldHVybiB2YWx1ZSB0byB3b3JrZXJcbiAgICAgICAgICAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgLy8gQXN5bmMgcmVzdWx0XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gdmFsdWUudHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdtYWluX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZF9uYW1lfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byB3b3JrZXIgdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdtYWluX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEltbWVkaWF0ZSByZXN1bHRcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IHJlc3VsdC50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdtYWluX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubWVzc2FnZX06ICR7ZXJyb3Iuc3RhY2t9YCA6IGVycm9yKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZF9uYW1lfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byB3b3JrZXIgdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcblxuICAgIC8vIEV4cG9zZSBmb3IgZGVidWdnaW5nXG4gICAgV29ya2VyQnJva2VyLmdldE1lc3NhZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZXM7XG4gICAgfTtcblxuICAgIFdvcmtlckJyb2tlci5nZXRNZXNzYWdlSWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlX2lkO1xuICAgIH07XG5cbn1cblxuLy8gV29ya2VyIHRocmVhZHM6XG4vLyAtIFJlY2VpdmUgbWVzc2FnZXMgZnJvbSBtYWluIHRocmVhZCwgYW5kIG9wdGlvbmFsbHkgc2VuZCBhbiBhc3luYyByZXNwb25zZSBiYWNrIGFzIGEgcHJvbWlzZVxuLy8gLSBTZW5kIG1lc3NhZ2VzIHRvIG1haW4gdGhyZWFkLCBhbmQgb3B0aW9uYWxseSByZWNlaXZlIGFuIGFzeW5jIHJlc3BvbnNlIGFzIGEgcHJvbWlzZVxuZnVuY3Rpb24gc2V0dXBXb3JrZXJUaHJlYWQgKCkge1xuXG4gICAgLy8gU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIG1haW4gdGhyZWFkLCBhbmQgb3B0aW9uYWxseSBnZXQgYW4gYXN5bmMgcmVzcG9uc2UgYXMgYSBwcm9taXNlXG4gICAgLy8gQXJndW1lbnRzOlxuICAgIC8vICAgLSBtZXRob2Q6IHRoZSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUsIHNwZWNpZmllZCB3aXRoIGRvdC1ub3RhdGlvbiwgd2lsbCBiZSBpbnZva2VkIG9uIHRoZSBtYWluIHRocmVhZFxuICAgIC8vICAgLSBtZXNzYWdlOiBhcnJheSBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgbWV0aG9kIHdpdGhcbiAgICAvLyBSZXR1cm5zOlxuICAgIC8vICAgLSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBpZiB0aGUgbWFpbiB0aHJlYWQgbWV0aG9kIHJldHVybnMgYSB2YWx1ZSAoY291bGQgYmUgaW1tZWRpYXRlbHksIG9yIGFzeW5jKVxuICAgIC8vXG4gICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlID0gZnVuY3Rpb24gKG1ldGhvZCwgLi4ubWVzc2FnZSkge1xuICAgICAgICAvLyBUcmFjayBzdGF0ZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlc1ttZXNzYWdlX2lkXSA9IHsgbWV0aG9kLCBtZXNzYWdlLCByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgIGlmIChtZXNzYWdlICYmIG1lc3NhZ2UubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VbMF0gaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSBtZXNzYWdlWzBdLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZVswXS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnd29ya2VyX3NlbmQnLCAgICAvLyBtYXJrIG1lc3NhZ2UgYXMgbWV0aG9kIGludm9jYXRpb24gZnJvbSB3b3JrZXJcbiAgICAgICAgICAgIG1lc3NhZ2VfaWQsICAgICAgICAgICAgIC8vIHVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlLCBmb3IgbGlmZSBvZiBwcm9ncmFtXG4gICAgICAgICAgICBtZXRob2QsICAgICAgICAgICAgICAgICAvLyB3aWxsIGRpc3BhdGNoIHRvIGEgbWV0aG9kIG9mIHRoaXMgbmFtZSBvbiB0aGUgbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIG1lc3NhZ2UgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcGF5bG9hZFxuICAgICAgICB9O1xuXG4gICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZH0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lc3NhZ2VfaWQrKztcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIFdvcmtlckJyb2tlcldvcmtlclRocmVhZEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBtYXliZURlY29kZShldmVudC5kYXRhKTtcbiAgICAgICAgbGV0IGlkID0gZGF0YS5tZXNzYWdlX2lkO1xuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgY29taW5nIGJhY2sgZnJvbSB0aGUgbWFpbiB0aHJlYWQsIGFuZCBmdWxmaWxsIHRoYXQgbWVzc2FnZSdzIHByb21pc2VcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ21haW5fcmVwbHknKSB7XG4gICAgICAgICAgICAvLyBQYXNzIHRoZSByZXN1bHQgdG8gdGhlIHByb21pc2VcbiAgICAgICAgICAgIGlmIChtZXNzYWdlc1tpZF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpZF0ucmVqZWN0KGRhdGEuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaWRdLnJlc29sdmUoZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2VzW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBSZWNlaXZlIG1lc3NhZ2VzIGZyb20gbWFpbiB0aHJlYWQsIGRpc3BhdGNoIHRoZW0sIGFuZCBzZW5kIGJhY2sgYSByZXBseVxuICAgICAgICAvLyBVbmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZSAmIHJldHVybiBjYWxsIHRvIG1haW4gdGhyZWFkXG4gICAgICAgIGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ21haW5fc2VuZCcgJiYgaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgcmVxdWVzdGVkIHdvcmtlciBtZXRob2QgYW5kIHNhdmUgdGhlIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgdmFyIFttZXRob2RfbmFtZSwgdGFyZ2V0XSA9IGZpbmRUYXJnZXQoZGF0YS5tZXRob2QpO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IG9uIHRhcmdldCAke2RhdGEudGFyZ2V0fSBiZWNhdXNlIG5vIG9iamVjdCB3aXRoIHRoYXQgbmFtZSBpcyByZWdpc3RlcmVkIG9uIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBtZXRob2QgPSAodHlwZW9mIHRhcmdldFttZXRob2RfbmFtZV0gPT09ICdmdW5jdGlvbicpICYmIHRhcmdldFttZXRob2RfbmFtZV07XG5cbiAgICAgICAgICAgIGlmICghbWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdvcmtlciBicm9rZXIgY291bGQgbm90IGRpc3BhdGNoIG1lc3NhZ2UgdHlwZSAke2RhdGEubWV0aG9kfSBiZWNhdXNlIHdvcmtlciBoYXMgbm8gbWV0aG9kIHdpdGggdGhhdCBuYW1lYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXN1bHQsIGVycm9yO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBtZXRob2QuYXBwbHkodGFyZ2V0LCBkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIC8vIFRocm93biBlcnJvcnMgd2lsbCBiZSBwYXNzZWQgYmFjayAoaW4gc3RyaW5nIGZvcm0pIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZW5kIHJldHVybiB2YWx1ZSB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgbGV0IHBheWxvYWQsIHRyYW5zZmVyYWJsZXMgPSBbXTtcblxuICAgICAgICAgICAgLy8gQXN5bmMgcmVzdWx0XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSB2YWx1ZS50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd29ya2VyX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd29ya2VyX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubWVzc2FnZX06ICR7ZXJyb3Iuc3RhY2t9YCA6IGVycm9yKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEltbWVkaWF0ZSByZXN1bHRcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IHJlc3VsdC50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dvcmtlcl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm1lc3NhZ2V9OiAke2Vycm9yLnN0YWNrfWAgOiBlcnJvcilcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbn1cblxuLy8gU3BlY2lhbCB2YWx1ZSB3cmFwcGVyLCB0byBpbmRpY2F0ZSB0aGF0IHdlIHdhbnQgdG8gZmluZCBhbmQgaW5jbHVkZSB0cmFuc2ZlcmFibGUgb2JqZWN0cyBpbiB0aGUgbWVzc2FnZVxuV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzID0gZnVuY3Rpb24gKC4uLnZhbHVlKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMoLi4udmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnRyYW5zZmVyYWJsZXMgPSBmaW5kVHJhbnNmZXJhYmxlcyh0aGlzLnZhbHVlKTtcbn07XG5cbi8vIEJ1aWxkIGEgbGlzdCBvZiB0cmFuc2ZlcmFibGUgb2JqZWN0cyBmcm9tIGEgc291cmNlIG9iamVjdFxuLy8gUmV0dXJucyBhIGxpc3Qgb2YgaW5mbyBhYm91dCBlYWNoIHRyYW5zZmVyYWJsZTpcbi8vICAgLSBvYmplY3Q6IHRoZSBhY3R1YWwgdHJhbnNmZXJhYmxlIG9iamVjdFxuLy8gICAtIHBhcmVudDogdGhlIHBhcmVudCBvYmplY3QgdGhhdCB0aGUgdHJhbnNmZXJhYmxlIGlzIGEgcHJvcGVydHkgb2YgKGlmIGFueSlcbi8vICAgLSBwcm9wZXJ0eTogdGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHRyYW5zZmVyYWJsZSBvbiB0aGUgcGFyZW50IG9iamVjdCAoaWYgYW55KVxuLy8gVE9ETzogYWRkIG9wdGlvbiBpbiBjYXNlIHlvdSBET04nVCB3YW50IHRvIHRyYW5zZmVyIG9iamVjdHNcbmZ1bmN0aW9uIGZpbmRUcmFuc2ZlcmFibGVzKHNvdXJjZSwgcGFyZW50ID0gbnVsbCwgcHJvcGVydHkgPSBudWxsLCBsaXN0ID0gW10pIHtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICAvLyBDaGVjayBlYWNoIGFycmF5IGVsZW1lbnRcbiAgICAgICAgc291cmNlLmZvckVhY2goKHgsIGkpID0+IGZpbmRUcmFuc2ZlcmFibGVzKHgsIHNvdXJjZSwgaSwgbGlzdCkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBJcyB0aGUgb2JqZWN0IGEgdHJhbnNmZXJhYmxlIGFycmF5IGJ1ZmZlcj9cbiAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICBsaXN0LnB1c2goeyBvYmplY3Q6IHNvdXJjZSwgcGFyZW50LCBwcm9wZXJ0eSB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPciBsb29rcyBsaWtlIGEgdHlwZWQgYXJyYXkgKGhhcyBhbiBhcnJheSBidWZmZXIgcHJvcGVydHkpP1xuICAgICAgICBlbHNlIGlmIChzb3VyY2UuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGxpc3QucHVzaCh7IG9iamVjdDogc291cmNlLmJ1ZmZlciwgcGFyZW50LCBwcm9wZXJ0eSB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UgY2hlY2sgZWFjaCBwcm9wZXJ0eVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgZmluZFRyYW5zZmVyYWJsZXMoc291cmNlW3Byb3BdLCBzb3VyY2UsIHByb3AsIGxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vLyBSZW1vdmUgbmV1dGVyZWQgdHJhbnNmZXJhYmxlcyBmcm9tIHBhcmVudCBvYmplY3RzLCBhcyB0aGV5IHNob3VsZCBubyBsb25nZXIgYmUgYWNjZXNzZWQgYWZ0ZXIgdHJhbnNmZXJcbmZ1bmN0aW9uIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodHJhbnNmZXJhYmxlcykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cmFuc2ZlcmFibGVzLmZpbHRlcih0ID0+IHQucGFyZW50ICYmIHQucHJvcGVydHkpLmZvckVhY2godCA9PiBkZWxldGUgdC5wYXJlbnRbdC5wcm9wZXJ0eV0pO1xufVxuXG4vLyBNZXNzYWdlIHBheWxvYWQgY2FuIGJlIHN0cmluZ2lmaWVkIGZvciBmYXN0ZXIgdHJhbnNmZXIsIGlmIGl0IGRvZXMgbm90IGluY2x1ZGUgdHJhbnNmZXJhYmxlIG9iamVjdHNcbmZ1bmN0aW9uIG1heWJlRW5jb2RlIChwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKSB7XG4gICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBheWxvYWQgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG59XG5cbi8vIFBhcnNlIHN0cmluZ2lmaWVkIG1lc3NhZ2UgcGF5bG9hZFxuZnVuY3Rpb24gbWF5YmVEZWNvZGUgKGRhdGEpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoZGF0YSkgOiBkYXRhKTtcbn1cblxuLy8gU2V0dXAgdGhpcyB0aHJlYWQgYXMgYXBwcm9wcmlhdGVcbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIHNldHVwTWFpblRocmVhZCgpO1xufVxuXG5pZiAoVGhyZWFkLmlzX3dvcmtlcikge1xuICAgIHNldHVwV29ya2VyVGhyZWFkKCk7XG59XG4iLCIvKioqIFZlY3RvciBmdW5jdGlvbnMgLSB2ZWN0b3JzIHByb3ZpZGVkIGFzIFt4LCB5LCB6XSBhcnJheXMgKioqL1xuXG52YXIgVmVjdG9yO1xuZXhwb3J0IGRlZmF1bHQgVmVjdG9yID0ge307XG5cblZlY3Rvci5zZXQgPSBmdW5jdGlvbiAodikge1xuICAgIHZhciBWID0gW107XG4gICAgdmFyIGxpbSA9IHYubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltOyBpKyspIHtcbiAgICAgICAgVltpXSA9IHZbaV07XG4gICAgfVxuICAgIHJldHVybiBWO1xufTtcblxuVmVjdG9yLm5lZyA9IGZ1bmN0aW9uICh2KSB7XG4gICAgdmFyIFYgPSBbXTtcbiAgICB2YXIgbGltID0gdi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICBWW2ldID0gdltpXSAqIC0xO1xuICAgIH1cbiAgICByZXR1cm4gVjtcbn07XG5cbi8vIEFkZGl0aW9uIG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IuYWRkID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciB2ID0gW107XG4gICAgdmFyIGxpbSA9IE1hdGgubWluKHYxLmxlbmd0aCx2Mi5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltOyBpKyspIHtcbiAgICAgICAgdltpXSA9IHYxW2ldICsgdjJbaV07XG4gICAgfVxuICAgIHJldHVybiB2O1xufTtcblxuLy8gU3Vic3RyYWN0aW9uIG9mIHR3byB2ZWN0b3JzXG5WZWN0b3Iuc3ViID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciB2ID0gW107XG4gICAgdmFyIGxpbSA9IE1hdGgubWluKHYxLmxlbmd0aCx2Mi5sZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICB2W2ldID0gdjFbaV0gLSB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG5WZWN0b3Iuc2lnbmVkX2FyZWEgPSBmdW5jdGlvbiAodjEsIHYyLCB2Mykge1xuICAgIHJldHVybiAodjJbMF0tdjFbMF0pKih2M1sxXS12MVsxXSkgLSAodjNbMF0tdjFbMF0pKih2MlsxXS12MVsxXSk7XG59O1xuXG4vLyBNdWx0aXBsaWNhdGlvbiBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLm11bHQgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXSxcbiAgICAgICAgbGVuID0gdjEubGVuZ3RoLFxuICAgICAgICBpO1xuXG4gICAgaWYgKHR5cGVvZiB2MiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gTXVsaXRwbHkgYnkgc2NhbGFyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldICogdjI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIE11bHRpcGx5IHR3byB2ZWN0b3JzXG4gICAgICAgIGxlbiA9IE1hdGgubWluKHYxLmxlbmd0aCx2Mi5sZW5ndGgpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZbaV0gPSB2MVtpXSAqIHYyW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2O1xufTtcblxuLy8gRGl2aXNpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5kaXYgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXSxcbiAgICAgICAgaTtcbiAgICBpZih0eXBlb2YgdjIgPT09ICdudW1iZXInKXtcbiAgICAgICAgLy8gRGl2aWRlIGJ5IHNjYWxhclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldIC8gdjI7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEaXZpZGUgdG8gdmVjdG9yc1xuICAgICAgICB2YXIgbGVuID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldIC8gdjJbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG4vLyBHZXQgMkQgcGVycGVuZGljdWxhclxuVmVjdG9yLnBlcnAgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgcmV0dXJuIFsgdjJbMV0gLSB2MVsxXSxcbiAgICAgICAgICAgICB2MVswXSAtIHYyWzBdIF07XG59O1xuXG4vLyBHZXQgMkQgdmVjdG9yIHJvdGF0ZWRcblZlY3Rvci5yb3QgPSBmdW5jdGlvbiAodiwgYSkge1xuICAgIHZhciBjID0gTWF0aC5jb3MoYSk7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihhKTtcbiAgICByZXR1cm4gW3ZbMF0gKiBjIC0gdlsxXSAqIHMsXG4gICAgICAgICAgICB2WzBdICogcyArIHZbMV0gKiBjXTtcbn07XG5cbi8vIEdldCAyRCBoZWFkaW5nIGFuZ2xlXG5WZWN0b3IuYW5nbGUgPSBmdW5jdGlvbiAoW3gsIHldKSB7XG4gICAgcmV0dXJuIE1hdGguYXRhbjIoeSx4KTtcbn07XG5cbi8vIEdldCBhbmdsZSBiZXR3ZWVuIHR3byB2ZWN0b3JzXG5WZWN0b3IuYW5nbGVCZXR3ZWVuID0gZnVuY3Rpb24oQSwgQil7XG4gICAgdmFyIGRlbHRhID0gVmVjdG9yLmRvdChBLCBCKTtcbiAgICBpZiAoZGVsdGEgPCAtMSkge1xuICAgICAgICBkZWx0YSA9IC0xO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5hY29zKGRlbHRhKTtcbn07XG5cbi8vIENvbXBhcmUgdHdvIHBvaW50c1xuVmVjdG9yLmlzRXF1YWwgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIGxlbiA9IHYxLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmICh2MVtpXSAhPT0gdjJbaV0pe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLy8gVmVjdG9yIGxlbmd0aCBzcXVhcmVkXG5WZWN0b3IubGVuZ3RoU3EgPSBmdW5jdGlvbiAodikge1xuICAgIGlmICh2Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gKHZbMF0qdlswXSArIHZbMV0qdlsxXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHYubGVuZ3RoID49IDMpIHtcbiAgICAgICAgcmV0dXJuICh2WzBdKnZbMF0gKyB2WzFdKnZbMV0gKyB2WzJdKnZbMl0pO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn07XG5cbi8vIFZlY3RvciBsZW5ndGhcblZlY3Rvci5sZW5ndGggPSBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiBNYXRoLnNxcnQoVmVjdG9yLmxlbmd0aFNxKHYpKTtcbn07XG5cbi8vIE5vcm1hbGl6ZSBhIHZlY3RvclxuVmVjdG9yLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgdmFyIGQ7XG4gICAgaWYgKHYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGQgPSB2WzBdKnZbMF0gKyB2WzFdKnZbMV07XG4gICAgICAgIGQgPSBNYXRoLnNxcnQoZCk7XG5cbiAgICAgICAgaWYgKGQgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbdlswXSAvIGQsIHZbMV0gLyBkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWzAsIDBdO1xuICAgIH0gZWxzZSBpZiAodi5sZW5ndGggPj0gMykge1xuICAgICAgICBkID0gdlswXSp2WzBdICsgdlsxXSp2WzFdICsgdlsyXSp2WzJdO1xuICAgICAgICBkID0gTWF0aC5zcXJ0KGQpO1xuXG4gICAgICAgIGlmIChkICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW3ZbMF0gLyBkLCB2WzFdIC8gZCwgdlsyXSAvIGRdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbMCwgMCwgMF07XG59O1xuXG4vLyBDcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IuY3Jvc3MgID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHJldHVybiBbXG4gICAgICAgICh2MVsxXSAqIHYyWzJdKSAtICh2MVsyXSAqIHYyWzFdKSxcbiAgICAgICAgKHYxWzJdICogdjJbMF0pIC0gKHYxWzBdICogdjJbMl0pLFxuICAgICAgICAodjFbMF0gKiB2MlsxXSkgLSAodjFbMV0gKiB2MlswXSlcbiAgICBdO1xufTtcblxuLy8gRG90IHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5kb3QgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIG4gPSAwO1xuICAgIHZhciBsaW0gPSBNYXRoLm1pbih2MS5sZW5ndGgsIHYyLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICBuICs9IHYxW2ldICogdjJbaV07XG4gICAgfVxuICAgIHJldHVybiBuO1xufTtcbiIsImltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcbmltcG9ydCBDYW1lcmEgZnJvbSAnLi9jYW1lcmEnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHN1YnNjcmliZU1peGluIGZyb20gJy4vdXRpbHMvc3Vic2NyaWJlJztcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaWV3IHtcblxuICAgIGNvbnN0cnVjdG9yIChzY2VuZSwgb3B0aW9ucykge1xuICAgICAgICBzdWJzY3JpYmVNaXhpbih0aGlzKTtcblxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgICAgIHRoaXMuY3JlYXRlTWF0cmljZXMoKTtcblxuICAgICAgICB0aGlzLnpvb20gPSBudWxsO1xuICAgICAgICB0aGlzLmNlbnRlciA9IG51bGw7XG4gICAgICAgIHRoaXMuYm91bmRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsID0gbnVsbDtcblxuICAgICAgICB0aGlzLnBhbm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy56b29taW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuem9vbV9kaXJlY3Rpb24gPSAwO1xuXG4gICAgICAgIC8vIFNpemUgb2Ygdmlld3BvcnQgaW4gQ1NTIHBpeGVscywgZGV2aWNlIHBpeGVscywgYW5kIG1lcmNhdG9yIG1ldGVyc1xuICAgICAgICB0aGlzLnNpemUgPSB7XG4gICAgICAgICAgICBjc3M6IHt9LFxuICAgICAgICAgICAgZGV2aWNlOiB7fSxcbiAgICAgICAgICAgIG1ldGVyczoge31cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hc3BlY3QgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuYnVmZmVyID0gMDtcbiAgICAgICAgdGhpcy5jb250aW51b3VzX3pvb20gPSAodHlwZW9mIG9wdGlvbnMuY29udGludW91c1pvb20gPT09ICdib29sZWFuJykgPyBvcHRpb25zLmNvbnRpbnVvdXNab29tIDogdHJ1ZTtcbiAgICAgICAgdGhpcy50aWxlX3NpbXBsaWZpY2F0aW9uX2xldmVsID0gMDsgLy8gbGV2ZWwtb2YtZGV0YWlsIGRvd25zYW1wbGluZyB0byBhcHBseSB0byB0aWxlIGxvYWRpbmdcbiAgICAgICAgdGhpcy5wcmVzZXJ2ZV90aWxlc193aXRoaW5fem9vbSA9IDE7XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHN0YXRlIGJlZm9yZSBzY2VuZSBjb25maWcgaXMgdXBkYXRlZFxuICAgIHJlc2V0ICgpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVDYW1lcmEoKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY2FtZXJhXG4gICAgY3JlYXRlQ2FtZXJhICgpIHtcbiAgICAgICAgbGV0IGFjdGl2ZV9jYW1lcmEgPSB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgICAgICBpZiAoYWN0aXZlX2NhbWVyYSkge1xuICAgICAgICAgICAgdGhpcy5jYW1lcmEgPSBDYW1lcmEuY3JlYXRlKGFjdGl2ZV9jYW1lcmEsIHRoaXMsIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXNbYWN0aXZlX2NhbWVyYV0pO1xuICAgICAgICAgICAgdGhpcy5jYW1lcmEudXBkYXRlVmlldygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IGFjdGl2ZSBjYW1lcmEgLSBmb3IgcHVibGljIEFQSVxuICAgIGdldEFjdGl2ZUNhbWVyYSAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNjZW5lLmNvbmZpZyAmJiB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBuYW1lIGluIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBubyBjYW1lcmEgc2V0IGFzIGFjdGl2ZSwgdXNlIGZpcnN0IG9uZVxuICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzKTtcbiAgICAgICAgICAgIHJldHVybiBrZXlzLmxlbmd0aCAmJiBrZXlzWzBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGFjdGl2ZSBjYW1lcmEgYW5kIHJlY29tcGlsZSAtIGZvciBwdWJsaWMgQVBJXG4gICAgc2V0QWN0aXZlQ2FtZXJhIChuYW1lKSB7XG4gICAgICAgIGxldCBwcmV2ID0gdGhpcy5nZXRBY3RpdmVDYW1lcmEoKTtcbiAgICAgICAgaWYgKHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXNbbmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXNbbmFtZV0uYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXNseSBhY3RpdmUgY2FtZXJhXG4gICAgICAgICAgICBpZiAocHJldiAmJiBwcmV2ICE9PSBuYW1lICYmIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXNbcHJldl0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1twcmV2XS5hY3RpdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjZW5lLnVwZGF0ZUNvbmZpZyh7IHJlYnVpbGQ6IGZhbHNlIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBY3RpdmVDYW1lcmEoKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbWV0aG9kIGNhbGxlZCBvbmNlIHBlciBmcmFtZVxuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIHRoaXMuY2FtZXJhLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBsb2dpY2FsIHBpeGVsIHNpemUgb2Ygdmlld3BvcnRcbiAgICBzZXRWaWV3cG9ydFNpemUgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5zaXplLmNzcyA9IHsgd2lkdGgsIGhlaWdodCB9O1xuICAgICAgICB0aGlzLnNpemUuZGV2aWNlID0ge1xuICAgICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5zaXplLmNzcy53aWR0aCAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyksXG4gICAgICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQodGhpcy5zaXplLmNzcy5oZWlnaHQgKiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYXNwZWN0ID0gdGhpcy5zaXplLmNzcy53aWR0aCAvIHRoaXMuc2l6ZS5jc3MuaGVpZ2h0O1xuICAgICAgICB0aGlzLnVwZGF0ZUJvdW5kcygpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgbWFwIHZpZXcsIGNhbiBiZSBwYXNzZWQgYW4gb2JqZWN0IHdpdGggbGF0L2xuZyBhbmQvb3Igem9vbVxuICAgIHNldFZpZXcgKHsgbG5nLCBsYXQsIHpvb20gfSA9IHt9KSB7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gU2V0IGNlbnRlclxuICAgICAgICBpZiAodHlwZW9mIGxuZyA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGxhdCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jZW50ZXIgfHwgbG5nICE9PSB0aGlzLmNlbnRlci5sbmcgfHwgbGF0ICE9PSB0aGlzLmNlbnRlci5sYXQpIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNlbnRlciA9IHsgbG5nOiBHZW8ud3JhcExuZyhsbmcpLCBsYXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB6b29tXG4gICAgICAgIGlmICh0eXBlb2Ygem9vbSA9PT0gJ251bWJlcicgJiYgem9vbSAhPT0gdGhpcy56b29tKSB7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0Wm9vbSh6b29tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH1cblxuICAgIHNldFpvb20gKHpvb20pIHtcbiAgICAgICAgaWYgKHRoaXMuem9vbWluZykge1xuICAgICAgICAgICAgdGhpcy56b29taW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhc3Rfem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsYXN0X3RpbGVfem9vbSA9IHRoaXMudGlsZV96b29tO1xuICAgICAgICBsZXQgdGlsZV96b29tID0gdGhpcy50aWxlWm9vbSh6b29tKTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRpbnVvdXNfem9vbSkge1xuICAgICAgICAgICAgem9vbSA9IHRpbGVfem9vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aWxlX3pvb20gIT09IGxhc3RfdGlsZV96b29tKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21fZGlyZWN0aW9uID0gdGlsZV96b29tID4gbGFzdF90aWxlX3pvb20gPyAxIDogLTE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhc3Rfem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgdGhpcy56b29tID0gem9vbTtcbiAgICAgICAgdGhpcy50aWxlX3pvb20gPSB0aWxlX3pvb207XG5cbiAgICAgICAgdGhpcy51cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgfVxuXG4gICAgc3RhcnRab29tICgpIHtcbiAgICAgICAgdGhpcy5sYXN0X3pvb20gPSB0aGlzLnpvb207XG4gICAgICAgIHRoaXMuem9vbWluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2hvb3NlIHRoZSBiYXNlIHpvb20gbGV2ZWwgdG8gdXNlIGZvciBhIGdpdmVuIGZyYWN0aW9uYWwgem9vbVxuICAgIGJhc2Vab29tICh6b29tKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHpvb20pO1xuICAgIH1cblxuICAgIC8vIEZvciBhIGdpdmVuIHZpZXcgem9vbSwgd2hhdCB0aWxlIHpvb20gc2hvdWxkIGJlIGxvYWRlZD9cbiAgICB0aWxlWm9vbSAodmlld196b29tKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2Vab29tKHZpZXdfem9vbSkgLSB0aGlzLnRpbGVfc2ltcGxpZmljYXRpb25fbGV2ZWw7XG4gICAgfVxuXG4gICAgLy8gRm9yIGEgZ2l2ZW4gdGlsZSB6b29tLCB3aGF0IHN0eWxlIHpvb20gc2hvdWxkIGJlIHVzZWQ/XG4gICAgc3R5bGVab29tICh0aWxlX3pvb20pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVpvb20odGlsZV96b29tKSArIHRoaXMudGlsZV9zaW1wbGlmaWNhdGlvbl9sZXZlbDtcbiAgICB9XG5cbiAgICByZWFkeSAoKSB7XG4gICAgICAgIC8vIFRPRE86IGJldHRlciBjb25jZXB0IG9mIFwicmVhZGluZXNzXCIgc3RhdGU/XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zaXplLmNzcy53aWR0aCAhPT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnNpemUuY3NzLmhlaWdodCAhPT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIHRoaXMuY2VudGVyID09IG51bGwgfHxcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnpvb20gIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSB2aWV3cG9ydCBib3VuZHMgYmFzZWQgb24gY3VycmVudCBjZW50ZXIgYW5kIHpvb21cbiAgICB1cGRhdGVCb3VuZHMgKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsID0gR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMuem9vbSk7XG5cbiAgICAgICAgLy8gU2l6ZSBvZiB0aGUgaGFsZi12aWV3cG9ydCBpbiBtZXRlcnMgYXQgY3VycmVudCB6b29tXG4gICAgICAgIHRoaXMuc2l6ZS5tZXRlcnMgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnNpemUuY3NzLndpZHRoICogdGhpcy5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgeTogdGhpcy5zaXplLmNzcy5oZWlnaHQgKiB0aGlzLm1ldGVyc19wZXJfcGl4ZWxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDZW50ZXIgb2Ygdmlld3BvcnQgaW4gbWV0ZXJzLCBhbmQgdGlsZVxuICAgICAgICBsZXQgW3gsIHldID0gR2VvLmxhdExuZ1RvTWV0ZXJzKFt0aGlzLmNlbnRlci5sbmcsIHRoaXMuY2VudGVyLmxhdF0pO1xuICAgICAgICB0aGlzLmNlbnRlci5tZXRlcnMgPSB7IHgsIHkgfTtcblxuICAgICAgICB0aGlzLmNlbnRlci50aWxlID0gR2VvLnRpbGVGb3JNZXRlcnMoW3RoaXMuY2VudGVyLm1ldGVycy54LCB0aGlzLmNlbnRlci5tZXRlcnMueV0sIHRoaXMudGlsZV96b29tKTtcblxuICAgICAgICAvLyBCb3VuZHMgaW4gbWV0ZXJzXG4gICAgICAgIHRoaXMuYm91bmRzID0ge1xuICAgICAgICAgICAgc3c6IHtcbiAgICAgICAgICAgICAgICB4OiB0aGlzLmNlbnRlci5tZXRlcnMueCAtIHRoaXMuc2l6ZS5tZXRlcnMueCAvIDIsXG4gICAgICAgICAgICAgICAgeTogdGhpcy5jZW50ZXIubWV0ZXJzLnkgLSB0aGlzLnNpemUubWV0ZXJzLnkgLyAyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmU6IHtcbiAgICAgICAgICAgICAgICB4OiB0aGlzLmNlbnRlci5tZXRlcnMueCArIHRoaXMuc2l6ZS5tZXRlcnMueCAvIDIsXG4gICAgICAgICAgICAgICAgeTogdGhpcy5jZW50ZXIubWV0ZXJzLnkgKyB0aGlzLnNpemUubWV0ZXJzLnkgLyAyXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zY2VuZS50aWxlX21hbmFnZXIudXBkYXRlVGlsZXNGb3JWaWV3KCk7XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdtb3ZlJyk7XG4gICAgICAgIHRoaXMuc2NlbmUucmVxdWVzdFJlZHJhdygpOyAvLyBUT0RPIGF1dG9tYXRlIHZpYSBtb3ZlIGV2ZW50P1xuICAgIH1cblxuICAgIGZpbmRWaXNpYmxlVGlsZUNvb3JkaW5hdGVzICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJvdW5kcykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHogPSB0aGlzLnRpbGVfem9vbTtcbiAgICAgICAgbGV0IHN3ID0gR2VvLnRpbGVGb3JNZXRlcnMoW3RoaXMuYm91bmRzLnN3LngsIHRoaXMuYm91bmRzLnN3LnldLCB6KTtcbiAgICAgICAgbGV0IG5lID0gR2VvLnRpbGVGb3JNZXRlcnMoW3RoaXMuYm91bmRzLm5lLngsIHRoaXMuYm91bmRzLm5lLnldLCB6KTtcblxuICAgICAgICBsZXQgY29vcmRzID0gW107XG4gICAgICAgIGZvciAobGV0IHggPSBzdy54IC0gdGhpcy5idWZmZXI7IHggPD0gbmUueCArIHRoaXMuYnVmZmVyOyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSBuZS55IC0gdGhpcy5idWZmZXI7IHkgPD0gc3cueSArIHRoaXMuYnVmZmVyOyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb29yZHMucHVzaChUaWxlLmNvb3JkKHsgeCwgeSwgeiB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvb3JkcztcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdGlsZXMgdG9vIGZhciBvdXRzaWRlIG9mIHZpZXdcbiAgICBwcnVuZVRpbGVzRm9yVmlldyAoKSB7XG4gICAgICAgIC8vIFRPRE86IHdpbGwgdGhpcyBmdW5jdGlvbiBldmVyIGJlIGNhbGxlZCB3aGVuIHZpZXcgaXNuJ3QgcmVhZHk/XG4gICAgICAgIGlmICghdGhpcy5yZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGlsZXMgdGhhdCBhcmUgYSBzcGVjaWZpZWQgIyBvZiB0aWxlcyBvdXRzaWRlIG9mIHRoZSB2aWV3cG9ydCBib3JkZXJcbiAgICAgICAgbGV0IGJvcmRlcl90aWxlcyA9IFtcbiAgICAgICAgICAgIE1hdGguY2VpbCgoTWF0aC5mbG9vcih0aGlzLnNpemUuY3NzLndpZHRoIC8gR2VvLnRpbGVfc2l6ZSkgKyAyKSAvIDIpLFxuICAgICAgICAgICAgTWF0aC5jZWlsKChNYXRoLmZsb29yKHRoaXMuc2l6ZS5jc3MuaGVpZ2h0IC8gR2VvLnRpbGVfc2l6ZSkgKyAyKSAvIDIpXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5zY2VuZS50aWxlX21hbmFnZXIucmVtb3ZlVGlsZXModGlsZSA9PiB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgdmlzaWJsZSB0aWxlc1xuICAgICAgICAgICAgaWYgKHRpbGUudmlzaWJsZSB8fCB0aWxlLnByb3h5X2Zvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRpbGVzIG91dHNpZGUgZ2l2ZW4gem9vbSB0aGF0IGFyZSBzdGlsbCBsb2FkaW5nXG4gICAgICAgICAgICBpZiAodGlsZS5sb2FkaW5nICYmIHRpbGUuc3R5bGVfem9vbSAhPT0gdGhpcy50aWxlX3pvb20pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGlzY2FyZCBpZiB0b28gZmFyIGZyb20gY3VycmVudCB6b29tXG4gICAgICAgICAgICBsZXQgemRpZmYgPSBNYXRoLmFicyh0aWxlLnN0eWxlX3pvb20gLSB0aGlzLnRpbGVfem9vbSk7XG4gICAgICAgICAgICBpZiAoemRpZmYgPiB0aGlzLnByZXNlcnZlX3RpbGVzX3dpdGhpbl96b29tKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSB0aWxlcyBhdCBkaWZmZXJlbnQgem9vbXNcbiAgICAgICAgICAgIGxldCBjb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20odGlsZS5jb29yZHMsIHRoaXMudGlsZV96b29tKTtcblxuICAgICAgICAgICAgLy8gRGlzY2FyZCB0aWxlcyBvdXRzaWRlIGFuIGFyZWEgc3Vycm91bmRpbmcgdGhlIHZpZXdwb3J0XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoY29vcmRzLnggLSB0aGlzLmNlbnRlci50aWxlLngpIC0gYm9yZGVyX3RpbGVzWzBdID4gdGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFZpZXc6IHJlbW92ZSB0aWxlICR7dGlsZS5rZXl9IChhcyAke2Nvb3Jkcy54fS8ke2Nvb3Jkcy55fS8ke3RoaXMudGlsZV96b29tfSkgZm9yIGJlaW5nIHRvbyBmYXIgb3V0IG9mIHZpc2libGUgYXJlYSAqKipgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKE1hdGguYWJzKGNvb3Jkcy55IC0gdGhpcy5jZW50ZXIudGlsZS55KSAtIGJvcmRlcl90aWxlc1sxXSA+IHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBWaWV3OiByZW1vdmUgdGlsZSAke3RpbGUua2V5fSAoYXMgJHtjb29yZHMueH0vJHtjb29yZHMueX0vJHt0aGlzLnRpbGVfem9vbX0pIGZvciBiZWluZyB0b28gZmFyIG91dCBvZiB2aXNpYmxlIGFyZWEgKioqYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFsbG9jYXRlIG1vZGVsLXZpZXcgbWF0cmljZXNcbiAgICAvLyA2NC1iaXQgdmVyc2lvbnMgYXJlIGZvciBDUFUgY2FsY3VhdGlvbnNcbiAgICAvLyAzMi1iaXQgdmVyc2lvbnMgYXJlIGRvd25zYW1wbGVkIGFuZCBzZW50IHRvIEdQVVxuICAgIGNyZWF0ZU1hdHJpY2VzICgpIHtcbiAgICAgICAgdGhpcy5tYXRyaWNlcyA9IHt9O1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm1vZGVsID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWwzMiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm1vZGVsX3ZpZXcgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5tb2RlbF92aWV3MzIgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5ub3JtYWwgPSBuZXcgRmxvYXQ2NEFycmF5KDkpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm5vcm1hbDMyID0gbmV3IEZsb2F0MzJBcnJheSg5KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5pbnZlcnNlX25vcm1hbDMyID0gbmV3IEZsb2F0MzJBcnJheSg5KTtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgYW5kIHNldCBtb2RlbC92aWV3IGFuZCBub3JtYWwgbWF0cmljZXMgZm9yIGEgdGlsZVxuICAgIHNldHVwVGlsZSAodGlsZSwgcHJvZ3JhbSkge1xuICAgICAgICAvLyBUaWxlLXNwZWNpZmljIHN0YXRlXG4gICAgICAgIC8vIFRPRE86IGNhbGMgdGhlc2Ugb25jZSBwZXIgdGlsZSAoY3VycmVudGx5IGJlaW5nIG5lZWRsZXNzbHkgcmUtY2FsY3VsYXRlZCBwZXItdGlsZS1wZXItc3R5bGUpXG4gICAgICAgIHRpbGUuc2V0dXBQcm9ncmFtKHRoaXMubWF0cmljZXMsIHByb2dyYW0pO1xuXG4gICAgICAgIC8vIE1vZGVsLXZpZXcgYW5kIG5vcm1hbCBtYXRyaWNlc1xuICAgICAgICB0aGlzLmNhbWVyYS5zZXR1cE1hdHJpY2VzKHRoaXMubWF0cmljZXMsIHByb2dyYW0pO1xuICAgIH1cblxuICAgIC8vIFNldCBnZW5lcmFsIHVuaWZvcm1zIHRoYXQgbXVzdCBiZSB1cGRhdGVkIG9uY2UgcGVyIHByb2dyYW1cbiAgICBzZXR1cFByb2dyYW0gKHByb2dyYW0pIHtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcyZnYnLCAndV9yZXNvbHV0aW9uJywgW3RoaXMuc2l6ZS5kZXZpY2Uud2lkdGgsIHRoaXMuc2l6ZS5kZXZpY2UuaGVpZ2h0XSk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnM2Z2JywgJ3VfbWFwX3Bvc2l0aW9uJywgW3RoaXMuY2VudGVyLm1ldGVycy54LCB0aGlzLmNlbnRlci5tZXRlcnMueSwgdGhpcy56b29tXSk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV9tZXRlcnNfcGVyX3BpeGVsJywgdGhpcy5tZXRlcnNfcGVyX3BpeGVsKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X2RldmljZV9waXhlbF9yYXRpbycsIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyk7XG5cbiAgICAgICAgdGhpcy5jYW1lcmEuc2V0dXBQcm9ncmFtKHByb2dyYW0pO1xuICAgIH1cblxufVxuIl19 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLWFzYXAuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLXJhdy5qcyIsIm5vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3Nlci1yZXNvbHZlL2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2VzNi9wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2N0eC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oYXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyYXRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1hdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9jc3Njb2xvcnBhcnNlci9jc3Njb2xvcnBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIm5vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2ZvbnRmYWNlb2JzZXJ2ZXIvZm9udGZhY2VvYnNlcnZlci5zdGFuZGFsb25lLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NsaXAuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY29udmVydC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9zaW1wbGlmeS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy90aWxlLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3dyYXAuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0My9pbnZlcnQuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0My9ub3JtYWwtZnJvbS1tYXQ0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvY29weS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2lkZW50aXR5LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvbG9va0F0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvbXVsdGlwbHkuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9wZXJzcGVjdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L3NjYWxlLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvdHJhbnNsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2dsLXNoYWRlci1lcnJvcnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2lzLWJ1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2NvbW1vbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2V4Y2VwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2xvYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL21hcmsuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2pzb24uanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9iaW5hcnkuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Jvb2wuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Zsb2F0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9pbnQuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL2Z1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9yZWdleHAuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL3VuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWFwLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbnVsbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvb21hcC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NlcS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2V0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zdHIuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3RpbWVzdGFtcC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvYmFzZTY0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2VkT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2lvbnMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2NyYzMyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9kZWZhdWx0cy5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvZXh0ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2ZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbG9hZC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL25vZGVqc1V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9vYmplY3QuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9BcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL0RhdGFSZWFkZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9Ob2RlQnVmZmVyUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvU3RyaW5nUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvVWludDhBcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL3JlYWRlckZvci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc2lnbmF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vQ29udmVydFdvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL0NyYzMyUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhV29ya2VyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vR2VuZXJpY1dvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL1N0cmVhbUhlbHBlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3VwcG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRmOC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJpZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJ5LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi96aXBPYmplY3QuanMiLCJub2RlX21vZHVsZXMvbWF0Y2gtZmVhdHVyZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL2RlZmxhdGUuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvaW5mbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9jb21tb24uanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvc3RyaW5ncy5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jb25zdGFudHMuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jcmMzMi5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2RlZmxhdGUuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9nemhlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmZhc3QuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9tZXNzYWdlcy5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3RyZWVzLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvenN0cmVhbS5qcyIsIm5vZGVfbW9kdWxlcy9wYmYvYnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL3BiZi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wb2ludC1nZW9tZXRyeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9zdHJpbmdfZGVjb2Rlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zdHJpcC1jb21tZW50cy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy90b3BvanNvbi1jbGllbnQvZGlzdC90b3BvanNvbi1jbGllbnQuanMiLCJub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZS5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVsYXllci5qcyIsInNyYy9idWlsZGVycy9jb21tb24uanMiLCJzcmMvYnVpbGRlcnMvcG9pbnRzLmpzIiwic3JjL2J1aWxkZXJzL3BvbHlnb25zLmpzIiwic3JjL2J1aWxkZXJzL3BvbHlsaW5lcy5qcyIsInNyYy9jYW1lcmEuanMiLCJzcmMvZ2VvLmpzIiwic3JjL2dsL2NvbnN0YW50cy5qcyIsInNyYy9nbC9jb250ZXh0LmpzIiwic3JjL2dsL2V4dGVuc2lvbnMuanMiLCJzcmMvZ2wvZ2xzbC5qcyIsInNyYy9nbC9yZW5kZXJfc3RhdGUuanMiLCJzcmMvZ2wvc2hhZGVyX3Byb2dyYW0uanMiLCJzcmMvZ2wvdGV4dHVyZS5qcyIsInNyYy9nbC92YW8uanMiLCJzcmMvZ2wvdmJvX21lc2guanMiLCJzcmMvZ2wvdmVydGV4X2RhdGEuanMiLCJzcmMvZ2wvdmVydGV4X2VsZW1lbnRzLmpzIiwic3JjL2dsL3ZlcnRleF9sYXlvdXQuanMiLCJzcmMvbGFiZWxzL2NvbGxpc2lvbi5qcyIsInNyYy9sYWJlbHMvaW50ZXJzZWN0LmpzIiwic3JjL2xhYmVscy9sYWJlbC5qcyIsInNyYy9sYWJlbHMvbGFiZWxfbGluZS5qcyIsInNyYy9sYWJlbHMvbGFiZWxfcG9pbnQuanMiLCJzcmMvbGFiZWxzL3BvaW50X2FuY2hvci5qcyIsInNyYy9sYWJlbHMvcG9pbnRfcGxhY2VtZW50LmpzIiwic3JjL2xhYmVscy9yZXBlYXRfZ3JvdXAuanMiLCJzcmMvbGVhZmxldF9sYXllci5qcyIsInNyYy9saWdodC5qcyIsInNyYy9tYXRlcmlhbC5qcyIsInNyYy9tb2R1bGUuanMiLCJzcmMvc2NlbmUuanMiLCJzcmMvc2NlbmVfYnVuZGxlLmpzIiwic3JjL3NjZW5lX2xvYWRlci5qcyIsInNyYy9zY2VuZV93b3JrZXIuanMiLCJzcmMvc2VsZWN0aW9uLmpzIiwic3JjL3NvdXJjZXMvZGF0YV9zb3VyY2UuanMiLCJzcmMvc291cmNlcy9nZW9qc29uLmpzIiwic3JjL3NvdXJjZXMvbXZ0LmpzIiwic3JjL3NvdXJjZXMvcmFzdGVyLmpzIiwic3JjL3NvdXJjZXMvdG9wb2pzb24uanMiLCJzcmMvc3R5bGVzL2xheWVyLmpzIiwic3JjL3N0eWxlcy9saW5lcy9kYXNoYXJyYXkuanMiLCJzcmMvc3R5bGVzL2xpbmVzL2xpbmVzLmpzIiwic3JjL3N0eWxlcy9wb2ludHMvcG9pbnRzLmpzIiwic3JjL3N0eWxlcy9wb2x5Z29ucy9wb2x5Z29ucy5qcyIsInNyYy9zdHlsZXMvcmFzdGVyL3Jhc3Rlci5qcyIsInNyYy9zdHlsZXMvc3R5bGUuanMiLCJzcmMvc3R5bGVzL3N0eWxlX21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3N0eWxlX3BhcnNlci5qcyIsInNyYy9zdHlsZXMvdGV4dC9jYW52YXNfdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC9mb250X21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3RleHQvdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X2xhYmVscy5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X3NldHRpbmdzLmpzIiwic3JjL3RpbGUuanMiLCJzcmMvdGlsZV9tYW5hZ2VyLmpzIiwic3JjL3RpbGVfcHlyYW1pZC5qcyIsInNyYy91dGlscy9kZWJ1Z19zZXR0aW5ncy5qcyIsInNyYy91dGlscy9lcnJvcnMuanMiLCJzcmMvdXRpbHMvZ2wtbWF0cml4LmpzIiwic3JjL3V0aWxzL2xvZy5qcyIsInNyYy91dGlscy9tZWRpYV9jYXB0dXJlLmpzIiwic3JjL3V0aWxzL21lcmdlLmpzIiwic3JjL3V0aWxzL29iYi5qcyIsInNyYy91dGlscy9wb2x5ZmlsbHMuanMiLCJzcmMvdXRpbHMvc3Vic2NyaWJlLmpzIiwic3JjL3V0aWxzL3RocmVhZC5qcyIsInNyYy91dGlscy91cmxzLmpzIiwic3JjL3V0aWxzL3V0aWxzLmpzIiwic3JjL3V0aWxzL3ZlcnNpb24uanMiLCJzcmMvdXRpbHMvd29ya2VyX2Jyb2tlci5qcyIsInNyYy92ZWN0b3IuanMiLCJzcmMvdmlldy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM3dkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBOztBQ0FBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7O0FDRkE7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGpEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDN01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25SQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0VUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xnREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdmFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDLzJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25MQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMWtCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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OztxQ0FDYyxPLEVBQVM7QUFDbkIsb0JBQVEsT0FBUixDQUFnQixLQUFoQixFQUF1QixjQUF2QixFQUF1QyxDQUFDLEtBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsS0FBbEIsRUFBeUIsS0FBSyxJQUFMLENBQVUsTUFBVixDQUFpQixNQUExQyxDQUF2QztBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsS0FBaEIsRUFBdUIsZ0JBQXZCLEVBQXlDLENBQUMsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFwQixFQUF1QixLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLENBQTFDLEVBQTZDLEtBQUssSUFBbEQsQ0FBekM7QUFDQSxvQkFBUSxPQUFSLENBQWdCLElBQWhCLEVBQXNCLG9CQUF0QixFQUE0QyxLQUFLLGdCQUFqRDtBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0Isc0JBQXRCLEVBQThDLGdCQUFNLGtCQUFwRDtBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0IsdUJBQXRCLEVBQStDLEtBQUssY0FBcEQ7QUFDQSxvQkFBUSxPQUFSLENBQWdCLElBQWhCLEVBQXNCLGdCQUF0QixFQUF3QyxLQUFLLE9BQTdDOztBQUVBLGlCQUFLLE1BQUwsQ0FBWSxZQUFaLENBQXlCLE9BQXpCO0FBQ0g7O0FBRUQ7Ozs7c0NBQ2U7QUFDWCxtQkFBUSxLQUFLLGNBQUwsSUFBdUIsa0JBQS9CO0FBQ0g7Ozs7OztrQkF0VWdCLEkiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIHJhd0FzYXAgcHJvdmlkZXMgZXZlcnl0aGluZyB3ZSBuZWVkIGV4Y2VwdCBleGNlcHRpb24gbWFuYWdlbWVudC5cbnZhciByYXdBc2FwID0gcmVxdWlyZShcIi4vcmF3XCIpO1xuLy8gUmF3VGFza3MgYXJlIHJlY3ljbGVkIHRvIHJlZHVjZSBHQyBjaHVybi5cbnZhciBmcmVlVGFza3MgPSBbXTtcbi8vIFdlIHF1ZXVlIGVycm9ycyB0byBlbnN1cmUgdGhleSBhcmUgdGhyb3duIGluIHJpZ2h0IG9yZGVyIChGSUZPKS5cbi8vIEFycmF5LWFzLXF1ZXVlIGlzIGdvb2QgZW5vdWdoIGhlcmUsIHNpbmNlIHdlIGFyZSBqdXN0IGRlYWxpbmcgd2l0aCBleGNlcHRpb25zLlxudmFyIHBlbmRpbmdFcnJvcnMgPSBbXTtcbnZhciByZXF1ZXN0RXJyb3JUaHJvdyA9IHJhd0FzYXAubWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKHRocm93Rmlyc3RFcnJvcik7XG5cbmZ1bmN0aW9uIHRocm93Rmlyc3RFcnJvcigpIHtcbiAgICBpZiAocGVuZGluZ0Vycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgcGVuZGluZ0Vycm9ycy5zaGlmdCgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDYWxscyBhIHRhc2sgYXMgc29vbiBhcyBwb3NzaWJsZSBhZnRlciByZXR1cm5pbmcsIGluIGl0cyBvd24gZXZlbnQsIHdpdGggcHJpb3JpdHlcbiAqIG92ZXIgb3RoZXIgZXZlbnRzIGxpa2UgYW5pbWF0aW9uLCByZWZsb3csIGFuZCByZXBhaW50LiBBbiBlcnJvciB0aHJvd24gZnJvbSBhblxuICogZXZlbnQgd2lsbCBub3QgaW50ZXJydXB0LCBub3IgZXZlbiBzdWJzdGFudGlhbGx5IHNsb3cgZG93biB0aGUgcHJvY2Vzc2luZyBvZlxuICogb3RoZXIgZXZlbnRzLCBidXQgd2lsbCBiZSByYXRoZXIgcG9zdHBvbmVkIHRvIGEgbG93ZXIgcHJpb3JpdHkgZXZlbnQuXG4gKiBAcGFyYW0ge3tjYWxsfX0gdGFzayBBIGNhbGxhYmxlIG9iamVjdCwgdHlwaWNhbGx5IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBub1xuICogYXJndW1lbnRzLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGFzYXA7XG5mdW5jdGlvbiBhc2FwKHRhc2spIHtcbiAgICB2YXIgcmF3VGFzaztcbiAgICBpZiAoZnJlZVRhc2tzLmxlbmd0aCkge1xuICAgICAgICByYXdUYXNrID0gZnJlZVRhc2tzLnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJhd1Rhc2sgPSBuZXcgUmF3VGFzaygpO1xuICAgIH1cbiAgICByYXdUYXNrLnRhc2sgPSB0YXNrO1xuICAgIHJhd0FzYXAocmF3VGFzayk7XG59XG5cbi8vIFdlIHdyYXAgdGFza3Mgd2l0aCByZWN5Y2xhYmxlIHRhc2sgb2JqZWN0cy4gIEEgdGFzayBvYmplY3QgaW1wbGVtZW50c1xuLy8gYGNhbGxgLCBqdXN0IGxpa2UgYSBmdW5jdGlvbi5cbmZ1bmN0aW9uIFJhd1Rhc2soKSB7XG4gICAgdGhpcy50YXNrID0gbnVsbDtcbn1cblxuLy8gVGhlIHNvbGUgcHVycG9zZSBvZiB3cmFwcGluZyB0aGUgdGFzayBpcyB0byBjYXRjaCB0aGUgZXhjZXB0aW9uIGFuZCByZWN5Y2xlXG4vLyB0aGUgdGFzayBvYmplY3QgYWZ0ZXIgaXRzIHNpbmdsZSB1c2UuXG5SYXdUYXNrLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIHRoaXMudGFzay5jYWxsKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGFzYXAub25lcnJvcikge1xuICAgICAgICAgICAgLy8gVGhpcyBob29rIGV4aXN0cyBwdXJlbHkgZm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gICAgICAgICAgICAvLyBJdHMgbmFtZSB3aWxsIGJlIHBlcmlvZGljYWxseSByYW5kb21pemVkIHRvIGJyZWFrIGFueSBjb2RlIHRoYXRcbiAgICAgICAgICAgIC8vIGRlcGVuZHMgb24gaXRzIGV4aXN0ZW5jZS5cbiAgICAgICAgICAgIGFzYXAub25lcnJvcihlcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJbiBhIHdlYiBicm93c2VyLCBleGNlcHRpb25zIGFyZSBub3QgZmF0YWwuIEhvd2V2ZXIsIHRvIGF2b2lkXG4gICAgICAgICAgICAvLyBzbG93aW5nIGRvd24gdGhlIHF1ZXVlIG9mIHBlbmRpbmcgdGFza3MsIHdlIHJldGhyb3cgdGhlIGVycm9yIGluIGFcbiAgICAgICAgICAgIC8vIGxvd2VyIHByaW9yaXR5IHR1cm4uXG4gICAgICAgICAgICBwZW5kaW5nRXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgICAgcmVxdWVzdEVycm9yVGhyb3coKTtcbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMudGFzayA9IG51bGw7XG4gICAgICAgIGZyZWVUYXNrc1tmcmVlVGFza3MubGVuZ3RoXSA9IHRoaXM7XG4gICAgfVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyBVc2UgdGhlIGZhc3Rlc3QgbWVhbnMgcG9zc2libGUgdG8gZXhlY3V0ZSBhIHRhc2sgaW4gaXRzIG93biB0dXJuLCB3aXRoXG4vLyBwcmlvcml0eSBvdmVyIG90aGVyIGV2ZW50cyBpbmNsdWRpbmcgSU8sIGFuaW1hdGlvbiwgcmVmbG93LCBhbmQgcmVkcmF3XG4vLyBldmVudHMgaW4gYnJvd3NlcnMuXG4vL1xuLy8gQW4gZXhjZXB0aW9uIHRocm93biBieSBhIHRhc2sgd2lsbCBwZXJtYW5lbnRseSBpbnRlcnJ1cHQgdGhlIHByb2Nlc3Npbmcgb2Zcbi8vIHN1YnNlcXVlbnQgdGFza3MuIFRoZSBoaWdoZXIgbGV2ZWwgYGFzYXBgIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCBpZiBhblxuLy8gZXhjZXB0aW9uIGlzIHRocm93biBieSBhIHRhc2ssIHRoYXQgdGhlIHRhc2sgcXVldWUgd2lsbCBjb250aW51ZSBmbHVzaGluZyBhc1xuLy8gc29vbiBhcyBwb3NzaWJsZSwgYnV0IGlmIHlvdSB1c2UgYHJhd0FzYXBgIGRpcmVjdGx5LCB5b3UgYXJlIHJlc3BvbnNpYmxlIHRvXG4vLyBlaXRoZXIgZW5zdXJlIHRoYXQgbm8gZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20geW91ciB0YXNrLCBvciB0byBtYW51YWxseVxuLy8gY2FsbCBgcmF3QXNhcC5yZXF1ZXN0Rmx1c2hgIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG5tb2R1bGUuZXhwb3J0cyA9IHJhd0FzYXA7XG5mdW5jdGlvbiByYXdBc2FwKHRhc2spIHtcbiAgICBpZiAoIXF1ZXVlLmxlbmd0aCkge1xuICAgICAgICByZXF1ZXN0Rmx1c2goKTtcbiAgICAgICAgZmx1c2hpbmcgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBFcXVpdmFsZW50IHRvIHB1c2gsIGJ1dCBhdm9pZHMgYSBmdW5jdGlvbiBjYWxsLlxuICAgIHF1ZXVlW3F1ZXVlLmxlbmd0aF0gPSB0YXNrO1xufVxuXG52YXIgcXVldWUgPSBbXTtcbi8vIE9uY2UgYSBmbHVzaCBoYXMgYmVlbiByZXF1ZXN0ZWQsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gYHJlcXVlc3RGbHVzaGAgYXJlXG4vLyBuZWNlc3NhcnkgdW50aWwgdGhlIG5leHQgYGZsdXNoYCBjb21wbGV0ZXMuXG52YXIgZmx1c2hpbmcgPSBmYWxzZTtcbi8vIGByZXF1ZXN0Rmx1c2hgIGlzIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIG1ldGhvZCB0aGF0IGF0dGVtcHRzIHRvIGtpY2tcbi8vIG9mZiBhIGBmbHVzaGAgZXZlbnQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4gYGZsdXNoYCB3aWxsIGF0dGVtcHQgdG8gZXhoYXVzdFxuLy8gdGhlIGV2ZW50IHF1ZXVlIGJlZm9yZSB5aWVsZGluZyB0byB0aGUgYnJvd3NlcidzIG93biBldmVudCBsb29wLlxudmFyIHJlcXVlc3RGbHVzaDtcbi8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCB0YXNrIHRvIGV4ZWN1dGUgaW4gdGhlIHRhc2sgcXVldWUuIFRoaXMgaXNcbi8vIHByZXNlcnZlZCBiZXR3ZWVuIGNhbGxzIHRvIGBmbHVzaGAgc28gdGhhdCBpdCBjYW4gYmUgcmVzdW1lZCBpZlxuLy8gYSB0YXNrIHRocm93cyBhbiBleGNlcHRpb24uXG52YXIgaW5kZXggPSAwO1xuLy8gSWYgYSB0YXNrIHNjaGVkdWxlcyBhZGRpdGlvbmFsIHRhc2tzIHJlY3Vyc2l2ZWx5LCB0aGUgdGFzayBxdWV1ZSBjYW4gZ3Jvd1xuLy8gdW5ib3VuZGVkLiBUbyBwcmV2ZW50IG1lbW9yeSBleGhhdXN0aW9uLCB0aGUgdGFzayBxdWV1ZSB3aWxsIHBlcmlvZGljYWxseVxuLy8gdHJ1bmNhdGUgYWxyZWFkeS1jb21wbGV0ZWQgdGFza3MuXG52YXIgY2FwYWNpdHkgPSAxMDI0O1xuXG4vLyBUaGUgZmx1c2ggZnVuY3Rpb24gcHJvY2Vzc2VzIGFsbCB0YXNrcyB0aGF0IGhhdmUgYmVlbiBzY2hlZHVsZWQgd2l0aFxuLy8gYHJhd0FzYXBgIHVubGVzcyBhbmQgdW50aWwgb25lIG9mIHRob3NlIHRhc2tzIHRocm93cyBhbiBleGNlcHRpb24uXG4vLyBJZiBhIHRhc2sgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgYGZsdXNoYCBlbnN1cmVzIHRoYXQgaXRzIHN0YXRlIHdpbGwgcmVtYWluXG4vLyBjb25zaXN0ZW50IGFuZCB3aWxsIHJlc3VtZSB3aGVyZSBpdCBsZWZ0IG9mZiB3aGVuIGNhbGxlZCBhZ2Fpbi5cbi8vIEhvd2V2ZXIsIGBmbHVzaGAgZG9lcyBub3QgbWFrZSBhbnkgYXJyYW5nZW1lbnRzIHRvIGJlIGNhbGxlZCBhZ2FpbiBpZiBhblxuLy8gZXhjZXB0aW9uIGlzIHRocm93bi5cbmZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHdoaWxlIChpbmRleCA8IHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gaW5kZXg7XG4gICAgICAgIC8vIEFkdmFuY2UgdGhlIGluZGV4IGJlZm9yZSBjYWxsaW5nIHRoZSB0YXNrLiBUaGlzIGVuc3VyZXMgdGhhdCB3ZSB3aWxsXG4gICAgICAgIC8vIGJlZ2luIGZsdXNoaW5nIG9uIHRoZSBuZXh0IHRhc2sgdGhlIHRhc2sgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICBpbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgcXVldWVbY3VycmVudEluZGV4XS5jYWxsKCk7XG4gICAgICAgIC8vIFByZXZlbnQgbGVha2luZyBtZW1vcnkgZm9yIGxvbmcgY2hhaW5zIG9mIHJlY3Vyc2l2ZSBjYWxscyB0byBgYXNhcGAuXG4gICAgICAgIC8vIElmIHdlIGNhbGwgYGFzYXBgIHdpdGhpbiB0YXNrcyBzY2hlZHVsZWQgYnkgYGFzYXBgLCB0aGUgcXVldWUgd2lsbFxuICAgICAgICAvLyBncm93LCBidXQgdG8gYXZvaWQgYW4gTyhuKSB3YWxrIGZvciBldmVyeSB0YXNrIHdlIGV4ZWN1dGUsIHdlIGRvbid0XG4gICAgICAgIC8vIHNoaWZ0IHRhc2tzIG9mZiB0aGUgcXVldWUgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZXhlY3V0ZWQuXG4gICAgICAgIC8vIEluc3RlYWQsIHdlIHBlcmlvZGljYWxseSBzaGlmdCAxMDI0IHRhc2tzIG9mZiB0aGUgcXVldWUuXG4gICAgICAgIGlmIChpbmRleCA+IGNhcGFjaXR5KSB7XG4gICAgICAgICAgICAvLyBNYW51YWxseSBzaGlmdCBhbGwgdmFsdWVzIHN0YXJ0aW5nIGF0IHRoZSBpbmRleCBiYWNrIHRvIHRoZVxuICAgICAgICAgICAgLy8gYmVnaW5uaW5nIG9mIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgIGZvciAodmFyIHNjYW4gPSAwLCBuZXdMZW5ndGggPSBxdWV1ZS5sZW5ndGggLSBpbmRleDsgc2NhbiA8IG5ld0xlbmd0aDsgc2NhbisrKSB7XG4gICAgICAgICAgICAgICAgcXVldWVbc2Nhbl0gPSBxdWV1ZVtzY2FuICsgaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVldWUubGVuZ3RoIC09IGluZGV4O1xuICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgaW5kZXggPSAwO1xuICAgIGZsdXNoaW5nID0gZmFsc2U7XG59XG5cbi8vIGByZXF1ZXN0Rmx1c2hgIGlzIGltcGxlbWVudGVkIHVzaW5nIGEgc3RyYXRlZ3kgYmFzZWQgb24gZGF0YSBjb2xsZWN0ZWQgZnJvbVxuLy8gZXZlcnkgYXZhaWxhYmxlIFNhdWNlTGFicyBTZWxlbml1bSB3ZWIgZHJpdmVyIHdvcmtlciBhdCB0aW1lIG9mIHdyaXRpbmcuXG4vLyBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xbUctNVVZR3VwNXF4R2RFTVdraFA2QldDejA1M05VYjJFMVFvVVRVMTZ1QS9lZGl0I2dpZD03ODM3MjQ1OTNcblxuLy8gU2FmYXJpIDYgYW5kIDYuMSBmb3IgZGVza3RvcCwgaVBhZCwgYW5kIGlQaG9uZSBhcmUgdGhlIG9ubHkgYnJvd3NlcnMgdGhhdFxuLy8gaGF2ZSBXZWJLaXRNdXRhdGlvbk9ic2VydmVyIGJ1dCBub3QgdW4tcHJlZml4ZWQgTXV0YXRpb25PYnNlcnZlci5cbi8vIE11c3QgdXNlIGBnbG9iYWxgIG9yIGBzZWxmYCBpbnN0ZWFkIG9mIGB3aW5kb3dgIHRvIHdvcmsgaW4gYm90aCBmcmFtZXMgYW5kIHdlYlxuLy8gd29ya2Vycy4gYGdsb2JhbGAgaXMgYSBwcm92aXNpb24gb2YgQnJvd3NlcmlmeSwgTXIsIE1ycywgb3IgTW9wLlxuXG4vKiBnbG9iYWxzIHNlbGYgKi9cbnZhciBzY29wZSA9IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiBzZWxmO1xudmFyIEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID0gc2NvcGUuTXV0YXRpb25PYnNlcnZlciB8fCBzY29wZS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuXG4vLyBNdXRhdGlvbk9ic2VydmVycyBhcmUgZGVzaXJhYmxlIGJlY2F1c2UgdGhleSBoYXZlIGhpZ2ggcHJpb3JpdHkgYW5kIHdvcmtcbi8vIHJlbGlhYmx5IGV2ZXJ5d2hlcmUgdGhleSBhcmUgaW1wbGVtZW50ZWQuXG4vLyBUaGV5IGFyZSBpbXBsZW1lbnRlZCBpbiBhbGwgbW9kZXJuIGJyb3dzZXJzLlxuLy9cbi8vIC0gQW5kcm9pZCA0LTQuM1xuLy8gLSBDaHJvbWUgMjYtMzRcbi8vIC0gRmlyZWZveCAxNC0yOVxuLy8gLSBJbnRlcm5ldCBFeHBsb3JlciAxMVxuLy8gLSBpUGFkIFNhZmFyaSA2LTcuMVxuLy8gLSBpUGhvbmUgU2FmYXJpIDctNy4xXG4vLyAtIFNhZmFyaSA2LTdcbmlmICh0eXBlb2YgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJlcXVlc3RGbHVzaCA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21NdXRhdGlvbk9ic2VydmVyKGZsdXNoKTtcblxuLy8gTWVzc2FnZUNoYW5uZWxzIGFyZSBkZXNpcmFibGUgYmVjYXVzZSB0aGV5IGdpdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUgSFRNTFxuLy8gdGFzayBxdWV1ZSwgYXJlIGltcGxlbWVudGVkIGluIEludGVybmV0IEV4cGxvcmVyIDEwLCBTYWZhcmkgNS4wLTEsIGFuZCBPcGVyYVxuLy8gMTEtMTIsIGFuZCBpbiB3ZWIgd29ya2VycyBpbiBtYW55IGVuZ2luZXMuXG4vLyBBbHRob3VnaCBtZXNzYWdlIGNoYW5uZWxzIHlpZWxkIHRvIGFueSBxdWV1ZWQgcmVuZGVyaW5nIGFuZCBJTyB0YXNrcywgdGhleVxuLy8gd291bGQgYmUgYmV0dGVyIHRoYW4gaW1wb3NpbmcgdGhlIDRtcyBkZWxheSBvZiB0aW1lcnMuXG4vLyBIb3dldmVyLCB0aGV5IGRvIG5vdCB3b3JrIHJlbGlhYmx5IGluIEludGVybmV0IEV4cGxvcmVyIG9yIFNhZmFyaS5cblxuLy8gSW50ZXJuZXQgRXhwbG9yZXIgMTAgaXMgdGhlIG9ubHkgYnJvd3NlciB0aGF0IGhhcyBzZXRJbW1lZGlhdGUgYnV0IGRvZXNcbi8vIG5vdCBoYXZlIE11dGF0aW9uT2JzZXJ2ZXJzLlxuLy8gQWx0aG91Z2ggc2V0SW1tZWRpYXRlIHlpZWxkcyB0byB0aGUgYnJvd3NlcidzIHJlbmRlcmVyLCBpdCB3b3VsZCBiZVxuLy8gcHJlZmVycmFibGUgdG8gZmFsbGluZyBiYWNrIHRvIHNldFRpbWVvdXQgc2luY2UgaXQgZG9lcyBub3QgaGF2ZVxuLy8gdGhlIG1pbmltdW0gNG1zIHBlbmFsdHkuXG4vLyBVbmZvcnR1bmF0ZWx5IHRoZXJlIGFwcGVhcnMgdG8gYmUgYSBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAgTW9iaWxlIChhbmRcbi8vIERlc2t0b3AgdG8gYSBsZXNzZXIgZXh0ZW50KSB0aGF0IHJlbmRlcnMgYm90aCBzZXRJbW1lZGlhdGUgYW5kXG4vLyBNZXNzYWdlQ2hhbm5lbCB1c2VsZXNzIGZvciB0aGUgcHVycG9zZXMgb2YgQVNBUC5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvcS9pc3N1ZXMvMzk2XG5cbi8vIFRpbWVycyBhcmUgaW1wbGVtZW50ZWQgdW5pdmVyc2FsbHkuXG4vLyBXZSBmYWxsIGJhY2sgdG8gdGltZXJzIGluIHdvcmtlcnMgaW4gbW9zdCBlbmdpbmVzLCBhbmQgaW4gZm9yZWdyb3VuZFxuLy8gY29udGV4dHMgaW4gdGhlIGZvbGxvd2luZyBicm93c2Vycy5cbi8vIEhvd2V2ZXIsIG5vdGUgdGhhdCBldmVuIHRoaXMgc2ltcGxlIGNhc2UgcmVxdWlyZXMgbnVhbmNlcyB0byBvcGVyYXRlIGluIGFcbi8vIGJyb2FkIHNwZWN0cnVtIG9mIGJyb3dzZXJzLlxuLy9cbi8vIC0gRmlyZWZveCAzLTEzXG4vLyAtIEludGVybmV0IEV4cGxvcmVyIDYtOVxuLy8gLSBpUGFkIFNhZmFyaSA0LjNcbi8vIC0gTHlueCAyLjguN1xufSBlbHNlIHtcbiAgICByZXF1ZXN0Rmx1c2ggPSBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXIoZmx1c2gpO1xufVxuXG4vLyBgcmVxdWVzdEZsdXNoYCByZXF1ZXN0cyB0aGF0IHRoZSBoaWdoIHByaW9yaXR5IGV2ZW50IHF1ZXVlIGJlIGZsdXNoZWQgYXNcbi8vIHNvb24gYXMgcG9zc2libGUuXG4vLyBUaGlzIGlzIHVzZWZ1bCB0byBwcmV2ZW50IGFuIGVycm9yIHRocm93biBpbiBhIHRhc2sgZnJvbSBzdGFsbGluZyB0aGUgZXZlbnRcbi8vIHF1ZXVlIGlmIHRoZSBleGNlcHRpb24gaGFuZGxlZCBieSBOb2RlLmpz4oCZc1xuLy8gYHByb2Nlc3Mub24oXCJ1bmNhdWdodEV4Y2VwdGlvblwiKWAgb3IgYnkgYSBkb21haW4uXG5yYXdBc2FwLnJlcXVlc3RGbHVzaCA9IHJlcXVlc3RGbHVzaDtcblxuLy8gVG8gcmVxdWVzdCBhIGhpZ2ggcHJpb3JpdHkgZXZlbnQsIHdlIGluZHVjZSBhIG11dGF0aW9uIG9ic2VydmVyIGJ5IHRvZ2dsaW5nXG4vLyB0aGUgdGV4dCBvZiBhIHRleHQgbm9kZSBiZXR3ZWVuIFwiMVwiIGFuZCBcIi0xXCIuXG5mdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaykge1xuICAgIHZhciB0b2dnbGUgPSAxO1xuICAgIHZhciBvYnNlcnZlciA9IG5ldyBCcm93c2VyTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKG5vZGUsIHtjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuICAgICAgICB0b2dnbGUgPSAtdG9nZ2xlO1xuICAgICAgICBub2RlLmRhdGEgPSB0b2dnbGU7XG4gICAgfTtcbn1cblxuLy8gVGhlIG1lc3NhZ2UgY2hhbm5lbCB0ZWNobmlxdWUgd2FzIGRpc2NvdmVyZWQgYnkgTWFsdGUgVWJsIGFuZCB3YXMgdGhlXG4vLyBvcmlnaW5hbCBmb3VuZGF0aW9uIGZvciB0aGlzIGxpYnJhcnkuXG4vLyBodHRwOi8vd3d3Lm5vbmJsb2NraW5nLmlvLzIwMTEvMDYvd2luZG93bmV4dHRpY2suaHRtbFxuXG4vLyBTYWZhcmkgNi4wLjUgKGF0IGxlYXN0KSBpbnRlcm1pdHRlbnRseSBmYWlscyB0byBjcmVhdGUgbWVzc2FnZSBwb3J0cyBvbiBhXG4vLyBwYWdlJ3MgZmlyc3QgbG9hZC4gVGhhbmtmdWxseSwgdGhpcyB2ZXJzaW9uIG9mIFNhZmFyaSBzdXBwb3J0c1xuLy8gTXV0YXRpb25PYnNlcnZlcnMsIHNvIHdlIGRvbid0IG5lZWQgdG8gZmFsbCBiYWNrIGluIHRoYXQgY2FzZS5cblxuLy8gZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbU1lc3NhZ2VDaGFubmVsKGNhbGxiYWNrKSB7XG4vLyAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbi8vICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuLy8gICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbi8vICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbi8vICAgICB9O1xuLy8gfVxuXG4vLyBGb3IgcmVhc29ucyBleHBsYWluZWQgYWJvdmUsIHdlIGFyZSBhbHNvIHVuYWJsZSB0byB1c2UgYHNldEltbWVkaWF0ZWBcbi8vIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLlxuLy8gRXZlbiBpZiB3ZSB3ZXJlLCB0aGVyZSBpcyBhbm90aGVyIGJ1ZyBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMC5cbi8vIEl0IGlzIG5vdCBzdWZmaWNpZW50IHRvIGFzc2lnbiBgc2V0SW1tZWRpYXRlYCB0byBgcmVxdWVzdEZsdXNoYCBiZWNhdXNlXG4vLyBgc2V0SW1tZWRpYXRlYCBtdXN0IGJlIGNhbGxlZCAqYnkgbmFtZSogYW5kIHRoZXJlZm9yZSBtdXN0IGJlIHdyYXBwZWQgaW4gYVxuLy8gY2xvc3VyZS5cbi8vIE5ldmVyIGZvcmdldC5cblxuLy8gZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbVNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuLy8gICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbi8vICAgICAgICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbi8vICAgICB9O1xuLy8gfVxuXG4vLyBTYWZhcmkgNi4wIGhhcyBhIHByb2JsZW0gd2hlcmUgdGltZXJzIHdpbGwgZ2V0IGxvc3Qgd2hpbGUgdGhlIHVzZXIgaXNcbi8vIHNjcm9sbGluZy4gVGhpcyBwcm9ibGVtIGRvZXMgbm90IGltcGFjdCBBU0FQIGJlY2F1c2UgU2FmYXJpIDYuMCBzdXBwb3J0c1xuLy8gbXV0YXRpb24gb2JzZXJ2ZXJzLCBzbyB0aGF0IGltcGxlbWVudGF0aW9uIGlzIHVzZWQgaW5zdGVhZC5cbi8vIEhvd2V2ZXIsIGlmIHdlIGV2ZXIgZWxlY3QgdG8gdXNlIHRpbWVycyBpbiBTYWZhcmksIHRoZSBwcmV2YWxlbnQgd29yay1hcm91bmRcbi8vIGlzIHRvIGFkZCBhIHNjcm9sbCBldmVudCBsaXN0ZW5lciB0aGF0IGNhbGxzIGZvciBhIGZsdXNoLlxuXG4vLyBgc2V0VGltZW91dGAgZG9lcyBub3QgY2FsbCB0aGUgcGFzc2VkIGNhbGxiYWNrIGlmIHRoZSBkZWxheSBpcyBsZXNzIHRoYW5cbi8vIGFwcHJveGltYXRlbHkgNyBpbiB3ZWIgd29ya2VycyBpbiBGaXJlZm94IDggdGhyb3VnaCAxOCwgYW5kIHNvbWV0aW1lcyBub3Rcbi8vIGV2ZW4gdGhlbi5cblxuZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuICAgICAgICAvLyBXZSBkaXNwYXRjaCBhIHRpbWVvdXQgd2l0aCBhIHNwZWNpZmllZCBkZWxheSBvZiAwIGZvciBlbmdpbmVzIHRoYXRcbiAgICAgICAgLy8gY2FuIHJlbGlhYmx5IGFjY29tbW9kYXRlIHRoYXQgcmVxdWVzdC4gVGhpcyB3aWxsIHVzdWFsbHkgYmUgc25hcHBlZFxuICAgICAgICAvLyB0byBhIDQgbWlsaXNlY29uZCBkZWxheSwgYnV0IG9uY2Ugd2UncmUgZmx1c2hpbmcsIHRoZXJlJ3Mgbm8gZGVsYXlcbiAgICAgICAgLy8gYmV0d2VlbiBldmVudHMuXG4gICAgICAgIHZhciB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChoYW5kbGVUaW1lciwgMCk7XG4gICAgICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHRoaXMgdGltZXIgZ2V0cyBmcmVxdWVudGx5IGRyb3BwZWQgaW4gRmlyZWZveFxuICAgICAgICAvLyB3b3JrZXJzLCB3ZSBlbmxpc3QgYW4gaW50ZXJ2YWwgaGFuZGxlIHRoYXQgd2lsbCB0cnkgdG8gZmlyZVxuICAgICAgICAvLyBhbiBldmVudCAyMCB0aW1lcyBwZXIgc2Vjb25kIHVudGlsIGl0IHN1Y2NlZWRzLlxuICAgICAgICB2YXIgaW50ZXJ2YWxIYW5kbGUgPSBzZXRJbnRlcnZhbChoYW5kbGVUaW1lciwgNTApO1xuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVRpbWVyKCkge1xuICAgICAgICAgICAgLy8gV2hpY2hldmVyIHRpbWVyIHN1Y2NlZWRzIHdpbGwgY2FuY2VsIGJvdGggdGltZXJzIGFuZFxuICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgY2FsbGJhY2suXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSGFuZGxlKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyBUaGlzIGlzIGZvciBgYXNhcC5qc2Agb25seS5cbi8vIEl0cyBuYW1lIHdpbGwgYmUgcGVyaW9kaWNhbGx5IHJhbmRvbWl6ZWQgdG8gYnJlYWsgYW55IGNvZGUgdGhhdCBkZXBlbmRzIG9uXG4vLyBpdHMgZXhpc3RlbmNlLlxucmF3QXNhcC5tYWtlUmVxdWVzdENhbGxGcm9tVGltZXIgPSBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXI7XG5cbi8vIEFTQVAgd2FzIG9yaWdpbmFsbHkgYSBuZXh0VGljayBzaGltIGluY2x1ZGVkIGluIFEuIFRoaXMgd2FzIGZhY3RvcmVkIG91dFxuLy8gaW50byB0aGlzIEFTQVAgcGFja2FnZS4gSXQgd2FzIGxhdGVyIGFkYXB0ZWQgdG8gUlNWUCB3aGljaCBtYWRlIGZ1cnRoZXJcbi8vIGFtZW5kbWVudHMuIFRoZXNlIGRlY2lzaW9ucywgcGFydGljdWxhcmx5IHRvIG1hcmdpbmFsaXplIE1lc3NhZ2VDaGFubmVsIGFuZFxuLy8gdG8gY2FwdHVyZSB0aGUgTXV0YXRpb25PYnNlcnZlciBpbXBsZW1lbnRhdGlvbiBpbiBhIGNsb3N1cmUsIHdlcmUgaW50ZWdyYXRlZFxuLy8gYmFjayBpbnRvIEFTQVAgcHJvcGVyLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vcnN2cC5qcy9ibG9iL2NkZGY3MjMyNTQ2YTljZjg1ODUyNGI3NWNkZTZmOWVkZjcyNjIwYTcvbGliL3JzdnAvYXNhcC5qc1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gcGxhY2VIb2xkZXJzQ291bnQgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcbiAgLy8gaWYgdGhlcmUgYXJlIHR3byBwbGFjZWhvbGRlcnMsIHRoYW4gdGhlIHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBpdFxuICAvLyByZXByZXNlbnQgb25lIGJ5dGVcbiAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG4gIC8vIHRoaXMgaXMganVzdCBhIGNoZWFwIGhhY2sgdG8gbm90IGRvIGluZGV4T2YgdHdpY2VcbiAgcmV0dXJuIGI2NFtsZW4gLSAyXSA9PT0gJz0nID8gMiA6IGI2NFtsZW4gLSAxXSA9PT0gJz0nID8gMSA6IDBcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICByZXR1cm4gYjY0Lmxlbmd0aCAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzQ291bnQoYjY0KVxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciBpLCBqLCBsLCB0bXAsIHBsYWNlSG9sZGVycywgYXJyXG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIHBsYWNlSG9sZGVycyA9IHBsYWNlSG9sZGVyc0NvdW50KGI2NClcblxuICBhcnIgPSBuZXcgQXJyKGxlbiAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgb3V0cHV0ID0gJydcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz09J1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMTBdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPSdcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnByb21pc2UnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9fY29yZScpLlByb21pc2U7IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07IiwiLy8gMjIuMS4zLjMxIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxudmFyIFVOU0NPUEFCTEVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3Vuc2NvcGFibGVzJylcbiAgLCBBcnJheVByb3RvICA9IEFycmF5LnByb3RvdHlwZTtcbmlmKEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZClyZXF1aXJlKCcuL19oaWRlJykoQXJyYXlQcm90bywgVU5TQ09QQUJMRVMsIHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgQXJyYXlQcm90b1tVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIENvbnN0cnVjdG9yLCBuYW1lLCBmb3JiaWRkZW5GaWVsZCl7XG4gIGlmKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKXtcbiAgICB0aHJvdyBUeXBlRXJyb3IobmFtZSArICc6IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICB9IHJldHVybiBpdDtcbn07IiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoIWlzT2JqZWN0KGl0KSl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07IiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIHRvSW5kZXggICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKCR0aGlzLCBlbCwgZnJvbUluZGV4KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gdG9JbmRleChmcm9tSW5kZXgsIGxlbmd0aClcbiAgICAgICwgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIGlmKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKXdoaWxlKGxlbmd0aCA+IGluZGV4KXtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I3RvSW5kZXggaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcbiAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59OyIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKVxuICAvLyBFUzMgd3JvbmcgaGVyZVxuICAsIEFSRyA9IGNvZihmdW5jdGlvbigpeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07IiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTsiLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0ge3ZlcnNpb246ICcyLjQuMCd9O1xuaWYodHlwZW9mIF9fZSA9PSAnbnVtYmVyJylfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgdGhhdCwgbGVuZ3RoKXtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYodGhhdCA9PT0gdW5kZWZpbmVkKXJldHVybiBmbjtcbiAgc3dpdGNoKGxlbmd0aCl7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYSl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbihhLCBiLCBjKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTsiLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ID09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07IiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xufSk7IiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50XG4gIC8vIGluIG9sZCBJRSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0J1xuICAsIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59OyIsIi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gKFxuICAnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJ1xuKS5zcGxpdCgnLCcpOyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGNvcmUgICAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxuICAsIGhpZGUgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIHJlZGVmaW5lICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBjdHggICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHNvdXJjZSl7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GXG4gICAgLCBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HXG4gICAgLCBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TXG4gICAgLCBJU19QUk9UTyAgPSB0eXBlICYgJGV4cG9ydC5QXG4gICAgLCBJU19CSU5EICAgPSB0eXBlICYgJGV4cG9ydC5CXG4gICAgLCB0YXJnZXQgICAgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gfHwgKGdsb2JhbFtuYW1lXSA9IHt9KSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV1cbiAgICAsIGV4cG9ydHMgICA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pXG4gICAgLCBleHBQcm90byAgPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KVxuICAgICwga2V5LCBvd24sIG91dCwgZXhwO1xuICBpZihJU19HTE9CQUwpc291cmNlID0gbmFtZTtcbiAgZm9yKGtleSBpbiBzb3VyY2Upe1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSAob3duID8gdGFyZ2V0IDogc291cmNlKVtrZXldO1xuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgZXhwID0gSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIGlmKHRhcmdldClyZWRlZmluZSh0YXJnZXQsIGtleSwgb3V0LCB0eXBlICYgJGV4cG9ydC5VKTtcbiAgICAvLyBleHBvcnRcbiAgICBpZihleHBvcnRzW2tleV0gIT0gb3V0KWhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmKElTX1BST1RPICYmIGV4cFByb3RvW2tleV0gIT0gb3V0KWV4cFByb3RvW2tleV0gPSBvdXQ7XG4gIH1cbn07XG5nbG9iYWwuY29yZSA9IGNvcmU7XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgIFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59OyIsInZhciBjdHggICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgY2FsbCAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpXG4gICwgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvTGVuZ3RoICAgID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBnZXRJdGVyRm4gICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJylcbiAgLCBCUkVBSyAgICAgICA9IHt9XG4gICwgUkVUVVJOICAgICAgPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVyYWJsZSwgZW50cmllcywgZm4sIHRoYXQsIElURVJBVE9SKXtcbiAgdmFyIGl0ZXJGbiA9IElURVJBVE9SID8gZnVuY3Rpb24oKXsgcmV0dXJuIGl0ZXJhYmxlOyB9IDogZ2V0SXRlckZuKGl0ZXJhYmxlKVxuICAgICwgZiAgICAgID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpXG4gICAgLCBpbmRleCAgPSAwXG4gICAgLCBsZW5ndGgsIHN0ZXAsIGl0ZXJhdG9yLCByZXN1bHQ7XG4gIGlmKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmKGlzQXJyYXlJdGVyKGl0ZXJGbikpZm9yKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXtcbiAgICByZXN1bHQgPSBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgaWYocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTilyZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7ICl7XG4gICAgcmVzdWx0ID0gY2FsbChpdGVyYXRvciwgZiwgc3RlcC52YWx1ZSwgZW50cmllcyk7XG4gICAgaWYocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTilyZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyAgPSBCUkVBSztcbmV4cG9ydHMuUkVUVVJOID0gUkVUVVJOOyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYodHlwZW9mIF9fZyA9PSAnbnVtYmVyJylfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTsiLCJ2YXIgZFAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7IiwibW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG59KTsiLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIGFyZ3MsIHRoYXQpe1xuICB2YXIgdW4gPSB0aGF0ID09PSB1bmRlZmluZWQ7XG4gIHN3aXRjaChhcmdzLmxlbmd0aCl7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07IiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBjb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07IiwiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIElURVJBVE9SICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07IiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIGVudHJpZXMpe1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2goZSl7XG4gICAgdmFyIHJldCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZihyZXQgIT09IHVuZGVmaW5lZClhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpXG4gICwgZGVzY3JpcHRvciAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KXtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7bmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KX0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHJlZGVmaW5lICAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIGhpZGUgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgaGFzICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIEl0ZXJhdG9ycyAgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCAkaXRlckNyZWF0ZSAgICA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxuICAsIElURVJBVE9SICAgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBCVUdHWSAgICAgICAgICA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKSAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gICwgRkZfSVRFUkFUT1IgICAgPSAnQEBpdGVyYXRvcidcbiAgLCBLRVlTICAgICAgICAgICA9ICdrZXlzJ1xuICAsIFZBTFVFUyAgICAgICAgID0gJ3ZhbHVlcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKXtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24oa2luZCl7XG4gICAgaWYoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaChraW5kKXtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHICAgICAgICA9IE5BTUUgKyAnIEl0ZXJhdG9yJ1xuICAgICwgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTXG4gICAgLCBWQUxVRVNfQlVHID0gZmFsc2VcbiAgICAsIHByb3RvICAgICAgPSBCYXNlLnByb3RvdHlwZVxuICAgICwgJG5hdGl2ZSAgICA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXVxuICAgICwgJGRlZmF1bHQgICA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpXG4gICAgLCAkZW50cmllcyAgID0gREVGQVVMVCA/ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKSA6IHVuZGVmaW5lZFxuICAgICwgJGFueU5hdGl2ZSA9IE5BTUUgPT0gJ0FycmF5JyA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmVcbiAgICAsIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYoJGFueU5hdGl2ZSl7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UpKTtcbiAgICBpZihJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSl7XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuICAgICAgaWYoIUxJQlJBUlkgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKWhpZGUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICB9XG4gIH1cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZihERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpe1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiAkbmF0aXZlLmNhbGwodGhpcyk7IH07XG4gIH1cbiAgLy8gRGVmaW5lIGl0ZXJhdG9yXG4gIGlmKCghTElCUkFSWSB8fCBGT1JDRUQpICYmIChCVUdHWSB8fCBWQUxVRVNfQlVHIHx8ICFwcm90b1tJVEVSQVRPUl0pKXtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddICA9IHJldHVyblRoaXM7XG4gIGlmKERFRkFVTFQpe1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6ICBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6ICAgIElTX1NFVCAgICAgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG4gICAgfTtcbiAgICBpZihGT1JDRUQpZm9yKGtleSBpbiBtZXRob2RzKXtcbiAgICAgIGlmKCEoa2V5IGluIHByb3RvKSlyZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZHM7XG59OyIsInZhciBJVEVSQVRPUiAgICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgcml0ZXIgPSBbN11bSVRFUkFUT1JdKCk7XG4gIHJpdGVyWydyZXR1cm4nXSA9IGZ1bmN0aW9uKCl7IFNBRkVfQ0xPU0lORyA9IHRydWU7IH07XG4gIEFycmF5LmZyb20ocml0ZXIsIGZ1bmN0aW9uKCl7IHRocm93IDI7IH0pO1xufSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGV4ZWMsIHNraXBDbG9zaW5nKXtcbiAgaWYoIXNraXBDbG9zaW5nICYmICFTQUZFX0NMT1NJTkcpcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgID0gWzddXG4gICAgICAsIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24oKXsgcmV0dXJuIHtkb25lOiBzYWZlID0gdHJ1ZX07IH07XG4gICAgYXJyW0lURVJBVE9SXSA9IGZ1bmN0aW9uKCl7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gc2FmZTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkb25lLCB2YWx1ZSl7XG4gIHJldHVybiB7dmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmV9O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHt9OyIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7IiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgbWFjcm90YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldFxuICAsIE9ic2VydmVyICA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyXG4gICwgcHJvY2VzcyAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBQcm9taXNlICAgPSBnbG9iYWwuUHJvbWlzZVxuICAsIGlzTm9kZSAgICA9IHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpe1xuICB2YXIgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYoaXNOb2RlICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZShoZWFkKXtcbiAgICAgIGZuICAgPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoKGUpe1xuICAgICAgICBpZihoZWFkKW5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmKHBhcmVudClwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmKGlzTm9kZSl7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlclxuICB9IGVsc2UgaWYoT2JzZXJ2ZXIpe1xuICAgIHZhciB0b2dnbGUgPSB0cnVlXG4gICAgICAsIG5vZGUgICA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpe1xuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgICBtYWNyb3Rhc2suY2FsbChnbG9iYWwsIGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGZuKXtcbiAgICB2YXIgdGFzayA9IHtmbjogZm4sIG5leHQ6IHVuZGVmaW5lZH07XG4gICAgaWYobGFzdClsYXN0Lm5leHQgPSB0YXNrO1xuICAgIGlmKCFoZWFkKXtcbiAgICAgIGhlYWQgPSB0YXNrO1xuICAgICAgbm90aWZ5KCk7XG4gICAgfSBsYXN0ID0gdGFzaztcbiAgfTtcbn07IiwiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGRQcyAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpXG4gICwgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJylcbiAgLCBJRV9QUk9UTyAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKVxuICAsIEVtcHR5ICAgICAgID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfVxuICAsIFBST1RPVFlQRSAgID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24oKXtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJylcbiAgICAsIGkgICAgICA9IGVudW1CdWdLZXlzLmxlbmd0aFxuICAgICwgbHQgICAgID0gJzwnXG4gICAgLCBndCAgICAgPSAnPidcbiAgICAsIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlKGktLSlkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcyl7XG4gIHZhciByZXN1bHQ7XG4gIGlmKE8gIT09IG51bGwpe1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIiwidmFyIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJylcbiAgLCB0b1ByaW1pdGl2ZSAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXG4gICwgZFAgICAgICAgICAgICAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKXtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmKElFOF9ET01fREVGSU5FKXRyeSB7XG4gICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gIGlmKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcyl0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZigndmFsdWUnIGluIEF0dHJpYnV0ZXMpT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTsiLCJ2YXIgZFAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBnZXRLZXlzICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKXtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzICAgPSBnZXRLZXlzKFByb3BlcnRpZXMpXG4gICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICwgaSA9IDBcbiAgICAsIFA7XG4gIHdoaWxlKGxlbmd0aCA+IGkpZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59OyIsIi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgaGFzICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIHRvT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcbiAgLCBJRV9QUk9UTyAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKVxuICAsIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24oTyl7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYoaGFzKE8sIElFX1BST1RPKSlyZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3Ipe1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07IiwidmFyIGhhcyAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgdG9JT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSlcbiAgLCBJRV9QUk9UTyAgICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBuYW1lcyl7XG4gIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuICAgICwgaSAgICAgID0gMFxuICAgICwgcmVzdWx0ID0gW11cbiAgICAsIGtleTtcbiAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpaWYoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKXtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyIsIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKVxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTyl7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSl7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZSAgOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZSAgICA6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWUgICAgICAgOiB2YWx1ZVxuICB9O1xufTsiLCJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih0YXJnZXQsIHNyYywgc2FmZSl7XG4gIGZvcih2YXIga2V5IGluIHNyYylyZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIHNhZmUpO1xuICByZXR1cm4gdGFyZ2V0O1xufTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBoYXMgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIFNSQyAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKVxuICAsIFRPX1NUUklORyA9ICd0b1N0cmluZydcbiAgLCAkdG9TdHJpbmcgPSBGdW5jdGlvbltUT19TVFJJTkddXG4gICwgVFBMICAgICAgID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuL19jb3JlJykuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuICR0b1N0cmluZy5jYWxsKGl0KTtcbn07XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE8sIGtleSwgdmFsLCBzYWZlKXtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgdmFsID09ICdmdW5jdGlvbic7XG4gIGlmKGlzRnVuY3Rpb24paGFzKHZhbCwgJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICBpZihPW2tleV0gPT09IHZhbClyZXR1cm47XG4gIGlmKGlzRnVuY3Rpb24paGFzKHZhbCwgU1JDKSB8fCBoaWRlKHZhbCwgU1JDLCBPW2tleV0gPyAnJyArIE9ba2V5XSA6IFRQTC5qb2luKFN0cmluZyhrZXkpKSk7XG4gIGlmKE8gPT09IGdsb2JhbCl7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2Uge1xuICAgIGlmKCFzYWZlKXtcbiAgICAgIGRlbGV0ZSBPW2tleV07XG4gICAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoT1trZXldKU9ba2V5XSA9IHZhbDtcbiAgICAgIGVsc2UgaGlkZShPLCBrZXksIHZhbCk7XG4gICAgfVxuICB9XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTsiLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGRQICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcbiAgLCBTUEVDSUVTICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oS0VZKXtcbiAgdmFyIEMgPSBnbG9iYWxbS0VZXTtcbiAgaWYoREVTQ1JJUFRPUlMgJiYgQyAmJiAhQ1tTUEVDSUVTXSlkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07IiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBoYXMgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuICBpZihpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKWRlZihpdCwgVEFHLCB7Y29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnfSk7XG59OyIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpXG4gICwgdWlkICAgID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59OyIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG4gICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcbn07IiwiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcbiAgLCBTUEVDSUVTICAgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBEKXtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvciwgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTsiLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgZGVmaW5lZCAgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVE9fU1RSSU5HKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKHRoYXQsIHBvcyl7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSlcbiAgICAgICwgaSA9IHRvSW50ZWdlcihwb3MpXG4gICAgICAsIGwgPSBzLmxlbmd0aFxuICAgICAgLCBhLCBiO1xuICAgIGlmKGkgPCAwIHx8IGkgPj0gbClyZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTsiLCJ2YXIgY3R4ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBpbnZva2UgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19pbnZva2UnKVxuICAsIGh0bWwgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2h0bWwnKVxuICAsIGNlbCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKVxuICAsIGdsb2JhbCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBzZXRUYXNrICAgICAgICAgICAgPSBnbG9iYWwuc2V0SW1tZWRpYXRlXG4gICwgY2xlYXJUYXNrICAgICAgICAgID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlXG4gICwgTWVzc2FnZUNoYW5uZWwgICAgID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsXG4gICwgY291bnRlciAgICAgICAgICAgID0gMFxuICAsIHF1ZXVlICAgICAgICAgICAgICA9IHt9XG4gICwgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSdcbiAgLCBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbigpe1xuICB2YXIgaWQgPSArdGhpcztcbiAgaWYocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKXtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQpe1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZighc2V0VGFzayB8fCAhY2xlYXJUYXNrKXtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbil7XG4gICAgdmFyIGFyZ3MgPSBbXSwgaSA9IDE7XG4gICAgd2hpbGUoYXJndW1lbnRzLmxlbmd0aCA+IGkpYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24oKXtcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCl7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYoTWVzc2FnZUNoYW5uZWwpe1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWw7XG4gICAgcG9ydCAgICA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGN0eChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZihnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIHNldFRpbWVvdXQoY3R4KHJ1biwgaWQsIDEpLCAwKTtcbiAgICB9O1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiAgIHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07IiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIG1heCAgICAgICA9IE1hdGgubWF4XG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGluZGV4LCBsZW5ndGgpe1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTsiLCIvLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsICA9IE1hdGguY2VpbFxuICAsIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07IiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKVxuICAsIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTsiLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTsiLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07IiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZih0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07IiwidmFyIGlkID0gMFxuICAsIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcbn07IiwidmFyIHN0b3JlICAgICAgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJylcbiAgLCB1aWQgICAgICAgID0gcmVxdWlyZSgnLi9fdWlkJylcbiAgLCBTeW1ib2wgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sXG4gICwgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lKXtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7IiwidmFyIGNsYXNzb2YgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIElURVJBVE9SICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgIT0gdW5kZWZpbmVkKXJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKVxuICAsIHN0ZXAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKVxuICAsIEl0ZXJhdG9ycyAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIHRvSU9iamVjdCAgICAgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG5cbi8vIDIyLjEuMy40IEFycmF5LnByb3RvdHlwZS5lbnRyaWVzKClcbi8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG4vLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG4vLyAyMi4xLjMuMzAgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24oaXRlcmF0ZWQsIGtpbmQpe1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uKCl7XG4gIHZhciBPICAgICA9IHRoaXMuX3RcbiAgICAsIGtpbmQgID0gdGhpcy5fa1xuICAgICwgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKXtcbiAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBzdGVwKDEpO1xuICB9XG4gIGlmKGtpbmQgPT0gJ2tleXMnICApcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuICBpZihraW5kID09ICd2YWx1ZXMnKXJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTsiLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgdGVzdCAgICA9IHt9O1xudGVzdFtyZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKV0gPSAneic7XG5pZih0ZXN0ICsgJycgIT0gJ1tvYmplY3Qgel0nKXtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICAgIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbiAgfSwgdHJ1ZSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsIGdsb2JhbCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY3R4ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBjbGFzc29mICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCAkZXhwb3J0ICAgICAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGlzT2JqZWN0ICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgYUZ1bmN0aW9uICAgICAgICAgID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXG4gICwgYW5JbnN0YW5jZSAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKVxuICAsIGZvck9mICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2Zvci1vZicpXG4gICwgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpXG4gICwgdGFzayAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldFxuICAsIG1pY3JvdGFzayAgICAgICAgICA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKClcbiAgLCBQUk9NSVNFICAgICAgICAgICAgPSAnUHJvbWlzZSdcbiAgLCBUeXBlRXJyb3IgICAgICAgICAgPSBnbG9iYWwuVHlwZUVycm9yXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCAkUHJvbWlzZSAgICAgICAgICAgPSBnbG9iYWxbUFJPTUlTRV1cbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIGlzTm9kZSAgICAgICAgICAgICA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnXG4gICwgZW1wdHkgICAgICAgICAgICAgID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfVxuICAsIEludGVybmFsLCBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG5cbnZhciBVU0VfTkFUSVZFID0gISFmdW5jdGlvbigpe1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlICAgICA9ICRQcm9taXNlLnJlc29sdmUoMSlcbiAgICAgICwgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uKGV4ZWMpeyBleGVjKGVtcHR5LCBlbXB0eSk7IH07XG4gICAgLy8gdW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICAgIHJldHVybiAoaXNOb2RlIHx8IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJykgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBzYW1lQ29uc3RydWN0b3IgPSBmdW5jdGlvbihhLCBiKXtcbiAgLy8gd2l0aCBsaWJyYXJ5IHdyYXBwZXIgc3BlY2lhbCBjYXNlXG4gIHJldHVybiBhID09PSBiIHx8IGEgPT09ICRQcm9taXNlICYmIGIgPT09IFdyYXBwZXI7XG59O1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbihpdCl7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oQyl7XG4gIHJldHVybiBzYW1lQ29uc3RydWN0b3IoJFByb21pc2UsIEMpXG4gICAgPyBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICA6IG5ldyBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oQyl7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uKCQkcmVzb2x2ZSwgJCRyZWplY3Qpe1xuICAgIGlmKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ICA9IGFGdW5jdGlvbihyZWplY3QpO1xufTtcbnZhciBwZXJmb3JtID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB7ZXJyb3I6IGV9O1xuICB9XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uKHByb21pc2UsIGlzUmVqZWN0KXtcbiAgaWYocHJvbWlzZS5fbilyZXR1cm47XG4gIHByb21pc2UuX24gPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9jO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24oKXtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92XG4gICAgICAsIG9rICAgID0gcHJvbWlzZS5fcyA9PSAxXG4gICAgICAsIGkgICAgID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24ocmVhY3Rpb24pe1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbFxuICAgICAgICAsIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlXG4gICAgICAgICwgcmVqZWN0ICA9IHJlYWN0aW9uLnJlamVjdFxuICAgICAgICAsIGRvbWFpbiAgPSByZWFjdGlvbi5kb21haW5cbiAgICAgICAgLCByZXN1bHQsIHRoZW47XG4gICAgICB0cnkge1xuICAgICAgICBpZihoYW5kbGVyKXtcbiAgICAgICAgICBpZighb2spe1xuICAgICAgICAgICAgaWYocHJvbWlzZS5faCA9PSAyKW9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5faCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGhhbmRsZXIgPT09IHRydWUpcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZihkb21haW4pZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgIGlmKGRvbWFpbilkb21haW4uZXhpdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2Upe1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSl7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUoY2hhaW4ubGVuZ3RoID4gaSlydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgcHJvbWlzZS5fYyA9IFtdO1xuICAgIHByb21pc2UuX24gPSBmYWxzZTtcbiAgICBpZihpc1JlamVjdCAmJiAhcHJvbWlzZS5faClvblVuaGFuZGxlZChwcm9taXNlKTtcbiAgfSk7XG59O1xudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdlxuICAgICAgLCBhYnJ1cHQsIGhhbmRsZXIsIGNvbnNvbGU7XG4gICAgaWYoaXNVbmhhbmRsZWQocHJvbWlzZSkpe1xuICAgICAgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgICBpZihpc05vZGUpe1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgaWYoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbil7XG4gICAgICAgICAgaGFuZGxlcih7cHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiB2YWx1ZX0pO1xuICAgICAgICB9IGVsc2UgaWYoKGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcil7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBwcm9taXNlLl9oID0gaXNOb2RlIHx8IGlzVW5oYW5kbGVkKHByb21pc2UpID8gMiA6IDE7XG4gICAgfSBwcm9taXNlLl9hID0gdW5kZWZpbmVkO1xuICAgIGlmKGFicnVwdCl0aHJvdyBhYnJ1cHQuZXJyb3I7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICBpZihwcm9taXNlLl9oID09IDEpcmV0dXJuIGZhbHNlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9hIHx8IHByb21pc2UuX2NcbiAgICAsIGkgICAgID0gMFxuICAgICwgcmVhY3Rpb247XG4gIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpe1xuICAgIHJlYWN0aW9uID0gY2hhaW5baSsrXTtcbiAgICBpZihyZWFjdGlvbi5mYWlsIHx8ICFpc1VuaGFuZGxlZChyZWFjdGlvbi5wcm9taXNlKSlyZXR1cm4gZmFsc2U7XG4gIH0gcmV0dXJuIHRydWU7XG59O1xudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYoaXNOb2RlKXtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBpZihoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCl7XG4gICAgICBoYW5kbGVyKHtwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHByb21pc2UuX3Z9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIGlmKHByb21pc2UuX2QpcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fcyA9IDI7XG4gIGlmKCFwcm9taXNlLl9hKXByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbih2YWx1ZSl7XG4gIHZhciBwcm9taXNlID0gdGhpc1xuICAgICwgdGhlbjtcbiAgaWYocHJvbWlzZS5fZClyZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZihwcm9taXNlID09PSB2YWx1ZSl0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICBpZih0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSkpe1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciB3cmFwcGVyID0ge193OiBwcm9taXNlLCBfZDogZmFsc2V9OyAvLyB3cmFwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBjdHgoJHJlc29sdmUsIHdyYXBwZXIsIDEpLCBjdHgoJHJlamVjdCwgd3JhcHBlciwgMSkpO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2goZSl7XG4gICAgJHJlamVjdC5jYWxsKHtfdzogcHJvbWlzZSwgX2Q6IGZhbHNlfSwgZSk7IC8vIHdyYXBcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmKCFVU0VfTkFUSVZFKXtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRQcm9taXNlLCBQUk9NSVNFLCAnX2gnKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGN0eCgkcmVzb2x2ZSwgdGhpcywgMSksIGN0eCgkcmVqZWN0LCB0aGlzLCAxKSk7XG4gICAgfSBjYXRjaChlcnIpe1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3Ipe1xuICAgIHRoaXMuX2MgPSBbXTsgICAgICAgICAgICAgLy8gPC0gYXdhaXRpbmcgcmVhY3Rpb25zXG4gICAgdGhpcy5fYSA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgIHRoaXMuX3MgPSAwOyAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICB0aGlzLl9kID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIGRvbmVcbiAgICB0aGlzLl92ID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIHZhbHVlXG4gICAgdGhpcy5faCA9IDA7ICAgICAgICAgICAgICAvLyA8LSByZWplY3Rpb24gc3RhdGUsIDAgLSBkZWZhdWx0LCAxIC0gaGFuZGxlZCwgMiAtIHVuaGFuZGxlZFxuICAgIHRoaXMuX24gPSBmYWxzZTsgICAgICAgICAgLy8gPC0gbm90aWZ5XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpKCRQcm9taXNlLnByb3RvdHlwZSwge1xuICAgIC8vIDI1LjQuNS4zIFByb21pc2UucHJvdG90eXBlLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCl7XG4gICAgICB2YXIgcmVhY3Rpb24gICAgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rICAgICA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCAgID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYodGhpcy5fYSl0aGlzLl9hLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYodGhpcy5fcylub3RpZnkodGhpcywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyAyNS40LjUuMSBQcm9taXNlLnByb3RvdHlwZS5jYXRjaChvblJlamVjdGVkKVxuICAgICdjYXRjaCc6IGZ1bmN0aW9uKG9uUmVqZWN0ZWQpe1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgcHJvbWlzZSAgPSBuZXcgSW50ZXJuYWw7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ICA9IGN0eCgkcmVqZWN0LCBwcm9taXNlLCAxKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1Byb21pc2U6ICRQcm9taXNlfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpe1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcylcbiAgICAgICwgJCRyZWplY3QgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCl7XG4gICAgLy8gaW5zdGFuY2VvZiBpbnN0ZWFkIG9mIGludGVybmFsIHNsb3QgY2hlY2sgYmVjYXVzZSB3ZSBzaG91bGQgZml4IGl0IHdpdGhvdXQgcmVwbGFjZW1lbnQgbmF0aXZlIFByb21pc2UgY29yZVxuICAgIGlmKHggaW5zdGFuY2VvZiAkUHJvbWlzZSAmJiBzYW1lQ29uc3RydWN0b3IoeC5jb25zdHJ1Y3RvciwgdGhpcykpcmV0dXJuIHg7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKVxuICAgICAgLCAkJHJlc29sdmUgID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgICQkcmVzb2x2ZSh4KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7XG4gICRQcm9taXNlLmFsbChpdGVyKVsnY2F0Y2gnXShlbXB0eSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgICAgICA9IHRoaXNcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlc29sdmUgICAgPSBjYXBhYmlsaXR5LnJlc29sdmVcbiAgICAgICwgcmVqZWN0ICAgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICB2YXIgdmFsdWVzICAgID0gW11cbiAgICAgICAgLCBpbmRleCAgICAgPSAwXG4gICAgICAgICwgcmVtYWluaW5nID0gMTtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24ocHJvbWlzZSl7XG4gICAgICAgIHZhciAkaW5kZXggICAgICAgID0gaW5kZXgrK1xuICAgICAgICAgICwgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgICAgICAgIGlmKGFscmVhZHlDYWxsZWQpcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbJGluZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmKGFicnVwdClyZWplY3QoYWJydXB0LmVycm9yKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyAyNS40LjQuNCBQcm9taXNlLnJhY2UoaXRlcmFibGUpXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpe1xuICAgIHZhciBDICAgICAgICAgID0gdGhpc1xuICAgICAgLCBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgICwgcmVqZWN0ICAgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uKHByb21pc2Upe1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZihhYnJ1cHQpcmVqZWN0KGFicnVwdC5lcnJvcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyICRhdCAgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuLy8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbihpdGVyYXRlZCl7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uKCl7XG4gIHZhciBPICAgICA9IHRoaXMuX3RcbiAgICAsIGluZGV4ID0gdGhpcy5faVxuICAgICwgcG9pbnQ7XG4gIGlmKGluZGV4ID49IE8ubGVuZ3RoKXJldHVybiB7dmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZX07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7dmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZX07XG59KTsiLCJ2YXIgJGl0ZXJhdG9ycyAgICA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJylcbiAgLCByZWRlZmluZSAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIGdsb2JhbCAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGhpZGUgICAgICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBJdGVyYXRvcnMgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCB3a3MgICAgICAgICAgID0gcmVxdWlyZSgnLi9fd2tzJylcbiAgLCBJVEVSQVRPUiAgICAgID0gd2tzKCdpdGVyYXRvcicpXG4gICwgVE9fU1RSSU5HX1RBRyA9IHdrcygndG9TdHJpbmdUYWcnKVxuICAsIEFycmF5VmFsdWVzICAgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmZvcih2YXIgY29sbGVjdGlvbnMgPSBbJ05vZGVMaXN0JywgJ0RPTVRva2VuTGlzdCcsICdNZWRpYUxpc3QnLCAnU3R5bGVTaGVldExpc3QnLCAnQ1NTUnVsZUxpc3QnXSwgaSA9IDA7IGkgPCA1OyBpKyspe1xuICB2YXIgTkFNRSAgICAgICA9IGNvbGxlY3Rpb25zW2ldXG4gICAgLCBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdXG4gICAgLCBwcm90byAgICAgID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZVxuICAgICwga2V5O1xuICBpZihwcm90byl7XG4gICAgaWYoIXByb3RvW0lURVJBVE9SXSloaWRlKHByb3RvLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuICAgIGlmKCFwcm90b1tUT19TVFJJTkdfVEFHXSloaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcbiAgICBJdGVyYXRvcnNbTkFNRV0gPSBBcnJheVZhbHVlcztcbiAgICBmb3Ioa2V5IGluICRpdGVyYXRvcnMpaWYoIXByb3RvW2tleV0pcmVkZWZpbmUocHJvdG8sIGtleSwgJGl0ZXJhdG9yc1trZXldLCB0cnVlKTtcbiAgfVxufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuXG5mdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSBCdWZmZXIuaXNCdWZmZXI7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cbiIsIi8vIChjKSBEZWFuIE1jTmFtZWUgPGRlYW5AZ21haWwuY29tPiwgMjAxMi5cbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGVhbm0vY3NzLWNvbG9yLXBhcnNlci1qc1xuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HXG4vLyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4vLyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvXG52YXIga0NTU0NvbG9yVGFibGUgPSB7XG4gIFwidHJhbnNwYXJlbnRcIjogWzAsMCwwLDBdLCBcImFsaWNlYmx1ZVwiOiBbMjQwLDI0OCwyNTUsMV0sXG4gIFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsMjM1LDIxNSwxXSwgXCJhcXVhXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiYXF1YW1hcmluZVwiOiBbMTI3LDI1NSwyMTIsMV0sIFwiYXp1cmVcIjogWzI0MCwyNTUsMjU1LDFdLFxuICBcImJlaWdlXCI6IFsyNDUsMjQ1LDIyMCwxXSwgXCJiaXNxdWVcIjogWzI1NSwyMjgsMTk2LDFdLFxuICBcImJsYWNrXCI6IFswLDAsMCwxXSwgXCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LDIzNSwyMDUsMV0sXG4gIFwiYmx1ZVwiOiBbMCwwLDI1NSwxXSwgXCJibHVldmlvbGV0XCI6IFsxMzgsNDMsMjI2LDFdLFxuICBcImJyb3duXCI6IFsxNjUsNDIsNDIsMV0sIFwiYnVybHl3b29kXCI6IFsyMjIsMTg0LDEzNSwxXSxcbiAgXCJjYWRldGJsdWVcIjogWzk1LDE1OCwxNjAsMV0sIFwiY2hhcnRyZXVzZVwiOiBbMTI3LDI1NSwwLDFdLFxuICBcImNob2NvbGF0ZVwiOiBbMjEwLDEwNSwzMCwxXSwgXCJjb3JhbFwiOiBbMjU1LDEyNyw4MCwxXSxcbiAgXCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLDE0OSwyMzcsMV0sIFwiY29ybnNpbGtcIjogWzI1NSwyNDgsMjIwLDFdLFxuICBcImNyaW1zb25cIjogWzIyMCwyMCw2MCwxXSwgXCJjeWFuXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiZGFya2JsdWVcIjogWzAsMCwxMzksMV0sIFwiZGFya2N5YW5cIjogWzAsMTM5LDEzOSwxXSxcbiAgXCJkYXJrZ29sZGVucm9kXCI6IFsxODQsMTM0LDExLDFdLCBcImRhcmtncmF5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJrZ3JlZW5cIjogWzAsMTAwLDAsMV0sIFwiZGFya2dyZXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtraGFraVwiOiBbMTg5LDE4MywxMDcsMV0sIFwiZGFya21hZ2VudGFcIjogWzEzOSwwLDEzOSwxXSxcbiAgXCJkYXJrb2xpdmVncmVlblwiOiBbODUsMTA3LDQ3LDFdLCBcImRhcmtvcmFuZ2VcIjogWzI1NSwxNDAsMCwxXSxcbiAgXCJkYXJrb3JjaGlkXCI6IFsxNTMsNTAsMjA0LDFdLCBcImRhcmtyZWRcIjogWzEzOSwwLDAsMV0sXG4gIFwiZGFya3NhbG1vblwiOiBbMjMzLDE1MCwxMjIsMV0sIFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsMTg4LDE0MywxXSxcbiAgXCJkYXJrc2xhdGVibHVlXCI6IFs3Miw2MSwxMzksMV0sIFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsNzksNzksMV0sXG4gIFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsNzksNzksMV0sIFwiZGFya3R1cnF1b2lzZVwiOiBbMCwyMDYsMjA5LDFdLFxuICBcImRhcmt2aW9sZXRcIjogWzE0OCwwLDIxMSwxXSwgXCJkZWVwcGlua1wiOiBbMjU1LDIwLDE0NywxXSxcbiAgXCJkZWVwc2t5Ymx1ZVwiOiBbMCwxOTEsMjU1LDFdLCBcImRpbWdyYXlcIjogWzEwNSwxMDUsMTA1LDFdLFxuICBcImRpbWdyZXlcIjogWzEwNSwxMDUsMTA1LDFdLCBcImRvZGdlcmJsdWVcIjogWzMwLDE0NCwyNTUsMV0sXG4gIFwiZmlyZWJyaWNrXCI6IFsxNzgsMzQsMzQsMV0sIFwiZmxvcmFsd2hpdGVcIjogWzI1NSwyNTAsMjQwLDFdLFxuICBcImZvcmVzdGdyZWVuXCI6IFszNCwxMzksMzQsMV0sIFwiZnVjaHNpYVwiOiBbMjU1LDAsMjU1LDFdLFxuICBcImdhaW5zYm9yb1wiOiBbMjIwLDIyMCwyMjAsMV0sIFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LDI0OCwyNTUsMV0sXG4gIFwiZ29sZFwiOiBbMjU1LDIxNSwwLDFdLCBcImdvbGRlbnJvZFwiOiBbMjE4LDE2NSwzMiwxXSxcbiAgXCJncmF5XCI6IFsxMjgsMTI4LDEyOCwxXSwgXCJncmVlblwiOiBbMCwxMjgsMCwxXSxcbiAgXCJncmVlbnllbGxvd1wiOiBbMTczLDI1NSw0NywxXSwgXCJncmV5XCI6IFsxMjgsMTI4LDEyOCwxXSxcbiAgXCJob25leWRld1wiOiBbMjQwLDI1NSwyNDAsMV0sIFwiaG90cGlua1wiOiBbMjU1LDEwNSwxODAsMV0sXG4gIFwiaW5kaWFucmVkXCI6IFsyMDUsOTIsOTIsMV0sIFwiaW5kaWdvXCI6IFs3NSwwLDEzMCwxXSxcbiAgXCJpdm9yeVwiOiBbMjU1LDI1NSwyNDAsMV0sIFwia2hha2lcIjogWzI0MCwyMzAsMTQwLDFdLFxuICBcImxhdmVuZGVyXCI6IFsyMzAsMjMwLDI1MCwxXSwgXCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsMjQwLDI0NSwxXSxcbiAgXCJsYXduZ3JlZW5cIjogWzEyNCwyNTIsMCwxXSwgXCJsZW1vbmNoaWZmb25cIjogWzI1NSwyNTAsMjA1LDFdLFxuICBcImxpZ2h0Ymx1ZVwiOiBbMTczLDIxNiwyMzAsMV0sIFwibGlnaHRjb3JhbFwiOiBbMjQwLDEyOCwxMjgsMV0sXG4gIFwibGlnaHRjeWFuXCI6IFsyMjQsMjU1LDI1NSwxXSwgXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLDI1MCwyMTAsMV0sXG4gIFwibGlnaHRncmF5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodGdyZWVuXCI6IFsxNDQsMjM4LDE0NCwxXSxcbiAgXCJsaWdodGdyZXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0cGlua1wiOiBbMjU1LDE4MiwxOTMsMV0sXG4gIFwibGlnaHRzYWxtb25cIjogWzI1NSwxNjAsMTIyLDFdLCBcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLDE3OCwxNzAsMV0sXG4gIFwibGlnaHRza3libHVlXCI6IFsxMzUsMjA2LDI1MCwxXSwgXCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LDEzNiwxNTMsMV0sXG4gIFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwxMzYsMTUzLDFdLCBcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsMTk2LDIyMiwxXSxcbiAgXCJsaWdodHllbGxvd1wiOiBbMjU1LDI1NSwyMjQsMV0sIFwibGltZVwiOiBbMCwyNTUsMCwxXSxcbiAgXCJsaW1lZ3JlZW5cIjogWzUwLDIwNSw1MCwxXSwgXCJsaW5lblwiOiBbMjUwLDI0MCwyMzAsMV0sXG4gIFwibWFnZW50YVwiOiBbMjU1LDAsMjU1LDFdLCBcIm1hcm9vblwiOiBbMTI4LDAsMCwxXSxcbiAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsMjA1LDE3MCwxXSwgXCJtZWRpdW1ibHVlXCI6IFswLDAsMjA1LDFdLFxuICBcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LDg1LDIxMSwxXSwgXCJtZWRpdW1wdXJwbGVcIjogWzE0NywxMTIsMjE5LDFdLFxuICBcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwxNzksMTEzLDFdLCBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLDEwNCwyMzgsMV0sXG4gIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsMjUwLDE1NCwxXSwgXCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLDIwOSwyMDQsMV0sXG4gIFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksMjEsMTMzLDFdLCBcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsMjUsMTEyLDFdLFxuICBcIm1pbnRjcmVhbVwiOiBbMjQ1LDI1NSwyNTAsMV0sIFwibWlzdHlyb3NlXCI6IFsyNTUsMjI4LDIyNSwxXSxcbiAgXCJtb2NjYXNpblwiOiBbMjU1LDIyOCwxODEsMV0sIFwibmF2YWpvd2hpdGVcIjogWzI1NSwyMjIsMTczLDFdLFxuICBcIm5hdnlcIjogWzAsMCwxMjgsMV0sIFwib2xkbGFjZVwiOiBbMjUzLDI0NSwyMzAsMV0sXG4gIFwib2xpdmVcIjogWzEyOCwxMjgsMCwxXSwgXCJvbGl2ZWRyYWJcIjogWzEwNywxNDIsMzUsMV0sXG4gIFwib3JhbmdlXCI6IFsyNTUsMTY1LDAsMV0sIFwib3JhbmdlcmVkXCI6IFsyNTUsNjksMCwxXSxcbiAgXCJvcmNoaWRcIjogWzIxOCwxMTIsMjE0LDFdLCBcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwyMzIsMTcwLDFdLFxuICBcInBhbGVncmVlblwiOiBbMTUyLDI1MSwxNTIsMV0sIFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LDIzOCwyMzgsMV0sXG4gIFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LDExMiwxNDcsMV0sIFwicGFwYXlhd2hpcFwiOiBbMjU1LDIzOSwyMTMsMV0sXG4gIFwicGVhY2hwdWZmXCI6IFsyNTUsMjE4LDE4NSwxXSwgXCJwZXJ1XCI6IFsyMDUsMTMzLDYzLDFdLFxuICBcInBpbmtcIjogWzI1NSwxOTIsMjAzLDFdLCBcInBsdW1cIjogWzIyMSwxNjAsMjIxLDFdLFxuICBcInBvd2RlcmJsdWVcIjogWzE3NiwyMjQsMjMwLDFdLCBcInB1cnBsZVwiOiBbMTI4LDAsMTI4LDFdLFxuICBcInJlYmVjY2FwdXJwbGVcIjogWzEwMiw1MSwxNTMsMV0sXG4gIFwicmVkXCI6IFsyNTUsMCwwLDFdLCBcInJvc3licm93blwiOiBbMTg4LDE0MywxNDMsMV0sXG4gIFwicm95YWxibHVlXCI6IFs2NSwxMDUsMjI1LDFdLCBcInNhZGRsZWJyb3duXCI6IFsxMzksNjksMTksMV0sXG4gIFwic2FsbW9uXCI6IFsyNTAsMTI4LDExNCwxXSwgXCJzYW5keWJyb3duXCI6IFsyNDQsMTY0LDk2LDFdLFxuICBcInNlYWdyZWVuXCI6IFs0NiwxMzksODcsMV0sIFwic2Vhc2hlbGxcIjogWzI1NSwyNDUsMjM4LDFdLFxuICBcInNpZW5uYVwiOiBbMTYwLDgyLDQ1LDFdLCBcInNpbHZlclwiOiBbMTkyLDE5MiwxOTIsMV0sXG4gIFwic2t5Ymx1ZVwiOiBbMTM1LDIwNiwyMzUsMV0sIFwic2xhdGVibHVlXCI6IFsxMDYsOTAsMjA1LDFdLFxuICBcInNsYXRlZ3JheVwiOiBbMTEyLDEyOCwxNDQsMV0sIFwic2xhdGVncmV5XCI6IFsxMTIsMTI4LDE0NCwxXSxcbiAgXCJzbm93XCI6IFsyNTUsMjUwLDI1MCwxXSwgXCJzcHJpbmdncmVlblwiOiBbMCwyNTUsMTI3LDFdLFxuICBcInN0ZWVsYmx1ZVwiOiBbNzAsMTMwLDE4MCwxXSwgXCJ0YW5cIjogWzIxMCwxODAsMTQwLDFdLFxuICBcInRlYWxcIjogWzAsMTI4LDEyOCwxXSwgXCJ0aGlzdGxlXCI6IFsyMTYsMTkxLDIxNiwxXSxcbiAgXCJ0b21hdG9cIjogWzI1NSw5OSw3MSwxXSwgXCJ0dXJxdW9pc2VcIjogWzY0LDIyNCwyMDgsMV0sXG4gIFwidmlvbGV0XCI6IFsyMzgsMTMwLDIzOCwxXSwgXCJ3aGVhdFwiOiBbMjQ1LDIyMiwxNzksMV0sXG4gIFwid2hpdGVcIjogWzI1NSwyNTUsMjU1LDFdLCBcIndoaXRlc21va2VcIjogWzI0NSwyNDUsMjQ1LDFdLFxuICBcInllbGxvd1wiOiBbMjU1LDI1NSwwLDFdLCBcInllbGxvd2dyZWVuXCI6IFsxNTQsMjA1LDUwLDFdfVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfYnl0ZShpKSB7ICAvLyBDbGFtcCB0byBpbnRlZ2VyIDAgLi4gMjU1LlxuICBpID0gTWF0aC5yb3VuZChpKTsgIC8vIFNlZW1zIHRvIGJlIHdoYXQgQ2hyb21lIGRvZXMgKHZzIHRydW5jYXRpb24pLlxuICByZXR1cm4gaSA8IDAgPyAwIDogaSA+IDI1NSA/IDI1NSA6IGk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wX2Nzc19mbG9hdChmKSB7ICAvLyBDbGFtcCB0byBmbG9hdCAwLjAgLi4gMS4wLlxuICByZXR1cm4gZiA8IDAgPyAwIDogZiA+IDEgPyAxIDogZjtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3NzX2ludChzdHIpIHsgIC8vIGludCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfYnl0ZShwYXJzZUZsb2F0KHN0cikgLyAxMDAgKiAyNTUpO1xuICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VJbnQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19mbG9hdChzdHIpIHsgIC8vIGZsb2F0IG9yIHBlcmNlbnRhZ2UuXG4gIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnJScpXG4gICAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikgLyAxMDApO1xuICByZXR1cm4gY2xhbXBfY3NzX2Zsb2F0KHBhcnNlRmxvYXQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCkge1xuICBpZiAoaCA8IDApIGggKz0gMTtcbiAgZWxzZSBpZiAoaCA+IDEpIGggLT0gMTtcblxuICBpZiAoaCAqIDYgPCAxKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiBoICogNjtcbiAgaWYgKGggKiAyIDwgMSkgcmV0dXJuIG0yO1xuICBpZiAoaCAqIDMgPCAyKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiAoMi8zIC0gaCkgKiA2O1xuICByZXR1cm4gbTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ1NTQ29sb3IoY3NzX3N0cikge1xuICAvLyBSZW1vdmUgYWxsIHdoaXRlc3BhY2UsIG5vdCBjb21wbGlhbnQsIGJ1dCBzaG91bGQganVzdCBiZSBtb3JlIGFjY2VwdGluZy5cbiAgdmFyIHN0ciA9IGNzc19zdHIucmVwbGFjZSgvIC9nLCAnJykudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDb2xvciBrZXl3b3JkcyAoYW5kIHRyYW5zcGFyZW50KSBsb29rdXAuXG4gIGlmIChzdHIgaW4ga0NTU0NvbG9yVGFibGUpIHJldHVybiBrQ1NTQ29sb3JUYWJsZVtzdHJdLnNsaWNlKCk7ICAvLyBkdXAuXG5cbiAgLy8gI2FiYyBhbmQgI2FiYzEyMyBzeW50YXguXG4gIGlmIChzdHJbMF0gPT09ICcjJykge1xuICAgIGlmIChzdHIubGVuZ3RoID09PSA0KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWygoaXYgJiAweGYwMCkgPj4gNCkgfCAoKGl2ICYgMHhmMDApID4+IDgpLFxuICAgICAgICAgICAgICAoaXYgJiAweGYwKSB8ICgoaXYgJiAweGYwKSA+PiA0KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmKSB8ICgoaXYgJiAweGYpIDw8IDQpLFxuICAgICAgICAgICAgICAxXTtcbiAgICB9IGVsc2UgaWYgKHN0ci5sZW5ndGggPT09IDcpIHtcbiAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZmZmZikpIHJldHVybiBudWxsOyAgLy8gQ292ZXJzIE5hTi5cbiAgICAgIHJldHVybiBbKGl2ICYgMHhmZjAwMDApID4+IDE2LFxuICAgICAgICAgICAgICAoaXYgJiAweGZmMDApID4+IDgsXG4gICAgICAgICAgICAgIGl2ICYgMHhmZixcbiAgICAgICAgICAgICAgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgb3AgPSBzdHIuaW5kZXhPZignKCcpLCBlcCA9IHN0ci5pbmRleE9mKCcpJyk7XG4gIGlmIChvcCAhPT0gLTEgJiYgZXAgKyAxID09PSBzdHIubGVuZ3RoKSB7XG4gICAgdmFyIGZuYW1lID0gc3RyLnN1YnN0cigwLCBvcCk7XG4gICAgdmFyIHBhcmFtcyA9IHN0ci5zdWJzdHIob3ArMSwgZXAtKG9wKzEpKS5zcGxpdCgnLCcpO1xuICAgIHZhciBhbHBoYSA9IDE7ICAvLyBUbyBhbGxvdyBjYXNlIGZhbGx0aHJvdWdoLlxuICAgIHN3aXRjaCAoZm5hbWUpIHtcbiAgICAgIGNhc2UgJ3JnYmEnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGFscGhhID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtcy5wb3AoKSk7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJ3JnYic6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIFtwYXJzZV9jc3NfaW50KHBhcmFtc1swXSksXG4gICAgICAgICAgICAgICAgcGFyc2VfY3NzX2ludChwYXJhbXNbMV0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzJdKSxcbiAgICAgICAgICAgICAgICBhbHBoYV07XG4gICAgICBjYXNlICdoc2xhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdoc2wnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBoID0gKCgocGFyc2VGbG9hdChwYXJhbXNbMF0pICUgMzYwKSArIDM2MCkgJSAzNjApIC8gMzYwOyAgLy8gMCAuLiAxXG4gICAgICAgIC8vIE5PVEUoZGVhbm0pOiBBY2NvcmRpbmcgdG8gdGhlIENTUyBzcGVjIHMvbCBzaG91bGQgb25seSBiZVxuICAgICAgICAvLyBwZXJjZW50YWdlcywgYnV0IHdlIGRvbid0IGJvdGhlciBhbmQgbGV0IGZsb2F0IG9yIHBlcmNlbnRhZ2UuXG4gICAgICAgIHZhciBzID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtc1sxXSk7XG4gICAgICAgIHZhciBsID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtc1syXSk7XG4gICAgICAgIHZhciBtMiA9IGwgPD0gMC41ID8gbCAqIChzICsgMSkgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgICB2YXIgbTEgPSBsICogMiAtIG0yO1xuICAgICAgICByZXR1cm4gW2NsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCsxLzMpICogMjU1KSxcbiAgICAgICAgICAgICAgICBjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpICogMjU1KSxcbiAgICAgICAgICAgICAgICBjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgtMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnRyeSB7IGV4cG9ydHMucGFyc2VDU1NDb2xvciA9IHBhcnNlQ1NTQ29sb3IgfSBjYXRjaChlKSB7IH1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBlYXJjdXQ7XG5cbmZ1bmN0aW9uIGVhcmN1dChkYXRhLCBob2xlSW5kaWNlcywgZGltKSB7XG5cbiAgICBkaW0gPSBkaW0gfHwgMjtcblxuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aCxcbiAgICAgICAgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGgsXG4gICAgICAgIG91dGVyTm9kZSA9IGxpbmtlZExpc3QoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSwgdHJ1ZSksXG4gICAgICAgIHRyaWFuZ2xlcyA9IFtdO1xuXG4gICAgaWYgKCFvdXRlck5vZGUpIHJldHVybiB0cmlhbmdsZXM7XG5cbiAgICB2YXIgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgeCwgeSwgc2l6ZTtcblxuICAgIGlmIChoYXNIb2xlcykgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZXMoZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltKTtcblxuICAgIC8vIGlmIHRoZSBzaGFwZSBpcyBub3QgdG9vIHNpbXBsZSwgd2UnbGwgdXNlIHotb3JkZXIgY3VydmUgaGFzaCBsYXRlcjsgY2FsY3VsYXRlIHBvbHlnb24gYmJveFxuICAgIGlmIChkYXRhLmxlbmd0aCA+IDgwICogZGltKSB7XG4gICAgICAgIG1pblggPSBtYXhYID0gZGF0YVswXTtcbiAgICAgICAgbWluWSA9IG1heFkgPSBkYXRhWzFdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBkaW07IGkgPCBvdXRlckxlbjsgaSArPSBkaW0pIHtcbiAgICAgICAgICAgIHggPSBkYXRhW2ldO1xuICAgICAgICAgICAgeSA9IGRhdGFbaSArIDFdO1xuICAgICAgICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geDtcbiAgICAgICAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7XG4gICAgICAgICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1pblgsIG1pblkgYW5kIHNpemUgYXJlIGxhdGVyIHVzZWQgdG8gdHJhbnNmb3JtIGNvb3JkcyBpbnRvIGludGVnZXJzIGZvciB6LW9yZGVyIGNhbGN1bGF0aW9uXG4gICAgICAgIHNpemUgPSBNYXRoLm1heChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpO1xuICAgIH1cblxuICAgIGVhcmN1dExpbmtlZChvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplKTtcblxuICAgIHJldHVybiB0cmlhbmdsZXM7XG59XG5cbi8vIGNyZWF0ZSBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBmcm9tIHBvbHlnb24gcG9pbnRzIGluIHRoZSBzcGVjaWZpZWQgd2luZGluZyBvcmRlclxuZnVuY3Rpb24gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSkge1xuICAgIHZhciBpLCBsYXN0O1xuXG4gICAgaWYgKGNsb2Nrd2lzZSA9PT0gKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSA+IDApKSB7XG4gICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcbiAgICB9XG5cbiAgICBpZiAobGFzdCAmJiBlcXVhbHMobGFzdCwgbGFzdC5uZXh0KSkge1xuICAgICAgICByZW1vdmVOb2RlKGxhc3QpO1xuICAgICAgICBsYXN0ID0gbGFzdC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBsYXN0O1xufVxuXG4vLyBlbGltaW5hdGUgY29saW5lYXIgb3IgZHVwbGljYXRlIHBvaW50c1xuZnVuY3Rpb24gZmlsdGVyUG9pbnRzKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gc3RhcnQ7XG4gICAgaWYgKCFlbmQpIGVuZCA9IHN0YXJ0O1xuXG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgYWdhaW47XG4gICAgZG8ge1xuICAgICAgICBhZ2FpbiA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghcC5zdGVpbmVyICYmIChlcXVhbHMocCwgcC5uZXh0KSB8fCBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICBwID0gZW5kID0gcC5wcmV2O1xuICAgICAgICAgICAgaWYgKHAgPT09IHAubmV4dCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBhZ2FpbiA9IHRydWU7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICAgIH1cbiAgICB9IHdoaWxlIChhZ2FpbiB8fCBwICE9PSBlbmQpO1xuXG4gICAgcmV0dXJuIGVuZDtcbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSwgcGFzcykge1xuICAgIGlmICghZWFyKSByZXR1cm47XG5cbiAgICAvLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG4gICAgaWYgKCFwYXNzICYmIHNpemUpIGluZGV4Q3VydmUoZWFyLCBtaW5YLCBtaW5ZLCBzaXplKTtcblxuICAgIHZhciBzdG9wID0gZWFyLFxuICAgICAgICBwcmV2LCBuZXh0O1xuXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG4gICAgd2hpbGUgKGVhci5wcmV2ICE9PSBlYXIubmV4dCkge1xuICAgICAgICBwcmV2ID0gZWFyLnByZXY7XG4gICAgICAgIG5leHQgPSBlYXIubmV4dDtcblxuICAgICAgICBpZiAoc2l6ZSA/IGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgc2l6ZSkgOiBpc0VhcihlYXIpKSB7XG4gICAgICAgICAgICAvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocHJldi5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGVhci5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKG5leHQuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIHJlbW92ZU5vZGUoZWFyKTtcblxuICAgICAgICAgICAgLy8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGljZSBsZWFkcyB0byBsZXNzIHNsaXZlciB0cmlhbmdsZXNcbiAgICAgICAgICAgIGVhciA9IG5leHQubmV4dDtcbiAgICAgICAgICAgIHN0b3AgPSBuZXh0Lm5leHQ7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZWFyID0gbmV4dDtcblxuICAgICAgICAvLyBpZiB3ZSBsb29wZWQgdGhyb3VnaCB0aGUgd2hvbGUgcmVtYWluaW5nIHBvbHlnb24gYW5kIGNhbid0IGZpbmQgYW55IG1vcmUgZWFyc1xuICAgICAgICBpZiAoZWFyID09PSBzdG9wKSB7XG4gICAgICAgICAgICAvLyB0cnkgZmlsdGVyaW5nIHBvaW50cyBhbmQgc2xpY2luZyBhZ2FpblxuICAgICAgICAgICAgaWYgKCFwYXNzKSB7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGZpbHRlclBvaW50cyhlYXIpLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSwgMSk7XG5cbiAgICAgICAgICAgIC8vIGlmIHRoaXMgZGlkbid0IHdvcmssIHRyeSBjdXJpbmcgYWxsIHNtYWxsIHNlbGYtaW50ZXJzZWN0aW9ucyBsb2NhbGx5XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBlYXIgPSBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKGVhciwgdHJpYW5nbGVzLCBkaW0pO1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCAyKTtcblxuICAgICAgICAgICAgLy8gYXMgYSBsYXN0IHJlc29ydCwgdHJ5IHNwbGl0dGluZyB0aGUgcmVtYWluaW5nIHBvbHlnb24gaW50byB0d29cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMikge1xuICAgICAgICAgICAgICAgIHNwbGl0RWFyY3V0KGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gY2hlY2sgd2hldGhlciBhIHBvbHlnb24gbm9kZSBmb3JtcyBhIHZhbGlkIGVhciB3aXRoIGFkamFjZW50IG5vZGVzXG5mdW5jdGlvbiBpc0VhcihlYXIpIHtcbiAgICB2YXIgYSA9IGVhci5wcmV2LFxuICAgICAgICBiID0gZWFyLFxuICAgICAgICBjID0gZWFyLm5leHQ7XG5cbiAgICBpZiAoYXJlYShhLCBiLCBjKSA+PSAwKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cbiAgICAvLyBub3cgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgb3RoZXIgcG9pbnRzIGluc2lkZSB0aGUgcG90ZW50aWFsIGVhclxuICAgIHZhciBwID0gZWFyLm5leHQubmV4dDtcblxuICAgIHdoaWxlIChwICE9PSBlYXIucHJldikge1xuICAgICAgICBpZiAocG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0Vhckhhc2hlZChlYXIsIG1pblgsIG1pblksIHNpemUpIHtcbiAgICB2YXIgYSA9IGVhci5wcmV2LFxuICAgICAgICBiID0gZWFyLFxuICAgICAgICBjID0gZWFyLm5leHQ7XG5cbiAgICBpZiAoYXJlYShhLCBiLCBjKSA+PSAwKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cbiAgICAvLyB0cmlhbmdsZSBiYm94OyBtaW4gJiBtYXggYXJlIGNhbGN1bGF0ZWQgbGlrZSB0aGlzIGZvciBzcGVlZFxuICAgIHZhciBtaW5UWCA9IGEueCA8IGIueCA/IChhLnggPCBjLnggPyBhLnggOiBjLngpIDogKGIueCA8IGMueCA/IGIueCA6IGMueCksXG4gICAgICAgIG1pblRZID0gYS55IDwgYi55ID8gKGEueSA8IGMueSA/IGEueSA6IGMueSkgOiAoYi55IDwgYy55ID8gYi55IDogYy55KSxcbiAgICAgICAgbWF4VFggPSBhLnggPiBiLnggPyAoYS54ID4gYy54ID8gYS54IDogYy54KSA6IChiLnggPiBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtYXhUWSA9IGEueSA+IGIueSA/IChhLnkgPiBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA+IGMueSA/IGIueSA6IGMueSk7XG5cbiAgICAvLyB6LW9yZGVyIHJhbmdlIGZvciB0aGUgY3VycmVudCB0cmlhbmdsZSBiYm94O1xuICAgIHZhciBtaW5aID0gek9yZGVyKG1pblRYLCBtaW5UWSwgbWluWCwgbWluWSwgc2l6ZSksXG4gICAgICAgIG1heFogPSB6T3JkZXIobWF4VFgsIG1heFRZLCBtaW5YLCBtaW5ZLCBzaXplKTtcblxuICAgIC8vIGZpcnN0IGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIGluIGluY3JlYXNpbmcgei1vcmRlclxuICAgIHZhciBwID0gZWFyLm5leHRaO1xuXG4gICAgd2hpbGUgKHAgJiYgcC56IDw9IG1heFopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLm5leHRaO1xuICAgIH1cblxuICAgIC8vIHRoZW4gbG9vayBmb3IgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuICAgIHAgPSBlYXIucHJldlo7XG5cbiAgICB3aGlsZSAocCAmJiBwLnogPj0gbWluWikge1xuICAgICAgICBpZiAocCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAucHJldlo7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIGdvIHRocm91Z2ggYWxsIHBvbHlnb24gbm9kZXMgYW5kIGN1cmUgc21hbGwgbG9jYWwgc2VsZi1pbnRlcnNlY3Rpb25zXG5mdW5jdGlvbiBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSkge1xuICAgIHZhciBwID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICB2YXIgYSA9IHAucHJldixcbiAgICAgICAgICAgIGIgPSBwLm5leHQubmV4dDtcblxuICAgICAgICBpZiAoIWVxdWFscyhhLCBiKSAmJiBpbnRlcnNlY3RzKGEsIHAsIHAubmV4dCwgYikgJiYgbG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpKSB7XG5cbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGEuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChwLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYi5pIC8gZGltKTtcblxuICAgICAgICAgICAgLy8gcmVtb3ZlIHR3byBub2RlcyBpbnZvbHZlZFxuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocC5uZXh0KTtcblxuICAgICAgICAgICAgcCA9IHN0YXJ0ID0gYjtcbiAgICAgICAgfVxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHJldHVybiBwO1xufVxuXG4vLyB0cnkgc3BsaXR0aW5nIHBvbHlnb24gaW50byB0d28gYW5kIHRyaWFuZ3VsYXRlIHRoZW0gaW5kZXBlbmRlbnRseVxuZnVuY3Rpb24gc3BsaXRFYXJjdXQoc3RhcnQsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplKSB7XG4gICAgLy8gbG9vayBmb3IgYSB2YWxpZCBkaWFnb25hbCB0aGF0IGRpdmlkZXMgdGhlIHBvbHlnb24gaW50byB0d29cbiAgICB2YXIgYSA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgdmFyIGIgPSBhLm5leHQubmV4dDtcbiAgICAgICAgd2hpbGUgKGIgIT09IGEucHJldikge1xuICAgICAgICAgICAgaWYgKGEuaSAhPT0gYi5pICYmIGlzVmFsaWREaWFnb25hbChhLCBiKSkge1xuICAgICAgICAgICAgICAgIC8vIHNwbGl0IHRoZSBwb2x5Z29uIGluIHR3byBieSB0aGUgZGlhZ29uYWxcbiAgICAgICAgICAgICAgICB2YXIgYyA9IHNwbGl0UG9seWdvbihhLCBiKTtcblxuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBjb2xpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXG4gICAgICAgICAgICAgICAgYSA9IGZpbHRlclBvaW50cyhhLCBhLm5leHQpO1xuICAgICAgICAgICAgICAgIGMgPSBmaWx0ZXJQb2ludHMoYywgYy5uZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIHJ1biBlYXJjdXQgb24gZWFjaCBoYWxmXG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGEsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYywgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGIgPSBiLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgYSA9IGEubmV4dDtcbiAgICB9IHdoaWxlIChhICE9PSBzdGFydCk7XG59XG5cbi8vIGxpbmsgZXZlcnkgaG9sZSBpbnRvIHRoZSBvdXRlciBsb29wLCBwcm9kdWNpbmcgYSBzaW5nbGUtcmluZyBwb2x5Z29uIHdpdGhvdXQgaG9sZXNcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSkge1xuICAgIHZhciBxdWV1ZSA9IFtdLFxuICAgICAgICBpLCBsZW4sIHN0YXJ0LCBlbmQsIGxpc3Q7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xuICAgICAgICBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICBsaXN0ID0gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlKTtcbiAgICAgICAgaWYgKGxpc3QgPT09IGxpc3QubmV4dCkgbGlzdC5zdGVpbmVyID0gdHJ1ZTtcbiAgICAgICAgcXVldWUucHVzaChnZXRMZWZ0bW9zdChsaXN0KSk7XG4gICAgfVxuXG4gICAgcXVldWUuc29ydChjb21wYXJlWCk7XG5cbiAgICAvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodFxuICAgIGZvciAoaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBlbGltaW5hdGVIb2xlKHF1ZXVlW2ldLCBvdXRlck5vZGUpO1xuICAgICAgICBvdXRlck5vZGUgPSBmaWx0ZXJQb2ludHMob3V0ZXJOb2RlLCBvdXRlck5vZGUubmV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dGVyTm9kZTtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVgoYSwgYikge1xuICAgIHJldHVybiBhLnggLSBiLng7XG59XG5cbi8vIGZpbmQgYSBicmlkZ2UgYmV0d2VlbiB2ZXJ0aWNlcyB0aGF0IGNvbm5lY3RzIGhvbGUgd2l0aCBhbiBvdXRlciByaW5nIGFuZCBhbmQgbGluayBpdFxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZShob2xlLCBvdXRlck5vZGUpIHtcbiAgICBvdXRlck5vZGUgPSBmaW5kSG9sZUJyaWRnZShob2xlLCBvdXRlck5vZGUpO1xuICAgIGlmIChvdXRlck5vZGUpIHtcbiAgICAgICAgdmFyIGIgPSBzcGxpdFBvbHlnb24ob3V0ZXJOb2RlLCBob2xlKTtcbiAgICAgICAgZmlsdGVyUG9pbnRzKGIsIGIubmV4dCk7XG4gICAgfVxufVxuXG4vLyBEYXZpZCBFYmVybHkncyBhbGdvcml0aG0gZm9yIGZpbmRpbmcgYSBicmlkZ2UgYmV0d2VlbiBob2xlIGFuZCBvdXRlciBwb2x5Z29uXG5mdW5jdGlvbiBmaW5kSG9sZUJyaWRnZShob2xlLCBvdXRlck5vZGUpIHtcbiAgICB2YXIgcCA9IG91dGVyTm9kZSxcbiAgICAgICAgaHggPSBob2xlLngsXG4gICAgICAgIGh5ID0gaG9sZS55LFxuICAgICAgICBxeCA9IC1JbmZpbml0eSxcbiAgICAgICAgbTtcblxuICAgIC8vIGZpbmQgYSBzZWdtZW50IGludGVyc2VjdGVkIGJ5IGEgcmF5IGZyb20gdGhlIGhvbGUncyBsZWZ0bW9zdCBwb2ludCB0byB0aGUgbGVmdDtcbiAgICAvLyBzZWdtZW50J3MgZW5kcG9pbnQgd2l0aCBsZXNzZXIgeCB3aWxsIGJlIHBvdGVudGlhbCBjb25uZWN0aW9uIHBvaW50XG4gICAgZG8ge1xuICAgICAgICBpZiAoaHkgPD0gcC55ICYmIGh5ID49IHAubmV4dC55KSB7XG4gICAgICAgICAgICB2YXIgeCA9IHAueCArIChoeSAtIHAueSkgKiAocC5uZXh0LnggLSBwLngpIC8gKHAubmV4dC55IC0gcC55KTtcbiAgICAgICAgICAgIGlmICh4IDw9IGh4ICYmIHggPiBxeCkge1xuICAgICAgICAgICAgICAgIHF4ID0geDtcbiAgICAgICAgICAgICAgICBpZiAoeCA9PT0gaHgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh5ID09PSBwLnkpIHJldHVybiBwO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAubmV4dC55KSByZXR1cm4gcC5uZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtID0gcC54IDwgcC5uZXh0LnggPyBwIDogcC5uZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gb3V0ZXJOb2RlKTtcblxuICAgIGlmICghbSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoaHggPT09IHF4KSByZXR1cm4gbS5wcmV2OyAvLyBob2xlIHRvdWNoZXMgb3V0ZXIgc2VnbWVudDsgcGljayBsb3dlciBlbmRwb2ludFxuXG4gICAgLy8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBwb2ludHMgZm91bmQsIHdlIGhhdmUgYSB2YWxpZCBjb25uZWN0aW9uO1xuICAgIC8vIG90aGVyd2lzZSBjaG9vc2UgdGhlIHBvaW50IG9mIHRoZSBtaW5pbXVtIGFuZ2xlIHdpdGggdGhlIHJheSBhcyBjb25uZWN0aW9uIHBvaW50XG5cbiAgICB2YXIgc3RvcCA9IG0sXG4gICAgICAgIG14ID0gbS54LFxuICAgICAgICBteSA9IG0ueSxcbiAgICAgICAgdGFuTWluID0gSW5maW5pdHksXG4gICAgICAgIHRhbjtcblxuICAgIHAgPSBtLm5leHQ7XG5cbiAgICB3aGlsZSAocCAhPT0gc3RvcCkge1xuICAgICAgICBpZiAoaHggPj0gcC54ICYmIHAueCA+PSBteCAmJlxuICAgICAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShoeSA8IG15ID8gaHggOiBxeCwgaHksIG14LCBteSwgaHkgPCBteSA/IHF4IDogaHgsIGh5LCBwLngsIHAueSkpIHtcblxuICAgICAgICAgICAgdGFuID0gTWF0aC5hYnMoaHkgLSBwLnkpIC8gKGh4IC0gcC54KTsgLy8gdGFuZ2VudGlhbFxuXG4gICAgICAgICAgICBpZiAoKHRhbiA8IHRhbk1pbiB8fCAodGFuID09PSB0YW5NaW4gJiYgcC54ID4gbS54KSkgJiYgbG9jYWxseUluc2lkZShwLCBob2xlKSkge1xuICAgICAgICAgICAgICAgIG0gPSBwO1xuICAgICAgICAgICAgICAgIHRhbk1pbiA9IHRhbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG07XG59XG5cbi8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbmZ1bmN0aW9uIGluZGV4Q3VydmUoc3RhcnQsIG1pblgsIG1pblksIHNpemUpIHtcbiAgICB2YXIgcCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAueiA9PT0gbnVsbCkgcC56ID0gek9yZGVyKHAueCwgcC55LCBtaW5YLCBtaW5ZLCBzaXplKTtcbiAgICAgICAgcC5wcmV2WiA9IHAucHJldjtcbiAgICAgICAgcC5uZXh0WiA9IHAubmV4dDtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICBwLnByZXZaLm5leHRaID0gbnVsbDtcbiAgICBwLnByZXZaID0gbnVsbDtcblxuICAgIHNvcnRMaW5rZWQocCk7XG59XG5cbi8vIFNpbW9uIFRhdGhhbSdzIGxpbmtlZCBsaXN0IG1lcmdlIHNvcnQgYWxnb3JpdGhtXG4vLyBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL2FsZ29yaXRobXMvbGlzdHNvcnQuaHRtbFxuZnVuY3Rpb24gc29ydExpbmtlZChsaXN0KSB7XG4gICAgdmFyIGksIHAsIHEsIGUsIHRhaWwsIG51bU1lcmdlcywgcFNpemUsIHFTaXplLFxuICAgICAgICBpblNpemUgPSAxO1xuXG4gICAgZG8ge1xuICAgICAgICBwID0gbGlzdDtcbiAgICAgICAgbGlzdCA9IG51bGw7XG4gICAgICAgIHRhaWwgPSBudWxsO1xuICAgICAgICBudW1NZXJnZXMgPSAwO1xuXG4gICAgICAgIHdoaWxlIChwKSB7XG4gICAgICAgICAgICBudW1NZXJnZXMrKztcbiAgICAgICAgICAgIHEgPSBwO1xuICAgICAgICAgICAgcFNpemUgPSAwO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGluU2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcFNpemUrKztcbiAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICBpZiAoIXEpIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBxU2l6ZSA9IGluU2l6ZTtcblxuICAgICAgICAgICAgd2hpbGUgKHBTaXplID4gMCB8fCAocVNpemUgPiAwICYmIHEpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAocFNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHE7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBxU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocVNpemUgPT09IDAgfHwgIXEpIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHA7XG4gICAgICAgICAgICAgICAgICAgIHAgPSBwLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBwU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocC56IDw9IHEueikge1xuICAgICAgICAgICAgICAgICAgICBlID0gcDtcbiAgICAgICAgICAgICAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHBTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHE7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBxU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0YWlsKSB0YWlsLm5leHRaID0gZTtcbiAgICAgICAgICAgICAgICBlbHNlIGxpc3QgPSBlO1xuXG4gICAgICAgICAgICAgICAgZS5wcmV2WiA9IHRhaWw7XG4gICAgICAgICAgICAgICAgdGFpbCA9IGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHAgPSBxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFpbC5uZXh0WiA9IG51bGw7XG4gICAgICAgIGluU2l6ZSAqPSAyO1xuXG4gICAgfSB3aGlsZSAobnVtTWVyZ2VzID4gMSk7XG5cbiAgICByZXR1cm4gbGlzdDtcbn1cblxuLy8gei1vcmRlciBvZiBhIHBvaW50IGdpdmVuIGNvb3JkcyBhbmQgc2l6ZSBvZiB0aGUgZGF0YSBib3VuZGluZyBib3hcbmZ1bmN0aW9uIHpPcmRlcih4LCB5LCBtaW5YLCBtaW5ZLCBzaXplKSB7XG4gICAgLy8gY29vcmRzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIG5vbi1uZWdhdGl2ZSAxNS1iaXQgaW50ZWdlciByYW5nZVxuICAgIHggPSAzMjc2NyAqICh4IC0gbWluWCkgLyBzaXplO1xuICAgIHkgPSAzMjc2NyAqICh5IC0gbWluWSkgLyBzaXplO1xuXG4gICAgeCA9ICh4IHwgKHggPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB4ID0gKHggfCAoeCA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHggPSAoeCB8ICh4IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeCA9ICh4IHwgKHggPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHkgPSAoeSB8ICh5IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gICAgeSA9ICh5IHwgKHkgPDwgNCkpICYgMHgwRjBGMEYwRjtcbiAgICB5ID0gKHkgfCAoeSA8PCAyKSkgJiAweDMzMzMzMzMzO1xuICAgIHkgPSAoeSB8ICh5IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgICByZXR1cm4geCB8ICh5IDw8IDEpO1xufVxuXG4vLyBmaW5kIHRoZSBsZWZ0bW9zdCBub2RlIG9mIGEgcG9seWdvbiByaW5nXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdChzdGFydCkge1xuICAgIHZhciBwID0gc3RhcnQsXG4gICAgICAgIGxlZnRtb3N0ID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC54IDwgbGVmdG1vc3QueCkgbGVmdG1vc3QgPSBwO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHJldHVybiBsZWZ0bW9zdDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZVxuZnVuY3Rpb24gcG9pbnRJblRyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSkge1xuICAgIHJldHVybiAoY3ggLSBweCkgKiAoYXkgLSBweSkgLSAoYXggLSBweCkgKiAoY3kgLSBweSkgPj0gMCAmJlxuICAgICAgICAgICAoYXggLSBweCkgKiAoYnkgLSBweSkgLSAoYnggLSBweCkgKiAoYXkgLSBweSkgPj0gMCAmJlxuICAgICAgICAgICAoYnggLSBweCkgKiAoY3kgLSBweSkgLSAoY3ggLSBweCkgKiAoYnkgLSBweSkgPj0gMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBkaWFnb25hbCBiZXR3ZWVuIHR3byBwb2x5Z29uIG5vZGVzIGlzIHZhbGlkIChsaWVzIGluIHBvbHlnb24gaW50ZXJpb3IpXG5mdW5jdGlvbiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikge1xuICAgIHJldHVybiBhLm5leHQuaSAhPT0gYi5pICYmIGEucHJldi5pICE9PSBiLmkgJiYgIWludGVyc2VjdHNQb2x5Z29uKGEsIGIpICYmXG4gICAgICAgICAgIGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSAmJiBtaWRkbGVJbnNpZGUoYSwgYik7XG59XG5cbi8vIHNpZ25lZCBhcmVhIG9mIGEgdHJpYW5nbGVcbmZ1bmN0aW9uIGFyZWEocCwgcSwgcikge1xuICAgIHJldHVybiAocS55IC0gcC55KSAqIChyLnggLSBxLngpIC0gKHEueCAtIHAueCkgKiAoci55IC0gcS55KTtcbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcbmZ1bmN0aW9uIGVxdWFscyhwMSwgcDIpIHtcbiAgICByZXR1cm4gcDEueCA9PT0gcDIueCAmJiBwMS55ID09PSBwMi55O1xufVxuXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XG5mdW5jdGlvbiBpbnRlcnNlY3RzKHAxLCBxMSwgcDIsIHEyKSB7XG4gICAgaWYgKChlcXVhbHMocDEsIHExKSAmJiBlcXVhbHMocDIsIHEyKSkgfHxcbiAgICAgICAgKGVxdWFscyhwMSwgcTIpICYmIGVxdWFscyhwMiwgcTEpKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGFyZWEocDEsIHExLCBwMikgPiAwICE9PSBhcmVhKHAxLCBxMSwgcTIpID4gMCAmJlxuICAgICAgICAgICBhcmVhKHAyLCBxMiwgcDEpID4gMCAhPT0gYXJlYShwMiwgcTIsIHExKSA+IDA7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzXG5mdW5jdGlvbiBpbnRlcnNlY3RzUG9seWdvbihhLCBiKSB7XG4gICAgdmFyIHAgPSBhO1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJlxuICAgICAgICAgICAgICAgIGludGVyc2VjdHMocCwgcC5uZXh0LCBhLCBiKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpcyBsb2NhbGx5IGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbG9jYWxseUluc2lkZShhLCBiKSB7XG4gICAgcmV0dXJuIGFyZWEoYS5wcmV2LCBhLCBhLm5leHQpIDwgMCA/XG4gICAgICAgIGFyZWEoYSwgYiwgYS5uZXh0KSA+PSAwICYmIGFyZWEoYSwgYS5wcmV2LCBiKSA+PSAwIDpcbiAgICAgICAgYXJlYShhLCBiLCBhLnByZXYpIDwgMCB8fCBhcmVhKGEsIGEubmV4dCwgYikgPCAwO1xufVxuXG4vLyBjaGVjayBpZiB0aGUgbWlkZGxlIHBvaW50IG9mIGEgcG9seWdvbiBkaWFnb25hbCBpcyBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIG1pZGRsZUluc2lkZShhLCBiKSB7XG4gICAgdmFyIHAgPSBhLFxuICAgICAgICBpbnNpZGUgPSBmYWxzZSxcbiAgICAgICAgcHggPSAoYS54ICsgYi54KSAvIDIsXG4gICAgICAgIHB5ID0gKGEueSArIGIueSkgLyAyO1xuICAgIGRvIHtcbiAgICAgICAgaWYgKCgocC55ID4gcHkpICE9PSAocC5uZXh0LnkgPiBweSkpICYmIChweCA8IChwLm5leHQueCAtIHAueCkgKiAocHkgLSBwLnkpIC8gKHAubmV4dC55IC0gcC55KSArIHAueCkpXG4gICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xuXG4gICAgcmV0dXJuIGluc2lkZTtcbn1cblxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXG5mdW5jdGlvbiBzcGxpdFBvbHlnb24oYSwgYikge1xuICAgIHZhciBhMiA9IG5ldyBOb2RlKGEuaSwgYS54LCBhLnkpLFxuICAgICAgICBiMiA9IG5ldyBOb2RlKGIuaSwgYi54LCBiLnkpLFxuICAgICAgICBhbiA9IGEubmV4dCxcbiAgICAgICAgYnAgPSBiLnByZXY7XG5cbiAgICBhLm5leHQgPSBiO1xuICAgIGIucHJldiA9IGE7XG5cbiAgICBhMi5uZXh0ID0gYW47XG4gICAgYW4ucHJldiA9IGEyO1xuXG4gICAgYjIubmV4dCA9IGEyO1xuICAgIGEyLnByZXYgPSBiMjtcblxuICAgIGJwLm5leHQgPSBiMjtcbiAgICBiMi5wcmV2ID0gYnA7XG5cbiAgICByZXR1cm4gYjI7XG59XG5cbi8vIGNyZWF0ZSBhIG5vZGUgYW5kIG9wdGlvbmFsbHkgbGluayBpdCB3aXRoIHByZXZpb3VzIG9uZSAoaW4gYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBpbnNlcnROb2RlKGksIHgsIHksIGxhc3QpIHtcbiAgICB2YXIgcCA9IG5ldyBOb2RlKGksIHgsIHkpO1xuXG4gICAgaWYgKCFsYXN0KSB7XG4gICAgICAgIHAucHJldiA9IHA7XG4gICAgICAgIHAubmV4dCA9IHA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBwLm5leHQgPSBsYXN0Lm5leHQ7XG4gICAgICAgIHAucHJldiA9IGxhc3Q7XG4gICAgICAgIGxhc3QubmV4dC5wcmV2ID0gcDtcbiAgICAgICAgbGFzdC5uZXh0ID0gcDtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUocCkge1xuICAgIHAubmV4dC5wcmV2ID0gcC5wcmV2O1xuICAgIHAucHJldi5uZXh0ID0gcC5uZXh0O1xuXG4gICAgaWYgKHAucHJldlopIHAucHJldloubmV4dFogPSBwLm5leHRaO1xuICAgIGlmIChwLm5leHRaKSBwLm5leHRaLnByZXZaID0gcC5wcmV2Wjtcbn1cblxuZnVuY3Rpb24gTm9kZShpLCB4LCB5KSB7XG4gICAgLy8gdmVydGljZSBpbmRleCBpbiBjb29yZGluYXRlcyBhcnJheVxuICAgIHRoaXMuaSA9IGk7XG5cbiAgICAvLyB2ZXJ0ZXggY29vcmRpbmF0ZXNcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG5cbiAgICAvLyBwcmV2aW91cyBhbmQgbmV4dCB2ZXJ0aWNlIG5vZGVzIGluIGEgcG9seWdvbiByaW5nXG4gICAgdGhpcy5wcmV2ID0gbnVsbDtcbiAgICB0aGlzLm5leHQgPSBudWxsO1xuXG4gICAgLy8gei1vcmRlciBjdXJ2ZSB2YWx1ZVxuICAgIHRoaXMueiA9IG51bGw7XG5cbiAgICAvLyBwcmV2aW91cyBhbmQgbmV4dCBub2RlcyBpbiB6LW9yZGVyXG4gICAgdGhpcy5wcmV2WiA9IG51bGw7XG4gICAgdGhpcy5uZXh0WiA9IG51bGw7XG5cbiAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgc3RlaW5lciBwb2ludFxuICAgIHRoaXMuc3RlaW5lciA9IGZhbHNlO1xufVxuXG4vLyByZXR1cm4gYSBwZXJjZW50YWdlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcG9seWdvbiBhcmVhIGFuZCBpdHMgdHJpYW5ndWxhdGlvbiBhcmVhO1xuLy8gdXNlZCB0byB2ZXJpZnkgY29ycmVjdG5lc3Mgb2YgdHJpYW5ndWxhdGlvblxuZWFyY3V0LmRldmlhdGlvbiA9IGZ1bmN0aW9uIChkYXRhLCBob2xlSW5kaWNlcywgZGltLCB0cmlhbmdsZXMpIHtcbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGg7XG4gICAgdmFyIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuXG4gICAgdmFyIHBvbHlnb25BcmVhID0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCAwLCBvdXRlckxlbiwgZGltKSk7XG4gICAgaWYgKGhhc0hvbGVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XG4gICAgICAgICAgICB2YXIgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHBvbHlnb25BcmVhIC09IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdHJpYW5nbGVzQXJlYSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB2YXIgYSA9IHRyaWFuZ2xlc1tpXSAqIGRpbTtcbiAgICAgICAgdmFyIGIgPSB0cmlhbmdsZXNbaSArIDFdICogZGltO1xuICAgICAgICB2YXIgYyA9IHRyaWFuZ2xlc1tpICsgMl0gKiBkaW07XG4gICAgICAgIHRyaWFuZ2xlc0FyZWEgKz0gTWF0aC5hYnMoXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbY10pICogKGRhdGFbYiArIDFdIC0gZGF0YVthICsgMV0pIC1cbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtiXSkgKiAoZGF0YVtjICsgMV0gLSBkYXRhW2EgKyAxXSkpO1xuICAgIH1cblxuICAgIHJldHVybiBwb2x5Z29uQXJlYSA9PT0gMCAmJiB0cmlhbmdsZXNBcmVhID09PSAwID8gMCA6XG4gICAgICAgIE1hdGguYWJzKCh0cmlhbmdsZXNBcmVhIC0gcG9seWdvbkFyZWEpIC8gcG9seWdvbkFyZWEpO1xufTtcblxuZnVuY3Rpb24gc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pIHtcbiAgICB2YXIgc3VtID0gMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQsIGogPSBlbmQgLSBkaW07IGkgPCBlbmQ7IGkgKz0gZGltKSB7XG4gICAgICAgIHN1bSArPSAoZGF0YVtqXSAtIGRhdGFbaV0pICogKGRhdGFbaSArIDFdICsgZGF0YVtqICsgMV0pO1xuICAgICAgICBqID0gaTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn1cblxuLy8gdHVybiBhIHBvbHlnb24gaW4gYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBmb3JtIChlLmcuIGFzIGluIEdlb0pTT04pIGludG8gYSBmb3JtIEVhcmN1dCBhY2NlcHRzXG5lYXJjdXQuZmxhdHRlbiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIGRpbSA9IGRhdGFbMF1bMF0ubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSB7dmVydGljZXM6IFtdLCBob2xlczogW10sIGRpbWVuc2lvbnM6IGRpbX0sXG4gICAgICAgIGhvbGVJbmRleCA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkYXRhW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8IGRpbTsgZCsrKSByZXN1bHQudmVydGljZXMucHVzaChkYXRhW2ldW2pdW2RdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGhvbGVJbmRleCArPSBkYXRhW2kgLSAxXS5sZW5ndGg7XG4gICAgICAgICAgICByZXN1bHQuaG9sZXMucHVzaChob2xlSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG5FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbihuKSB7XG4gIGlmICghaXNOdW1iZXIobikgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCduIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBlciwgaGFuZGxlciwgbGVuLCBhcmdzLCBpLCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAodHlwZSA9PT0gJ2Vycm9yJykge1xuICAgIGlmICghdGhpcy5fZXZlbnRzLmVycm9yIHx8XG4gICAgICAgIChpc09iamVjdCh0aGlzLl9ldmVudHMuZXJyb3IpICYmICF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSkge1xuICAgICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG4gICAgICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc1VuZGVmaW5lZChoYW5kbGVyKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIGZhc3QgY2FzZXNcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIHNsb3dlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGhhbmRsZXIpKSB7XG4gICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgbGlzdGVuZXJzID0gaGFuZGxlci5zbGljZSgpO1xuICAgIGxlbiA9IGxpc3RlbmVycy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG07XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgaWYgKHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lcilcbiAgICB0aGlzLmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbihsaXN0ZW5lci5saXN0ZW5lcikgP1xuICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgZWxzZSBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlXG4gICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gW3RoaXMuX2V2ZW50c1t0eXBlXSwgbGlzdGVuZXJdO1xuXG4gIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pICYmICF0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkKSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9tYXhMaXN0ZW5lcnMpKSB7XG4gICAgICBtID0gdGhpcy5fbWF4TGlzdGVuZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gICAgfVxuXG4gICAgaWYgKG0gJiYgbSA+IDAgJiYgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCA+IG0pIHtcbiAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgJyArXG4gICAgICAgICAgICAgICAgICAgICdsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUudHJhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBpbiBJRSAxMFxuICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIHZhciBmaXJlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGcoKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcblxuICAgIGlmICghZmlyZWQpIHtcbiAgICAgIGZpcmVkID0gdHJ1ZTtcbiAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgZy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB0aGlzLm9uKHR5cGUsIGcpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWRcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbGlzdCwgcG9zaXRpb24sIGxlbmd0aCwgaTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXR1cm4gdGhpcztcblxuICBsaXN0ID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuICBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgcG9zaXRpb24gPSAtMTtcblxuICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHxcbiAgICAgIChpc0Z1bmN0aW9uKGxpc3QubGlzdGVuZXIpICYmIGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgfSBlbHNlIGlmIChpc09iamVjdChsaXN0KSkge1xuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tID4gMDspIHtcbiAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fFxuICAgICAgICAgIChsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgbGlzdC5sZW5ndGggPSAwO1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdC5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGtleSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgaWYgKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIGVsc2UgaWYgKHRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGtleSBpbiB0aGlzLl9ldmVudHMpIHtcbiAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXJzKSkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAvLyBMSUZPIG9yZGVyXG4gICAgd2hpbGUgKGxpc3RlbmVycy5sZW5ndGgpXG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuICB9XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIHJldDtcbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXQgPSBbXTtcbiAgZWxzZSBpZiAoaXNGdW5jdGlvbih0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIHJldCA9IFt0aGlzLl9ldmVudHNbdHlwZV1dO1xuICBlbHNlXG4gICAgcmV0ID0gdGhpcy5fZXZlbnRzW3R5cGVdLnNsaWNlKCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIGlmICh0aGlzLl9ldmVudHMpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICAgIGlmIChpc0Z1bmN0aW9uKGV2bGlzdGVuZXIpKVxuICAgICAgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoZXZsaXN0ZW5lcilcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xufTtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuIiwiKGZ1bmN0aW9uKCl7dmFyIGs9ISFkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyO2Z1bmN0aW9uIGwoYSxiKXtrP2EuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLGIsITEpOmEuYXR0YWNoRXZlbnQoXCJzY3JvbGxcIixiKX1mdW5jdGlvbiB2KGEpe2RvY3VtZW50LmJvZHk/YSgpOms/ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIixhKTpkb2N1bWVudC5hdHRhY2hFdmVudChcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiLGZ1bmN0aW9uKCl7XCJpbnRlcmFjdGl2ZVwiIT1kb2N1bWVudC5yZWFkeVN0YXRlJiZcImNvbXBsZXRlXCIhPWRvY3VtZW50LnJlYWR5U3RhdGV8fGEoKX0pfTtmdW5jdGlvbiB3KGEpe3RoaXMuYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3RoaXMuYS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKTt0aGlzLmEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYSkpO3RoaXMuYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt0aGlzLmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7dGhpcy5oPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt0aGlzLmc9LTE7dGhpcy5iLnN0eWxlLmNzc1RleHQ9XCJtYXgtd2lkdGg6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO292ZXJmbG93OnNjcm9sbDtmb250LXNpemU6MTZweDtcIjt0aGlzLmMuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6c2Nyb2xsO2ZvbnQtc2l6ZToxNnB4O1wiO1xudGhpcy5mLnN0eWxlLmNzc1RleHQ9XCJtYXgtd2lkdGg6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO292ZXJmbG93OnNjcm9sbDtmb250LXNpemU6MTZweDtcIjt0aGlzLmguc3R5bGUuY3NzVGV4dD1cImRpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjIwMCU7aGVpZ2h0OjIwMCU7Zm9udC1zaXplOjE2cHg7bWF4LXdpZHRoOm5vbmU7XCI7dGhpcy5iLmFwcGVuZENoaWxkKHRoaXMuaCk7dGhpcy5jLmFwcGVuZENoaWxkKHRoaXMuZik7dGhpcy5hLmFwcGVuZENoaWxkKHRoaXMuYik7dGhpcy5hLmFwcGVuZENoaWxkKHRoaXMuYyl9XG5mdW5jdGlvbiB5KGEsYil7YS5hLnN0eWxlLmNzc1RleHQ9XCJtYXgtd2lkdGg6bm9uZTttaW4td2lkdGg6MjBweDttaW4taGVpZ2h0OjIwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOmF1dG87bWFyZ2luOjA7cGFkZGluZzowO3RvcDotOTk5cHg7bGVmdDotOTk5cHg7d2hpdGUtc3BhY2U6bm93cmFwO2ZvbnQ6XCIrYitcIjtcIn1mdW5jdGlvbiB6KGEpe3ZhciBiPWEuYS5vZmZzZXRXaWR0aCxjPWIrMTAwO2EuZi5zdHlsZS53aWR0aD1jK1wicHhcIjthLmMuc2Nyb2xsTGVmdD1jO2EuYi5zY3JvbGxMZWZ0PWEuYi5zY3JvbGxXaWR0aCsxMDA7cmV0dXJuIGEuZyE9PWI/KGEuZz1iLCEwKTohMX1mdW5jdGlvbiBBKGEsYil7ZnVuY3Rpb24gYygpe3ZhciBhPW07eihhKSYmbnVsbCE9PWEuYS5wYXJlbnROb2RlJiZiKGEuZyl9dmFyIG09YTtsKGEuYixjKTtsKGEuYyxjKTt6KGEpfTtmdW5jdGlvbiBCKGEsYil7dmFyIGM9Ynx8e307dGhpcy5mYW1pbHk9YTt0aGlzLnN0eWxlPWMuc3R5bGV8fFwibm9ybWFsXCI7dGhpcy53ZWlnaHQ9Yy53ZWlnaHR8fFwibm9ybWFsXCI7dGhpcy5zdHJldGNoPWMuc3RyZXRjaHx8XCJub3JtYWxcIn12YXIgQz1udWxsLEQ9bnVsbCxIPSEhd2luZG93LkZvbnRGYWNlO2Z1bmN0aW9uIEkoKXtpZihudWxsPT09RCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0cnl7YS5zdHlsZS5mb250PVwiY29uZGVuc2VkIDEwMHB4IHNhbnMtc2VyaWZcIn1jYXRjaChiKXt9RD1cIlwiIT09YS5zdHlsZS5mb250fXJldHVybiBEfWZ1bmN0aW9uIEooYSxiKXtyZXR1cm5bYS5zdHlsZSxhLndlaWdodCxJKCk/YS5zdHJldGNoOlwiXCIsXCIxMDBweFwiLGJdLmpvaW4oXCIgXCIpfVxuQi5wcm90b3R5cGUubG9hZD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsbT1hfHxcIkJFU2Jzd3lcIix4PWJ8fDNFMyxFPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihhLGIpe2lmKEgpe3ZhciBLPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZSgpeyhuZXcgRGF0ZSkuZ2V0VGltZSgpLUU+PXg/YigpOmRvY3VtZW50LmZvbnRzLmxvYWQoSihjLGMuZmFtaWx5KSxtKS50aGVuKGZ1bmN0aW9uKGMpezE8PWMubGVuZ3RoP2EoKTpzZXRUaW1lb3V0KGUsMjUpfSxmdW5jdGlvbigpe2IoKX0pfWUoKX0pLEw9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxjKXtzZXRUaW1lb3V0KGMseCl9KTtQcm9taXNlLnJhY2UoW0wsS10pLnRoZW4oZnVuY3Rpb24oKXthKGMpfSxmdW5jdGlvbigpe2IoYyl9KX1lbHNlIHYoZnVuY3Rpb24oKXtmdW5jdGlvbiBxKCl7dmFyIGI7aWYoYj0tMSE9ZiYmLTEhPWd8fC0xIT1mJiYtMSE9aHx8LTEhPWcmJi0xIT1cbmgpKGI9ZiE9ZyYmZiE9aCYmZyE9aCl8fChudWxsPT09QyYmKGI9L0FwcGxlV2ViS2l0XFwvKFswLTldKykoPzpcXC4oWzAtOV0rKSkvLmV4ZWMod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpLEM9ISFiJiYoNTM2PnBhcnNlSW50KGJbMV0sMTApfHw1MzY9PT1wYXJzZUludChiWzFdLDEwKSYmMTE+PXBhcnNlSW50KGJbMl0sMTApKSksYj1DJiYoZj09ciYmZz09ciYmaD09cnx8Zj09dCYmZz09dCYmaD09dHx8Zj09dSYmZz09dSYmaD09dSkpLGI9IWI7YiYmKG51bGwhPT1kLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSxjbGVhclRpbWVvdXQoRyksYShjKSl9ZnVuY3Rpb24gRigpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLUU+PXgpbnVsbCE9PWQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpLGIoYyk7ZWxzZXt2YXIgYT1kb2N1bWVudC5oaWRkZW47aWYoITA9PT1hfHx2b2lkIDA9PT1hKWY9ZS5hLm9mZnNldFdpZHRoLGc9bi5hLm9mZnNldFdpZHRoLFxuaD1wLmEub2Zmc2V0V2lkdGgscSgpO0c9c2V0VGltZW91dChGLDUwKX19dmFyIGU9bmV3IHcobSksbj1uZXcgdyhtKSxwPW5ldyB3KG0pLGY9LTEsZz0tMSxoPS0xLHI9LTEsdD0tMSx1PS0xLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxHPTA7ZC5kaXI9XCJsdHJcIjt5KGUsSihjLFwic2Fucy1zZXJpZlwiKSk7eShuLEooYyxcInNlcmlmXCIpKTt5KHAsSihjLFwibW9ub3NwYWNlXCIpKTtkLmFwcGVuZENoaWxkKGUuYSk7ZC5hcHBlbmRDaGlsZChuLmEpO2QuYXBwZW5kQ2hpbGQocC5hKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3I9ZS5hLm9mZnNldFdpZHRoO3Q9bi5hLm9mZnNldFdpZHRoO3U9cC5hLm9mZnNldFdpZHRoO0YoKTtBKGUsZnVuY3Rpb24oYSl7Zj1hO3EoKX0pO3koZSxKKGMsJ1wiJytjLmZhbWlseSsnXCIsc2Fucy1zZXJpZicpKTtBKG4sZnVuY3Rpb24oYSl7Zz1hO3EoKX0pO3kobixKKGMsJ1wiJytjLmZhbWlseSsnXCIsc2VyaWYnKSk7QShwLGZ1bmN0aW9uKGEpe2g9XG5hO3EoKX0pO3kocCxKKGMsJ1wiJytjLmZhbWlseSsnXCIsbW9ub3NwYWNlJykpfSl9KX07d2luZG93LkZvbnRGYWNlT2JzZXJ2ZXI9Qjt3aW5kb3cuRm9udEZhY2VPYnNlcnZlci5wcm90b3R5cGUuY2hlY2s9d2luZG93LkZvbnRGYWNlT2JzZXJ2ZXIucHJvdG90eXBlLmxvYWQ9Qi5wcm90b3R5cGUubG9hZDtcInVuZGVmaW5lZFwiIT09dHlwZW9mIG1vZHVsZSYmKG1vZHVsZS5leHBvcnRzPXdpbmRvdy5Gb250RmFjZU9ic2VydmVyKTt9KCkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsaXA7XG5cbi8qIGNsaXAgZmVhdHVyZXMgYmV0d2VlbiB0d28gYXhpcy1wYXJhbGxlbCBsaW5lczpcbiAqICAgICB8ICAgICAgICB8XG4gKiAgX19ffF9fXyAgICAgfCAgICAgL1xuICogLyAgIHwgICBcXF9fX198X19fXy9cbiAqICAgICB8ICAgICAgICB8XG4gKi9cblxuZnVuY3Rpb24gY2xpcChmZWF0dXJlcywgc2NhbGUsIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCBtaW5BbGwsIG1heEFsbCkge1xuXG4gICAgazEgLz0gc2NhbGU7XG4gICAgazIgLz0gc2NhbGU7XG5cbiAgICBpZiAobWluQWxsID49IGsxICYmIG1heEFsbCA8PSBrMikgcmV0dXJuIGZlYXR1cmVzOyAvLyB0cml2aWFsIGFjY2VwdFxuICAgIGVsc2UgaWYgKG1pbkFsbCA+IGsyIHx8IG1heEFsbCA8IGsxKSByZXR1cm4gbnVsbDsgLy8gdHJpdmlhbCByZWplY3RcblxuICAgIHZhciBjbGlwcGVkID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGUsXG4gICAgICAgICAgICBtaW4sIG1heDtcblxuICAgICAgICBtaW4gPSBmZWF0dXJlLm1pbltheGlzXTtcbiAgICAgICAgbWF4ID0gZmVhdHVyZS5tYXhbYXhpc107XG5cbiAgICAgICAgaWYgKG1pbiA+PSBrMSAmJiBtYXggPD0gazIpIHsgLy8gdHJpdmlhbCBhY2NlcHRcbiAgICAgICAgICAgIGNsaXBwZWQucHVzaChmZWF0dXJlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+IGsyIHx8IG1heCA8IGsxKSBjb250aW51ZTsgLy8gdHJpdmlhbCByZWplY3RcblxuICAgICAgICB2YXIgc2xpY2VzID0gdHlwZSA9PT0gMSA/XG4gICAgICAgICAgICAgICAgY2xpcFBvaW50cyhnZW9tZXRyeSwgazEsIGsyLCBheGlzKSA6XG4gICAgICAgICAgICAgICAgY2xpcEdlb21ldHJ5KGdlb21ldHJ5LCBrMSwgazIsIGF4aXMsIGludGVyc2VjdCwgdHlwZSA9PT0gMyk7XG5cbiAgICAgICAgaWYgKHNsaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGlmIGEgZmVhdHVyZSBnb3QgY2xpcHBlZCwgaXQgd2lsbCBsaWtlbHkgZ2V0IGNsaXBwZWQgb24gdGhlIG5leHQgem9vbSBsZXZlbCBhcyB3ZWxsLFxuICAgICAgICAgICAgLy8gc28gdGhlcmUncyBubyBuZWVkIHRvIHJlY2FsY3VsYXRlIGJib3hlc1xuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogc2xpY2VzLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgdGFnczogZmVhdHVyZXNbaV0udGFncyB8fCBudWxsLFxuICAgICAgICAgICAgICAgIG1pbjogZmVhdHVyZS5taW4sXG4gICAgICAgICAgICAgICAgbWF4OiBmZWF0dXJlLm1heFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xpcHBlZC5sZW5ndGggPyBjbGlwcGVkIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gY2xpcFBvaW50cyhnZW9tZXRyeSwgazEsIGsyLCBheGlzKSB7XG4gICAgdmFyIHNsaWNlID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBhID0gZ2VvbWV0cnlbaV0sXG4gICAgICAgICAgICBhayA9IGFbYXhpc107XG5cbiAgICAgICAgaWYgKGFrID49IGsxICYmIGFrIDw9IGsyKSBzbGljZS5wdXNoKGEpO1xuICAgIH1cbiAgICByZXR1cm4gc2xpY2U7XG59XG5cbmZ1bmN0aW9uIGNsaXBHZW9tZXRyeShnZW9tZXRyeSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIGNsb3NlZCkge1xuXG4gICAgdmFyIHNsaWNlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tZXRyeS5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIHZhciBhayA9IDAsXG4gICAgICAgICAgICBiayA9IDAsXG4gICAgICAgICAgICBiID0gbnVsbCxcbiAgICAgICAgICAgIHBvaW50cyA9IGdlb21ldHJ5W2ldLFxuICAgICAgICAgICAgYXJlYSA9IHBvaW50cy5hcmVhLFxuICAgICAgICAgICAgZGlzdCA9IHBvaW50cy5kaXN0LFxuICAgICAgICAgICAgbGVuID0gcG9pbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGEsIGosIGxhc3Q7XG5cbiAgICAgICAgdmFyIHNsaWNlID0gW107XG5cbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbiAtIDE7IGorKykge1xuICAgICAgICAgICAgYSA9IGIgfHwgcG9pbnRzW2pdO1xuICAgICAgICAgICAgYiA9IHBvaW50c1tqICsgMV07XG4gICAgICAgICAgICBhayA9IGJrIHx8IGFbYXhpc107XG4gICAgICAgICAgICBiayA9IGJbYXhpc107XG5cbiAgICAgICAgICAgIGlmIChhayA8IGsxKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGJrID4gazIpKSB7IC8vIC0tLXwtLS0tLXwtLT5cbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazEpLCBpbnRlcnNlY3QoYSwgYiwgazIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJrID49IGsxKSBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSkpOyAvLyAtLS18LS0+ICB8XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWsgPiBrMikge1xuXG4gICAgICAgICAgICAgICAgaWYgKChiayA8IGsxKSkgeyAvLyA8LS18LS0tLS18LS0tXG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSwgaW50ZXJzZWN0KGEsIGIsIGsxKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiayA8PSBrMikgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazIpKTsgLy8gfCAgPC0tfC0tLVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgc2xpY2UucHVzaChhKTtcblxuICAgICAgICAgICAgICAgIGlmIChiayA8IGsxKSB7IC8vIDwtLXwtLS0gIHxcbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazEpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJrID4gazIpIHsgLy8gfCAgLS0tfC0tPlxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gfCAtLT4gfFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIHRoZSBsYXN0IHBvaW50XG4gICAgICAgIGEgPSBwb2ludHNbbGVuIC0gMV07XG4gICAgICAgIGFrID0gYVtheGlzXTtcbiAgICAgICAgaWYgKGFrID49IGsxICYmIGFrIDw9IGsyKSBzbGljZS5wdXNoKGEpO1xuXG4gICAgICAgIC8vIGNsb3NlIHRoZSBwb2x5Z29uIGlmIGl0cyBlbmRwb2ludHMgYXJlIG5vdCB0aGUgc2FtZSBhZnRlciBjbGlwcGluZ1xuXG4gICAgICAgIGxhc3QgPSBzbGljZVtzbGljZS5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKGNsb3NlZCAmJiBsYXN0ICYmIChzbGljZVswXVswXSAhPT0gbGFzdFswXSB8fCBzbGljZVswXVsxXSAhPT0gbGFzdFsxXSkpIHNsaWNlLnB1c2goc2xpY2VbMF0pO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgZmluYWwgc2xpY2VcbiAgICAgICAgbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNsaWNlcztcbn1cblxuZnVuY3Rpb24gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCkge1xuICAgIGlmIChzbGljZS5sZW5ndGgpIHtcbiAgICAgICAgLy8gd2UgZG9uJ3QgcmVjYWxjdWxhdGUgdGhlIGFyZWEvbGVuZ3RoIG9mIHRoZSB1bmNsaXBwZWQgZ2VvbWV0cnkgYmVjYXVzZSB0aGUgY2FzZSB3aGVyZSBpdCBnb2VzXG4gICAgICAgIC8vIGJlbG93IHRoZSB2aXNpYmlsaXR5IHRocmVzaG9sZCBhcyBhIHJlc3VsdCBvZiBjbGlwcGluZyBpcyByYXJlLCBzbyB3ZSBhdm9pZCBkb2luZyB1bm5lY2Vzc2FyeSB3b3JrXG4gICAgICAgIHNsaWNlLmFyZWEgPSBhcmVhO1xuICAgICAgICBzbGljZS5kaXN0ID0gZGlzdDtcblxuICAgICAgICBzbGljZXMucHVzaChzbGljZSk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0O1xuXG52YXIgc2ltcGxpZnkgPSByZXF1aXJlKCcuL3NpbXBsaWZ5Jyk7XG5cbi8vIGNvbnZlcnRzIEdlb0pTT04gZmVhdHVyZSBpbnRvIGFuIGludGVybWVkaWF0ZSBwcm9qZWN0ZWQgSlNPTiB2ZWN0b3IgZm9ybWF0IHdpdGggc2ltcGxpZmljYXRpb24gZGF0YVxuXG5mdW5jdGlvbiBjb252ZXJ0KGRhdGEsIHRvbGVyYW5jZSkge1xuICAgIHZhciBmZWF0dXJlcyA9IFtdO1xuXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLmZlYXR1cmVzW2ldLCB0b2xlcmFuY2UpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YSwgdG9sZXJhbmNlKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNpbmdsZSBnZW9tZXRyeSBvciBhIGdlb21ldHJ5IGNvbGxlY3Rpb25cbiAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIHtnZW9tZXRyeTogZGF0YX0sIHRvbGVyYW5jZSk7XG4gICAgfVxuICAgIHJldHVybiBmZWF0dXJlcztcbn1cblxuZnVuY3Rpb24gY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGZlYXR1cmUsIHRvbGVyYW5jZSkge1xuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgdHlwZSA9IGdlb20udHlwZSxcbiAgICAgICAgY29vcmRzID0gZ2VvbS5jb29yZGluYXRlcyxcbiAgICAgICAgdGFncyA9IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgaSwgaiwgcmluZ3M7XG5cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAxLCBbcHJvamVjdFBvaW50KGNvb3JkcyldKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAxLCBwcm9qZWN0KGNvb3JkcykpKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDIsIFtwcm9qZWN0KGNvb3JkcywgdG9sZXJhbmNlKV0pKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIHJpbmdzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJpbmdzLnB1c2gocHJvamVjdChjb29yZHNbaV0sIHRvbGVyYW5jZSkpO1xuICAgICAgICB9XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIHR5cGUgPT09ICdQb2x5Z29uJyA/IDMgOiAyLCByaW5ncykpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICByaW5ncyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgcmluZ3MucHVzaChwcm9qZWN0KGNvb3Jkc1tpXVtqXSwgdG9sZXJhbmNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMywgcmluZ3MpKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0dlb21ldHJ5Q29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20uZ2VvbWV0cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogZ2VvbS5nZW9tZXRyaWVzW2ldLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHRhZ3NcbiAgICAgICAgICAgIH0sIHRvbGVyYW5jZSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC4nKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZSh0YWdzLCB0eXBlLCBnZW9tZXRyeSkge1xuICAgIHZhciBmZWF0dXJlID0ge1xuICAgICAgICBnZW9tZXRyeTogZ2VvbWV0cnksXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHRhZ3M6IHRhZ3MgfHwgbnVsbCxcbiAgICAgICAgbWluOiBbMiwgMV0sIC8vIGluaXRpYWwgYmJveCB2YWx1ZXM7XG4gICAgICAgIG1heDogWy0xLCAwXSAgLy8gbm90ZSB0aGF0IGNvb3JkcyBhcmUgdXN1YWxseSBpbiBbMC4uMV0gcmFuZ2VcbiAgICB9O1xuICAgIGNhbGNCQm94KGZlYXR1cmUpO1xuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0KGxvbmxhdHMsIHRvbGVyYW5jZSkge1xuICAgIHZhciBwcm9qZWN0ZWQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmxhdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcHJvamVjdGVkLnB1c2gocHJvamVjdFBvaW50KGxvbmxhdHNbaV0pKTtcbiAgICB9XG4gICAgaWYgKHRvbGVyYW5jZSkge1xuICAgICAgICBzaW1wbGlmeShwcm9qZWN0ZWQsIHRvbGVyYW5jZSk7XG4gICAgICAgIGNhbGNTaXplKHByb2plY3RlZCk7XG4gICAgfVxuICAgIHJldHVybiBwcm9qZWN0ZWQ7XG59XG5cbmZ1bmN0aW9uIHByb2plY3RQb2ludChwKSB7XG4gICAgdmFyIHNpbiA9IE1hdGguc2luKHBbMV0gKiBNYXRoLlBJIC8gMTgwKSxcbiAgICAgICAgeCA9IChwWzBdIC8gMzYwICsgMC41KSxcbiAgICAgICAgeSA9ICgwLjUgLSAwLjI1ICogTWF0aC5sb2coKDEgKyBzaW4pIC8gKDEgLSBzaW4pKSAvIE1hdGguUEkpO1xuXG4gICAgeSA9IHkgPCAtMSA/IC0xIDpcbiAgICAgICAgeSA+IDEgPyAxIDogeTtcblxuICAgIHJldHVybiBbeCwgeSwgMF07XG59XG5cbi8vIGNhbGN1bGF0ZSBhcmVhIGFuZCBsZW5ndGggb2YgdGhlIHBvbHlcbmZ1bmN0aW9uIGNhbGNTaXplKHBvaW50cykge1xuICAgIHZhciBhcmVhID0gMCxcbiAgICAgICAgZGlzdCA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgYSwgYjsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgYSA9IGIgfHwgcG9pbnRzW2ldO1xuICAgICAgICBiID0gcG9pbnRzW2kgKyAxXTtcblxuICAgICAgICBhcmVhICs9IGFbMF0gKiBiWzFdIC0gYlswXSAqIGFbMV07XG5cbiAgICAgICAgLy8gdXNlIE1hbmhhdHRhbiBkaXN0YW5jZSBpbnN0ZWFkIG9mIEV1Y2xpZGlhbiBvbmUgdG8gYXZvaWQgZXhwZW5zaXZlIHNxdWFyZSByb290IGNvbXB1dGF0aW9uXG4gICAgICAgIGRpc3QgKz0gTWF0aC5hYnMoYlswXSAtIGFbMF0pICsgTWF0aC5hYnMoYlsxXSAtIGFbMV0pO1xuICAgIH1cbiAgICBwb2ludHMuYXJlYSA9IE1hdGguYWJzKGFyZWEgLyAyKTtcbiAgICBwb2ludHMuZGlzdCA9IGRpc3Q7XG59XG5cbi8vIGNhbGN1bGF0ZSB0aGUgZmVhdHVyZSBib3VuZGluZyBib3ggZm9yIGZhc3RlciBjbGlwcGluZyBsYXRlclxuZnVuY3Rpb24gY2FsY0JCb3goZmVhdHVyZSkge1xuICAgIHZhciBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgIG1pbiA9IGZlYXR1cmUubWluLFxuICAgICAgICBtYXggPSBmZWF0dXJlLm1heDtcblxuICAgIGlmIChmZWF0dXJlLnR5cGUgPT09IDEpIGNhbGNSaW5nQkJveChtaW4sIG1heCwgZ2VvbWV0cnkpO1xuICAgIGVsc2UgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tZXRyeS5sZW5ndGg7IGkrKykgY2FsY1JpbmdCQm94KG1pbiwgbWF4LCBnZW9tZXRyeVtpXSk7XG5cbiAgICByZXR1cm4gZmVhdHVyZTtcbn1cblxuZnVuY3Rpb24gY2FsY1JpbmdCQm94KG1pbiwgbWF4LCBwb2ludHMpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgcDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwID0gcG9pbnRzW2ldO1xuICAgICAgICBtaW5bMF0gPSBNYXRoLm1pbihwWzBdLCBtaW5bMF0pO1xuICAgICAgICBtYXhbMF0gPSBNYXRoLm1heChwWzBdLCBtYXhbMF0pO1xuICAgICAgICBtaW5bMV0gPSBNYXRoLm1pbihwWzFdLCBtaW5bMV0pO1xuICAgICAgICBtYXhbMV0gPSBNYXRoLm1heChwWzFdLCBtYXhbMV0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBnZW9qc29udnQ7XG5cbnZhciBjb252ZXJ0ID0gcmVxdWlyZSgnLi9jb252ZXJ0JyksIC8vIEdlb0pTT04gY29udmVyc2lvbiBhbmQgcHJlcHJvY2Vzc2luZ1xuICAgIGNsaXAgPSByZXF1aXJlKCcuL2NsaXAnKSwgICAgICAgLy8gc3RyaXBlIGNsaXBwaW5nIGFsZ29yaXRobVxuICAgIHdyYXAgPSByZXF1aXJlKCcuL3dyYXAnKSwgICAgICAgLy8gZGF0ZSBsaW5lIHByb2Nlc3NpbmdcbiAgICBjcmVhdGVUaWxlID0gcmVxdWlyZSgnLi90aWxlJyk7IC8vIGZpbmFsIHNpbXBsaWZpZWQgdGlsZSBnZW5lcmF0aW9uXG5cblxuZnVuY3Rpb24gZ2VvanNvbnZ0KGRhdGEsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEdlb0pTT05WVChkYXRhLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gZXh0ZW5kKE9iamVjdC5jcmVhdGUodGhpcy5vcHRpb25zKSwgb3B0aW9ucyk7XG5cbiAgICB2YXIgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgaWYgKGRlYnVnKSBjb25zb2xlLnRpbWUoJ3ByZXByb2Nlc3MgZGF0YScpO1xuXG4gICAgdmFyIHoyID0gMSA8PCBvcHRpb25zLm1heFpvb20sIC8vIDJeelxuICAgICAgICBmZWF0dXJlcyA9IGNvbnZlcnQoZGF0YSwgb3B0aW9ucy50b2xlcmFuY2UgLyAoejIgKiBvcHRpb25zLmV4dGVudCkpO1xuXG4gICAgdGhpcy50aWxlcyA9IHt9O1xuICAgIHRoaXMudGlsZUNvb3JkcyA9IFtdO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgncHJlcHJvY2VzcyBkYXRhJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdpbmRleDogbWF4Wm9vbTogJWQsIG1heFBvaW50czogJWQnLCBvcHRpb25zLmluZGV4TWF4Wm9vbSwgb3B0aW9ucy5pbmRleE1heFBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZSgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgdGhpcy5zdGF0cyA9IHt9O1xuICAgICAgICB0aGlzLnRvdGFsID0gMDtcbiAgICB9XG5cbiAgICBmZWF0dXJlcyA9IHdyYXAoZmVhdHVyZXMsIG9wdGlvbnMuYnVmZmVyIC8gb3B0aW9ucy5leHRlbnQsIGludGVyc2VjdFgpO1xuXG4gICAgLy8gc3RhcnQgc2xpY2luZyBmcm9tIHRoZSB0b3AgdGlsZSBkb3duXG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgdGhpcy5zcGxpdFRpbGUoZmVhdHVyZXMsIDAsIDAsIDApO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIGNvbnNvbGUubG9nKCdmZWF0dXJlczogJWQsIHBvaW50czogJWQnLCB0aGlzLnRpbGVzWzBdLm51bUZlYXR1cmVzLCB0aGlzLnRpbGVzWzBdLm51bVBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3RpbGVzIGdlbmVyYXRlZDonLCB0aGlzLnRvdGFsLCBKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSk7XG4gICAgfVxufVxuXG5HZW9KU09OVlQucHJvdG90eXBlLm9wdGlvbnMgPSB7XG4gICAgbWF4Wm9vbTogMTQsICAgICAgICAgICAgLy8gbWF4IHpvb20gdG8gcHJlc2VydmUgZGV0YWlsIG9uXG4gICAgaW5kZXhNYXhab29tOiA1LCAgICAgICAgLy8gbWF4IHpvb20gaW4gdGhlIHRpbGUgaW5kZXhcbiAgICBpbmRleE1heFBvaW50czogMTAwMDAwLCAvLyBtYXggbnVtYmVyIG9mIHBvaW50cyBwZXIgdGlsZSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIHNvbGlkQ2hpbGRyZW46IGZhbHNlLCAgIC8vIHdoZXRoZXIgdG8gdGlsZSBzb2xpZCBzcXVhcmUgdGlsZXMgZnVydGhlclxuICAgIHRvbGVyYW5jZTogMywgICAgICAgICAgIC8vIHNpbXBsaWZpY2F0aW9uIHRvbGVyYW5jZSAoaGlnaGVyIG1lYW5zIHNpbXBsZXIpXG4gICAgZXh0ZW50OiA0MDk2LCAgICAgICAgICAgLy8gdGlsZSBleHRlbnRcbiAgICBidWZmZXI6IDY0LCAgICAgICAgICAgICAvLyB0aWxlIGJ1ZmZlciBvbiBlYWNoIHNpZGVcbiAgICBkZWJ1ZzogMCAgICAgICAgICAgICAgICAvLyBsb2dnaW5nIGxldmVsICgwLCAxIG9yIDIpXG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLnNwbGl0VGlsZSA9IGZ1bmN0aW9uIChmZWF0dXJlcywgeiwgeCwgeSwgY3osIGN4LCBjeSkge1xuXG4gICAgdmFyIHN0YWNrID0gW2ZlYXR1cmVzLCB6LCB4LCB5XSxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgLy8gYXZvaWQgcmVjdXJzaW9uIGJ5IHVzaW5nIGEgcHJvY2Vzc2luZyBxdWV1ZVxuICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgeSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB4ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHogPSBzdGFjay5wb3AoKTtcbiAgICAgICAgZmVhdHVyZXMgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICB2YXIgejIgPSAxIDw8IHosXG4gICAgICAgICAgICBpZCA9IHRvSUQoeiwgeCwgeSksXG4gICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1tpZF0sXG4gICAgICAgICAgICB0aWxlVG9sZXJhbmNlID0geiA9PT0gb3B0aW9ucy5tYXhab29tID8gMCA6IG9wdGlvbnMudG9sZXJhbmNlIC8gKHoyICogb3B0aW9ucy5leHRlbnQpO1xuXG4gICAgICAgIGlmICghdGlsZSkge1xuICAgICAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdjcmVhdGlvbicpO1xuXG4gICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1tpZF0gPSBjcmVhdGVUaWxlKGZlYXR1cmVzLCB6MiwgeCwgeSwgdGlsZVRvbGVyYW5jZSwgeiA9PT0gb3B0aW9ucy5tYXhab29tKTtcbiAgICAgICAgICAgIHRoaXMudGlsZUNvb3Jkcy5wdXNoKHt6OiB6LCB4OiB4LCB5OiB5fSk7XG5cbiAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RpbGUgeiVkLSVkLSVkIChmZWF0dXJlczogJWQsIHBvaW50czogJWQsIHNpbXBsaWZpZWQ6ICVkKScsXG4gICAgICAgICAgICAgICAgICAgICAgICB6LCB4LCB5LCB0aWxlLm51bUZlYXR1cmVzLCB0aWxlLm51bVBvaW50cywgdGlsZS5udW1TaW1wbGlmaWVkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lRW5kKCdjcmVhdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJ3onICsgejtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRzW2tleV0gPSAodGhpcy5zdGF0c1trZXldIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzYXZlIHJlZmVyZW5jZSB0byBvcmlnaW5hbCBnZW9tZXRyeSBpbiB0aWxlIHNvIHRoYXQgd2UgY2FuIGRyaWxsIGRvd24gbGF0ZXIgaWYgd2Ugc3RvcCBub3dcbiAgICAgICAgdGlsZS5zb3VyY2UgPSBmZWF0dXJlcztcblxuICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB0aGUgdGlsZSBpcyBzb2xpZCBjbGlwcGVkIHNxdWFyZVxuICAgICAgICBpZiAoIW9wdGlvbnMuc29saWRDaGlsZHJlbiAmJiBpc0NsaXBwZWRTcXVhcmUodGlsZSwgb3B0aW9ucy5leHRlbnQsIG9wdGlvbnMuYnVmZmVyKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gaWYgaXQncyB0aGUgZmlyc3QtcGFzcyB0aWxpbmdcbiAgICAgICAgaWYgKCFjeikge1xuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgd2UgcmVhY2hlZCBtYXggem9vbSwgb3IgaWYgdGhlIHRpbGUgaXMgdG9vIHNpbXBsZVxuICAgICAgICAgICAgaWYgKHogPT09IG9wdGlvbnMuaW5kZXhNYXhab29tIHx8IHRpbGUubnVtUG9pbnRzIDw9IG9wdGlvbnMuaW5kZXhNYXhQb2ludHMpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIGlmIGEgZHJpbGxkb3duIHRvIGEgc3BlY2lmaWMgdGlsZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgd2UgcmVhY2hlZCBiYXNlIHpvb20gb3Igb3VyIHRhcmdldCB0aWxlIHpvb21cbiAgICAgICAgICAgIGlmICh6ID09PSBvcHRpb25zLm1heFpvb20gfHwgeiA9PT0gY3opIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiBpdCdzIG5vdCBhbiBhbmNlc3RvciBvZiB0aGUgdGFyZ2V0IHRpbGVcbiAgICAgICAgICAgIHZhciBtID0gMSA8PCAoY3ogLSB6KTtcbiAgICAgICAgICAgIGlmICh4ICE9PSBNYXRoLmZsb29yKGN4IC8gbSkgfHwgeSAhPT0gTWF0aC5mbG9vcihjeSAvIG0pKSBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHdlIHNsaWNlIGZ1cnRoZXIgZG93biwgbm8gbmVlZCB0byBrZWVwIHNvdXJjZSBnZW9tZXRyeVxuICAgICAgICB0aWxlLnNvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdjbGlwcGluZycpO1xuXG4gICAgICAgIC8vIHZhbHVlcyB3ZSdsbCB1c2UgZm9yIGNsaXBwaW5nXG4gICAgICAgIHZhciBrMSA9IDAuNSAqIG9wdGlvbnMuYnVmZmVyIC8gb3B0aW9ucy5leHRlbnQsXG4gICAgICAgICAgICBrMiA9IDAuNSAtIGsxLFxuICAgICAgICAgICAgazMgPSAwLjUgKyBrMSxcbiAgICAgICAgICAgIGs0ID0gMSArIGsxLFxuICAgICAgICAgICAgdGwsIGJsLCB0ciwgYnIsIGxlZnQsIHJpZ2h0O1xuXG4gICAgICAgIHRsID0gYmwgPSB0ciA9IGJyID0gbnVsbDtcblxuICAgICAgICBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4IC0gazEsIHggKyBrMywgMCwgaW50ZXJzZWN0WCwgdGlsZS5taW5bMF0sIHRpbGUubWF4WzBdKTtcbiAgICAgICAgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCArIGsyLCB4ICsgazQsIDAsIGludGVyc2VjdFgsIHRpbGUubWluWzBdLCB0aWxlLm1heFswXSk7XG5cbiAgICAgICAgaWYgKGxlZnQpIHtcbiAgICAgICAgICAgIHRsID0gY2xpcChsZWZ0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgICAgICBibCA9IGNsaXAobGVmdCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgICB0ciA9IGNsaXAocmlnaHQsIHoyLCB5IC0gazEsIHkgKyBrMywgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgICAgIGJyID0gY2xpcChyaWdodCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lRW5kKCdjbGlwcGluZycpO1xuXG4gICAgICAgIGlmICh0bCkgc3RhY2sucHVzaCh0bCwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIpO1xuICAgICAgICBpZiAoYmwpIHN0YWNrLnB1c2goYmwsIHogKyAxLCB4ICogMiwgICAgIHkgKiAyICsgMSk7XG4gICAgICAgIGlmICh0cikgc3RhY2sucHVzaCh0ciwgeiArIDEsIHggKiAyICsgMSwgeSAqIDIpO1xuICAgICAgICBpZiAoYnIpIHN0YWNrLnB1c2goYnIsIHogKyAxLCB4ICogMiArIDEsIHkgKiAyICsgMSk7XG4gICAgfVxufTtcblxuR2VvSlNPTlZULnByb3RvdHlwZS5nZXRUaWxlID0gZnVuY3Rpb24gKHosIHgsIHkpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZXh0ZW50ID0gb3B0aW9ucy5leHRlbnQsXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIHZhciB6MiA9IDEgPDwgejtcbiAgICB4ID0gKCh4ICUgejIpICsgejIpICUgejI7IC8vIHdyYXAgdGlsZSB4IGNvb3JkaW5hdGVcblxuICAgIHZhciBpZCA9IHRvSUQoeiwgeCwgeSk7XG4gICAgaWYgKHRoaXMudGlsZXNbaWRdKSByZXR1cm4gdHJhbnNmb3JtVGlsZSh0aGlzLnRpbGVzW2lkXSwgZXh0ZW50KTtcblxuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUubG9nKCdkcmlsbGluZyBkb3duIHRvIHolZC0lZC0lZCcsIHosIHgsIHkpO1xuXG4gICAgdmFyIHowID0geixcbiAgICAgICAgeDAgPSB4LFxuICAgICAgICB5MCA9IHksXG4gICAgICAgIHBhcmVudDtcblxuICAgIHdoaWxlICghcGFyZW50ICYmIHowID4gMCkge1xuICAgICAgICB6MC0tO1xuICAgICAgICB4MCA9IE1hdGguZmxvb3IoeDAgLyAyKTtcbiAgICAgICAgeTAgPSBNYXRoLmZsb29yKHkwIC8gMik7XG4gICAgICAgIHBhcmVudCA9IHRoaXMudGlsZXNbdG9JRCh6MCwgeDAsIHkwKV07XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS5sb2coJ2ZvdW5kIHBhcmVudCB0aWxlIHolZC0lZC0lZCcsIHowLCB4MCwgeTApO1xuXG4gICAgLy8gaWYgd2UgZm91bmQgYSBwYXJlbnQgdGlsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBnZW9tZXRyeSwgd2UgY2FuIGRyaWxsIGRvd24gZnJvbSBpdFxuICAgIGlmIChwYXJlbnQuc291cmNlKSB7XG4gICAgICAgIGlmIChpc0NsaXBwZWRTcXVhcmUocGFyZW50LCBleHRlbnQsIG9wdGlvbnMuYnVmZmVyKSkgcmV0dXJuIHRyYW5zZm9ybVRpbGUocGFyZW50LCBleHRlbnQpO1xuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnZHJpbGxpbmcgZG93bicpO1xuICAgICAgICB0aGlzLnNwbGl0VGlsZShwYXJlbnQuc291cmNlLCB6MCwgeDAsIHkwLCB6LCB4LCB5KTtcbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lRW5kKCdkcmlsbGluZyBkb3duJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnRpbGVzW2lkXSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gdHJhbnNmb3JtVGlsZSh0aGlzLnRpbGVzW2lkXSwgZXh0ZW50KTtcbn07XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUodGlsZSwgZXh0ZW50KSB7XG4gICAgaWYgKHRpbGUudHJhbnNmb3JtZWQpIHJldHVybiB0aWxlO1xuXG4gICAgdmFyIHoyID0gdGlsZS56MixcbiAgICAgICAgdHggPSB0aWxlLngsXG4gICAgICAgIHR5ID0gdGlsZS55LFxuICAgICAgICBpLCBqLCBrO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRpbGUuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSB0aWxlLmZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2VvbS5sZW5ndGg7IGorKykgZ2VvbVtqXSA9IHRyYW5zZm9ybVBvaW50KGdlb21bal0sIGV4dGVudCwgejIsIHR4LCB0eSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJpbmcgPSBnZW9tW2pdO1xuICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCByaW5nLmxlbmd0aDsgaysrKSByaW5nW2tdID0gdHJhbnNmb3JtUG9pbnQocmluZ1trXSwgZXh0ZW50LCB6MiwgdHgsIHR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRpbGUudHJhbnNmb3JtZWQgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHRpbGU7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVBvaW50KHAsIGV4dGVudCwgejIsIHR4LCB0eSkge1xuICAgIHZhciB4ID0gTWF0aC5yb3VuZChleHRlbnQgKiAocFswXSAqIHoyIC0gdHgpKSxcbiAgICAgICAgeSA9IE1hdGgucm91bmQoZXh0ZW50ICogKHBbMV0gKiB6MiAtIHR5KSk7XG4gICAgcmV0dXJuIFt4LCB5XTtcbn1cblxuZnVuY3Rpb24gdG9JRCh6LCB4LCB5KSB7XG4gICAgcmV0dXJuICgoKDEgPDwgeikgKiB5ICsgeCkgKiAzMikgKyB6O1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3RYKGEsIGIsIHgpIHtcbiAgICByZXR1cm4gW3gsICh4IC0gYVswXSkgKiAoYlsxXSAtIGFbMV0pIC8gKGJbMF0gLSBhWzBdKSArIGFbMV0sIDFdO1xufVxuZnVuY3Rpb24gaW50ZXJzZWN0WShhLCBiLCB5KSB7XG4gICAgcmV0dXJuIFsoeSAtIGFbMV0pICogKGJbMF0gLSBhWzBdKSAvIChiWzFdIC0gYVsxXSkgKyBhWzBdLCB5LCAxXTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKGRlc3QsIHNyYykge1xuICAgIGZvciAodmFyIGkgaW4gc3JjKSBkZXN0W2ldID0gc3JjW2ldO1xuICAgIHJldHVybiBkZXN0O1xufVxuXG4vLyBjaGVja3Mgd2hldGhlciBhIHRpbGUgaXMgYSB3aG9sZS1hcmVhIGZpbGwgYWZ0ZXIgY2xpcHBpbmc7IGlmIGl0IGlzLCB0aGVyZSdzIG5vIHNlbnNlIHNsaWNpbmcgaXQgZnVydGhlclxuZnVuY3Rpb24gaXNDbGlwcGVkU3F1YXJlKHRpbGUsIGV4dGVudCwgYnVmZmVyKSB7XG5cbiAgICB2YXIgZmVhdHVyZXMgPSB0aWxlLnNvdXJjZTtcbiAgICBpZiAoZmVhdHVyZXMubGVuZ3RoICE9PSAxKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzWzBdO1xuICAgIGlmIChmZWF0dXJlLnR5cGUgIT09IDMgfHwgZmVhdHVyZS5nZW9tZXRyeS5sZW5ndGggPiAxKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgbGVuID0gZmVhdHVyZS5nZW9tZXRyeVswXS5sZW5ndGg7XG4gICAgaWYgKGxlbiAhPT0gNSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgcCA9IHRyYW5zZm9ybVBvaW50KGZlYXR1cmUuZ2VvbWV0cnlbMF1baV0sIGV4dGVudCwgdGlsZS56MiwgdGlsZS54LCB0aWxlLnkpO1xuICAgICAgICBpZiAoKHBbMF0gIT09IC1idWZmZXIgJiYgcFswXSAhPT0gZXh0ZW50ICsgYnVmZmVyKSB8fFxuICAgICAgICAgICAgKHBbMV0gIT09IC1idWZmZXIgJiYgcFsxXSAhPT0gZXh0ZW50ICsgYnVmZmVyKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNpbXBsaWZ5O1xuXG4vLyBjYWxjdWxhdGUgc2ltcGxpZmljYXRpb24gZGF0YSB1c2luZyBvcHRpbWl6ZWQgRG91Z2xhcy1QZXVja2VyIGFsZ29yaXRobVxuXG5mdW5jdGlvbiBzaW1wbGlmeShwb2ludHMsIHRvbGVyYW5jZSkge1xuXG4gICAgdmFyIHNxVG9sZXJhbmNlID0gdG9sZXJhbmNlICogdG9sZXJhbmNlLFxuICAgICAgICBsZW4gPSBwb2ludHMubGVuZ3RoLFxuICAgICAgICBmaXJzdCA9IDAsXG4gICAgICAgIGxhc3QgPSBsZW4gLSAxLFxuICAgICAgICBzdGFjayA9IFtdLFxuICAgICAgICBpLCBtYXhTcURpc3QsIHNxRGlzdCwgaW5kZXg7XG5cbiAgICAvLyBhbHdheXMgcmV0YWluIHRoZSBlbmRwb2ludHMgKDEgaXMgdGhlIG1heCB2YWx1ZSlcbiAgICBwb2ludHNbZmlyc3RdWzJdID0gMTtcbiAgICBwb2ludHNbbGFzdF1bMl0gPSAxO1xuXG4gICAgLy8gYXZvaWQgcmVjdXJzaW9uIGJ5IHVzaW5nIGEgc3RhY2tcbiAgICB3aGlsZSAobGFzdCkge1xuXG4gICAgICAgIG1heFNxRGlzdCA9IDA7XG5cbiAgICAgICAgZm9yIChpID0gZmlyc3QgKyAxOyBpIDwgbGFzdDsgaSsrKSB7XG4gICAgICAgICAgICBzcURpc3QgPSBnZXRTcVNlZ0Rpc3QocG9pbnRzW2ldLCBwb2ludHNbZmlyc3RdLCBwb2ludHNbbGFzdF0pO1xuXG4gICAgICAgICAgICBpZiAoc3FEaXN0ID4gbWF4U3FEaXN0KSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIG1heFNxRGlzdCA9IHNxRGlzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXhTcURpc3QgPiBzcVRvbGVyYW5jZSkge1xuICAgICAgICAgICAgcG9pbnRzW2luZGV4XVsyXSA9IG1heFNxRGlzdDsgLy8gc2F2ZSB0aGUgcG9pbnQgaW1wb3J0YW5jZSBpbiBzcXVhcmVkIHBpeGVscyBhcyBhIHogY29vcmRpbmF0ZVxuICAgICAgICAgICAgc3RhY2sucHVzaChmaXJzdCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGluZGV4KTtcbiAgICAgICAgICAgIGZpcnN0ID0gaW5kZXg7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhc3QgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGZpcnN0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIHNxdWFyZSBkaXN0YW5jZSBmcm9tIGEgcG9pbnQgdG8gYSBzZWdtZW50XG5mdW5jdGlvbiBnZXRTcVNlZ0Rpc3QocCwgYSwgYikge1xuXG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSxcbiAgICAgICAgYnggPSBiWzBdLCBieSA9IGJbMV0sXG4gICAgICAgIHB4ID0gcFswXSwgcHkgPSBwWzFdLFxuICAgICAgICBkeCA9IGJ4IC0geCxcbiAgICAgICAgZHkgPSBieSAtIHk7XG5cbiAgICBpZiAoZHggIT09IDAgfHwgZHkgIT09IDApIHtcblxuICAgICAgICB2YXIgdCA9ICgocHggLSB4KSAqIGR4ICsgKHB5IC0geSkgKiBkeSkgLyAoZHggKiBkeCArIGR5ICogZHkpO1xuXG4gICAgICAgIGlmICh0ID4gMSkge1xuICAgICAgICAgICAgeCA9IGJ4O1xuICAgICAgICAgICAgeSA9IGJ5O1xuXG4gICAgICAgIH0gZWxzZSBpZiAodCA+IDApIHtcbiAgICAgICAgICAgIHggKz0gZHggKiB0O1xuICAgICAgICAgICAgeSArPSBkeSAqIHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkeCA9IHB4IC0geDtcbiAgICBkeSA9IHB5IC0geTtcblxuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVUaWxlO1xuXG5mdW5jdGlvbiBjcmVhdGVUaWxlKGZlYXR1cmVzLCB6MiwgdHgsIHR5LCB0b2xlcmFuY2UsIG5vU2ltcGxpZnkpIHtcbiAgICB2YXIgdGlsZSA9IHtcbiAgICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgICBudW1Qb2ludHM6IDAsXG4gICAgICAgIG51bVNpbXBsaWZpZWQ6IDAsXG4gICAgICAgIG51bUZlYXR1cmVzOiAwLFxuICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgIHg6IHR4LFxuICAgICAgICB5OiB0eSxcbiAgICAgICAgejI6IHoyLFxuICAgICAgICB0cmFuc2Zvcm1lZDogZmFsc2UsXG4gICAgICAgIG1pbjogWzIsIDFdLFxuICAgICAgICBtYXg6IFstMSwgMF1cbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGlsZS5udW1GZWF0dXJlcysrO1xuICAgICAgICBhZGRGZWF0dXJlKHRpbGUsIGZlYXR1cmVzW2ldLCB0b2xlcmFuY2UsIG5vU2ltcGxpZnkpO1xuXG4gICAgICAgIHZhciBtaW4gPSBmZWF0dXJlc1tpXS5taW4sXG4gICAgICAgICAgICBtYXggPSBmZWF0dXJlc1tpXS5tYXg7XG5cbiAgICAgICAgaWYgKG1pblswXSA8IHRpbGUubWluWzBdKSB0aWxlLm1pblswXSA9IG1pblswXTtcbiAgICAgICAgaWYgKG1pblsxXSA8IHRpbGUubWluWzFdKSB0aWxlLm1pblsxXSA9IG1pblsxXTtcbiAgICAgICAgaWYgKG1heFswXSA+IHRpbGUubWF4WzBdKSB0aWxlLm1heFswXSA9IG1heFswXTtcbiAgICAgICAgaWYgKG1heFsxXSA+IHRpbGUubWF4WzFdKSB0aWxlLm1heFsxXSA9IG1heFsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHRpbGU7XG59XG5cbmZ1bmN0aW9uIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KSB7XG5cbiAgICB2YXIgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGUsXG4gICAgICAgIHNpbXBsaWZpZWQgPSBbXSxcbiAgICAgICAgc3FUb2xlcmFuY2UgPSB0b2xlcmFuY2UgKiB0b2xlcmFuY2UsXG4gICAgICAgIGksIGosIHJpbmcsIHA7XG5cbiAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKGdlb21baV0pO1xuICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMrKztcbiAgICAgICAgICAgIHRpbGUubnVtU2ltcGxpZmllZCsrO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2Uge1xuXG4gICAgICAgIC8vIHNpbXBsaWZ5IGFuZCB0cmFuc2Zvcm0gcHJvamVjdGVkIGNvb3JkaW5hdGVzIGZvciB0aWxlIGdlb21ldHJ5XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByaW5nID0gZ2VvbVtpXTtcblxuICAgICAgICAgICAgLy8gZmlsdGVyIG91dCB0aW55IHBvbHlsaW5lcyAmIHBvbHlnb25zXG4gICAgICAgICAgICBpZiAoIW5vU2ltcGxpZnkgJiYgKCh0eXBlID09PSAyICYmIHJpbmcuZGlzdCA8IHRvbGVyYW5jZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT09IDMgJiYgcmluZy5hcmVhIDwgc3FUb2xlcmFuY2UpKSkge1xuICAgICAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzICs9IHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc2ltcGxpZmllZFJpbmcgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBwID0gcmluZ1tqXTtcbiAgICAgICAgICAgICAgICAvLyBrZWVwIHBvaW50cyB3aXRoIGltcG9ydGFuY2UgPiB0b2xlcmFuY2VcbiAgICAgICAgICAgICAgICBpZiAobm9TaW1wbGlmeSB8fCBwWzJdID4gc3FUb2xlcmFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc2ltcGxpZmllZFJpbmcucHVzaChwKTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5udW1TaW1wbGlmaWVkKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNpbXBsaWZpZWQucHVzaChzaW1wbGlmaWVkUmluZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2ltcGxpZmllZC5sZW5ndGgpIHtcbiAgICAgICAgdGlsZS5mZWF0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiBzaW1wbGlmaWVkLFxuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIHRhZ3M6IGZlYXR1cmUudGFncyB8fCBudWxsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNsaXAgPSByZXF1aXJlKCcuL2NsaXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB3cmFwO1xuXG5mdW5jdGlvbiB3cmFwKGZlYXR1cmVzLCBidWZmZXIsIGludGVyc2VjdFgpIHtcbiAgICB2YXIgbWVyZ2VkID0gZmVhdHVyZXMsXG4gICAgICAgIGxlZnQgID0gY2xpcChmZWF0dXJlcywgMSwgLTEgLSBidWZmZXIsIGJ1ZmZlciwgICAgIDAsIGludGVyc2VjdFgsIC0xLCAyKSwgLy8gbGVmdCB3b3JsZCBjb3B5XG4gICAgICAgIHJpZ2h0ID0gY2xpcChmZWF0dXJlcywgMSwgIDEgLSBidWZmZXIsIDIgKyBidWZmZXIsIDAsIGludGVyc2VjdFgsIC0xLCAyKTsgLy8gcmlnaHQgd29ybGQgY29weVxuXG4gICAgaWYgKGxlZnQgfHwgcmlnaHQpIHtcbiAgICAgICAgbWVyZ2VkID0gY2xpcChmZWF0dXJlcywgMSwgLWJ1ZmZlciwgMSArIGJ1ZmZlciwgMCwgaW50ZXJzZWN0WCwgLTEsIDIpOyAvLyBjZW50ZXIgd29ybGQgY29weVxuXG4gICAgICAgIGlmIChsZWZ0KSBtZXJnZWQgPSBzaGlmdEZlYXR1cmVDb29yZHMobGVmdCwgMSkuY29uY2F0KG1lcmdlZCk7IC8vIG1lcmdlIGxlZnQgaW50byBjZW50ZXJcbiAgICAgICAgaWYgKHJpZ2h0KSBtZXJnZWQgPSBtZXJnZWQuY29uY2F0KHNoaWZ0RmVhdHVyZUNvb3JkcyhyaWdodCwgLTEpKTsgLy8gbWVyZ2UgcmlnaHQgaW50byBjZW50ZXJcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBzaGlmdEZlYXR1cmVDb29yZHMoZmVhdHVyZXMsIG9mZnNldCkge1xuICAgIHZhciBuZXdGZWF0dXJlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICB2YXIgbmV3R2VvbWV0cnk7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIG5ld0dlb21ldHJ5ID0gc2hpZnRDb29yZHMoZmVhdHVyZS5nZW9tZXRyeSwgb2Zmc2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0dlb21ldHJ5ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZlYXR1cmUuZ2VvbWV0cnkubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeS5wdXNoKHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnlbal0sIG9mZnNldCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbmV3RmVhdHVyZXMucHVzaCh7XG4gICAgICAgICAgICBnZW9tZXRyeTogbmV3R2VvbWV0cnksXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgdGFnczogZmVhdHVyZS50YWdzLFxuICAgICAgICAgICAgbWluOiBbZmVhdHVyZS5taW5bMF0gKyBvZmZzZXQsIGZlYXR1cmUubWluWzFdXSxcbiAgICAgICAgICAgIG1heDogW2ZlYXR1cmUubWF4WzBdICsgb2Zmc2V0LCBmZWF0dXJlLm1heFsxXV1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBzaGlmdENvb3Jkcyhwb2ludHMsIG9mZnNldCkge1xuICAgIHZhciBuZXdQb2ludHMgPSBbXTtcbiAgICBuZXdQb2ludHMuYXJlYSA9IHBvaW50cy5hcmVhO1xuICAgIG5ld1BvaW50cy5kaXN0ID0gcG9pbnRzLmRpc3Q7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBuZXdQb2ludHMucHVzaChbcG9pbnRzW2ldWzBdICsgb2Zmc2V0LCBwb2ludHNbaV1bMV0sIHBvaW50c1tpXVsyXV0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UG9pbnRzO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBpbnZlcnRcblxuLyoqXG4gKiBJbnZlcnRzIGEgbWF0M1xuICpcbiAqIEBhbGlhcyBtYXQzLmludmVydFxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5mdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdXG4gIHZhciBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdXG4gIHZhciBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdXG5cbiAgdmFyIGIwMSA9IGEyMiAqIGExMSAtIGExMiAqIGEyMVxuICB2YXIgYjExID0gLWEyMiAqIGExMCArIGExMiAqIGEyMFxuICB2YXIgYjIxID0gYTIxICogYTEwIC0gYTExICogYTIwXG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICB2YXIgZGV0ID0gYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxXG5cbiAgaWYgKCFkZXQpIHJldHVybiBudWxsXG4gIGRldCA9IDEuMCAvIGRldFxuXG4gIG91dFswXSA9IGIwMSAqIGRldFxuICBvdXRbMV0gPSAoLWEyMiAqIGEwMSArIGEwMiAqIGEyMSkgKiBkZXRcbiAgb3V0WzJdID0gKGExMiAqIGEwMSAtIGEwMiAqIGExMSkgKiBkZXRcbiAgb3V0WzNdID0gYjExICogZGV0XG4gIG91dFs0XSA9IChhMjIgKiBhMDAgLSBhMDIgKiBhMjApICogZGV0XG4gIG91dFs1XSA9ICgtYTEyICogYTAwICsgYTAyICogYTEwKSAqIGRldFxuICBvdXRbNl0gPSBiMjEgKiBkZXRcbiAgb3V0WzddID0gKC1hMjEgKiBhMDAgKyBhMDEgKiBhMjApICogZGV0XG4gIG91dFs4XSA9IChhMTEgKiBhMDAgLSBhMDEgKiBhMTApICogZGV0XG5cbiAgcmV0dXJuIG91dFxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBub3JtYWxGcm9tTWF0NFxuXG4vKipcbiogQ2FsY3VsYXRlcyBhIDN4MyBub3JtYWwgbWF0cml4ICh0cmFuc3Bvc2UgaW52ZXJzZSkgZnJvbSB0aGUgNHg0IG1hdHJpeFxuKlxuKiBAYWxpYXMgbWF0My5ub3JtYWxGcm9tTWF0NFxuKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4qIEBwYXJhbSB7bWF0NH0gYSBNYXQ0IHRvIGRlcml2ZSB0aGUgbm9ybWFsIG1hdHJpeCBmcm9tXG4qXG4qIEByZXR1cm5zIHttYXQzfSBvdXRcbiovXG5mdW5jdGlvbiBub3JtYWxGcm9tTWF0NChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM11cbiAgdmFyIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN11cbiAgdmFyIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXVxuICB2YXIgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV1cblxuICB2YXIgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwXG4gIHZhciBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTBcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMFxuICB2YXIgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExXG4gIHZhciBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTFcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMlxuICB2YXIgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwXG4gIHZhciBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzBcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMFxuICB2YXIgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxXG4gIHZhciBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzFcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMlxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgdmFyIGRldCA9IGIwMCAqIGIxMVxuICAgICAgICAgIC0gYjAxICogYjEwXG4gICAgICAgICAgKyBiMDIgKiBiMDlcbiAgICAgICAgICArIGIwMyAqIGIwOFxuICAgICAgICAgIC0gYjA0ICogYjA3XG4gICAgICAgICAgKyBiMDUgKiBiMDZcblxuICBpZiAoIWRldCkgcmV0dXJuIG51bGxcbiAgZGV0ID0gMS4wIC8gZGV0XG5cbiAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXRcbiAgb3V0WzFdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXRcbiAgb3V0WzJdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXRcblxuICBvdXRbM10gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldFxuICBvdXRbNF0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldFxuICBvdXRbNV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldFxuXG4gIG91dFs2XSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0XG4gIG91dFs3XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0XG4gIG91dFs4XSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0XG5cbiAgcmV0dXJuIG91dFxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBjb3B5O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQ0IHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgb3V0WzldID0gYVs5XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuXG4vKipcbiAqIFNldCBhIG1hdDQgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAxO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IDE7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07IiwidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvb2tBdDtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBsb29rLWF0IG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBleWUgcG9zaXRpb24sIGZvY2FsIHBvaW50LCBhbmQgdXAgYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7dmVjM30gZXllIFBvc2l0aW9uIG9mIHRoZSB2aWV3ZXJcbiAqIEBwYXJhbSB7dmVjM30gY2VudGVyIFBvaW50IHRoZSB2aWV3ZXIgaXMgbG9va2luZyBhdFxuICogQHBhcmFtIHt2ZWMzfSB1cCB2ZWMzIHBvaW50aW5nIHVwXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIGxvb2tBdChvdXQsIGV5ZSwgY2VudGVyLCB1cCkge1xuICAgIHZhciB4MCwgeDEsIHgyLCB5MCwgeTEsIHkyLCB6MCwgejEsIHoyLCBsZW4sXG4gICAgICAgIGV5ZXggPSBleWVbMF0sXG4gICAgICAgIGV5ZXkgPSBleWVbMV0sXG4gICAgICAgIGV5ZXogPSBleWVbMl0sXG4gICAgICAgIHVweCA9IHVwWzBdLFxuICAgICAgICB1cHkgPSB1cFsxXSxcbiAgICAgICAgdXB6ID0gdXBbMl0sXG4gICAgICAgIGNlbnRlcnggPSBjZW50ZXJbMF0sXG4gICAgICAgIGNlbnRlcnkgPSBjZW50ZXJbMV0sXG4gICAgICAgIGNlbnRlcnogPSBjZW50ZXJbMl07XG5cbiAgICBpZiAoTWF0aC5hYnMoZXlleCAtIGNlbnRlcngpIDwgMC4wMDAwMDEgJiZcbiAgICAgICAgTWF0aC5hYnMoZXlleSAtIGNlbnRlcnkpIDwgMC4wMDAwMDEgJiZcbiAgICAgICAgTWF0aC5hYnMoZXlleiAtIGNlbnRlcnopIDwgMC4wMDAwMDEpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KG91dCk7XG4gICAgfVxuXG4gICAgejAgPSBleWV4IC0gY2VudGVyeDtcbiAgICB6MSA9IGV5ZXkgLSBjZW50ZXJ5O1xuICAgIHoyID0gZXlleiAtIGNlbnRlcno7XG5cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KHowICogejAgKyB6MSAqIHoxICsgejIgKiB6Mik7XG4gICAgejAgKj0gbGVuO1xuICAgIHoxICo9IGxlbjtcbiAgICB6MiAqPSBsZW47XG5cbiAgICB4MCA9IHVweSAqIHoyIC0gdXB6ICogejE7XG4gICAgeDEgPSB1cHogKiB6MCAtIHVweCAqIHoyO1xuICAgIHgyID0gdXB4ICogejEgLSB1cHkgKiB6MDtcbiAgICBsZW4gPSBNYXRoLnNxcnQoeDAgKiB4MCArIHgxICogeDEgKyB4MiAqIHgyKTtcbiAgICBpZiAoIWxlbikge1xuICAgICAgICB4MCA9IDA7XG4gICAgICAgIHgxID0gMDtcbiAgICAgICAgeDIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxlbiA9IDEgLyBsZW47XG4gICAgICAgIHgwICo9IGxlbjtcbiAgICAgICAgeDEgKj0gbGVuO1xuICAgICAgICB4MiAqPSBsZW47XG4gICAgfVxuXG4gICAgeTAgPSB6MSAqIHgyIC0gejIgKiB4MTtcbiAgICB5MSA9IHoyICogeDAgLSB6MCAqIHgyO1xuICAgIHkyID0gejAgKiB4MSAtIHoxICogeDA7XG5cbiAgICBsZW4gPSBNYXRoLnNxcnQoeTAgKiB5MCArIHkxICogeTEgKyB5MiAqIHkyKTtcbiAgICBpZiAoIWxlbikge1xuICAgICAgICB5MCA9IDA7XG4gICAgICAgIHkxID0gMDtcbiAgICAgICAgeTIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxlbiA9IDEgLyBsZW47XG4gICAgICAgIHkwICo9IGxlbjtcbiAgICAgICAgeTEgKj0gbGVuO1xuICAgICAgICB5MiAqPSBsZW47XG4gICAgfVxuXG4gICAgb3V0WzBdID0geDA7XG4gICAgb3V0WzFdID0geTA7XG4gICAgb3V0WzJdID0gejA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSB4MTtcbiAgICBvdXRbNV0gPSB5MTtcbiAgICBvdXRbNl0gPSB6MTtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IHgyO1xuICAgIG91dFs5XSA9IHkyO1xuICAgIG91dFsxMF0gPSB6MjtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gLSh4MCAqIGV5ZXggKyB4MSAqIGV5ZXkgKyB4MiAqIGV5ZXopO1xuICAgIG91dFsxM10gPSAtKHkwICogZXlleCArIHkxICogZXlleSArIHkyICogZXlleik7XG4gICAgb3V0WzE0XSA9IC0oejAgKiBleWV4ICsgejEgKiBleWV5ICsgejIgKiBleWV6KTtcbiAgICBvdXRbMTVdID0gMTtcblxuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gbXVsdGlwbHk7XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0NCdzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXSxcbiAgICAgICAgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdLFxuICAgICAgICBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XTtcblxuICAgIC8vIENhY2hlIG9ubHkgdGhlIGN1cnJlbnQgbGluZSBvZiB0aGUgc2Vjb25kIG1hdHJpeFxuICAgIHZhciBiMCAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdOyAgXG4gICAgb3V0WzBdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFsxXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMl0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzNdID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzRdOyBiMSA9IGJbNV07IGIyID0gYls2XTsgYjMgPSBiWzddO1xuICAgIG91dFs0XSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDtcbiAgICBvdXRbNV0gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjEgKyBiMyphMzE7XG4gICAgb3V0WzZdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFs3XSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcblxuICAgIGIwID0gYls4XTsgYjEgPSBiWzldOyBiMiA9IGJbMTBdOyBiMyA9IGJbMTFdO1xuICAgIG91dFs4XSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDtcbiAgICBvdXRbOV0gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjEgKyBiMyphMzE7XG4gICAgb3V0WzEwXSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbMTFdID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzEyXTsgYjEgPSBiWzEzXTsgYjIgPSBiWzE0XTsgYjMgPSBiWzE1XTtcbiAgICBvdXRbMTJdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFsxM10gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjEgKyBiMyphMzE7XG4gICAgb3V0WzE0XSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbMTVdID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcGVyc3BlY3RpdmU7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IEFzcGVjdCByYXRpby4gdHlwaWNhbGx5IHZpZXdwb3J0IHdpZHRoL2hlaWdodFxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gcGVyc3BlY3RpdmUob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICAgIHZhciBmID0gMS4wIC8gTWF0aC50YW4oZm92eSAvIDIpLFxuICAgICAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzBdID0gZiAvIGFzcGVjdDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IGY7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzExXSA9IC0xO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAoMiAqIGZhciAqIG5lYXIpICogbmY7XG4gICAgb3V0WzE1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBzY2FsZTtcblxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcbiAqIEBwYXJhbSB7dmVjM30gdiB0aGUgdmVjMyB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKiovXG5mdW5jdGlvbiBzY2FsZShvdXQsIGEsIHYpIHtcbiAgICB2YXIgeCA9IHZbMF0sIHkgPSB2WzFdLCB6ID0gdlsyXTtcblxuICAgIG91dFswXSA9IGFbMF0gKiB4O1xuICAgIG91dFsxXSA9IGFbMV0gKiB4O1xuICAgIG91dFsyXSA9IGFbMl0gKiB4O1xuICAgIG91dFszXSA9IGFbM10gKiB4O1xuICAgIG91dFs0XSA9IGFbNF0gKiB5O1xuICAgIG91dFs1XSA9IGFbNV0gKiB5O1xuICAgIG91dFs2XSA9IGFbNl0gKiB5O1xuICAgIG91dFs3XSA9IGFbN10gKiB5O1xuICAgIG91dFs4XSA9IGFbOF0gKiB6O1xuICAgIG91dFs5XSA9IGFbOV0gKiB6O1xuICAgIG91dFsxMF0gPSBhWzEwXSAqIHo7XG4gICAgb3V0WzExXSA9IGFbMTFdICogejtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB0cmFuc2xhdGU7XG5cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0NCBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMzfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV0sIHogPSB2WzJdLFxuICAgICAgICBhMDAsIGEwMSwgYTAyLCBhMDMsXG4gICAgICAgIGExMCwgYTExLCBhMTIsIGExMyxcbiAgICAgICAgYTIwLCBhMjEsIGEyMiwgYTIzO1xuXG4gICAgaWYgKGEgPT09IG91dCkge1xuICAgICAgICBvdXRbMTJdID0gYVswXSAqIHggKyBhWzRdICogeSArIGFbOF0gKiB6ICsgYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzFdICogeCArIGFbNV0gKiB5ICsgYVs5XSAqIHogKyBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMl0gKiB4ICsgYVs2XSAqIHkgKyBhWzEwXSAqIHogKyBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGFbM10gKiB4ICsgYVs3XSAqIHkgKyBhWzExXSAqIHogKyBhWzE1XTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhMDAgPSBhWzBdOyBhMDEgPSBhWzFdOyBhMDIgPSBhWzJdOyBhMDMgPSBhWzNdO1xuICAgICAgICBhMTAgPSBhWzRdOyBhMTEgPSBhWzVdOyBhMTIgPSBhWzZdOyBhMTMgPSBhWzddO1xuICAgICAgICBhMjAgPSBhWzhdOyBhMjEgPSBhWzldOyBhMjIgPSBhWzEwXTsgYTIzID0gYVsxMV07XG5cbiAgICAgICAgb3V0WzBdID0gYTAwOyBvdXRbMV0gPSBhMDE7IG91dFsyXSA9IGEwMjsgb3V0WzNdID0gYTAzO1xuICAgICAgICBvdXRbNF0gPSBhMTA7IG91dFs1XSA9IGExMTsgb3V0WzZdID0gYTEyOyBvdXRbN10gPSBhMTM7XG4gICAgICAgIG91dFs4XSA9IGEyMDsgb3V0WzldID0gYTIxOyBvdXRbMTBdID0gYTIyOyBvdXRbMTFdID0gYTIzO1xuXG4gICAgICAgIG91dFsxMl0gPSBhMDAgKiB4ICsgYTEwICogeSArIGEyMCAqIHogKyBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGEwMSAqIHggKyBhMTEgKiB5ICsgYTIxICogeiArIGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYTAyICogeCArIGExMiAqIHkgKyBhMjIgKiB6ICsgYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhMDMgKiB4ICsgYTEzICogeSArIGEyMyAqIHogKyBhWzE1XTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHBhcnNlRXJyb3JzXG5cbmZ1bmN0aW9uIHBhcnNlRXJyb3JzKGxvZykge1xuICBsb2cgPSBTdHJpbmcobG9nKVxuXG4gIHZhciBsb2dzID0gW11cbiAgdmFyIHJlc3VsdFxuXG4gIHdoaWxlIChyZXN1bHQgPSBsb2cubWF0Y2goL0VSUk9SXFw6KFteXFxuXSspLykpIHtcbiAgICBsb2cgPSBsb2cuc2xpY2UocmVzdWx0LmluZGV4ICsgMSlcblxuICAgIHZhciBsaW5lID0gcmVzdWx0WzFdLnRyaW0oKVxuICAgIHZhciBzZXBzID0gbGluZS5zcGxpdCgnOicpXG4gICAgdmFyIGVtc2cgPSBzZXBzLnNsaWNlKDIpLmpvaW4oJzonKS50cmltKClcbiAgICB2YXIgZmlsZSA9IHBhcnNlSW50KHNlcHNbMF0sIDEwKVxuICAgIHZhciBsaW5lID0gcGFyc2VJbnQoc2Vwc1sxXSwgMTApXG5cbiAgICBsb2dzLnB1c2goe1xuICAgICAgICBtZXNzYWdlOiBlbXNnXG4gICAgICAsIGZpbGU6IGZpbGVcbiAgICAgICwgbGluZTogbGluZVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gbG9nc1xufVxuIiwiZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIi8qIVxuICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlclxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKGlzQnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikgfHwgISFvYmouX2lzQnVmZmVyKVxufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiAhIW9iai5jb25zdHJ1Y3RvciAmJiB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopXG59XG5cbi8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuXG5mdW5jdGlvbiBpc1Nsb3dCdWZmZXIgKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnNsaWNlID09PSAnZnVuY3Rpb24nICYmIGlzQnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB5YW1sID0gcmVxdWlyZSgnLi9saWIvanMteWFtbC5qcycpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0geWFtbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbG9hZGVyID0gcmVxdWlyZSgnLi9qcy15YW1sL2xvYWRlcicpO1xuLy8gdmFyIGR1bXBlciA9IHJlcXVpcmUoJy4vanMteWFtbC9kdW1wZXInKTtcblxuXG5mdW5jdGlvbiBkZXByZWNhdGVkKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uICcgKyBuYW1lICsgJyBpcyBkZXByZWNhdGVkIGFuZCBjYW5ub3QgYmUgdXNlZC4nKTtcbiAgfTtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cy5UeXBlICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3R5cGUnKTtcbm1vZHVsZS5leHBvcnRzLlNjaGVtYSAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hJyk7XG5tb2R1bGUuZXhwb3J0cy5GQUlMU0FGRV9TQ0hFTUEgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuSlNPTl9TQ0hFTUEgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvanNvbicpO1xubW9kdWxlLmV4cG9ydHMuQ09SRV9TQ0hFTUEgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvY29yZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5ERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcbm1vZHVsZS5leHBvcnRzLmxvYWQgICAgICAgICAgICAgICAgPSBsb2FkZXIubG9hZDtcbm1vZHVsZS5leHBvcnRzLmxvYWRBbGwgICAgICAgICAgICAgPSBsb2FkZXIubG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkICAgICAgICAgICAgPSBsb2FkZXIuc2FmZUxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZEFsbCAgICAgICAgID0gbG9hZGVyLnNhZmVMb2FkQWxsO1xuLy8gbW9kdWxlLmV4cG9ydHMuZHVtcCAgICAgICAgICAgICAgICA9IGR1bXBlci5kdW1wO1xuLy8gbW9kdWxlLmV4cG9ydHMuc2FmZUR1bXAgICAgICAgICAgICA9IGR1bXBlci5zYWZlRHVtcDtcbm1vZHVsZS5leHBvcnRzLllBTUxFeGNlcHRpb24gICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvZXhjZXB0aW9uJyk7XG5cbi8vIERlcHJlY2F0ZWQgc2NoZW1hIG5hbWVzIGZyb20gSlMtWUFNTCAyLjAueFxubW9kdWxlLmV4cG9ydHMuTUlOSU1BTF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5TQUZFX1NDSEVNQSAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5ERUZBVUxUX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5cbi8vIERlcHJlY2F0ZWQgZnVuY3Rpb25zIGZyb20gSlMtWUFNTCAxLngueFxubW9kdWxlLmV4cG9ydHMuc2NhbiAgICAgICAgICAgPSBkZXByZWNhdGVkKCdzY2FuJyk7XG5tb2R1bGUuZXhwb3J0cy5wYXJzZSAgICAgICAgICA9IGRlcHJlY2F0ZWQoJ3BhcnNlJyk7XG5tb2R1bGUuZXhwb3J0cy5jb21wb3NlICAgICAgICA9IGRlcHJlY2F0ZWQoJ2NvbXBvc2UnKTtcbm1vZHVsZS5leHBvcnRzLmFkZENvbnN0cnVjdG9yID0gZGVwcmVjYXRlZCgnYWRkQ29uc3RydWN0b3InKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5mdW5jdGlvbiBpc05vdGhpbmcoc3ViamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBzdWJqZWN0ID09PSAndW5kZWZpbmVkJykgfHwgKHN1YmplY3QgPT09IG51bGwpO1xufVxuXG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHN1YmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygc3ViamVjdCA9PT0gJ29iamVjdCcpICYmIChzdWJqZWN0ICE9PSBudWxsKTtcbn1cblxuXG5mdW5jdGlvbiB0b0FycmF5KHNlcXVlbmNlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHNlcXVlbmNlKSkgcmV0dXJuIHNlcXVlbmNlO1xuICBlbHNlIGlmIChpc05vdGhpbmcoc2VxdWVuY2UpKSByZXR1cm4gW107XG5cbiAgcmV0dXJuIFsgc2VxdWVuY2UgXTtcbn1cblxuXG5mdW5jdGlvbiBleHRlbmQodGFyZ2V0LCBzb3VyY2UpIHtcbiAgdmFyIGluZGV4LCBsZW5ndGgsIGtleSwgc291cmNlS2V5cztcblxuICBpZiAoc291cmNlKSB7XG4gICAgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cbiAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gc291cmNlS2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBrZXkgPSBzb3VyY2VLZXlzW2luZGV4XTtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuXG5mdW5jdGlvbiByZXBlYXQoc3RyaW5nLCBjb3VudCkge1xuICB2YXIgcmVzdWx0ID0gJycsIGN5Y2xlO1xuXG4gIGZvciAoY3ljbGUgPSAwOyBjeWNsZSA8IGNvdW50OyBjeWNsZSArPSAxKSB7XG4gICAgcmVzdWx0ICs9IHN0cmluZztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuZnVuY3Rpb24gaXNOZWdhdGl2ZVplcm8obnVtYmVyKSB7XG4gIHJldHVybiAobnVtYmVyID09PSAwKSAmJiAoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZID09PSAxIC8gbnVtYmVyKTtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cy5pc05vdGhpbmcgICAgICA9IGlzTm90aGluZztcbm1vZHVsZS5leHBvcnRzLmlzT2JqZWN0ICAgICAgID0gaXNPYmplY3Q7XG5tb2R1bGUuZXhwb3J0cy50b0FycmF5ICAgICAgICA9IHRvQXJyYXk7XG5tb2R1bGUuZXhwb3J0cy5yZXBlYXQgICAgICAgICA9IHJlcGVhdDtcbm1vZHVsZS5leHBvcnRzLmlzTmVnYXRpdmVaZXJvID0gaXNOZWdhdGl2ZVplcm87XG5tb2R1bGUuZXhwb3J0cy5leHRlbmQgICAgICAgICA9IGV4dGVuZDtcbiIsIi8vIFlBTUwgZXJyb3IgY2xhc3MuIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvODQ1ODk4NFxuLy9cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gWUFNTEV4Y2VwdGlvbihyZWFzb24sIG1hcmspIHtcbiAgLy8gU3VwZXIgY29uc3RydWN0b3JcbiAgRXJyb3IuY2FsbCh0aGlzKTtcblxuICAvLyBJbmNsdWRlIHN0YWNrIHRyYWNlIGluIGVycm9yIG9iamVjdFxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAvLyBDaHJvbWUgYW5kIE5vZGVKU1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9IGVsc2Uge1xuICAgIC8vIEZGLCBJRSAxMCsgYW5kIFNhZmFyaSA2Ky4gRmFsbGJhY2sgZm9yIG90aGVyc1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrIHx8ICcnO1xuICB9XG5cbiAgdGhpcy5uYW1lID0gJ1lBTUxFeGNlcHRpb24nO1xuICB0aGlzLnJlYXNvbiA9IHJlYXNvbjtcbiAgdGhpcy5tYXJrID0gbWFyaztcbiAgdGhpcy5tZXNzYWdlID0gKHRoaXMucmVhc29uIHx8ICcodW5rbm93biByZWFzb24pJykgKyAodGhpcy5tYXJrID8gJyAnICsgdGhpcy5tYXJrLnRvU3RyaW5nKCkgOiAnJyk7XG59XG5cblxuLy8gSW5oZXJpdCBmcm9tIEVycm9yXG5ZQU1MRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbllBTUxFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gWUFNTEV4Y2VwdGlvbjtcblxuXG5ZQU1MRXhjZXB0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGNvbXBhY3QpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMubmFtZSArICc6ICc7XG5cbiAgcmVzdWx0ICs9IHRoaXMucmVhc29uIHx8ICcodW5rbm93biByZWFzb24pJztcblxuICBpZiAoIWNvbXBhY3QgJiYgdGhpcy5tYXJrKSB7XG4gICAgcmVzdWx0ICs9ICcgJyArIHRoaXMubWFyay50b1N0cmluZygpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBZQU1MRXhjZXB0aW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG1heC1sZW4sbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuXG52YXIgY29tbW9uICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgWUFNTEV4Y2VwdGlvbiAgICAgICA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG52YXIgTWFyayAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vbWFyaycpO1xudmFyIERFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbnZhciBERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZSgnLi9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5cblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cblxudmFyIENPTlRFWFRfRkxPV19JTiAgID0gMTtcbnZhciBDT05URVhUX0ZMT1dfT1VUICA9IDI7XG52YXIgQ09OVEVYVF9CTE9DS19JTiAgPSAzO1xudmFyIENPTlRFWFRfQkxPQ0tfT1VUID0gNDtcblxuXG52YXIgQ0hPTVBJTkdfQ0xJUCAgPSAxO1xudmFyIENIT01QSU5HX1NUUklQID0gMjtcbnZhciBDSE9NUElOR19LRUVQICA9IDM7XG5cblxudmFyIFBBVFRFUk5fTk9OX1BSSU5UQUJMRSAgICAgICAgID0gL1tcXHgwMC1cXHgwOFxceDBCXFx4MENcXHgwRS1cXHgxRlxceDdGLVxceDg0XFx4ODYtXFx4OUZcXHVGRkZFXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0vO1xudmFyIFBBVFRFUk5fTk9OX0FTQ0lJX0xJTkVfQlJFQUtTID0gL1tcXHg4NVxcdTIwMjhcXHUyMDI5XS87XG52YXIgUEFUVEVSTl9GTE9XX0lORElDQVRPUlMgICAgICAgPSAvWyxcXFtcXF1cXHtcXH1dLztcbnZhciBQQVRURVJOX1RBR19IQU5ETEUgICAgICAgICAgICA9IC9eKD86IXwhIXwhW2EtelxcLV0rISkkL2k7XG52YXIgUEFUVEVSTl9UQUdfVVJJICAgICAgICAgICAgICAgPSAvXig/OiF8W14sXFxbXFxdXFx7XFx9XSkoPzolWzAtOWEtZl17Mn18WzAtOWEtelxcLSM7XFwvXFw/OkAmPVxcK1xcJCxfXFwuIX5cXConXFwoXFwpXFxbXFxdXSkqJC9pO1xuXG5cbmZ1bmN0aW9uIGlzX0VPTChjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwQS8qIExGICovKSB8fCAoYyA9PT0gMHgwRC8qIENSICovKTtcbn1cblxuZnVuY3Rpb24gaXNfV0hJVEVfU1BBQ0UoYykge1xuICByZXR1cm4gKGMgPT09IDB4MDkvKiBUYWIgKi8pIHx8IChjID09PSAweDIwLyogU3BhY2UgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19XU19PUl9FT0woYykge1xuICByZXR1cm4gKGMgPT09IDB4MDkvKiBUYWIgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgyMC8qIFNwYWNlICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MEEvKiBMRiAqLykgfHxcbiAgICAgICAgIChjID09PSAweDBELyogQ1IgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19GTE9XX0lORElDQVRPUihjKSB7XG4gIHJldHVybiBjID09PSAweDJDLyogLCAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg1Qi8qIFsgKi8gfHxcbiAgICAgICAgIGMgPT09IDB4NUQvKiBdICovIHx8XG4gICAgICAgICBjID09PSAweDdCLyogeyAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg3RC8qIH0gKi87XG59XG5cbmZ1bmN0aW9uIGZyb21IZXhDb2RlKGMpIHtcbiAgdmFyIGxjO1xuXG4gIGlmICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB7XG4gICAgcmV0dXJuIGMgLSAweDMwO1xuICB9XG5cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlKi9cbiAgbGMgPSBjIHwgMHgyMDtcblxuICBpZiAoKDB4NjEvKiBhICovIDw9IGxjKSAmJiAobGMgPD0gMHg2Ni8qIGYgKi8pKSB7XG4gICAgcmV0dXJuIGxjIC0gMHg2MSArIDEwO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVkSGV4TGVuKGMpIHtcbiAgaWYgKGMgPT09IDB4NzgvKiB4ICovKSB7IHJldHVybiAyOyB9XG4gIGlmIChjID09PSAweDc1LyogdSAqLykgeyByZXR1cm4gNDsgfVxuICBpZiAoYyA9PT0gMHg1NS8qIFUgKi8pIHsgcmV0dXJuIDg7IH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGZyb21EZWNpbWFsQ29kZShjKSB7XG4gIGlmICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB7XG4gICAgcmV0dXJuIGMgLSAweDMwO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVFc2NhcGVTZXF1ZW5jZShjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgzMC8qIDAgKi8pID8gJ1xceDAwJyA6XG4gICAgICAgIChjID09PSAweDYxLyogYSAqLykgPyAnXFx4MDcnIDpcbiAgICAgICAgKGMgPT09IDB4NjIvKiBiICovKSA/ICdcXHgwOCcgOlxuICAgICAgICAoYyA9PT0gMHg3NC8qIHQgKi8pID8gJ1xceDA5JyA6XG4gICAgICAgIChjID09PSAweDA5LyogVGFiICovKSA/ICdcXHgwOScgOlxuICAgICAgICAoYyA9PT0gMHg2RS8qIG4gKi8pID8gJ1xceDBBJyA6XG4gICAgICAgIChjID09PSAweDc2LyogdiAqLykgPyAnXFx4MEInIDpcbiAgICAgICAgKGMgPT09IDB4NjYvKiBmICovKSA/ICdcXHgwQycgOlxuICAgICAgICAoYyA9PT0gMHg3Mi8qIHIgKi8pID8gJ1xceDBEJyA6XG4gICAgICAgIChjID09PSAweDY1LyogZSAqLykgPyAnXFx4MUInIDpcbiAgICAgICAgKGMgPT09IDB4MjAvKiBTcGFjZSAqLykgPyAnICcgOlxuICAgICAgICAoYyA9PT0gMHgyMi8qIFwiICovKSA/ICdcXHgyMicgOlxuICAgICAgICAoYyA9PT0gMHgyRi8qIC8gKi8pID8gJy8nIDpcbiAgICAgICAgKGMgPT09IDB4NUMvKiBcXCAqLykgPyAnXFx4NUMnIDpcbiAgICAgICAgKGMgPT09IDB4NEUvKiBOICovKSA/ICdcXHg4NScgOlxuICAgICAgICAoYyA9PT0gMHg1Ri8qIF8gKi8pID8gJ1xceEEwJyA6XG4gICAgICAgIChjID09PSAweDRDLyogTCAqLykgPyAnXFx1MjAyOCcgOlxuICAgICAgICAoYyA9PT0gMHg1MC8qIFAgKi8pID8gJ1xcdTIwMjknIDogJyc7XG59XG5cbmZ1bmN0aW9uIGNoYXJGcm9tQ29kZXBvaW50KGMpIHtcbiAgaWYgKGMgPD0gMHhGRkZGKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gIH1cbiAgLy8gRW5jb2RlIFVURi0xNiBzdXJyb2dhdGUgcGFpclxuICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYjQ29kZV9wb2ludHNfVS4yQjAxMDAwMF90b19VLjJCMTBGRkZGXG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAtIDB4MDEwMDAwKSA+PiAxMCkgKyAweEQ4MDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyAtIDB4MDEwMDAwKSAmIDB4MDNGRikgKyAweERDMDApO1xufVxuXG52YXIgc2ltcGxlRXNjYXBlQ2hlY2sgPSBuZXcgQXJyYXkoMjU2KTsgLy8gaW50ZWdlciwgZm9yIGZhc3QgYWNjZXNzXG52YXIgc2ltcGxlRXNjYXBlTWFwID0gbmV3IEFycmF5KDI1Nik7XG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gIHNpbXBsZUVzY2FwZUNoZWNrW2ldID0gc2ltcGxlRXNjYXBlU2VxdWVuY2UoaSkgPyAxIDogMDtcbiAgc2ltcGxlRXNjYXBlTWFwW2ldID0gc2ltcGxlRXNjYXBlU2VxdWVuY2UoaSk7XG59XG5cblxuZnVuY3Rpb24gU3RhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gIHRoaXMuZmlsZW5hbWUgID0gb3B0aW9uc1snZmlsZW5hbWUnXSAgfHwgbnVsbDtcbiAgdGhpcy5zY2hlbWEgICAgPSBvcHRpb25zWydzY2hlbWEnXSAgICB8fCBERUZBVUxUX0ZVTExfU0NIRU1BO1xuICB0aGlzLm9uV2FybmluZyA9IG9wdGlvbnNbJ29uV2FybmluZyddIHx8IG51bGw7XG4gIHRoaXMubGVnYWN5ICAgID0gb3B0aW9uc1snbGVnYWN5J10gICAgfHwgZmFsc2U7XG4gIHRoaXMuanNvbiAgICAgID0gb3B0aW9uc1snanNvbiddICAgICAgfHwgZmFsc2U7XG4gIHRoaXMubGlzdGVuZXIgID0gb3B0aW9uc1snbGlzdGVuZXInXSAgfHwgbnVsbDtcblxuICB0aGlzLmltcGxpY2l0VHlwZXMgPSB0aGlzLnNjaGVtYS5jb21waWxlZEltcGxpY2l0O1xuICB0aGlzLnR5cGVNYXAgICAgICAgPSB0aGlzLnNjaGVtYS5jb21waWxlZFR5cGVNYXA7XG5cbiAgdGhpcy5sZW5ndGggICAgID0gaW5wdXQubGVuZ3RoO1xuICB0aGlzLnBvc2l0aW9uICAgPSAwO1xuICB0aGlzLmxpbmUgICAgICAgPSAwO1xuICB0aGlzLmxpbmVTdGFydCAgPSAwO1xuICB0aGlzLmxpbmVJbmRlbnQgPSAwO1xuXG4gIHRoaXMuZG9jdW1lbnRzID0gW107XG5cbiAgLypcbiAgdGhpcy52ZXJzaW9uO1xuICB0aGlzLmNoZWNrTGluZUJyZWFrcztcbiAgdGhpcy50YWdNYXA7XG4gIHRoaXMuYW5jaG9yTWFwO1xuICB0aGlzLnRhZztcbiAgdGhpcy5hbmNob3I7XG4gIHRoaXMua2luZDtcbiAgdGhpcy5yZXN1bHQ7Ki9cblxufVxuXG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UpIHtcbiAgcmV0dXJuIG5ldyBZQU1MRXhjZXB0aW9uKFxuICAgIG1lc3NhZ2UsXG4gICAgbmV3IE1hcmsoc3RhdGUuZmlsZW5hbWUsIHN0YXRlLmlucHV0LCBzdGF0ZS5wb3NpdGlvbiwgc3RhdGUubGluZSwgKHN0YXRlLnBvc2l0aW9uIC0gc3RhdGUubGluZVN0YXJ0KSkpO1xufVxuXG5mdW5jdGlvbiB0aHJvd0Vycm9yKHN0YXRlLCBtZXNzYWdlKSB7XG4gIHRocm93IGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiB0aHJvd1dhcm5pbmcoc3RhdGUsIG1lc3NhZ2UpIHtcbiAgaWYgKHN0YXRlLm9uV2FybmluZykge1xuICAgIHN0YXRlLm9uV2FybmluZy5jYWxsKG51bGwsIGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UpKTtcbiAgfVxufVxuXG5cbnZhciBkaXJlY3RpdmVIYW5kbGVycyA9IHtcblxuICBZQU1MOiBmdW5jdGlvbiBoYW5kbGVZYW1sRGlyZWN0aXZlKHN0YXRlLCBuYW1lLCBhcmdzKSB7XG5cbiAgICB2YXIgbWF0Y2gsIG1ham9yLCBtaW5vcjtcblxuICAgIGlmIChzdGF0ZS52ZXJzaW9uICE9PSBudWxsKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgJVlBTUwgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnWUFNTCBkaXJlY3RpdmUgYWNjZXB0cyBleGFjdGx5IG9uZSBhcmd1bWVudCcpO1xuICAgIH1cblxuICAgIG1hdGNoID0gL14oWzAtOV0rKVxcLihbMC05XSspJC8uZXhlYyhhcmdzWzBdKTtcblxuICAgIGlmIChtYXRjaCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2lsbC1mb3JtZWQgYXJndW1lbnQgb2YgdGhlIFlBTUwgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgbWFqb3IgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICAgIG1pbm9yID0gcGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcblxuICAgIGlmIChtYWpvciAhPT0gMSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuYWNjZXB0YWJsZSBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50Jyk7XG4gICAgfVxuXG4gICAgc3RhdGUudmVyc2lvbiA9IGFyZ3NbMF07XG4gICAgc3RhdGUuY2hlY2tMaW5lQnJlYWtzID0gKG1pbm9yIDwgMik7XG5cbiAgICBpZiAobWlub3IgIT09IDEgJiYgbWlub3IgIT09IDIpIHtcbiAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ3Vuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQnKTtcbiAgICB9XG4gIH0sXG5cbiAgVEFHOiBmdW5jdGlvbiBoYW5kbGVUYWdEaXJlY3RpdmUoc3RhdGUsIG5hbWUsIGFyZ3MpIHtcblxuICAgIHZhciBoYW5kbGUsIHByZWZpeDtcblxuICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ1RBRyBkaXJlY3RpdmUgYWNjZXB0cyBleGFjdGx5IHR3byBhcmd1bWVudHMnKTtcbiAgICB9XG5cbiAgICBoYW5kbGUgPSBhcmdzWzBdO1xuICAgIHByZWZpeCA9IGFyZ3NbMV07XG5cbiAgICBpZiAoIVBBVFRFUk5fVEFHX0hBTkRMRS50ZXN0KGhhbmRsZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIHRhZyBoYW5kbGUgKGZpcnN0IGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50YWdNYXAsIGhhbmRsZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0aGVyZSBpcyBhIHByZXZpb3VzbHkgZGVjbGFyZWQgc3VmZml4IGZvciBcIicgKyBoYW5kbGUgKyAnXCIgdGFnIGhhbmRsZScpO1xuICAgIH1cblxuICAgIGlmICghUEFUVEVSTl9UQUdfVVJJLnRlc3QocHJlZml4KSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2lsbC1mb3JtZWQgdGFnIHByZWZpeCAoc2Vjb25kIGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIHN0YXRlLnRhZ01hcFtoYW5kbGVdID0gcHJlZml4O1xuICB9XG59O1xuXG5cbmZ1bmN0aW9uIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBzdGFydCwgZW5kLCBjaGVja0pzb24pIHtcbiAgdmFyIF9wb3NpdGlvbiwgX2xlbmd0aCwgX2NoYXJhY3RlciwgX3Jlc3VsdDtcblxuICBpZiAoc3RhcnQgPCBlbmQpIHtcbiAgICBfcmVzdWx0ID0gc3RhdGUuaW5wdXQuc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgICBpZiAoY2hlY2tKc29uKSB7XG4gICAgICBmb3IgKF9wb3NpdGlvbiA9IDAsIF9sZW5ndGggPSBfcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgICAgX3Bvc2l0aW9uIDwgX2xlbmd0aDtcbiAgICAgICAgICAgX3Bvc2l0aW9uICs9IDEpIHtcbiAgICAgICAgX2NoYXJhY3RlciA9IF9yZXN1bHQuY2hhckNvZGVBdChfcG9zaXRpb24pO1xuICAgICAgICBpZiAoIShfY2hhcmFjdGVyID09PSAweDA5IHx8XG4gICAgICAgICAgICAgICgweDIwIDw9IF9jaGFyYWN0ZXIgJiYgX2NoYXJhY3RlciA8PSAweDEwRkZGRikpKSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2V4cGVjdGVkIHZhbGlkIEpTT04gY2hhcmFjdGVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFBBVFRFUk5fTk9OX1BSSU5UQUJMRS50ZXN0KF9yZXN1bHQpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGhlIHN0cmVhbSBjb250YWlucyBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS5yZXN1bHQgKz0gX3Jlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtZXJnZU1hcHBpbmdzKHN0YXRlLCBkZXN0aW5hdGlvbiwgc291cmNlLCBvdmVycmlkYWJsZUtleXMpIHtcbiAgdmFyIHNvdXJjZUtleXMsIGtleSwgaW5kZXgsIHF1YW50aXR5O1xuXG4gIGlmICghY29tbW9uLmlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2Fubm90IG1lcmdlIG1hcHBpbmdzOyB0aGUgcHJvdmlkZWQgc291cmNlIG9iamVjdCBpcyB1bmFjY2VwdGFibGUnKTtcbiAgfVxuXG4gIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBxdWFudGl0eSA9IHNvdXJjZUtleXMubGVuZ3RoOyBpbmRleCA8IHF1YW50aXR5OyBpbmRleCArPSAxKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpbmRleF07XG5cbiAgICBpZiAoIV9oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlc3RpbmF0aW9uLCBrZXkpKSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gc291cmNlW2tleV07XG4gICAgICBvdmVycmlkYWJsZUtleXNba2V5XSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpIHtcbiAgdmFyIGluZGV4LCBxdWFudGl0eTtcblxuICBrZXlOb2RlID0gU3RyaW5nKGtleU5vZGUpO1xuXG4gIGlmIChfcmVzdWx0ID09PSBudWxsKSB7XG4gICAgX3Jlc3VsdCA9IHt9O1xuICB9XG5cbiAgaWYgKGtleVRhZyA9PT0gJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlTm9kZSkpIHtcbiAgICAgIGZvciAoaW5kZXggPSAwLCBxdWFudGl0eSA9IHZhbHVlTm9kZS5sZW5ndGg7IGluZGV4IDwgcXVhbnRpdHk7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgX3Jlc3VsdCwgdmFsdWVOb2RlW2luZGV4XSwgb3ZlcnJpZGFibGVLZXlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgX3Jlc3VsdCwgdmFsdWVOb2RlLCBvdmVycmlkYWJsZUtleXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoIXN0YXRlLmpzb24gJiZcbiAgICAgICAgIV9oYXNPd25Qcm9wZXJ0eS5jYWxsKG92ZXJyaWRhYmxlS2V5cywga2V5Tm9kZSkgJiZcbiAgICAgICAgX2hhc093blByb3BlcnR5LmNhbGwoX3Jlc3VsdCwga2V5Tm9kZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGVkIG1hcHBpbmcga2V5Jyk7XG4gICAgfVxuICAgIF9yZXN1bHRba2V5Tm9kZV0gPSB2YWx1ZU5vZGU7XG4gICAgZGVsZXRlIG92ZXJyaWRhYmxlS2V5c1trZXlOb2RlXTtcbiAgfVxuXG4gIHJldHVybiBfcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZWFkTGluZUJyZWFrKHN0YXRlKSB7XG4gIHZhciBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHgwQS8qIExGICovKSB7XG4gICAgc3RhdGUucG9zaXRpb24rKztcbiAgfSBlbHNlIGlmIChjaCA9PT0gMHgwRC8qIENSICovKSB7XG4gICAgc3RhdGUucG9zaXRpb24rKztcbiAgICBpZiAoc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgPT09IDB4MEEvKiBMRiAqLykge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2EgbGluZSBicmVhayBpcyBleHBlY3RlZCcpO1xuICB9XG5cbiAgc3RhdGUubGluZSArPSAxO1xuICBzdGF0ZS5saW5lU3RhcnQgPSBzdGF0ZS5wb3NpdGlvbjtcbn1cblxuZnVuY3Rpb24gc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgYWxsb3dDb21tZW50cywgY2hlY2tJbmRlbnQpIHtcbiAgdmFyIGxpbmVCcmVha3MgPSAwLFxuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKGFsbG93Q29tbWVudHMgJiYgY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIH0gd2hpbGUgKGNoICE9PSAweDBBLyogTEYgKi8gJiYgY2ggIT09IDB4MEQvKiBDUiAqLyAmJiBjaCAhPT0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIHJlYWRMaW5lQnJlYWsoc3RhdGUpO1xuXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgICAgbGluZUJyZWFrcysrO1xuICAgICAgc3RhdGUubGluZUluZGVudCA9IDA7XG5cbiAgICAgIHdoaWxlIChjaCA9PT0gMHgyMC8qIFNwYWNlICovKSB7XG4gICAgICAgIHN0YXRlLmxpbmVJbmRlbnQrKztcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoY2hlY2tJbmRlbnQgIT09IC0xICYmIGxpbmVCcmVha3MgIT09IDAgJiYgc3RhdGUubGluZUluZGVudCA8IGNoZWNrSW5kZW50KSB7XG4gICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAnZGVmaWNpZW50IGluZGVudGF0aW9uJyk7XG4gIH1cblxuICByZXR1cm4gbGluZUJyZWFrcztcbn1cblxuZnVuY3Rpb24gdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbixcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24pO1xuXG4gIC8vIENvbmRpdGlvbiBzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0IGlzIHRlc3RlZFxuICAvLyBpbiBwYXJlbnQgb24gZWFjaCBjYWxsLCBmb3IgZWZmaWNpZW5jeS4gTm8gbmVlZHMgdG8gdGVzdCBoZXJlIGFnYWluLlxuICBpZiAoKGNoID09PSAweDJELyogLSAqLyB8fCBjaCA9PT0gMHgyRS8qIC4gKi8pICYmXG4gICAgICBjaCA9PT0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24gKyAxKSAmJlxuICAgICAgY2ggPT09IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uICsgMikpIHtcblxuICAgIF9wb3NpdGlvbiArPSAzO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDAgfHwgaXNfV1NfT1JfRU9MKGNoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBjb3VudCkge1xuICBpZiAoY291bnQgPT09IDEpIHtcbiAgICBzdGF0ZS5yZXN1bHQgKz0gJyAnO1xuICB9IGVsc2UgaWYgKGNvdW50ID4gMSkge1xuICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBjb3VudCAtIDEpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gcmVhZFBsYWluU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50LCB3aXRoaW5GbG93Q29sbGVjdGlvbikge1xuICB2YXIgcHJlY2VkaW5nLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgY2FwdHVyZVN0YXJ0LFxuICAgICAgY2FwdHVyZUVuZCxcbiAgICAgIGhhc1BlbmRpbmdDb250ZW50LFxuICAgICAgX2xpbmUsXG4gICAgICBfbGluZVN0YXJ0LFxuICAgICAgX2xpbmVJbmRlbnQsXG4gICAgICBfa2luZCA9IHN0YXRlLmtpbmQsXG4gICAgICBfcmVzdWx0ID0gc3RhdGUucmVzdWx0LFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoaXNfV1NfT1JfRU9MKGNoKSAgICAgIHx8XG4gICAgICBpc19GTE9XX0lORElDQVRPUihjaCkgfHxcbiAgICAgIGNoID09PSAweDIzLyogIyAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjYvKiAmICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyQS8qICogKi8gICAgfHxcbiAgICAgIGNoID09PSAweDIxLyogISAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4N0MvKiB8ICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgzRS8qID4gKi8gICAgfHxcbiAgICAgIGNoID09PSAweDI3LyogJyAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjIvKiBcIiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjUvKiAlICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg0MC8qIEAgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDYwLyogYCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChjaCA9PT0gMHgzRi8qID8gKi8gfHwgY2ggPT09IDB4MkQvKiAtICovKSB7XG4gICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpIHx8XG4gICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGZvbGxvd2luZykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gIGhhc1BlbmRpbmdDb250ZW50ID0gZmFsc2U7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgaWYgKGNoID09PSAweDNBLyogOiAqLykge1xuICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykgfHxcbiAgICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihmb2xsb3dpbmcpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIHByZWNlZGluZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gLSAxKTtcblxuICAgICAgaWYgKGlzX1dTX09SX0VPTChwcmVjZWRpbmcpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICgoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB8fFxuICAgICAgICAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7XG4gICAgICBicmVhaztcblxuICAgIH0gZWxzZSBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgX2xpbmUgPSBzdGF0ZS5saW5lO1xuICAgICAgX2xpbmVTdGFydCA9IHN0YXRlLmxpbmVTdGFydDtcbiAgICAgIF9saW5lSW5kZW50ID0gc3RhdGUubGluZUluZGVudDtcbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCAtMSk7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID49IG5vZGVJbmRlbnQpIHtcbiAgICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSB0cnVlO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uID0gY2FwdHVyZUVuZDtcbiAgICAgICAgc3RhdGUubGluZSA9IF9saW5lO1xuICAgICAgICBzdGF0ZS5saW5lU3RhcnQgPSBfbGluZVN0YXJ0O1xuICAgICAgICBzdGF0ZS5saW5lSW5kZW50ID0gX2xpbmVJbmRlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNQZW5kaW5nQ29udGVudCkge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgZmFsc2UpO1xuICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc3RhdGUubGluZSAtIF9saW5lKTtcbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICAgIGhhc1BlbmRpbmdDb250ZW50ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbiArIDE7XG4gICAgfVxuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICB9XG5cbiAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgZmFsc2UpO1xuXG4gIGlmIChzdGF0ZS5yZXN1bHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSBfa2luZDtcbiAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWFkU2luZ2xlUXVvdGVkU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBjaCxcbiAgICAgIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyNy8qICcgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuICBzdGF0ZS5wb3NpdGlvbisrO1xuICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkge1xuICAgIGlmIChjaCA9PT0gMHgyNy8qICcgKi8pIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgaWYgKGNoID09PSAweDI3LyogJyAqLykge1xuICAgICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgdHJ1ZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgbm9kZUluZGVudCkpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIGEgc2luZ2xlIHF1b3RlZCBzY2FsYXInKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWREb3VibGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNhcHR1cmVTdGFydCxcbiAgICAgIGNhcHR1cmVFbmQsXG4gICAgICBoZXhMZW5ndGgsXG4gICAgICBoZXhSZXN1bHQsXG4gICAgICB0bXAsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyMi8qIFwiICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcbiAgc3RhdGUucG9zaXRpb24rKztcbiAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4MjIvKiBcIiAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gMHg1Qy8qIFxcICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KTtcblxuICAgICAgICAvLyBUT0RPOiByZXdvcmsgdG8gaW5saW5lIGZuIHdpdGggbm8gdHlwZSBjYXN0P1xuICAgICAgfSBlbHNlIGlmIChjaCA8IDI1NiAmJiBzaW1wbGVFc2NhcGVDaGVja1tjaF0pIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IHNpbXBsZUVzY2FwZU1hcFtjaF07XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICAgIH0gZWxzZSBpZiAoKHRtcCA9IGVzY2FwZWRIZXhMZW4oY2gpKSA+IDApIHtcbiAgICAgICAgaGV4TGVuZ3RoID0gdG1wO1xuICAgICAgICBoZXhSZXN1bHQgPSAwO1xuXG4gICAgICAgIGZvciAoOyBoZXhMZW5ndGggPiAwOyBoZXhMZW5ndGgtLSkge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgICAgIGlmICgodG1wID0gZnJvbUhleENvZGUoY2gpKSA+PSAwKSB7XG4gICAgICAgICAgICBoZXhSZXN1bHQgPSAoaGV4UmVzdWx0IDw8IDQpICsgdG1wO1xuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdleHBlY3RlZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY2hhckZyb21Db2RlcG9pbnQoaGV4UmVzdWx0KTtcblxuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5rbm93biBlc2NhcGUgc2VxdWVuY2UnKTtcbiAgICAgIH1cblxuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCB0cnVlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhcicpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgZG91YmxlIHF1b3RlZCBzY2FsYXInKTtcbn1cblxuZnVuY3Rpb24gcmVhZEZsb3dDb2xsZWN0aW9uKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciByZWFkTmV4dCA9IHRydWUsXG4gICAgICBfbGluZSxcbiAgICAgIF90YWcgICAgID0gc3RhdGUudGFnLFxuICAgICAgX3Jlc3VsdCxcbiAgICAgIF9hbmNob3IgID0gc3RhdGUuYW5jaG9yLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgdGVybWluYXRvcixcbiAgICAgIGlzUGFpcixcbiAgICAgIGlzRXhwbGljaXRQYWlyLFxuICAgICAgaXNNYXBwaW5nLFxuICAgICAgb3ZlcnJpZGFibGVLZXlzID0ge30sXG4gICAgICBrZXlOb2RlLFxuICAgICAga2V5VGFnLFxuICAgICAgdmFsdWVOb2RlLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4NUIvKiBbICovKSB7XG4gICAgdGVybWluYXRvciA9IDB4NUQ7LyogXSAqL1xuICAgIGlzTWFwcGluZyA9IGZhbHNlO1xuICAgIF9yZXN1bHQgPSBbXTtcbiAgfSBlbHNlIGlmIChjaCA9PT0gMHg3Qi8qIHsgKi8pIHtcbiAgICB0ZXJtaW5hdG9yID0gMHg3RDsvKiB9ICovXG4gICAgaXNNYXBwaW5nID0gdHJ1ZTtcbiAgICBfcmVzdWx0ID0ge307XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IHRlcm1pbmF0b3IpIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICAgIHN0YXRlLmtpbmQgPSBpc01hcHBpbmcgPyAnbWFwcGluZycgOiAnc2VxdWVuY2UnO1xuICAgICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIXJlYWROZXh0KSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbWlzc2VkIGNvbW1hIGJldHdlZW4gZmxvdyBjb2xsZWN0aW9uIGVudHJpZXMnKTtcbiAgICB9XG5cbiAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICBpc1BhaXIgPSBpc0V4cGxpY2l0UGFpciA9IGZhbHNlO1xuXG4gICAgaWYgKGNoID09PSAweDNGLyogPyAqLykge1xuICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcbiAgICAgICAgaXNQYWlyID0gaXNFeHBsaWNpdFBhaXIgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfRkxPV19JTiwgZmFsc2UsIHRydWUpO1xuICAgIGtleVRhZyA9IHN0YXRlLnRhZztcbiAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmICgoaXNFeHBsaWNpdFBhaXIgfHwgc3RhdGUubGluZSA9PT0gX2xpbmUpICYmIGNoID09PSAweDNBLyogOiAqLykge1xuICAgICAgaXNQYWlyID0gdHJ1ZTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuICAgICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfRkxPV19JTiwgZmFsc2UsIHRydWUpO1xuICAgICAgdmFsdWVOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChpc01hcHBpbmcpIHtcbiAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgIH0gZWxzZSBpZiAoaXNQYWlyKSB7XG4gICAgICBfcmVzdWx0LnB1c2goc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgbnVsbCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfcmVzdWx0LnB1c2goa2V5Tm9kZSk7XG4gICAgfVxuXG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAweDJDLyogLCAqLykge1xuICAgICAgcmVhZE5leHQgPSB0cnVlO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWFkTmV4dCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGZsb3cgY29sbGVjdGlvbicpO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNhcHR1cmVTdGFydCxcbiAgICAgIGZvbGRpbmcsXG4gICAgICBjaG9tcGluZyAgICAgICA9IENIT01QSU5HX0NMSVAsXG4gICAgICBkZXRlY3RlZEluZGVudCA9IGZhbHNlLFxuICAgICAgdGV4dEluZGVudCAgICAgPSBub2RlSW5kZW50LFxuICAgICAgZW1wdHlMaW5lcyAgICAgPSAwLFxuICAgICAgYXRNb3JlSW5kZW50ZWQgPSBmYWxzZSxcbiAgICAgIHRtcCxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDdDLyogfCAqLykge1xuICAgIGZvbGRpbmcgPSBmYWxzZTtcbiAgfSBlbHNlIGlmIChjaCA9PT0gMHgzRS8qID4gKi8pIHtcbiAgICBmb2xkaW5nID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gMHgyQi8qICsgKi8gfHwgY2ggPT09IDB4MkQvKiAtICovKSB7XG4gICAgICBpZiAoQ0hPTVBJTkdfQ0xJUCA9PT0gY2hvbXBpbmcpIHtcbiAgICAgICAgY2hvbXBpbmcgPSAoY2ggPT09IDB4MkIvKiArICovKSA/IENIT01QSU5HX0tFRVAgOiBDSE9NUElOR19TVFJJUDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdyZXBlYXQgb2YgYSBjaG9tcGluZyBtb2RlIGlkZW50aWZpZXInKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoKHRtcCA9IGZyb21EZWNpbWFsQ29kZShjaCkpID49IDApIHtcbiAgICAgIGlmICh0bXAgPT09IDApIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2JhZCBleHBsaWNpdCBpbmRlbnRhdGlvbiB3aWR0aCBvZiBhIGJsb2NrIHNjYWxhcjsgaXQgY2Fubm90IGJlIGxlc3MgdGhhbiBvbmUnKTtcbiAgICAgIH0gZWxzZSBpZiAoIWRldGVjdGVkSW5kZW50KSB7XG4gICAgICAgIHRleHRJbmRlbnQgPSBub2RlSW5kZW50ICsgdG1wIC0gMTtcbiAgICAgICAgZGV0ZWN0ZWRJbmRlbnQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3JlcGVhdCBvZiBhbiBpbmRlbnRhdGlvbiB3aWR0aCBpZGVudGlmaWVyJyk7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSk7XG5cbiAgICBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgICAgd2hpbGUgKCFpc19FT0woY2gpICYmIChjaCAhPT0gMCkpO1xuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHJlYWRMaW5lQnJlYWsoc3RhdGUpO1xuICAgIHN0YXRlLmxpbmVJbmRlbnQgPSAwO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIHdoaWxlICgoIWRldGVjdGVkSW5kZW50IHx8IHN0YXRlLmxpbmVJbmRlbnQgPCB0ZXh0SW5kZW50KSAmJlxuICAgICAgICAgICAoY2ggPT09IDB4MjAvKiBTcGFjZSAqLykpIHtcbiAgICAgIHN0YXRlLmxpbmVJbmRlbnQrKztcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoIWRldGVjdGVkSW5kZW50ICYmIHN0YXRlLmxpbmVJbmRlbnQgPiB0ZXh0SW5kZW50KSB7XG4gICAgICB0ZXh0SW5kZW50ID0gc3RhdGUubGluZUluZGVudDtcbiAgICB9XG5cbiAgICBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgZW1wdHlMaW5lcysrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gRW5kIG9mIHRoZSBzY2FsYXIuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCB0ZXh0SW5kZW50KSB7XG5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIGNob21waW5nLlxuICAgICAgaWYgKGNob21waW5nID09PSBDSE9NUElOR19LRUVQKSB7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hvbXBpbmcgPT09IENIT01QSU5HX0NMSVApIHtcbiAgICAgICAgaWYgKGRldGVjdGVkSW5kZW50KSB7IC8vIGkuZS4gb25seSBpZiB0aGUgc2NhbGFyIGlzIG5vdCBlbXB0eS5cbiAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQnJlYWsgdGhpcyBgd2hpbGVgIGN5Y2xlIGFuZCBnbyB0byB0aGUgZnVuY2l0b24ncyBlcGlsb2d1ZS5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIEZvbGRlZCBzdHlsZTogdXNlIGZhbmN5IHJ1bGVzIHRvIGhhbmRsZSBsaW5lIGJyZWFrcy5cbiAgICBpZiAoZm9sZGluZykge1xuXG4gICAgICAvLyBMaW5lcyBzdGFydGluZyB3aXRoIHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMgKG1vcmUtaW5kZW50ZWQgbGluZXMpIGFyZSBub3QgZm9sZGVkLlxuICAgICAgaWYgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgICBhdE1vcmVJbmRlbnRlZCA9IHRydWU7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzICsgMSk7XG5cbiAgICAgIC8vIEVuZCBvZiBtb3JlLWluZGVudGVkIGJsb2NrLlxuICAgICAgfSBlbHNlIGlmIChhdE1vcmVJbmRlbnRlZCkge1xuICAgICAgICBhdE1vcmVJbmRlbnRlZCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyArIDEpO1xuXG4gICAgICAvLyBKdXN0IG9uZSBsaW5lIGJyZWFrIC0gcGVyY2VpdmUgYXMgdGhlIHNhbWUgbGluZS5cbiAgICAgIH0gZWxzZSBpZiAoZW1wdHlMaW5lcyA9PT0gMCkge1xuICAgICAgICBpZiAoZGV0ZWN0ZWRJbmRlbnQpIHsgLy8gaS5lLiBvbmx5IGlmIHdlIGhhdmUgYWxyZWFkeSByZWFkIHNvbWUgc2NhbGFyIGNvbnRlbnQuXG4gICAgICAgICAgc3RhdGUucmVzdWx0ICs9ICcgJztcbiAgICAgICAgfVxuXG4gICAgICAvLyBTZXZlcmFsIGxpbmUgYnJlYWtzIC0gcGVyY2VpdmUgYXMgZGlmZmVyZW50IGxpbmVzLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMpO1xuICAgICAgfVxuXG4gICAgLy8gTGl0ZXJhbCBzdHlsZToganVzdCBhZGQgZXhhY3QgbnVtYmVyIG9mIGxpbmUgYnJlYWtzIGJldHdlZW4gY29udGVudCBsaW5lcy5cbiAgICB9IGVsc2UgaWYgKGRldGVjdGVkSW5kZW50KSB7XG4gICAgICAvLyBJZiBjdXJyZW50IGxpbmUgaXNuJ3QgdGhlIGZpcnN0IG9uZSAtIGNvdW50IGxpbmUgYnJlYWsgZnJvbSB0aGUgbGFzdCBjb250ZW50IGxpbmUuXG4gICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBjYXNlIG9mIHRoZSBmaXJzdCBjb250ZW50IGxpbmUgLSBjb3VudCBvbmx5IGVtcHR5IGxpbmVzLlxuICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMpO1xuICAgIH1cblxuICAgIGRldGVjdGVkSW5kZW50ID0gdHJ1ZTtcbiAgICBlbXB0eUxpbmVzID0gMDtcbiAgICBjYXB0dXJlU3RhcnQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiAoY2ggIT09IDApKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgX2xpbmUsXG4gICAgICBfdGFnICAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfYW5jaG9yICAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBfcmVzdWx0ICAgPSBbXSxcbiAgICAgIGZvbGxvd2luZyxcbiAgICAgIGRldGVjdGVkICA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG5cbiAgICBpZiAoY2ggIT09IDB4MkQvKiAtICovKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICBpZiAoIWlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkZXRlY3RlZCA9IHRydWU7XG4gICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50IDw9IG5vZGVJbmRlbnQpIHtcbiAgICAgICAgX3Jlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfSU4sIGZhbHNlLCB0cnVlKTtcbiAgICBfcmVzdWx0LnB1c2goc3RhdGUucmVzdWx0KTtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKChzdGF0ZS5saW5lID09PSBfbGluZSB8fCBzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCkgJiYgKGNoICE9PSAwKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2JhZCBpbmRlbnRhdGlvbiBvZiBhIHNlcXVlbmNlIGVudHJ5Jyk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgbm9kZUluZGVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRldGVjdGVkKSB7XG4gICAgc3RhdGUudGFnID0gX3RhZztcbiAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgIHN0YXRlLmtpbmQgPSAnc2VxdWVuY2UnO1xuICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tNYXBwaW5nKHN0YXRlLCBub2RlSW5kZW50LCBmbG93SW5kZW50KSB7XG4gIHZhciBmb2xsb3dpbmcsXG4gICAgICBhbGxvd0NvbXBhY3QsXG4gICAgICBfbGluZSxcbiAgICAgIF90YWcgICAgICAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfYW5jaG9yICAgICAgID0gc3RhdGUuYW5jaG9yLFxuICAgICAgX3Jlc3VsdCAgICAgICA9IHt9LFxuICAgICAgb3ZlcnJpZGFibGVLZXlzID0ge30sXG4gICAgICBrZXlUYWcgICAgICAgID0gbnVsbCxcbiAgICAgIGtleU5vZGUgICAgICAgPSBudWxsLFxuICAgICAgdmFsdWVOb2RlICAgICA9IG51bGwsXG4gICAgICBhdEV4cGxpY2l0S2V5ID0gZmFsc2UsXG4gICAgICBkZXRlY3RlZCAgICAgID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG4gICAgX2xpbmUgPSBzdGF0ZS5saW5lOyAvLyBTYXZlIHRoZSBjdXJyZW50IGxpbmUuXG5cbiAgICAvL1xuICAgIC8vIEV4cGxpY2l0IG5vdGF0aW9uIGNhc2UuIFRoZXJlIGFyZSB0d28gc2VwYXJhdGUgYmxvY2tzOlxuICAgIC8vIGZpcnN0IGZvciB0aGUga2V5IChkZW5vdGVkIGJ5IFwiP1wiKSBhbmQgc2Vjb25kIGZvciB0aGUgdmFsdWUgKGRlbm90ZWQgYnkgXCI6XCIpXG4gICAgLy9cbiAgICBpZiAoKGNoID09PSAweDNGLyogPyAqLyB8fCBjaCA9PT0gMHgzQS8qIDogKi8pICYmIGlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7XG5cbiAgICAgIGlmIChjaCA9PT0gMHgzRi8qID8gKi8pIHtcbiAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7XG4gICAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkZXRlY3RlZCA9IHRydWU7XG4gICAgICAgIGF0RXhwbGljaXRLZXkgPSB0cnVlO1xuICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlO1xuXG4gICAgICB9IGVsc2UgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgLy8gaS5lLiAweDNBLyogOiAqLyA9PT0gY2hhcmFjdGVyIGFmdGVyIHRoZSBleHBsaWNpdCBrZXkuXG4gICAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZTtcbiAgICAgICAgYWxsb3dDb21wYWN0ID0gdHJ1ZTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2luY29tcGxldGUgZXhwbGljaXQgbWFwcGluZyBwYWlyOyBhIGtleSBub2RlIGlzIG1pc3NlZCcpO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5wb3NpdGlvbiArPSAxO1xuICAgICAgY2ggPSBmb2xsb3dpbmc7XG5cbiAgICAvL1xuICAgIC8vIEltcGxpY2l0IG5vdGF0aW9uIGNhc2UuIEZsb3ctc3R5bGUgbm9kZSBhcyB0aGUga2V5IGZpcnN0LCB0aGVuIFwiOlwiLCBhbmQgdGhlIHZhbHVlLlxuICAgIC8vXG4gICAgfSBlbHNlIGlmIChjb21wb3NlTm9kZShzdGF0ZSwgZmxvd0luZGVudCwgQ09OVEVYVF9GTE9XX09VVCwgZmFsc2UsIHRydWUpKSB7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lID09PSBfbGluZSkge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgICAgaWYgKCFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBleHBlY3RlZCBhZnRlciB0aGUga2V5LXZhbHVlIHNlcGFyYXRvciB3aXRoaW4gYSBibG9jayBtYXBwaW5nJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgICAgICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICBhdEV4cGxpY2l0S2V5ID0gZmFsc2U7XG4gICAgICAgICAgYWxsb3dDb21wYWN0ID0gZmFsc2U7XG4gICAgICAgICAga2V5VGFnID0gc3RhdGUudGFnO1xuICAgICAgICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG5cbiAgICAgICAgfSBlbHNlIGlmIChkZXRlY3RlZCkge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW4gbm90IHJlYWQgYW4gaW1wbGljaXQgbWFwcGluZyBwYWlyOyBhIGNvbG9uIGlzIG1pc3NlZCcpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUudGFnID0gX3RhZztcbiAgICAgICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIHRoZSByZXN1bHQgb2YgYGNvbXBvc2VOb2RlYC5cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW4gbm90IHJlYWQgYSBibG9jayBtYXBwaW5nIGVudHJ5OyBhIG11bHRpbGluZSBrZXkgbWF5IG5vdCBiZSBhbiBpbXBsaWNpdCBrZXknKTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUudGFnID0gX3RhZztcbiAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgdGhlIHJlc3VsdCBvZiBgY29tcG9zZU5vZGVgLlxuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrOyAvLyBSZWFkaW5nIGlzIGRvbmUuIEdvIHRvIHRoZSBlcGlsb2d1ZS5cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIENvbW1vbiByZWFkaW5nIGNvZGUgZm9yIGJvdGggZXhwbGljaXQgYW5kIGltcGxpY2l0IG5vdGF0aW9ucy5cbiAgICAvL1xuICAgIGlmIChzdGF0ZS5saW5lID09PSBfbGluZSB8fCBzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCkge1xuICAgICAgaWYgKGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0JMT0NLX09VVCwgdHJ1ZSwgYWxsb3dDb21wYWN0KSkge1xuICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWVOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghYXRFeHBsaWNpdEtleSkge1xuICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKTtcbiAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50ICYmIChjaCAhPT0gMCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdiYWQgaW5kZW50YXRpb24gb2YgYSBtYXBwaW5nIGVudHJ5Jyk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgbm9kZUluZGVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgLy8gRXBpbG9ndWUuXG4gIC8vXG5cbiAgLy8gU3BlY2lhbCBjYXNlOiBsYXN0IG1hcHBpbmcncyBub2RlIGNvbnRhaW5zIG9ubHkgdGhlIGtleSBpbiBleHBsaWNpdCBub3RhdGlvbi5cbiAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7XG4gIH1cblxuICAvLyBFeHBvc2UgdGhlIHJlc3VsdGluZyBtYXBwaW5nLlxuICBpZiAoZGV0ZWN0ZWQpIHtcbiAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgc3RhdGUua2luZCA9ICdtYXBwaW5nJztcbiAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIGRldGVjdGVkO1xufVxuXG5mdW5jdGlvbiByZWFkVGFnUHJvcGVydHkoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbixcbiAgICAgIGlzVmVyYmF0aW0gPSBmYWxzZSxcbiAgICAgIGlzTmFtZWQgICAgPSBmYWxzZSxcbiAgICAgIHRhZ0hhbmRsZSxcbiAgICAgIHRhZ05hbWUsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyMS8qICEgKi8pIHJldHVybiBmYWxzZTtcblxuICBpZiAoc3RhdGUudGFnICE9PSBudWxsKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mIGEgdGFnIHByb3BlcnR5Jyk7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDNDLyogPCAqLykge1xuICAgIGlzVmVyYmF0aW0gPSB0cnVlO1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB9IGVsc2UgaWYgKGNoID09PSAweDIxLyogISAqLykge1xuICAgIGlzTmFtZWQgPSB0cnVlO1xuICAgIHRhZ0hhbmRsZSA9ICchISc7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIH0gZWxzZSB7XG4gICAgdGFnSGFuZGxlID0gJyEnO1xuICB9XG5cbiAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgaWYgKGlzVmVyYmF0aW0pIHtcbiAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgIHdoaWxlIChjaCAhPT0gMCAmJiBjaCAhPT0gMHgzRS8qID4gKi8pO1xuXG4gICAgaWYgKHN0YXRlLnBvc2l0aW9uIDwgc3RhdGUubGVuZ3RoKSB7XG4gICAgICB0YWdOYW1lID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHZlcmJhdGltIHRhZycpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcblxuICAgICAgaWYgKGNoID09PSAweDIxLyogISAqLykge1xuICAgICAgICBpZiAoIWlzTmFtZWQpIHtcbiAgICAgICAgICB0YWdIYW5kbGUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24gLSAxLCBzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgICAgICAgaWYgKCFQQVRURVJOX1RBR19IQU5ETEUudGVzdCh0YWdIYW5kbGUpKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZWQgdGFnIGhhbmRsZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpc05hbWVkID0gdHJ1ZTtcbiAgICAgICAgICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbiArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZXhjbGFtYXRpb24gbWFya3MnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgdGFnTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKFBBVFRFUk5fRkxPV19JTkRJQ0FUT1JTLnRlc3QodGFnTmFtZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGZsb3cgaW5kaWNhdG9yIGNoYXJhY3RlcnMnKTtcbiAgICB9XG4gIH1cblxuICBpZiAodGFnTmFtZSAmJiAhUEFUVEVSTl9UQUdfVVJJLnRlc3QodGFnTmFtZSkpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIG5hbWUgY2Fubm90IGNvbnRhaW4gc3VjaCBjaGFyYWN0ZXJzOiAnICsgdGFnTmFtZSk7XG4gIH1cblxuICBpZiAoaXNWZXJiYXRpbSkge1xuICAgIHN0YXRlLnRhZyA9IHRhZ05hbWU7XG5cbiAgfSBlbHNlIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50YWdNYXAsIHRhZ0hhbmRsZSkpIHtcbiAgICBzdGF0ZS50YWcgPSBzdGF0ZS50YWdNYXBbdGFnSGFuZGxlXSArIHRhZ05hbWU7XG5cbiAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICchJykge1xuICAgIHN0YXRlLnRhZyA9ICchJyArIHRhZ05hbWU7XG5cbiAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICchIScpIHtcbiAgICBzdGF0ZS50YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6JyArIHRhZ05hbWU7XG5cbiAgfSBlbHNlIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5kZWNsYXJlZCB0YWcgaGFuZGxlIFwiJyArIHRhZ0hhbmRsZSArICdcIicpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRBbmNob3JQcm9wZXJ0eShzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjYvKiAmICovKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiBhbiBhbmNob3IgcHJvcGVydHknKTtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpICYmICFpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBpZiAoc3RhdGUucG9zaXRpb24gPT09IF9wb3NpdGlvbikge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICduYW1lIG9mIGFuIGFuY2hvciBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyJyk7XG4gIH1cblxuICBzdGF0ZS5hbmNob3IgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRBbGlhcyhzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uLCBhbGlhcyxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDJBLyogKiAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpICYmICFpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBpZiAoc3RhdGUucG9zaXRpb24gPT09IF9wb3NpdGlvbikge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICduYW1lIG9mIGFuIGFsaWFzIG5vZGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXInKTtcbiAgfVxuXG4gIGFsaWFzID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKCFzdGF0ZS5hbmNob3JNYXAuaGFzT3duUHJvcGVydHkoYWxpYXMpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuaWRlbnRpZmllZCBhbGlhcyBcIicgKyBhbGlhcyArICdcIicpO1xuICB9XG5cbiAgc3RhdGUucmVzdWx0ID0gc3RhdGUuYW5jaG9yTWFwW2FsaWFzXTtcbiAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29tcG9zZU5vZGUoc3RhdGUsIHBhcmVudEluZGVudCwgbm9kZUNvbnRleHQsIGFsbG93VG9TZWVrLCBhbGxvd0NvbXBhY3QpIHtcbiAgdmFyIGFsbG93QmxvY2tTdHlsZXMsXG4gICAgICBhbGxvd0Jsb2NrU2NhbGFycyxcbiAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyxcbiAgICAgIGluZGVudFN0YXR1cyA9IDEsIC8vIDE6IHRoaXM+cGFyZW50LCAwOiB0aGlzPXBhcmVudCwgLTE6IHRoaXM8cGFyZW50XG4gICAgICBhdE5ld0xpbmUgID0gZmFsc2UsXG4gICAgICBoYXNDb250ZW50ID0gZmFsc2UsXG4gICAgICB0eXBlSW5kZXgsXG4gICAgICB0eXBlUXVhbnRpdHksXG4gICAgICB0eXBlLFxuICAgICAgZmxvd0luZGVudCxcbiAgICAgIGJsb2NrSW5kZW50O1xuXG4gIGlmIChzdGF0ZS5saXN0ZW5lciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmxpc3RlbmVyKCdvcGVuJywgc3RhdGUpO1xuICB9XG5cbiAgc3RhdGUudGFnICAgID0gbnVsbDtcbiAgc3RhdGUuYW5jaG9yID0gbnVsbDtcbiAgc3RhdGUua2luZCAgID0gbnVsbDtcbiAgc3RhdGUucmVzdWx0ID0gbnVsbDtcblxuICBhbGxvd0Jsb2NrU3R5bGVzID0gYWxsb3dCbG9ja1NjYWxhcnMgPSBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPVxuICAgIENPTlRFWFRfQkxPQ0tfT1VUID09PSBub2RlQ29udGV4dCB8fFxuICAgIENPTlRFWFRfQkxPQ0tfSU4gID09PSBub2RlQ29udGV4dDtcblxuICBpZiAoYWxsb3dUb1NlZWspIHtcbiAgICBpZiAoc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpKSB7XG4gICAgICBhdE5ld0xpbmUgPSB0cnVlO1xuXG4gICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IHBhcmVudEluZGVudCkge1xuICAgICAgICBpbmRlbnRTdGF0dXMgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50ID09PSBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgaW5kZW50U3RhdHVzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IHBhcmVudEluZGVudCkge1xuICAgICAgICBpbmRlbnRTdGF0dXMgPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7XG4gICAgd2hpbGUgKHJlYWRUYWdQcm9wZXJ0eShzdGF0ZSkgfHwgcmVhZEFuY2hvclByb3BlcnR5KHN0YXRlKSkge1xuICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkge1xuICAgICAgICBhdE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBhbGxvd0Jsb2NrU3R5bGVzO1xuXG4gICAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gcGFyZW50SW5kZW50KSB7XG4gICAgICAgICAgaW5kZW50U3RhdHVzID0gMTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50ID09PSBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAtMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGFsbG93QmxvY2tDb2xsZWN0aW9ucykge1xuICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGF0TmV3TGluZSB8fCBhbGxvd0NvbXBhY3Q7XG4gIH1cblxuICBpZiAoaW5kZW50U3RhdHVzID09PSAxIHx8IENPTlRFWFRfQkxPQ0tfT1VUID09PSBub2RlQ29udGV4dCkge1xuICAgIGlmIChDT05URVhUX0ZMT1dfSU4gPT09IG5vZGVDb250ZXh0IHx8IENPTlRFWFRfRkxPV19PVVQgPT09IG5vZGVDb250ZXh0KSB7XG4gICAgICBmbG93SW5kZW50ID0gcGFyZW50SW5kZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBmbG93SW5kZW50ID0gcGFyZW50SW5kZW50ICsgMTtcbiAgICB9XG5cbiAgICBibG9ja0luZGVudCA9IHN0YXRlLnBvc2l0aW9uIC0gc3RhdGUubGluZVN0YXJ0O1xuXG4gICAgaWYgKGluZGVudFN0YXR1cyA9PT0gMSkge1xuICAgICAgaWYgKGFsbG93QmxvY2tDb2xsZWN0aW9ucyAmJlxuICAgICAgICAgIChyZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZSwgYmxvY2tJbmRlbnQpIHx8XG4gICAgICAgICAgIHJlYWRCbG9ja01hcHBpbmcoc3RhdGUsIGJsb2NrSW5kZW50LCBmbG93SW5kZW50KSkgfHxcbiAgICAgICAgICByZWFkRmxvd0NvbGxlY3Rpb24oc3RhdGUsIGZsb3dJbmRlbnQpKSB7XG4gICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKChhbGxvd0Jsb2NrU2NhbGFycyAmJiByZWFkQmxvY2tTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpKSB8fFxuICAgICAgICAgICAgcmVhZFNpbmdsZVF1b3RlZFNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkgfHxcbiAgICAgICAgICAgIHJlYWREb3VibGVRdW90ZWRTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpKSB7XG4gICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWFkQWxpYXMoc3RhdGUpKSB7XG4gICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc3RhdGUudGFnICE9PSBudWxsIHx8IHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2FsaWFzIG5vZGUgc2hvdWxkIG5vdCBoYXZlIGFueSBwcm9wZXJ0aWVzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAocmVhZFBsYWluU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50LCBDT05URVhUX0ZMT1dfSU4gPT09IG5vZGVDb250ZXh0KSkge1xuICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLnRhZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhdGUudGFnID0gJz8nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5kZW50U3RhdHVzID09PSAwKSB7XG4gICAgICAvLyBTcGVjaWFsIGNhc2U6IGJsb2NrIHNlcXVlbmNlcyBhcmUgYWxsb3dlZCB0byBoYXZlIHNhbWUgaW5kZW50YXRpb24gbGV2ZWwgYXMgdGhlIHBhcmVudC5cbiAgICAgIC8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjc5OTc4NFxuICAgICAgaGFzQ29udGVudCA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyAmJiByZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZSwgYmxvY2tJbmRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS50YWcgIT09IG51bGwgJiYgc3RhdGUudGFnICE9PSAnIScpIHtcbiAgICBpZiAoc3RhdGUudGFnID09PSAnPycpIHtcbiAgICAgIGZvciAodHlwZUluZGV4ID0gMCwgdHlwZVF1YW50aXR5ID0gc3RhdGUuaW1wbGljaXRUeXBlcy5sZW5ndGg7XG4gICAgICAgICAgIHR5cGVJbmRleCA8IHR5cGVRdWFudGl0eTtcbiAgICAgICAgICAgdHlwZUluZGV4ICs9IDEpIHtcbiAgICAgICAgdHlwZSA9IHN0YXRlLmltcGxpY2l0VHlwZXNbdHlwZUluZGV4XTtcblxuICAgICAgICAvLyBJbXBsaWNpdCByZXNvbHZpbmcgaXMgbm90IGFsbG93ZWQgZm9yIG5vbi1zY2FsYXIgdHlwZXMsIGFuZCAnPydcbiAgICAgICAgLy8gbm9uLXNwZWNpZmljIHRhZyBpcyBvbmx5IGFzc2lnbmVkIHRvIHBsYWluIHNjYWxhcnMuIFNvLCBpdCBpc24ndFxuICAgICAgICAvLyBuZWVkZWQgdG8gY2hlY2sgZm9yICdraW5kJyBjb25mb3JtaXR5LlxuXG4gICAgICAgIGlmICh0eXBlLnJlc29sdmUoc3RhdGUucmVzdWx0KSkgeyAvLyBgc3RhdGUucmVzdWx0YCB1cGRhdGVkIGluIHJlc29sdmVyIGlmIG1hdGNoZWRcbiAgICAgICAgICBzdGF0ZS5yZXN1bHQgPSB0eXBlLmNvbnN0cnVjdChzdGF0ZS5yZXN1bHQpO1xuICAgICAgICAgIHN0YXRlLnRhZyA9IHR5cGUudGFnO1xuICAgICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudHlwZU1hcCwgc3RhdGUudGFnKSkge1xuICAgICAgdHlwZSA9IHN0YXRlLnR5cGVNYXBbc3RhdGUudGFnXTtcblxuICAgICAgaWYgKHN0YXRlLnJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlLmtpbmQgIT09IHN0YXRlLmtpbmQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuYWNjZXB0YWJsZSBub2RlIGtpbmQgZm9yICE8JyArIHN0YXRlLnRhZyArICc+IHRhZzsgaXQgc2hvdWxkIGJlIFwiJyArIHR5cGUua2luZCArICdcIiwgbm90IFwiJyArIHN0YXRlLmtpbmQgKyAnXCInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0eXBlLnJlc29sdmUoc3RhdGUucmVzdWx0KSkgeyAvLyBgc3RhdGUucmVzdWx0YCB1cGRhdGVkIGluIHJlc29sdmVyIGlmIG1hdGNoZWRcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2Nhbm5vdCByZXNvbHZlIGEgbm9kZSB3aXRoICE8JyArIHN0YXRlLnRhZyArICc+IGV4cGxpY2l0IHRhZycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ID0gdHlwZS5jb25zdHJ1Y3Qoc3RhdGUucmVzdWx0KTtcbiAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmtub3duIHRhZyAhPCcgKyBzdGF0ZS50YWcgKyAnPicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5saXN0ZW5lciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmxpc3RlbmVyKCdjbG9zZScsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gc3RhdGUudGFnICE9PSBudWxsIHx8ICBzdGF0ZS5hbmNob3IgIT09IG51bGwgfHwgaGFzQ29udGVudDtcbn1cblxuZnVuY3Rpb24gcmVhZERvY3VtZW50KHN0YXRlKSB7XG4gIHZhciBkb2N1bWVudFN0YXJ0ID0gc3RhdGUucG9zaXRpb24sXG4gICAgICBfcG9zaXRpb24sXG4gICAgICBkaXJlY3RpdmVOYW1lLFxuICAgICAgZGlyZWN0aXZlQXJncyxcbiAgICAgIGhhc0RpcmVjdGl2ZXMgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIHN0YXRlLnZlcnNpb24gPSBudWxsO1xuICBzdGF0ZS5jaGVja0xpbmVCcmVha3MgPSBzdGF0ZS5sZWdhY3k7XG4gIHN0YXRlLnRhZ01hcCA9IHt9O1xuICBzdGF0ZS5hbmNob3JNYXAgPSB7fTtcblxuICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gMCB8fCBjaCAhPT0gMHgyNS8qICUgKi8pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlO1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkge1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGRpcmVjdGl2ZU5hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcbiAgICBkaXJlY3RpdmVBcmdzID0gW107XG5cbiAgICBpZiAoZGlyZWN0aXZlTmFtZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZGlyZWN0aXZlIG5hbWUgbXVzdCBub3QgYmUgbGVzcyB0aGFuIG9uZSBjaGFyYWN0ZXIgaW4gbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX0VPTChjaCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzX0VPTChjaCkpIGJyZWFrO1xuXG4gICAgICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZGlyZWN0aXZlQXJncy5wdXNoKHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pKTtcbiAgICB9XG5cbiAgICBpZiAoY2ggIT09IDApIHJlYWRMaW5lQnJlYWsoc3RhdGUpO1xuXG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKGRpcmVjdGl2ZUhhbmRsZXJzLCBkaXJlY3RpdmVOYW1lKSkge1xuICAgICAgZGlyZWN0aXZlSGFuZGxlcnNbZGlyZWN0aXZlTmFtZV0oc3RhdGUsIGRpcmVjdGl2ZU5hbWUsIGRpcmVjdGl2ZUFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICd1bmtub3duIGRvY3VtZW50IGRpcmVjdGl2ZSBcIicgKyBkaXJlY3RpdmVOYW1lICsgJ1wiJyk7XG4gICAgfVxuICB9XG5cbiAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gIGlmIChzdGF0ZS5saW5lSW5kZW50ID09PSAwICYmXG4gICAgICBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSAgICAgPT09IDB4MkQvKiAtICovICYmXG4gICAgICBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSkgPT09IDB4MkQvKiAtICovICYmXG4gICAgICBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMikgPT09IDB4MkQvKiAtICovKSB7XG4gICAgc3RhdGUucG9zaXRpb24gKz0gMztcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgfSBlbHNlIGlmIChoYXNEaXJlY3RpdmVzKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2RpcmVjdGl2ZXMgZW5kIG1hcmsgaXMgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIGNvbXBvc2VOb2RlKHN0YXRlLCBzdGF0ZS5saW5lSW5kZW50IC0gMSwgQ09OVEVYVF9CTE9DS19PVVQsIGZhbHNlLCB0cnVlKTtcbiAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gIGlmIChzdGF0ZS5jaGVja0xpbmVCcmVha3MgJiZcbiAgICAgIFBBVFRFUk5fTk9OX0FTQ0lJX0xJTkVfQlJFQUtTLnRlc3Qoc3RhdGUuaW5wdXQuc2xpY2UoZG9jdW1lbnRTdGFydCwgc3RhdGUucG9zaXRpb24pKSkge1xuICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ25vbi1BU0NJSSBsaW5lIGJyZWFrcyBhcmUgaW50ZXJwcmV0ZWQgYXMgY29udGVudCcpO1xuICB9XG5cbiAgc3RhdGUuZG9jdW1lbnRzLnB1c2goc3RhdGUucmVzdWx0KTtcblxuICBpZiAoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB7XG5cbiAgICBpZiAoc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgPT09IDB4MkUvKiAuICovKSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbiArPSAzO1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc3RhdGUucG9zaXRpb24gPCAoc3RhdGUubGVuZ3RoIC0gMSkpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZW5kIG9mIHRoZSBzdHJlYW0gb3IgYSBkb2N1bWVudCBzZXBhcmF0b3IgaXMgZXhwZWN0ZWQnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBsb2FkRG9jdW1lbnRzKGlucHV0LCBvcHRpb25zKSB7XG4gIGlucHV0ID0gU3RyaW5nKGlucHV0KTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKGlucHV0Lmxlbmd0aCAhPT0gMCkge1xuXG4gICAgLy8gQWRkIHRhaWxpbmcgYFxcbmAgaWYgbm90IGV4aXN0c1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KGlucHV0Lmxlbmd0aCAtIDEpICE9PSAweDBBLyogTEYgKi8gJiZcbiAgICAgICAgaW5wdXQuY2hhckNvZGVBdChpbnB1dC5sZW5ndGggLSAxKSAhPT0gMHgwRC8qIENSICovKSB7XG4gICAgICBpbnB1dCArPSAnXFxuJztcbiAgICB9XG5cbiAgICAvLyBTdHJpcCBCT01cbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XG4gICAgICBpbnB1dCA9IGlucHV0LnNsaWNlKDEpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdGF0ZSA9IG5ldyBTdGF0ZShpbnB1dCwgb3B0aW9ucyk7XG5cbiAgLy8gVXNlIDAgYXMgc3RyaW5nIHRlcm1pbmF0b3IuIFRoYXQgc2lnbmlmaWNhbnRseSBzaW1wbGlmaWVzIGJvdW5kcyBjaGVjay5cbiAgc3RhdGUuaW5wdXQgKz0gJ1xcMCc7XG5cbiAgd2hpbGUgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAweDIwLyogU3BhY2UgKi8pIHtcbiAgICBzdGF0ZS5saW5lSW5kZW50ICs9IDE7XG4gICAgc3RhdGUucG9zaXRpb24gKz0gMTtcbiAgfVxuXG4gIHdoaWxlIChzdGF0ZS5wb3NpdGlvbiA8IChzdGF0ZS5sZW5ndGggLSAxKSkge1xuICAgIHJlYWREb2N1bWVudChzdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGUuZG9jdW1lbnRzO1xufVxuXG5cbmZ1bmN0aW9uIGxvYWRBbGwoaW5wdXQsIGl0ZXJhdG9yLCBvcHRpb25zKSB7XG4gIHZhciBkb2N1bWVudHMgPSBsb2FkRG9jdW1lbnRzKGlucHV0LCBvcHRpb25zKSwgaW5kZXgsIGxlbmd0aDtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gZG9jdW1lbnRzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBpdGVyYXRvcihkb2N1bWVudHNbaW5kZXhdKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGxvYWQoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIGlmIChkb2N1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgLyplc2xpbnQtZGlzYWJsZSBuby11bmRlZmluZWQqL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBkb2N1bWVudHNbMF07XG4gIH1cbiAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ2V4cGVjdGVkIGEgc2luZ2xlIGRvY3VtZW50IGluIHRoZSBzdHJlYW0sIGJ1dCBmb3VuZCBtb3JlJyk7XG59XG5cblxuZnVuY3Rpb24gc2FmZUxvYWRBbGwoaW5wdXQsIG91dHB1dCwgb3B0aW9ucykge1xuICBsb2FkQWxsKGlucHV0LCBvdXRwdXQsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpO1xufVxuXG5cbmZ1bmN0aW9uIHNhZmVMb2FkKGlucHV0LCBvcHRpb25zKSB7XG4gIHJldHVybiBsb2FkKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cy5sb2FkQWxsICAgICA9IGxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5sb2FkICAgICAgICA9IGxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZEFsbCA9IHNhZmVMb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWQgICAgPSBzYWZlTG9hZDtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxuXG5mdW5jdGlvbiBNYXJrKG5hbWUsIGJ1ZmZlciwgcG9zaXRpb24sIGxpbmUsIGNvbHVtbikge1xuICB0aGlzLm5hbWUgICAgID0gbmFtZTtcbiAgdGhpcy5idWZmZXIgICA9IGJ1ZmZlcjtcbiAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICB0aGlzLmxpbmUgICAgID0gbGluZTtcbiAgdGhpcy5jb2x1bW4gICA9IGNvbHVtbjtcbn1cblxuXG5NYXJrLnByb3RvdHlwZS5nZXRTbmlwcGV0ID0gZnVuY3Rpb24gZ2V0U25pcHBldChpbmRlbnQsIG1heExlbmd0aCkge1xuICB2YXIgaGVhZCwgc3RhcnQsIHRhaWwsIGVuZCwgc25pcHBldDtcblxuICBpZiAoIXRoaXMuYnVmZmVyKSByZXR1cm4gbnVsbDtcblxuICBpbmRlbnQgPSBpbmRlbnQgfHwgNDtcbiAgbWF4TGVuZ3RoID0gbWF4TGVuZ3RoIHx8IDc1O1xuXG4gIGhlYWQgPSAnJztcbiAgc3RhcnQgPSB0aGlzLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChzdGFydCA+IDAgJiYgJ1xceDAwXFxyXFxuXFx4ODVcXHUyMDI4XFx1MjAyOScuaW5kZXhPZih0aGlzLmJ1ZmZlci5jaGFyQXQoc3RhcnQgLSAxKSkgPT09IC0xKSB7XG4gICAgc3RhcnQgLT0gMTtcbiAgICBpZiAodGhpcy5wb3NpdGlvbiAtIHN0YXJ0ID4gKG1heExlbmd0aCAvIDIgLSAxKSkge1xuICAgICAgaGVhZCA9ICcgLi4uICc7XG4gICAgICBzdGFydCArPSA1O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdGFpbCA9ICcnO1xuICBlbmQgPSB0aGlzLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChlbmQgPCB0aGlzLmJ1ZmZlci5sZW5ndGggJiYgJ1xceDAwXFxyXFxuXFx4ODVcXHUyMDI4XFx1MjAyOScuaW5kZXhPZih0aGlzLmJ1ZmZlci5jaGFyQXQoZW5kKSkgPT09IC0xKSB7XG4gICAgZW5kICs9IDE7XG4gICAgaWYgKGVuZCAtIHRoaXMucG9zaXRpb24gPiAobWF4TGVuZ3RoIC8gMiAtIDEpKSB7XG4gICAgICB0YWlsID0gJyAuLi4gJztcbiAgICAgIGVuZCAtPSA1O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc25pcHBldCA9IHRoaXMuYnVmZmVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gIHJldHVybiBjb21tb24ucmVwZWF0KCcgJywgaW5kZW50KSArIGhlYWQgKyBzbmlwcGV0ICsgdGFpbCArICdcXG4nICtcbiAgICAgICAgIGNvbW1vbi5yZXBlYXQoJyAnLCBpbmRlbnQgKyB0aGlzLnBvc2l0aW9uIC0gc3RhcnQgKyBoZWFkLmxlbmd0aCkgKyAnXic7XG59O1xuXG5cbk1hcmsucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoY29tcGFjdCkge1xuICB2YXIgc25pcHBldCwgd2hlcmUgPSAnJztcblxuICBpZiAodGhpcy5uYW1lKSB7XG4gICAgd2hlcmUgKz0gJ2luIFwiJyArIHRoaXMubmFtZSArICdcIiAnO1xuICB9XG5cbiAgd2hlcmUgKz0gJ2F0IGxpbmUgJyArICh0aGlzLmxpbmUgKyAxKSArICcsIGNvbHVtbiAnICsgKHRoaXMuY29sdW1uICsgMSk7XG5cbiAgaWYgKCFjb21wYWN0KSB7XG4gICAgc25pcHBldCA9IHRoaXMuZ2V0U25pcHBldCgpO1xuXG4gICAgaWYgKHNuaXBwZXQpIHtcbiAgICAgIHdoZXJlICs9ICc6XFxuJyArIHNuaXBwZXQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdoZXJlO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcms7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbWF4LWxlbiovXG5cbnZhciBjb21tb24gICAgICAgID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcbnZhciBUeXBlICAgICAgICAgID0gcmVxdWlyZSgnLi90eXBlJyk7XG5cblxuZnVuY3Rpb24gY29tcGlsZUxpc3Qoc2NoZW1hLCBuYW1lLCByZXN1bHQpIHtcbiAgdmFyIGV4Y2x1ZGUgPSBbXTtcblxuICBzY2hlbWEuaW5jbHVkZS5mb3JFYWNoKGZ1bmN0aW9uIChpbmNsdWRlZFNjaGVtYSkge1xuICAgIHJlc3VsdCA9IGNvbXBpbGVMaXN0KGluY2x1ZGVkU2NoZW1hLCBuYW1lLCByZXN1bHQpO1xuICB9KTtcblxuICBzY2hlbWFbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAoY3VycmVudFR5cGUpIHtcbiAgICByZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocHJldmlvdXNUeXBlLCBwcmV2aW91c0luZGV4KSB7XG4gICAgICBpZiAocHJldmlvdXNUeXBlLnRhZyA9PT0gY3VycmVudFR5cGUudGFnKSB7XG4gICAgICAgIGV4Y2x1ZGUucHVzaChwcmV2aW91c0luZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlc3VsdC5wdXNoKGN1cnJlbnRUeXBlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdC5maWx0ZXIoZnVuY3Rpb24gKHR5cGUsIGluZGV4KSB7XG4gICAgcmV0dXJuIGV4Y2x1ZGUuaW5kZXhPZihpbmRleCkgPT09IC0xO1xuICB9KTtcbn1cblxuXG5mdW5jdGlvbiBjb21waWxlTWFwKC8qIGxpc3RzLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7fSwgaW5kZXgsIGxlbmd0aDtcblxuICBmdW5jdGlvbiBjb2xsZWN0VHlwZSh0eXBlKSB7XG4gICAgcmVzdWx0W3R5cGUudGFnXSA9IHR5cGU7XG4gIH1cblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBhcmd1bWVudHNbaW5kZXhdLmZvckVhY2goY29sbGVjdFR5cGUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5mdW5jdGlvbiBTY2hlbWEoZGVmaW5pdGlvbikge1xuICB0aGlzLmluY2x1ZGUgID0gZGVmaW5pdGlvbi5pbmNsdWRlICB8fCBbXTtcbiAgdGhpcy5pbXBsaWNpdCA9IGRlZmluaXRpb24uaW1wbGljaXQgfHwgW107XG4gIHRoaXMuZXhwbGljaXQgPSBkZWZpbml0aW9uLmV4cGxpY2l0IHx8IFtdO1xuXG4gIHRoaXMuaW1wbGljaXQuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgIGlmICh0eXBlLmxvYWRLaW5kICYmIHR5cGUubG9hZEtpbmQgIT09ICdzY2FsYXInKSB7XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVGhlcmUgaXMgYSBub24tc2NhbGFyIHR5cGUgaW4gdGhlIGltcGxpY2l0IGxpc3Qgb2YgYSBzY2hlbWEuIEltcGxpY2l0IHJlc29sdmluZyBvZiBzdWNoIHR5cGVzIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLmNvbXBpbGVkSW1wbGljaXQgPSBjb21waWxlTGlzdCh0aGlzLCAnaW1wbGljaXQnLCBbXSk7XG4gIHRoaXMuY29tcGlsZWRFeHBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICdleHBsaWNpdCcsIFtdKTtcbiAgdGhpcy5jb21waWxlZFR5cGVNYXAgID0gY29tcGlsZU1hcCh0aGlzLmNvbXBpbGVkSW1wbGljaXQsIHRoaXMuY29tcGlsZWRFeHBsaWNpdCk7XG59XG5cblxuU2NoZW1hLkRFRkFVTFQgPSBudWxsO1xuXG5cblNjaGVtYS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGVTY2hlbWEoKSB7XG4gIHZhciBzY2hlbWFzLCB0eXBlcztcblxuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDE6XG4gICAgICBzY2hlbWFzID0gU2NoZW1hLkRFRkFVTFQ7XG4gICAgICB0eXBlcyA9IGFyZ3VtZW50c1swXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAyOlxuICAgICAgc2NoZW1hcyA9IGFyZ3VtZW50c1swXTtcbiAgICAgIHR5cGVzID0gYXJndW1lbnRzWzFdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1dyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIFNjaGVtYS5jcmVhdGUgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIHNjaGVtYXMgPSBjb21tb24udG9BcnJheShzY2hlbWFzKTtcbiAgdHlwZXMgPSBjb21tb24udG9BcnJheSh0eXBlcyk7XG5cbiAgaWYgKCFzY2hlbWFzLmV2ZXJ5KGZ1bmN0aW9uIChzY2hlbWEpIHsgcmV0dXJuIHNjaGVtYSBpbnN0YW5jZW9mIFNjaGVtYTsgfSkpIHtcbiAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignU3BlY2lmaWVkIGxpc3Qgb2Ygc3VwZXIgc2NoZW1hcyAob3IgYSBzaW5nbGUgU2NoZW1hIG9iamVjdCkgY29udGFpbnMgYSBub24tU2NoZW1hIG9iamVjdC4nKTtcbiAgfVxuXG4gIGlmICghdHlwZXMuZXZlcnkoZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIHR5cGUgaW5zdGFuY2VvZiBUeXBlOyB9KSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdTcGVjaWZpZWQgbGlzdCBvZiBZQU1MIHR5cGVzIChvciBhIHNpbmdsZSBUeXBlIG9iamVjdCkgY29udGFpbnMgYSBub24tVHlwZSBvYmplY3QuJyk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNjaGVtYSh7XG4gICAgaW5jbHVkZTogc2NoZW1hcyxcbiAgICBleHBsaWNpdDogdHlwZXNcbiAgfSk7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gU2NoZW1hO1xuIiwiLy8gU3RhbmRhcmQgWUFNTCdzIENvcmUgc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODA0OTIzXG4vL1xuLy8gTk9URTogSlMtWUFNTCBkb2VzIG5vdCBzdXBwb3J0IHNjaGVtYS1zcGVjaWZpYyB0YWcgcmVzb2x1dGlvbiByZXN0cmljdGlvbnMuXG4vLyBTbywgQ29yZSBzY2hlbWEgaGFzIG5vIGRpc3RpbmN0aW9ucyBmcm9tIEpTT04gc2NoZW1hIGlzIEpTLVlBTUwuXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9qc29uJylcbiAgXVxufSk7XG4iLCIvLyBKUy1ZQU1MJ3MgZGVmYXVsdCBzY2hlbWEgZm9yIGBsb2FkYCBmdW5jdGlvbi5cbi8vIEl0IGlzIG5vdCBkZXNjcmliZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vXG4vLyBUaGlzIHNjaGVtYSBpcyBiYXNlZCBvbiBKUy1ZQU1MJ3MgZGVmYXVsdCBzYWZlIHNjaGVtYSBhbmQgaW5jbHVkZXNcbi8vIEphdmFTY3JpcHQtc3BlY2lmaWMgdHlwZXM6ICEhanMvdW5kZWZpbmVkLCAhIWpzL3JlZ2V4cCBhbmQgISFqcy9mdW5jdGlvbi5cbi8vXG4vLyBBbHNvIHRoaXMgc2NoZW1hIGlzIHVzZWQgYXMgZGVmYXVsdCBiYXNlIHNjaGVtYSBhdCBgU2NoZW1hLmNyZWF0ZWAgZnVuY3Rpb24uXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFNjaGVtYS5ERUZBVUxUID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2RlZmF1bHRfc2FmZScpXG4gIF0sXG4gIGV4cGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy91bmRlZmluZWQnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL3JlZ2V4cCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvZnVuY3Rpb24nKVxuICBdXG59KTtcbiIsIi8vIEpTLVlBTUwncyBkZWZhdWx0IHNjaGVtYSBmb3IgYHNhZmVMb2FkYCBmdW5jdGlvbi5cbi8vIEl0IGlzIG5vdCBkZXNjcmliZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vXG4vLyBUaGlzIHNjaGVtYSBpcyBiYXNlZCBvbiBzdGFuZGFyZCBZQU1MJ3MgQ29yZSBzY2hlbWEgYW5kIGluY2x1ZGVzIG1vc3Qgb2Zcbi8vIGV4dHJhIHR5cGVzIGRlc2NyaWJlZCBhdCBZQU1MIHRhZyByZXBvc2l0b3J5LiAoaHR0cDovL3lhbWwub3JnL3R5cGUvKVxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vY29yZScpXG4gIF0sXG4gIGltcGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS90aW1lc3RhbXAnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL21lcmdlJylcbiAgXSxcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL2JpbmFyeScpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvb21hcCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvcGFpcnMnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL3NldCcpXG4gIF1cbn0pO1xuIiwiLy8gU3RhbmRhcmQgWUFNTCdzIEZhaWxzYWZlIHNjaGVtYS5cbi8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjgwMjM0NlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL3N0cicpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvc2VxJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9tYXAnKVxuICBdXG59KTtcbiIsIi8vIFN0YW5kYXJkIFlBTUwncyBKU09OIHNjaGVtYS5cbi8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjgwMzIzMVxuLy9cbi8vIE5PVEU6IEpTLVlBTUwgZG9lcyBub3Qgc3VwcG9ydCBzY2hlbWEtc3BlY2lmaWMgdGFnIHJlc29sdXRpb24gcmVzdHJpY3Rpb25zLlxuLy8gU28sIHRoaXMgc2NoZW1hIGlzIG5vdCBzdWNoIHN0cmljdCBhcyBkZWZpbmVkIGluIHRoZSBZQU1MIHNwZWNpZmljYXRpb24uXG4vLyBJdCBhbGxvd3MgbnVtYmVycyBpbiBiaW5hcnkgbm90YWlvbiwgdXNlIGBOdWxsYCBhbmQgYE5VTExgIGFzIGBudWxsYCwgZXRjLlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vZmFpbHNhZmUnKVxuICBdLFxuICBpbXBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvbnVsbCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvYm9vbCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvaW50JyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9mbG9hdCcpXG4gIF1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG5cbnZhciBUWVBFX0NPTlNUUlVDVE9SX09QVElPTlMgPSBbXG4gICdraW5kJyxcbiAgJ3Jlc29sdmUnLFxuICAnY29uc3RydWN0JyxcbiAgJ2luc3RhbmNlT2YnLFxuICAncHJlZGljYXRlJyxcbiAgJ3JlcHJlc2VudCcsXG4gICdkZWZhdWx0U3R5bGUnLFxuICAnc3R5bGVBbGlhc2VzJ1xuXTtcblxudmFyIFlBTUxfTk9ERV9LSU5EUyA9IFtcbiAgJ3NjYWxhcicsXG4gICdzZXF1ZW5jZScsXG4gICdtYXBwaW5nJ1xuXTtcblxuZnVuY3Rpb24gY29tcGlsZVN0eWxlQWxpYXNlcyhtYXApIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGlmIChtYXAgIT09IG51bGwpIHtcbiAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICBtYXBbc3R5bGVdLmZvckVhY2goZnVuY3Rpb24gKGFsaWFzKSB7XG4gICAgICAgIHJlc3VsdFtTdHJpbmcoYWxpYXMpXSA9IHN0eWxlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBUeXBlKHRhZywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBPYmplY3Qua2V5cyhvcHRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24gb3B0aW9uIFwiJyArIG5hbWUgKyAnXCIgaXMgbWV0IGluIGRlZmluaXRpb24gb2YgXCInICsgdGFnICsgJ1wiIFlBTUwgdHlwZS4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFRPRE86IEFkZCB0YWcgZm9ybWF0IGNoZWNrLlxuICB0aGlzLnRhZyAgICAgICAgICA9IHRhZztcbiAgdGhpcy5raW5kICAgICAgICAgPSBvcHRpb25zWydraW5kJ10gICAgICAgICB8fCBudWxsO1xuICB0aGlzLnJlc29sdmUgICAgICA9IG9wdGlvbnNbJ3Jlc29sdmUnXSAgICAgIHx8IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XG4gIHRoaXMuY29uc3RydWN0ICAgID0gb3B0aW9uc1snY29uc3RydWN0J10gICAgfHwgZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGE7IH07XG4gIHRoaXMuaW5zdGFuY2VPZiAgID0gb3B0aW9uc1snaW5zdGFuY2VPZiddICAgfHwgbnVsbDtcbiAgdGhpcy5wcmVkaWNhdGUgICAgPSBvcHRpb25zWydwcmVkaWNhdGUnXSAgICB8fCBudWxsO1xuICB0aGlzLnJlcHJlc2VudCAgICA9IG9wdGlvbnNbJ3JlcHJlc2VudCddICAgIHx8IG51bGw7XG4gIHRoaXMuZGVmYXVsdFN0eWxlID0gb3B0aW9uc1snZGVmYXVsdFN0eWxlJ10gfHwgbnVsbDtcbiAgdGhpcy5zdHlsZUFsaWFzZXMgPSBjb21waWxlU3R5bGVBbGlhc2VzKG9wdGlvbnNbJ3N0eWxlQWxpYXNlcyddIHx8IG51bGwpO1xuXG4gIGlmIChZQU1MX05PREVfS0lORFMuaW5kZXhPZih0aGlzLmtpbmQpID09PSAtMSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdVbmtub3duIGtpbmQgXCInICsgdGhpcy5raW5kICsgJ1wiIGlzIHNwZWNpZmllZCBmb3IgXCInICsgdGFnICsgJ1wiIFlBTUwgdHlwZS4nKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFR5cGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSovXG5cbi8vIEEgdHJpY2sgZm9yIGJyb3dzZXJpZmllZCB2ZXJzaW9uLlxuLy8gU2luY2Ugd2UgbWFrZSBicm93c2VyaWZpZXIgdG8gaWdub3JlIGBidWZmZXJgIG1vZHVsZSwgTm9kZUJ1ZmZlciB3aWxsIGJlIHVuZGVmaW5lZFxudmFyIE5vZGVCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG52YXIgVHlwZSAgICAgICA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuXG4vLyBbIDY0LCA2NSwgNjYgXSAtPiBbIHBhZGRpbmcsIENSLCBMRiBdXG52YXIgQkFTRTY0X01BUCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVxcblxccic7XG5cblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxCaW5hcnkoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBjb2RlLCBpZHgsIGJpdGxlbiA9IDAsIG1heCA9IGRhdGEubGVuZ3RoLCBtYXAgPSBCQVNFNjRfTUFQO1xuXG4gIC8vIENvbnZlcnQgb25lIGJ5IG9uZS5cbiAgZm9yIChpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrKSB7XG4gICAgY29kZSA9IG1hcC5pbmRleE9mKGRhdGEuY2hhckF0KGlkeCkpO1xuXG4gICAgLy8gU2tpcCBDUi9MRlxuICAgIGlmIChjb2RlID4gNjQpIGNvbnRpbnVlO1xuXG4gICAgLy8gRmFpbCBvbiBpbGxlZ2FsIGNoYXJhY3RlcnNcbiAgICBpZiAoY29kZSA8IDApIHJldHVybiBmYWxzZTtcblxuICAgIGJpdGxlbiArPSA2O1xuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIGFueSBiaXRzIGxlZnQsIHNvdXJjZSB3YXMgY29ycnVwdGVkXG4gIHJldHVybiAoYml0bGVuICUgOCkgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxCaW5hcnkoZGF0YSkge1xuICB2YXIgaWR4LCB0YWlsYml0cyxcbiAgICAgIGlucHV0ID0gZGF0YS5yZXBsYWNlKC9bXFxyXFxuPV0vZywgJycpLCAvLyByZW1vdmUgQ1IvTEYgJiBwYWRkaW5nIHRvIHNpbXBsaWZ5IHNjYW5cbiAgICAgIG1heCA9IGlucHV0Lmxlbmd0aCxcbiAgICAgIG1hcCA9IEJBU0U2NF9NQVAsXG4gICAgICBiaXRzID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIC8vIENvbGxlY3QgYnkgNio0IGJpdHMgKDMgYnl0ZXMpXG5cbiAgZm9yIChpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrKSB7XG4gICAgaWYgKChpZHggJSA0ID09PSAwKSAmJiBpZHgpIHtcbiAgICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDE2KSAmIDB4RkYpO1xuICAgICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gOCkgJiAweEZGKTtcbiAgICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAweEZGKTtcbiAgICB9XG5cbiAgICBiaXRzID0gKGJpdHMgPDwgNikgfCBtYXAuaW5kZXhPZihpbnB1dC5jaGFyQXQoaWR4KSk7XG4gIH1cblxuICAvLyBEdW1wIHRhaWxcblxuICB0YWlsYml0cyA9IChtYXggJSA0KSAqIDY7XG5cbiAgaWYgKHRhaWxiaXRzID09PSAwKSB7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTYpICYgMHhGRik7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gOCkgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaChiaXRzICYgMHhGRik7XG4gIH0gZWxzZSBpZiAodGFpbGJpdHMgPT09IDE4KSB7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTApICYgMHhGRik7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMikgJiAweEZGKTtcbiAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTIpIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiA0KSAmIDB4RkYpO1xuICB9XG5cbiAgLy8gV3JhcCBpbnRvIEJ1ZmZlciBmb3IgTm9kZUpTIGFuZCBsZWF2ZSBBcnJheSBmb3IgYnJvd3NlclxuICBpZiAoTm9kZUJ1ZmZlcikgcmV0dXJuIG5ldyBOb2RlQnVmZmVyKHJlc3VsdCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbEJpbmFyeShvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgdmFyIHJlc3VsdCA9ICcnLCBiaXRzID0gMCwgaWR4LCB0YWlsLFxuICAgICAgbWF4ID0gb2JqZWN0Lmxlbmd0aCxcbiAgICAgIG1hcCA9IEJBU0U2NF9NQVA7XG5cbiAgLy8gQ29udmVydCBldmVyeSB0aHJlZSBieXRlcyB0byA0IEFTQ0lJIGNoYXJhY3RlcnMuXG5cbiAgZm9yIChpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrKSB7XG4gICAgaWYgKChpZHggJSAzID09PSAwKSAmJiBpZHgpIHtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTgpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEyKSAmIDB4M0ZdO1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiA2KSAmIDB4M0ZdO1xuICAgICAgcmVzdWx0ICs9IG1hcFtiaXRzICYgMHgzRl07XG4gICAgfVxuXG4gICAgYml0cyA9IChiaXRzIDw8IDgpICsgb2JqZWN0W2lkeF07XG4gIH1cblxuICAvLyBEdW1wIHRhaWxcblxuICB0YWlsID0gbWF4ICUgMztcblxuICBpZiAodGFpbCA9PT0gMCkge1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTgpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDYpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFtiaXRzICYgMHgzRl07XG4gIH0gZWxzZSBpZiAodGFpbCA9PT0gMikge1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTApICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiA0KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPDwgMikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWzY0XTtcbiAgfSBlbHNlIGlmICh0YWlsID09PSAxKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPDwgNCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWzY0XTtcbiAgICByZXN1bHQgKz0gbWFwWzY0XTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzQmluYXJ5KG9iamVjdCkge1xuICByZXR1cm4gTm9kZUJ1ZmZlciAmJiBOb2RlQnVmZmVyLmlzQnVmZmVyKG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmJpbmFyeScsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sQmluYXJ5LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxCaW5hcnksXG4gIHByZWRpY2F0ZTogaXNCaW5hcnksXG4gIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbEJpbmFyeVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEJvb2xlYW4oZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aDtcblxuICByZXR1cm4gKG1heCA9PT0gNCAmJiAoZGF0YSA9PT0gJ3RydWUnIHx8IGRhdGEgPT09ICdUcnVlJyB8fCBkYXRhID09PSAnVFJVRScpKSB8fFxuICAgICAgICAgKG1heCA9PT0gNSAmJiAoZGF0YSA9PT0gJ2ZhbHNlJyB8fCBkYXRhID09PSAnRmFsc2UnIHx8IGRhdGEgPT09ICdGQUxTRScpKTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEJvb2xlYW4oZGF0YSkge1xuICByZXR1cm4gZGF0YSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICBkYXRhID09PSAnVHJ1ZScgfHxcbiAgICAgICAgIGRhdGEgPT09ICdUUlVFJztcbn1cblxuZnVuY3Rpb24gaXNCb29sZWFuKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEJvb2xlYW5dJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sQm9vbGVhbixcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sQm9vbGVhbixcbiAgcHJlZGljYXRlOiBpc0Jvb2xlYW4sXG4gIHJlcHJlc2VudDoge1xuICAgIGxvd2VyY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ3RydWUnIDogJ2ZhbHNlJzsgfSxcbiAgICB1cHBlcmNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICdUUlVFJyA6ICdGQUxTRSc7IH0sXG4gICAgY2FtZWxjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAnVHJ1ZScgOiAnRmFsc2UnOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2xvd2VyY2FzZSdcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgVHlwZSAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgWUFNTF9GTE9BVF9QQVRURVJOID0gbmV3IFJlZ0V4cChcbiAgJ14oPzpbLStdPyg/OlswLTldWzAtOV9dKilcXFxcLlswLTlfXSooPzpbZUVdWy0rXVswLTldKyk/JyArXG4gICd8XFxcXC5bMC05X10rKD86W2VFXVstK11bMC05XSspPycgK1xuICAnfFstK10/WzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKStcXFxcLlswLTlfXSonICtcbiAgJ3xbLStdP1xcXFwuKD86aW5mfEluZnxJTkYpJyArXG4gICd8XFxcXC4oPzpuYW58TmFOfE5BTikpJCcpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEZsb2F0KGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICBpZiAoIVlBTUxfRkxPQVRfUEFUVEVSTi50ZXN0KGRhdGEpKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxGbG9hdChkYXRhKSB7XG4gIHZhciB2YWx1ZSwgc2lnbiwgYmFzZSwgZGlnaXRzO1xuXG4gIHZhbHVlICA9IGRhdGEucmVwbGFjZSgvXy9nLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgc2lnbiAgID0gdmFsdWVbMF0gPT09ICctJyA/IC0xIDogMTtcbiAgZGlnaXRzID0gW107XG5cbiAgaWYgKCcrLScuaW5kZXhPZih2YWx1ZVswXSkgPj0gMCkge1xuICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gIH1cblxuICBpZiAodmFsdWUgPT09ICcuaW5mJykge1xuICAgIHJldHVybiAoc2lnbiA9PT0gMSkgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG5cbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJy5uYW4nKSB7XG4gICAgcmV0dXJuIE5hTjtcblxuICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJzonKSA+PSAwKSB7XG4gICAgdmFsdWUuc3BsaXQoJzonKS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUZsb2F0KHYsIDEwKSk7XG4gICAgfSk7XG5cbiAgICB2YWx1ZSA9IDAuMDtcbiAgICBiYXNlID0gMTtcblxuICAgIGRpZ2l0cy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgICB2YWx1ZSArPSBkICogYmFzZTtcbiAgICAgIGJhc2UgKj0gNjA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2lnbiAqIHZhbHVlO1xuXG4gIH1cbiAgcmV0dXJuIHNpZ24gKiBwYXJzZUZsb2F0KHZhbHVlLCAxMCk7XG59XG5cblxudmFyIFNDSUVOVElGSUNfV0lUSE9VVF9ET1QgPSAvXlstK10/WzAtOV0rZS87XG5cbmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxGbG9hdChvYmplY3QsIHN0eWxlKSB7XG4gIHZhciByZXM7XG5cbiAgaWYgKGlzTmFOKG9iamVjdCkpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy5uYW4nO1xuICAgICAgY2FzZSAndXBwZXJjYXNlJzogcmV0dXJuICcuTkFOJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLk5hTic7XG4gICAgfVxuICB9IGVsc2UgaWYgKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA9PT0gb2JqZWN0KSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICcuaW5mJztcbiAgICAgIGNhc2UgJ3VwcGVyY2FzZSc6IHJldHVybiAnLklORic7XG4gICAgICBjYXNlICdjYW1lbGNhc2UnOiByZXR1cm4gJy5JbmYnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IG9iamVjdCkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLS5pbmYnO1xuICAgICAgY2FzZSAndXBwZXJjYXNlJzogcmV0dXJuICctLklORic7XG4gICAgICBjYXNlICdjYW1lbGNhc2UnOiByZXR1cm4gJy0uSW5mJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpIHtcbiAgICByZXR1cm4gJy0wLjAnO1xuICB9XG5cbiAgcmVzID0gb2JqZWN0LnRvU3RyaW5nKDEwKTtcblxuICAvLyBKUyBzdHJpbmdpZmllciBjYW4gYnVpbGQgc2NpZW50aWZpYyBmb3JtYXQgd2l0aG91dCBkb3RzOiA1ZS0xMDAsXG4gIC8vIHdoaWxlIFlBTUwgcmVxdXJlcyBkb3Q6IDUuZS0xMDAuIEZpeCBpdCB3aXRoIHNpbXBsZSBoYWNrXG5cbiAgcmV0dXJuIFNDSUVOVElGSUNfV0lUSE9VVF9ET1QudGVzdChyZXMpID8gcmVzLnJlcGxhY2UoJ2UnLCAnLmUnKSA6IHJlcztcbn1cblxuZnVuY3Rpb24gaXNGbG9hdChvYmplY3QpIHtcbiAgcmV0dXJuIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgTnVtYmVyXScpICYmXG4gICAgICAgICAob2JqZWN0ICUgMSAhPT0gMCB8fCBjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxGbG9hdCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sRmxvYXQsXG4gIHByZWRpY2F0ZTogaXNGbG9hdCxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sRmxvYXQsXG4gIGRlZmF1bHRTdHlsZTogJ2xvd2VyY2FzZSdcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgVHlwZSAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiBpc0hleENvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHx8XG4gICAgICAgICAoKDB4NDEvKiBBICovIDw9IGMpICYmIChjIDw9IDB4NDYvKiBGICovKSkgfHxcbiAgICAgICAgICgoMHg2MS8qIGEgKi8gPD0gYykgJiYgKGMgPD0gMHg2Ni8qIGYgKi8pKTtcbn1cblxuZnVuY3Rpb24gaXNPY3RDb2RlKGMpIHtcbiAgcmV0dXJuICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzNy8qIDcgKi8pKTtcbn1cblxuZnVuY3Rpb24gaXNEZWNDb2RlKGMpIHtcbiAgcmV0dXJuICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxJbnRlZ2VyKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGgsXG4gICAgICBpbmRleCA9IDAsXG4gICAgICBoYXNEaWdpdHMgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIGlmICghbWF4KSByZXR1cm4gZmFsc2U7XG5cbiAgY2ggPSBkYXRhW2luZGV4XTtcblxuICAvLyBzaWduXG4gIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycpIHtcbiAgICBjaCA9IGRhdGFbKytpbmRleF07XG4gIH1cblxuICBpZiAoY2ggPT09ICcwJykge1xuICAgIC8vIDBcbiAgICBpZiAoaW5kZXggKyAxID09PSBtYXgpIHJldHVybiB0cnVlO1xuICAgIGNoID0gZGF0YVsrK2luZGV4XTtcblxuICAgIC8vIGJhc2UgMiwgYmFzZSA4LCBiYXNlIDE2XG5cbiAgICBpZiAoY2ggPT09ICdiJykge1xuICAgICAgLy8gYmFzZSAyXG4gICAgICBpbmRleCsrO1xuXG4gICAgICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICAgICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoY2ggIT09ICcwJyAmJiBjaCAhPT0gJzEnKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzRGlnaXRzO1xuICAgIH1cblxuXG4gICAgaWYgKGNoID09PSAneCcpIHtcbiAgICAgIC8vIGJhc2UgMTZcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICAgIGlmICghaXNIZXhDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzRGlnaXRzO1xuICAgIH1cblxuICAgIC8vIGJhc2UgOFxuICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNPY3RDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSByZXR1cm4gZmFsc2U7XG4gICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzRGlnaXRzO1xuICB9XG5cbiAgLy8gYmFzZSAxMCAoZXhjZXB0IDApIG9yIGJhc2UgNjBcblxuICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICBpZiAoY2ggPT09ICc6JykgYnJlYWs7XG4gICAgaWYgKCFpc0RlY0NvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaGFzRGlnaXRzKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gaWYgIWJhc2U2MCAtIGRvbmU7XG4gIGlmIChjaCAhPT0gJzonKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBiYXNlNjAgYWxtb3N0IG5vdCB1c2VkLCBubyBuZWVkcyB0byBvcHRpbWl6ZVxuICByZXR1cm4gL14oOlswLTVdP1swLTldKSskLy50ZXN0KGRhdGEuc2xpY2UoaW5kZXgpKTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEludGVnZXIoZGF0YSkge1xuICB2YXIgdmFsdWUgPSBkYXRhLCBzaWduID0gMSwgY2gsIGJhc2UsIGRpZ2l0cyA9IFtdO1xuXG4gIGlmICh2YWx1ZS5pbmRleE9mKCdfJykgIT09IC0xKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9fL2csICcnKTtcbiAgfVxuXG4gIGNoID0gdmFsdWVbMF07XG5cbiAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykge1xuICAgIGlmIChjaCA9PT0gJy0nKSBzaWduID0gLTE7XG4gICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgICBjaCA9IHZhbHVlWzBdO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnMCcpIHJldHVybiAwO1xuXG4gIGlmIChjaCA9PT0gJzAnKSB7XG4gICAgaWYgKHZhbHVlWzFdID09PSAnYicpIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIDIpO1xuICAgIGlmICh2YWx1ZVsxXSA9PT0gJ3gnKSByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCAxNik7XG4gICAgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgOCk7XG4gIH1cblxuICBpZiAodmFsdWUuaW5kZXhPZignOicpICE9PSAtMSkge1xuICAgIHZhbHVlLnNwbGl0KCc6JykuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgZGlnaXRzLnVuc2hpZnQocGFyc2VJbnQodiwgMTApKTtcbiAgICB9KTtcblxuICAgIHZhbHVlID0gMDtcbiAgICBiYXNlID0gMTtcblxuICAgIGRpZ2l0cy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgICB2YWx1ZSArPSAoZCAqIGJhc2UpO1xuICAgICAgYmFzZSAqPSA2MDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaWduICogdmFsdWU7XG5cbiAgfVxuXG4gIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDEwKTtcbn1cblxuZnVuY3Rpb24gaXNJbnRlZ2VyKG9iamVjdCkge1xuICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiZcbiAgICAgICAgIChvYmplY3QgJSAxID09PSAwICYmICFjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sSW50ZWdlcixcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sSW50ZWdlcixcbiAgcHJlZGljYXRlOiBpc0ludGVnZXIsXG4gIHJlcHJlc2VudDoge1xuICAgIGJpbmFyeTogICAgICBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAnMGInICsgb2JqZWN0LnRvU3RyaW5nKDIpOyB9LFxuICAgIG9jdGFsOiAgICAgICBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAnMCcgICsgb2JqZWN0LnRvU3RyaW5nKDgpOyB9LFxuICAgIGRlY2ltYWw6ICAgICBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAgICAgICAgb2JqZWN0LnRvU3RyaW5nKDEwKTsgfSxcbiAgICBoZXhhZGVjaW1hbDogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gJzB4JyArIG9iamVjdC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdkZWNpbWFsJyxcbiAgc3R5bGVBbGlhc2VzOiB7XG4gICAgYmluYXJ5OiAgICAgIFsgMiwgICdiaW4nIF0sXG4gICAgb2N0YWw6ICAgICAgIFsgOCwgICdvY3QnIF0sXG4gICAgZGVjaW1hbDogICAgIFsgMTAsICdkZWMnIF0sXG4gICAgaGV4YWRlY2ltYWw6IFsgMTYsICdoZXgnIF1cbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBlc3ByaW1hO1xuXG4vLyBCcm93c2VyaWZpZWQgdmVyc2lvbiBkb2VzIG5vdCBoYXZlIGVzcHJpbWFcbi8vXG4vLyAxLiBGb3Igbm9kZS5qcyBqdXN0IHJlcXVpcmUgbW9kdWxlIGFzIGRlcHNcbi8vIDIuIEZvciBicm93c2VyIHRyeSB0byByZXF1aXJlIG11ZHVsZSB2aWEgZXh0ZXJuYWwgQU1EIHN5c3RlbS5cbi8vICAgIElmIG5vdCBmb3VuZCAtIHRyeSB0byBmYWxsYmFjayB0byB3aW5kb3cuZXNwcmltYS4gSWYgbm90XG4vLyAgICBmb3VuZCB0b28gLSB0aGVuIGZhaWwgdG8gcGFyc2UuXG4vL1xudHJ5IHtcbiAgLy8gd29ya2Fyb3VuZCB0byBleGNsdWRlIHBhY2thZ2UgZnJvbSBicm93c2VyaWZ5IGxpc3QuXG4gIHZhciBfcmVxdWlyZSA9IHJlcXVpcmU7XG4gIGVzcHJpbWEgPSBfcmVxdWlyZSgnZXNwcmltYScpO1xufSBjYXRjaCAoXykge1xuICAvKmdsb2JhbCB3aW5kb3cgKi9cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSBlc3ByaW1hID0gd2luZG93LmVzcHJpbWE7XG59XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdEZ1bmN0aW9uKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIHZhciBzb3VyY2UgPSAnKCcgKyBkYXRhICsgJyknLFxuICAgICAgICBhc3QgICAgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KTtcblxuICAgIGlmIChhc3QudHlwZSAgICAgICAgICAgICAgICAgICAgIT09ICdQcm9ncmFtJyAgICAgICAgICAgICB8fFxuICAgICAgICBhc3QuYm9keS5sZW5ndGggICAgICAgICAgICAgIT09IDEgICAgICAgICAgICAgICAgICAgICB8fFxuICAgICAgICBhc3QuYm9keVswXS50eXBlICAgICAgICAgICAgIT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyB8fFxuICAgICAgICBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICdGdW5jdGlvbkV4cHJlc3Npb24nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24oZGF0YSkge1xuICAvKmpzbGludCBldmlsOnRydWUqL1xuXG4gIHZhciBzb3VyY2UgPSAnKCcgKyBkYXRhICsgJyknLFxuICAgICAgYXN0ICAgID0gZXNwcmltYS5wYXJzZShzb3VyY2UsIHsgcmFuZ2U6IHRydWUgfSksXG4gICAgICBwYXJhbXMgPSBbXSxcbiAgICAgIGJvZHk7XG5cbiAgaWYgKGFzdC50eXBlICAgICAgICAgICAgICAgICAgICAhPT0gJ1Byb2dyYW0nICAgICAgICAgICAgIHx8XG4gICAgICBhc3QuYm9keS5sZW5ndGggICAgICAgICAgICAgIT09IDEgICAgICAgICAgICAgICAgICAgICB8fFxuICAgICAgYXN0LmJvZHlbMF0udHlwZSAgICAgICAgICAgICE9PSAnRXhwcmVzc2lvblN0YXRlbWVudCcgfHxcbiAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBhc3QuYm9keVswXS5leHByZXNzaW9uLnBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgIHBhcmFtcy5wdXNoKHBhcmFtLm5hbWUpO1xuICB9KTtcblxuICBib2R5ID0gYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5ib2R5LnJhbmdlO1xuXG4gIC8vIEVzcHJpbWEncyByYW5nZXMgaW5jbHVkZSB0aGUgZmlyc3QgJ3snIGFuZCB0aGUgbGFzdCAnfScgY2hhcmFjdGVycyBvblxuICAvLyBmdW5jdGlvbiBleHByZXNzaW9ucy4gU28gY3V0IHRoZW0gb3V0LlxuICAvKmVzbGludC1kaXNhYmxlIG5vLW5ldy1mdW5jKi9cbiAgcmV0dXJuIG5ldyBGdW5jdGlvbihwYXJhbXMsIHNvdXJjZS5zbGljZShib2R5WzBdICsgMSwgYm9keVsxXSAtIDEpKTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uKG9iamVjdCAvKiwgc3R5bGUqLykge1xuICByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvZnVuY3Rpb24nLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdEZ1bmN0aW9uLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbixcbiAgcHJlZGljYXRlOiBpc0Z1bmN0aW9uLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvblxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciByZWdleHAgPSBkYXRhLFxuICAgICAgdGFpbCAgID0gL1xcLyhbZ2ltXSopJC8uZXhlYyhkYXRhKSxcbiAgICAgIG1vZGlmaWVycyA9ICcnO1xuXG4gIC8vIGlmIHJlZ2V4cCBzdGFydHMgd2l0aCAnLycgaXQgY2FuIGhhdmUgbW9kaWZpZXJzIGFuZCBtdXN0IGJlIHByb3Blcmx5IGNsb3NlZFxuICAvLyBgL2Zvby9naW1gIC0gbW9kaWZpZXJzIHRhaWwgY2FuIGJlIG1heGltdW0gMyBjaGFyc1xuICBpZiAocmVnZXhwWzBdID09PSAnLycpIHtcbiAgICBpZiAodGFpbCkgbW9kaWZpZXJzID0gdGFpbFsxXTtcblxuICAgIGlmIChtb2RpZmllcnMubGVuZ3RoID4gMykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGlmIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggLywgaXMgc2hvdWxkIGJlIHByb3Blcmx5IHRlcm1pbmF0ZWRcbiAgICBpZiAocmVnZXhwW3JlZ2V4cC5sZW5ndGggLSBtb2RpZmllcnMubGVuZ3RoIC0gMV0gIT09ICcvJykgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRSZWdFeHAoZGF0YSkge1xuICB2YXIgcmVnZXhwID0gZGF0YSxcbiAgICAgIHRhaWwgICA9IC9cXC8oW2dpbV0qKSQvLmV4ZWMoZGF0YSksXG4gICAgICBtb2RpZmllcnMgPSAnJztcblxuICAvLyBgL2Zvby9naW1gIC0gdGFpbCBjYW4gYmUgbWF4aW11bSA0IGNoYXJzXG4gIGlmIChyZWdleHBbMF0gPT09ICcvJykge1xuICAgIGlmICh0YWlsKSBtb2RpZmllcnMgPSB0YWlsWzFdO1xuICAgIHJlZ2V4cCA9IHJlZ2V4cC5zbGljZSgxLCByZWdleHAubGVuZ3RoIC0gbW9kaWZpZXJzLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWdFeHAocmVnZXhwLCBtb2RpZmllcnMpO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwKG9iamVjdCAvKiwgc3R5bGUqLykge1xuICB2YXIgcmVzdWx0ID0gJy8nICsgb2JqZWN0LnNvdXJjZSArICcvJztcblxuICBpZiAob2JqZWN0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKG9iamVjdC5tdWx0aWxpbmUpIHJlc3VsdCArPSAnbSc7XG4gIGlmIChvYmplY3QuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc1JlZ0V4cChvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvcmVnZXhwJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRSZWdFeHAsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFJlZ0V4cCxcbiAgcHJlZGljYXRlOiBpc1JlZ0V4cCxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCgpIHtcbiAgLyplc2xpbnQtZGlzYWJsZSBuby11bmRlZmluZWQqL1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmpzL3VuZGVmaW5lZCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRVbmRlZmluZWQsXG4gIHByZWRpY2F0ZTogaXNVbmRlZmluZWQsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdFVuZGVmaW5lZFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjptYXAnLCB7XG4gIGtpbmQ6ICdtYXBwaW5nJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE1lcmdlKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgPT09ICc8PCcgfHwgZGF0YSA9PT0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbE1lcmdlXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sTnVsbChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGg7XG5cbiAgcmV0dXJuIChtYXggPT09IDEgJiYgZGF0YSA9PT0gJ34nKSB8fFxuICAgICAgICAgKG1heCA9PT0gNCAmJiAoZGF0YSA9PT0gJ251bGwnIHx8IGRhdGEgPT09ICdOdWxsJyB8fCBkYXRhID09PSAnTlVMTCcpKTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbE51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpc051bGwob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT09IG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm51bGwnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbE51bGwsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbE51bGwsXG4gIHByZWRpY2F0ZTogaXNOdWxsLFxuICByZXByZXNlbnQ6IHtcbiAgICBjYW5vbmljYWw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICd+JzsgICAgfSxcbiAgICBsb3dlcmNhc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdudWxsJzsgfSxcbiAgICB1cHBlcmNhc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdOVUxMJzsgfSxcbiAgICBjYW1lbGNhc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdOdWxsJzsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdsb3dlcmNhc2UnXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF90b1N0cmluZyAgICAgICA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sT21hcChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgb2JqZWN0S2V5cyA9IFtdLCBpbmRleCwgbGVuZ3RoLCBwYWlyLCBwYWlyS2V5LCBwYWlySGFzS2V5LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcbiAgICBwYWlySGFzS2V5ID0gZmFsc2U7XG5cbiAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHBhaXJLZXkgaW4gcGFpcikge1xuICAgICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhaXIsIHBhaXJLZXkpKSB7XG4gICAgICAgIGlmICghcGFpckhhc0tleSkgcGFpckhhc0tleSA9IHRydWU7XG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGFpckhhc0tleSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKG9iamVjdEtleXMuaW5kZXhPZihwYWlyS2V5KSA9PT0gLTEpIG9iamVjdEtleXMucHVzaChwYWlyS2V5KTtcbiAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sT21hcChkYXRhKSB7XG4gIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpvbWFwJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbE9tYXAsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbE9tYXBcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sUGFpcnMoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIGluZGV4LCBsZW5ndGgsIHBhaXIsIGtleXMsIHJlc3VsdCxcbiAgICAgIG9iamVjdCA9IGRhdGE7XG5cbiAgcmVzdWx0ID0gbmV3IEFycmF5KG9iamVjdC5sZW5ndGgpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHBhaXIgPSBvYmplY3RbaW5kZXhdO1xuXG4gICAgaWYgKF90b1N0cmluZy5jYWxsKHBhaXIpICE9PSAnW29iamVjdCBPYmplY3RdJykgcmV0dXJuIGZhbHNlO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHBhaXIpO1xuXG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXN1bHRbaW5kZXhdID0gWyBrZXlzWzBdLCBwYWlyW2tleXNbMF1dIF07XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbFBhaXJzKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBbXTtcblxuICB2YXIgaW5kZXgsIGxlbmd0aCwgcGFpciwga2V5cywgcmVzdWx0LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMocGFpcik7XG5cbiAgICByZXN1bHRbaW5kZXhdID0gWyBrZXlzWzBdLCBwYWlyW2tleXNbMF1dIF07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpwYWlycycsIHtcbiAga2luZDogJ3NlcXVlbmNlJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxQYWlycyxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sUGFpcnNcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c2VxJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IFtdOyB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbFNldChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIga2V5LCBvYmplY3QgPSBkYXRhO1xuXG4gIGZvciAoa2V5IGluIG9iamVjdCkge1xuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgIGlmIChvYmplY3Rba2V5XSAhPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sU2V0KGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnNldCcsIHtcbiAga2luZDogJ21hcHBpbmcnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFNldCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sU2V0XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogJyc7IH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIFlBTUxfVElNRVNUQU1QX1JFR0VYUCA9IG5ldyBSZWdFeHAoXG4gICdeKFswLTldWzAtOV1bMC05XVswLTldKScgICAgICAgICAgKyAvLyBbMV0geWVhclxuICAnLShbMC05XVswLTldPyknICAgICAgICAgICAgICAgICAgICsgLy8gWzJdIG1vbnRoXG4gICctKFswLTldWzAtOV0/KScgICAgICAgICAgICAgICAgICAgKyAvLyBbM10gZGF5XG4gICcoPzooPzpbVHRdfFsgXFxcXHRdKyknICAgICAgICAgICAgICArIC8vIC4uLlxuICAnKFswLTldWzAtOV0/KScgICAgICAgICAgICAgICAgICAgICsgLy8gWzRdIGhvdXJcbiAgJzooWzAtOV1bMC05XSknICAgICAgICAgICAgICAgICAgICArIC8vIFs1XSBtaW51dGVcbiAgJzooWzAtOV1bMC05XSknICAgICAgICAgICAgICAgICAgICArIC8vIFs2XSBzZWNvbmRcbiAgJyg/OlxcXFwuKFswLTldKikpPycgICAgICAgICAgICAgICAgICsgLy8gWzddIGZyYWN0aW9uXG4gICcoPzpbIFxcXFx0XSooWnwoWy0rXSkoWzAtOV1bMC05XT8pJyArIC8vIFs4XSB0eiBbOV0gdHpfc2lnbiBbMTBdIHR6X2hvdXJcbiAgJyg/OjooWzAtOV1bMC05XSkpPykpPyk/JCcpOyAgICAgICAgIC8vIFsxMV0gdHpfbWludXRlXG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sVGltZXN0YW1wKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wKGRhdGEpIHtcbiAgdmFyIG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24gPSAwLFxuICAgICAgZGVsdGEgPSBudWxsLCB0el9ob3VyLCB0el9taW51dGUsIGRhdGU7XG5cbiAgbWF0Y2ggPSBZQU1MX1RJTUVTVEFNUF9SRUdFWFAuZXhlYyhkYXRhKTtcblxuICBpZiAobWF0Y2ggPT09IG51bGwpIHRocm93IG5ldyBFcnJvcignRGF0ZSByZXNvbHZlIGVycm9yJyk7XG5cbiAgLy8gbWF0Y2g6IFsxXSB5ZWFyIFsyXSBtb250aCBbM10gZGF5XG5cbiAgeWVhciA9ICsobWF0Y2hbMV0pO1xuICBtb250aCA9ICsobWF0Y2hbMl0pIC0gMTsgLy8gSlMgbW9udGggc3RhcnRzIHdpdGggMFxuICBkYXkgPSArKG1hdGNoWzNdKTtcblxuICBpZiAoIW1hdGNoWzRdKSB7IC8vIG5vIGhvdXJcbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSkpO1xuICB9XG5cbiAgLy8gbWF0Y2g6IFs0XSBob3VyIFs1XSBtaW51dGUgWzZdIHNlY29uZCBbN10gZnJhY3Rpb25cblxuICBob3VyID0gKyhtYXRjaFs0XSk7XG4gIG1pbnV0ZSA9ICsobWF0Y2hbNV0pO1xuICBzZWNvbmQgPSArKG1hdGNoWzZdKTtcblxuICBpZiAobWF0Y2hbN10pIHtcbiAgICBmcmFjdGlvbiA9IG1hdGNoWzddLnNsaWNlKDAsIDMpO1xuICAgIHdoaWxlIChmcmFjdGlvbi5sZW5ndGggPCAzKSB7IC8vIG1pbGxpLXNlY29uZHNcbiAgICAgIGZyYWN0aW9uICs9ICcwJztcbiAgICB9XG4gICAgZnJhY3Rpb24gPSArZnJhY3Rpb247XG4gIH1cblxuICAvLyBtYXRjaDogWzhdIHR6IFs5XSB0el9zaWduIFsxMF0gdHpfaG91ciBbMTFdIHR6X21pbnV0ZVxuXG4gIGlmIChtYXRjaFs5XSkge1xuICAgIHR6X2hvdXIgPSArKG1hdGNoWzEwXSk7XG4gICAgdHpfbWludXRlID0gKyhtYXRjaFsxMV0gfHwgMCk7XG4gICAgZGVsdGEgPSAodHpfaG91ciAqIDYwICsgdHpfbWludXRlKSAqIDYwMDAwOyAvLyBkZWx0YSBpbiBtaWxpLXNlY29uZHNcbiAgICBpZiAobWF0Y2hbOV0gPT09ICctJykgZGVsdGEgPSAtZGVsdGE7XG4gIH1cblxuICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWN0aW9uKSk7XG5cbiAgaWYgKGRlbHRhKSBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgLSBkZWx0YSk7XG5cbiAgcmV0dXJuIGRhdGU7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxUaW1lc3RhbXAob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHJldHVybiBvYmplY3QudG9JU09TdHJpbmcoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxUaW1lc3RhbXAsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFRpbWVzdGFtcCxcbiAgaW5zdGFuY2VPZjogRGF0ZSxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sVGltZXN0YW1wXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG4vLyBwcml2YXRlIHByb3BlcnR5XG52YXIgX2tleVN0ciA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIjtcblxuXG4vLyBwdWJsaWMgbWV0aG9kIGZvciBlbmNvZGluZ1xuLy8gZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuLy8gICAgIHZhciBvdXRwdXQgPSBbXTtcbi8vICAgICB2YXIgY2hyMSwgY2hyMiwgY2hyMywgZW5jMSwgZW5jMiwgZW5jMywgZW5jNDtcbi8vICAgICB2YXIgaSA9IDAsIGxlbiA9IGlucHV0Lmxlbmd0aCwgcmVtYWluaW5nQnl0ZXMgPSBsZW47XG5cbi8vICAgICB2YXIgaXNBcnJheSA9IHV0aWxzLmdldFR5cGVPZihpbnB1dCkgIT09IFwic3RyaW5nXCI7XG4vLyAgICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcbi8vICAgICAgICAgcmVtYWluaW5nQnl0ZXMgPSBsZW4gLSBpO1xuXG4vLyAgICAgICAgIGlmICghaXNBcnJheSkge1xuLy8gICAgICAgICAgICAgY2hyMSA9IGlucHV0LmNoYXJDb2RlQXQoaSsrKTtcbi8vICAgICAgICAgICAgIGNocjIgPSBpIDwgbGVuID8gaW5wdXQuY2hhckNvZGVBdChpKyspIDogMDtcbi8vICAgICAgICAgICAgIGNocjMgPSBpIDwgbGVuID8gaW5wdXQuY2hhckNvZGVBdChpKyspIDogMDtcbi8vICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgIGNocjEgPSBpbnB1dFtpKytdO1xuLy8gICAgICAgICAgICAgY2hyMiA9IGkgPCBsZW4gPyBpbnB1dFtpKytdIDogMDtcbi8vICAgICAgICAgICAgIGNocjMgPSBpIDwgbGVuID8gaW5wdXRbaSsrXSA6IDA7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBlbmMxID0gY2hyMSA+PiAyO1xuLy8gICAgICAgICBlbmMyID0gKChjaHIxICYgMykgPDwgNCkgfCAoY2hyMiA+PiA0KTtcbi8vICAgICAgICAgZW5jMyA9IHJlbWFpbmluZ0J5dGVzID4gMSA/ICgoKGNocjIgJiAxNSkgPDwgMikgfCAoY2hyMyA+PiA2KSkgOiA2NDtcbi8vICAgICAgICAgZW5jNCA9IHJlbWFpbmluZ0J5dGVzID4gMiA/IChjaHIzICYgNjMpIDogNjQ7XG5cbi8vICAgICAgICAgb3V0cHV0LnB1c2goX2tleVN0ci5jaGFyQXQoZW5jMSkgKyBfa2V5U3RyLmNoYXJBdChlbmMyKSArIF9rZXlTdHIuY2hhckF0KGVuYzMpICsgX2tleVN0ci5jaGFyQXQoZW5jNCkpO1xuXG4vLyAgICAgfVxuXG4vLyAgICAgcmV0dXJuIG91dHB1dC5qb2luKFwiXCIpO1xuLy8gfTtcblxuLy8gcHVibGljIG1ldGhvZCBmb3IgZGVjb2RpbmdcbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24oaW5wdXQpIHtcbiAgICB2YXIgY2hyMSwgY2hyMiwgY2hyMztcbiAgICB2YXIgZW5jMSwgZW5jMiwgZW5jMywgZW5jNDtcbiAgICB2YXIgaSA9IDAsIHJlc3VsdEluZGV4ID0gMDtcblxuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvW15BLVphLXowLTlcXCtcXC9cXD1dL2csIFwiXCIpO1xuXG4gICAgdmFyIHRvdGFsTGVuZ3RoID0gaW5wdXQubGVuZ3RoICogMyAvIDQ7XG4gICAgaWYoaW5wdXQuY2hhckF0KGlucHV0Lmxlbmd0aCAtIDEpID09PSBfa2V5U3RyLmNoYXJBdCg2NCkpIHtcbiAgICAgICAgdG90YWxMZW5ndGgtLTtcbiAgICB9XG4gICAgaWYoaW5wdXQuY2hhckF0KGlucHV0Lmxlbmd0aCAtIDIpID09PSBfa2V5U3RyLmNoYXJBdCg2NCkpIHtcbiAgICAgICAgdG90YWxMZW5ndGgtLTtcbiAgICB9XG4gICAgdmFyIG91dHB1dDtcbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIG91dHB1dCA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXQgPSBuZXcgQXJyYXkodG90YWxMZW5ndGgpO1xuICAgIH1cblxuICAgIHdoaWxlIChpIDwgaW5wdXQubGVuZ3RoKSB7XG5cbiAgICAgICAgZW5jMSA9IF9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzIgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmMzID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jNCA9IF9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG5cbiAgICAgICAgY2hyMSA9IChlbmMxIDw8IDIpIHwgKGVuYzIgPj4gNCk7XG4gICAgICAgIGNocjIgPSAoKGVuYzIgJiAxNSkgPDwgNCkgfCAoZW5jMyA+PiAyKTtcbiAgICAgICAgY2hyMyA9ICgoZW5jMyAmIDMpIDw8IDYpIHwgZW5jNDtcblxuICAgICAgICBvdXRwdXRbcmVzdWx0SW5kZXgrK10gPSBjaHIxO1xuXG4gICAgICAgIGlmIChlbmMzICE9PSA2NCkge1xuICAgICAgICAgICAgb3V0cHV0W3Jlc3VsdEluZGV4KytdID0gY2hyMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5jNCAhPT0gNjQpIHtcbiAgICAgICAgICAgIG91dHB1dFtyZXN1bHRJbmRleCsrXSA9IGNocjM7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi9leHRlcm5hbFwiKTtcbnZhciBEYXRhV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vRGF0YVdvcmtlcicpO1xudmFyIERhdGFMZW5ndGhQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFMZW5ndGhQcm9iZScpO1xudmFyIENyYzMyUHJvYmUgPSByZXF1aXJlKCcuL3N0cmVhbS9DcmMzMlByb2JlJyk7XG52YXIgRGF0YUxlbmd0aFByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlJyk7XG5cbi8qKlxuICogUmVwcmVzZW50IGEgY29tcHJlc3NlZCBvYmplY3QsIHdpdGggZXZlcnl0aGluZyBuZWVkZWQgdG8gZGVjb21wcmVzcyBpdC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtudW1iZXJ9IGNvbXByZXNzZWRTaXplIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbXByZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gdW5jb21wcmVzc2VkU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBhZnRlciBkZWNvbXByZXNzaW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGNyYzMyIHRoZSBjcmMzMiBvZiB0aGUgZGVjb21wcmVzc2VkIGZpbGUuXG4gKiBAcGFyYW0ge29iamVjdH0gY29tcHJlc3Npb24gdGhlIHR5cGUgb2YgY29tcHJlc3Npb24sIHNlZSBsaWIvY29tcHJlc3Npb25zLmpzLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGNvbXByZXNzZWQgZGF0YS5cbiAqL1xuZnVuY3Rpb24gQ29tcHJlc3NlZE9iamVjdChjb21wcmVzc2VkU2l6ZSwgdW5jb21wcmVzc2VkU2l6ZSwgY3JjMzIsIGNvbXByZXNzaW9uLCBkYXRhKSB7XG4gICAgdGhpcy5jb21wcmVzc2VkU2l6ZSA9IGNvbXByZXNzZWRTaXplO1xuICAgIHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9IHVuY29tcHJlc3NlZFNpemU7XG4gICAgdGhpcy5jcmMzMiA9IGNyYzMyO1xuICAgIHRoaXMuY29tcHJlc3Npb24gPSBjb21wcmVzc2lvbjtcbiAgICB0aGlzLmNvbXByZXNzZWRDb250ZW50ID0gZGF0YTtcbn1cblxuQ29tcHJlc3NlZE9iamVjdC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgd29ya2VyIHRvIGdldCB0aGUgdW5jb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICBnZXRDb250ZW50V29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd29ya2VyID0gbmV3IERhdGFXb3JrZXIoZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29tcHJlc3NlZENvbnRlbnQpKVxuICAgICAgICAucGlwZSh0aGlzLmNvbXByZXNzaW9uLnVuY29tcHJlc3NXb3JrZXIoKSlcbiAgICAgICAgLnBpcGUobmV3IERhdGFMZW5ndGhQcm9iZShcImRhdGFfbGVuZ3RoXCIpKTtcblxuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHdvcmtlci5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZih0aGlzLnN0cmVhbUluZm9bJ2RhdGFfbGVuZ3RoJ10gIT09IHRoYXQudW5jb21wcmVzc2VkU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZyA6IHVuY29tcHJlc3NlZCBkYXRhIHNpemUgbWlzbWF0Y2hcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gd29ya2VyO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgd29ya2VyIHRvIGdldCB0aGUgY29tcHJlc3NlZCBjb250ZW50LlxuICAgICAqIEByZXR1cm4ge0dlbmVyaWNXb3JrZXJ9IHRoZSB3b3JrZXIuXG4gICAgICovXG4gICAgZ2V0Q29tcHJlc3NlZFdvcmtlciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhV29ya2VyKGV4dGVybmFsLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSlcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwiY29tcHJlc3NlZFNpemVcIiwgdGhpcy5jb21wcmVzc2VkU2l6ZSlcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwidW5jb21wcmVzc2VkU2l6ZVwiLCB0aGlzLnVuY29tcHJlc3NlZFNpemUpXG4gICAgICAgIC53aXRoU3RyZWFtSW5mbyhcImNyYzMyXCIsIHRoaXMuY3JjMzIpXG4gICAgICAgIC53aXRoU3RyZWFtSW5mbyhcImNvbXByZXNzaW9uXCIsIHRoaXMuY29tcHJlc3Npb24pXG4gICAgICAgIDtcbiAgICB9XG59O1xuXG4vKipcbiAqIENoYWluIHRoZSBnaXZlbiB3b3JrZXIgd2l0aCBvdGhlciB3b3JrZXJzIHRvIGNvbXByZXNzIHRoZSBjb250ZW50IHdpdGggdGhlXG4gKiBnaXZlbiBjb21wcmVzaW9uLlxuICogQHBhcmFtIHtHZW5lcmljV29ya2VyfSB1bmNvbXByZXNzZWRXb3JrZXIgdGhlIHdvcmtlciB0byBwaXBlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbXByZXNzaW9uIHRoZSBjb21wcmVzc2lvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb25PcHRpb25zIHRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIGNvbXByZXNzaW5nLlxuICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIG5ldyB3b3JrZXIgY29tcHJlc3NpbmcgdGhlIGNvbnRlbnQuXG4gKi9cbkNvbXByZXNzZWRPYmplY3QuY3JlYXRlV29ya2VyRnJvbSA9IGZ1bmN0aW9uICh1bmNvbXByZXNzZWRXb3JrZXIsIGNvbXByZXNzaW9uLCBjb21wcmVzc2lvbk9wdGlvbnMpIHtcbiAgICByZXR1cm4gdW5jb21wcmVzc2VkV29ya2VyXG4gICAgLnBpcGUobmV3IENyYzMyUHJvYmUoKSlcbiAgICAucGlwZShuZXcgRGF0YUxlbmd0aFByb2JlKFwidW5jb21wcmVzc2VkU2l6ZVwiKSlcbiAgICAucGlwZShjb21wcmVzc2lvbi5jb21wcmVzc1dvcmtlcihjb21wcmVzc2lvbk9wdGlvbnMpKVxuICAgIC5waXBlKG5ldyBEYXRhTGVuZ3RoUHJvYmUoXCJjb21wcmVzc2VkU2l6ZVwiKSlcbiAgICAud2l0aFN0cmVhbUluZm8oXCJjb21wcmVzc2lvblwiLCBjb21wcmVzc2lvbik7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXByZXNzZWRPYmplY3Q7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZShcIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXJcIik7XG5cbmV4cG9ydHMuU1RPUkUgPSB7XG4gICAgbWFnaWM6IFwiXFx4MDBcXHgwMFwiLFxuICAgIC8vIGNvbXByZXNzV29ya2VyIDogZnVuY3Rpb24gKGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIC8vICAgICByZXR1cm4gbmV3IEdlbmVyaWNXb3JrZXIoXCJTVE9SRSBjb21wcmVzc2lvblwiKTtcbiAgICAvLyB9LFxuICAgIHVuY29tcHJlc3NXb3JrZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgR2VuZXJpY1dvcmtlcihcIlNUT1JFIGRlY29tcHJlc3Npb25cIik7XG4gICAgfVxufTtcbmV4cG9ydHMuREVGTEFURSA9IHJlcXVpcmUoJy4vZmxhdGUnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNvbWUgZnJvbSBwYWtvLCBmcm9tIHBha28vbGliL3psaWIvY3JjMzIuanNcbiAqIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgc2VlIHBha28gaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9wYWtvL1xuICovXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gICAgdmFyIGMsIHRhYmxlID0gW107XG5cbiAgICBmb3IodmFyIG4gPTA7IG4gPCAyNTY7IG4rKyl7XG4gICAgICAgIGMgPSBuO1xuICAgICAgICBmb3IodmFyIGsgPTA7IGsgPCA4OyBrKyspe1xuICAgICAgICAgICAgYyA9ICgoYyYxKSA/ICgweEVEQjg4MzIwIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGFibGVbbl0gPSBjO1xuICAgIH1cblxuICAgIHJldHVybiB0YWJsZTtcbn1cblxuLy8gQ3JlYXRlIHRhYmxlIG9uIGxvYWQuIEp1c3QgMjU1IHNpZ25lZCBsb25ncy4gTm90IGEgcHJvYmxlbS5cbnZhciBjcmNUYWJsZSA9IG1ha2VUYWJsZSgpO1xuXG5cbmZ1bmN0aW9uIGNyYzMyKGNyYywgYnVmLCBsZW4sIHBvcykge1xuICAgIHZhciB0ID0gY3JjVGFibGUsIGVuZCA9IHBvcyArIGxlbjtcblxuICAgIGNyYyA9IGNyYyBeICgtMSk7XG5cbiAgICBmb3IgKHZhciBpID0gcG9zOyBpIDwgZW5kOyBpKysgKSB7XG4gICAgICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICAgIH1cblxuICAgIHJldHVybiAoY3JjIF4gKC0xKSk7IC8vID4+PiAwO1xufVxuXG4vLyBUaGF0J3MgYWxsIGZvciB0aGUgcGFrbyBmdW5jdGlvbnMuXG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgY3JjMzIgb2YgYSBzdHJpbmcuXG4gKiBUaGlzIGlzIGFsbW9zdCB0aGUgc2FtZSBhcyB0aGUgZnVuY3Rpb24gY3JjMzIsIGJ1dCBmb3Igc3RyaW5ncy4gVXNpbmcgdGhlXG4gKiBzYW1lIGZ1bmN0aW9uIGZvciB0aGUgdHdvIHVzZSBjYXNlcyBsZWFkcyB0byBob3JyaWJsZSBwZXJmb3JtYW5jZXMuXG4gKiBAcGFyYW0ge051bWJlcn0gY3JjIHRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgY3JjLlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHVzZS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLlxuICogQHBhcmFtIHtOdW1iZXJ9IHBvcyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBjcmMzMiBjb21wdXRhdGlvbi5cbiAqIEByZXR1cm4ge051bWJlcn0gdGhlIGNvbXB1dGVkIGNyYzMyLlxuICovXG5mdW5jdGlvbiBjcmMzMnN0cihjcmMsIHN0ciwgbGVuLCBwb3MpIHtcbiAgICB2YXIgdCA9IGNyY1RhYmxlLCBlbmQgPSBwb3MgKyBsZW47XG5cbiAgICBjcmMgPSBjcmMgXiAoLTEpO1xuXG4gICAgZm9yICh2YXIgaSA9IHBvczsgaSA8IGVuZDsgaSsrICkge1xuICAgICAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRbKGNyYyBeIHN0ci5jaGFyQ29kZUF0KGkpKSAmIDB4RkZdO1xuICAgIH1cblxuICAgIHJldHVybiAoY3JjIF4gKC0xKSk7IC8vID4+PiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyYzMyd3JhcHBlcihpbnB1dCwgY3JjKSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHZhciBpc0FycmF5ID0gdXRpbHMuZ2V0VHlwZU9mKGlucHV0KSAhPT0gXCJzdHJpbmdcIjtcblxuICAgIGlmKGlzQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIGNyYzMyKGNyY3wwLCBpbnB1dCwgaW5wdXQubGVuZ3RoLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY3JjMzJzdHIoY3JjfDAsIGlucHV0LCBpbnB1dC5sZW5ndGgsIDApO1xuICAgIH1cbn07XG4vLyB2aW06IHNldCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDpcbiIsIid1c2Ugc3RyaWN0JztcbmV4cG9ydHMuYmFzZTY0ID0gZmFsc2U7XG5leHBvcnRzLmJpbmFyeSA9IGZhbHNlO1xuZXhwb3J0cy5kaXIgPSBmYWxzZTtcbmV4cG9ydHMuY3JlYXRlRm9sZGVycyA9IHRydWU7XG5leHBvcnRzLmRhdGUgPSBudWxsO1xuZXhwb3J0cy5jb21wcmVzc2lvbiA9IG51bGw7XG5leHBvcnRzLmNvbXByZXNzaW9uT3B0aW9ucyA9IG51bGw7XG5leHBvcnRzLmNvbW1lbnQgPSBudWxsO1xuZXhwb3J0cy51bml4UGVybWlzc2lvbnMgPSBudWxsO1xuZXhwb3J0cy5kb3NQZXJtaXNzaW9ucyA9IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIHZhciBFUzZQcm9taXNlID0gcmVxdWlyZShcImVzNi1wcm9taXNlXCIpLlByb21pc2U7XG5cbi8qKlxuICogTGV0IHRoZSB1c2VyIHVzZS9jaGFuZ2Ugc29tZSBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIFByb21pc2U6IHdpbmRvdy5Qcm9taXNlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFVTRV9UWVBFREFSUkFZID0gKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykgJiYgKHR5cGVvZiBVaW50MTZBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmICh0eXBlb2YgVWludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKTtcblxudmFyIHBha28gPSByZXF1aXJlKFwicGFrb1wiKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKFwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlclwiKTtcblxudmFyIEFSUkFZX1RZUEUgPSBVU0VfVFlQRURBUlJBWSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiO1xuXG5leHBvcnRzLm1hZ2ljID0gXCJcXHgwOFxceDAwXCI7XG5cbi8qKlxuICogQ3JlYXRlIGEgd29ya2VyIHRoYXQgdXNlcyBwYWtvIHRvIGluZmxhdGUvZGVmbGF0ZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvbiB0aGUgbmFtZSBvZiB0aGUgcGFrbyBmdW5jdGlvbiB0byBjYWxsIDogZWl0aGVyIFwiRGVmbGF0ZVwiIG9yIFwiSW5mbGF0ZVwiLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gKGRlKWNvbXByZXNzaW5nLlxuICovXG5mdW5jdGlvbiBGbGF0ZVdvcmtlcihhY3Rpb24sIG9wdGlvbnMpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJGbGF0ZVdvcmtlci9cIiArIGFjdGlvbik7XG5cbiAgICB0aGlzLl9wYWtvID0gbmV3IHBha29bYWN0aW9uXSh7XG4gICAgICAgIHJhdzp0cnVlLFxuICAgICAgICBsZXZlbCA6IG9wdGlvbnMubGV2ZWwgfHwgLTEgLy8gZGVmYXVsdCBjb21wcmVzc2lvblxuICAgIH0pO1xuICAgIC8vIHRoZSBgbWV0YWAgb2JqZWN0IGZyb20gdGhlIGxhc3QgY2h1bmsgcmVjZWl2ZWRcbiAgICAvLyB0aGlzIGFsbG93IHRoaXMgd29ya2VyIHRvIHBhc3MgYXJvdW5kIG1ldGFkYXRhXG4gICAgdGhpcy5tZXRhID0ge307XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fcGFrby5vbkRhdGEgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHNlbGYucHVzaCh7XG4gICAgICAgICAgICBkYXRhIDogZGF0YSxcbiAgICAgICAgICAgIG1ldGEgOiBzZWxmLm1ldGFcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxudXRpbHMuaW5oZXJpdHMoRmxhdGVXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuRmxhdGVXb3JrZXIucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHRoaXMubWV0YSA9IGNodW5rLm1ldGE7XG4gICAgdGhpcy5fcGFrby5wdXNoKHV0aWxzLnRyYW5zZm9ybVRvKEFSUkFZX1RZUEUsIGNodW5rLmRhdGEpLCBmYWxzZSk7XG59O1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5mbHVzaFxuICovXG5GbGF0ZVdvcmtlci5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5wcm90b3R5cGUuZmx1c2guY2FsbCh0aGlzKTtcbiAgICB0aGlzLl9wYWtvLnB1c2goW10sIHRydWUpO1xufTtcbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmNsZWFuVXBcbiAqL1xuRmxhdGVXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5wcm90b3R5cGUuY2xlYW5VcC5jYWxsKHRoaXMpO1xuICAgIHRoaXMuX3Bha28gPSBudWxsO1xufTtcblxuZXhwb3J0cy5jb21wcmVzc1dvcmtlciA9IGZ1bmN0aW9uIChjb21wcmVzc2lvbk9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEZsYXRlV29ya2VyKFwiRGVmbGF0ZVwiLCBjb21wcmVzc2lvbk9wdGlvbnMpO1xufTtcbmV4cG9ydHMudW5jb21wcmVzc1dvcmtlciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IEZsYXRlV29ya2VyKFwiSW5mbGF0ZVwiLCB7fSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFJlcHJlc2VudGF0aW9uIGEgb2YgemlwIGZpbGUgaW4ganNcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBKU1ppcCgpIHtcbiAgICAvLyBpZiB0aGlzIGNvbnN0cnVjdG9yIGlzwqB1c2VkIHdpdGhvdXTCoGBuZXdgLCBpdMKgYWRkcyBgbmV3YCBiZWZvcmXCoGl0c2VsZjpcbiAgICBpZighKHRoaXMgaW5zdGFuY2VvZiBKU1ppcCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKU1ppcCgpO1xuICAgIH1cblxuICAgIGlmKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGNvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycyBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLlwiKTtcbiAgICB9XG5cbiAgICAvLyBvYmplY3QgY29udGFpbmluZyB0aGUgZmlsZXMgOlxuICAgIC8vIHtcbiAgICAvLyAgIFwiZm9sZGVyL1wiIDogey4uLn0sXG4gICAgLy8gICBcImZvbGRlci9kYXRhLnR4dFwiIDogey4uLn1cbiAgICAvLyB9XG4gICAgdGhpcy5maWxlcyA9IHt9O1xuXG4gICAgdGhpcy5jb21tZW50ID0gbnVsbDtcblxuICAgIC8vIFdoZXJlIHdlIGFyZSBpbiB0aGUgaGllcmFyY2h5XG4gICAgdGhpcy5yb290ID0gXCJcIjtcbiAgICB0aGlzLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBuZXdPYmogPSBuZXcgSlNaaXAoKTtcbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXNbaV0gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIG5ld09ialtpXSA9IHRoaXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld09iajtcbiAgICB9O1xufVxuSlNaaXAucHJvdG90eXBlID0gcmVxdWlyZSgnLi9vYmplY3QnKTtcbkpTWmlwLnByb3RvdHlwZS5sb2FkQXN5bmMgPSByZXF1aXJlKCcuL2xvYWQnKTtcbkpTWmlwLnN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbkpTWmlwLmRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xuXG5KU1ppcC5sb2FkQXN5bmMgPSBmdW5jdGlvbiAoY29udGVudCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgSlNaaXAoKS5sb2FkQXN5bmMoY29udGVudCwgb3B0aW9ucyk7XG59O1xuXG5KU1ppcC5leHRlcm5hbCA9IHJlcXVpcmUoXCIuL2V4dGVybmFsXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBKU1ppcDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBleHRlcm5hbCA9IHJlcXVpcmUoXCIuL2V4dGVybmFsXCIpO1xudmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBaaXBFbnRyaWVzID0gcmVxdWlyZSgnLi96aXBFbnRyaWVzJyk7XG52YXIgQ3JjMzJQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0NyYzMyUHJvYmUnKTtcbnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoXCIuL25vZGVqc1V0aWxzXCIpO1xuXG4vKipcbiAqIENoZWNrIHRoZSBDUkMzMiBvZiBhbiBlbnRyeS5cbiAqIEBwYXJhbSB7WmlwRW50cnl9IHppcEVudHJ5IHRoZSB6aXAgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBjaGVja0VudHJ5Q1JDMzIoemlwRW50cnkpIHtcbiAgICByZXR1cm4gbmV3IGV4dGVybmFsLlByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgd29ya2VyID0gemlwRW50cnkuZGVjb21wcmVzc2VkLmdldENvbnRlbnRXb3JrZXIoKS5waXBlKG5ldyBDcmMzMlByb2JlKCkpO1xuICAgICAgICB3b3JrZXIub24oXCJlcnJvclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9KVxuICAgICAgICAub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHdvcmtlci5zdHJlYW1JbmZvLmNyYzMyICE9PSB6aXBFbnRyeS5kZWNvbXByZXNzZWQuY3JjMzIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IENSQzMyIG1pc21hdGNoXCIpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAucmVzdW1lKCk7XG4gICAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZGF0YSwgb3B0aW9ucykge1xuICAgIHZhciB6aXAgPSB0aGlzO1xuICAgIG9wdGlvbnMgPSB1dGlscy5leHRlbmQob3B0aW9ucyB8fCB7fSwge1xuICAgICAgICBiYXNlNjQ6IGZhbHNlLFxuICAgICAgICBjaGVja0NSQzMyOiBmYWxzZSxcbiAgICAgICAgb3B0aW1pemVkQmluYXJ5U3RyaW5nOiBmYWxzZSxcbiAgICAgICAgY3JlYXRlRm9sZGVyczogZmFsc2UsXG4gICAgICAgIGRlY29kZUZpbGVOYW1lOiB1dGY4LnV0ZjhkZWNvZGVcbiAgICB9KTtcblxuICAgIGlmIChub2RlanNVdGlscy5pc05vZGUgJiYgbm9kZWpzVXRpbHMuaXNTdHJlYW0oZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVybmFsLlByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkpTWmlwIGNhbid0IGFjY2VwdCBhIHN0cmVhbSB3aGVuIGxvYWRpbmcgYSB6aXAgZmlsZS5cIikpO1xuICAgIH1cblxuICAgIHJldHVybiB1dGlscy5wcmVwYXJlQ29udGVudChcInRoZSBsb2FkZWQgemlwIGZpbGVcIiwgZGF0YSwgdHJ1ZSwgb3B0aW9ucy5vcHRpbWl6ZWRCaW5hcnlTdHJpbmcsIG9wdGlvbnMuYmFzZTY0KVxuICAgIC50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdmFyIHppcEVudHJpZXMgPSBuZXcgWmlwRW50cmllcyhvcHRpb25zKTtcbiAgICAgICAgemlwRW50cmllcy5sb2FkKGRhdGEpO1xuICAgICAgICByZXR1cm4gemlwRW50cmllcztcbiAgICB9KS50aGVuKGZ1bmN0aW9uIGNoZWNrQ1JDMzIoemlwRW50cmllcykge1xuICAgICAgICB2YXIgcHJvbWlzZXMgPSBbZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHppcEVudHJpZXMpXTtcbiAgICAgICAgdmFyIGZpbGVzID0gemlwRW50cmllcy5maWxlcztcbiAgICAgICAgaWYgKG9wdGlvbnMuY2hlY2tDUkMzMikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goY2hlY2tFbnRyeUNSQzMyKGZpbGVzW2ldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4dGVybmFsLlByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIGFkZEZpbGVzKHJlc3VsdHMpIHtcbiAgICAgICAgdmFyIHppcEVudHJpZXMgPSByZXN1bHRzLnNoaWZ0KCk7XG4gICAgICAgIHZhciBmaWxlcyA9IHppcEVudHJpZXMuZmlsZXM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpbnB1dCA9IGZpbGVzW2ldO1xuICAgICAgICAgICAgemlwLmZpbGUoaW5wdXQuZmlsZU5hbWVTdHIsIGlucHV0LmRlY29tcHJlc3NlZCwge1xuICAgICAgICAgICAgICAgIGJpbmFyeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgZGF0ZTogaW5wdXQuZGF0ZSxcbiAgICAgICAgICAgICAgICBkaXI6IGlucHV0LmRpcixcbiAgICAgICAgICAgICAgICBjb21tZW50IDogaW5wdXQuZmlsZUNvbW1lbnRTdHIubGVuZ3RoID8gaW5wdXQuZmlsZUNvbW1lbnRTdHIgOiBudWxsLFxuICAgICAgICAgICAgICAgIHVuaXhQZXJtaXNzaW9ucyA6IGlucHV0LnVuaXhQZXJtaXNzaW9ucyxcbiAgICAgICAgICAgICAgICBkb3NQZXJtaXNzaW9ucyA6IGlucHV0LmRvc1Blcm1pc3Npb25zLFxuICAgICAgICAgICAgICAgIGNyZWF0ZUZvbGRlcnM6IG9wdGlvbnMuY3JlYXRlRm9sZGVyc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHppcEVudHJpZXMuemlwQ29tbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHppcC5jb21tZW50ID0gemlwRW50cmllcy56aXBDb21tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHppcDtcbiAgICB9KTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi4vc3RyZWFtL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBBIHdvcmtlciB0aGF0IHVzZSBhIG5vZGVqcyBzdHJlYW0gYXMgc291cmNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZW50cnkgZm9yIHRoaXMgc3RyZWFtLlxuICogQHBhcmFtIHtSZWFkYWJsZX0gc3RyZWFtIHRoZSBub2RlanMgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIoZmlsZW5hbWUsIHN0cmVhbSkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIk5vZGVqcyBzdHJlYW0gaW5wdXQgYWRhcHRlciBmb3IgXCIgKyBmaWxlbmFtZSk7XG4gICAgdGhpcy5fdXBzdHJlYW1FbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2JpbmRTdHJlYW0oc3RyZWFtKTtcbn1cblxudXRpbHMuaW5oZXJpdHMoTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBQcmVwYXJlIHRoZSBzdHJlYW0gYW5kIGJpbmQgdGhlIGNhbGxiYWNrcyBvbiBpdC5cbiAqIERvIHRoaXMgQVNBUCBvbiBub2RlIDAuMTAgISBBIGxhenkgYmluZGluZyBkb2Vzbid0IGFsd2F5cyB3b3JrLlxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSB0aGUgbm9kZWpzIHN0cmVhbSB0byB1c2UuXG4gKi9cbk5vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5wcm90b3R5cGUuX2JpbmRTdHJlYW0gPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICBzdHJlYW1cbiAgICAub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICBzZWxmLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogY2h1bmssXG4gICAgICAgICAgICBtZXRhIDoge1xuICAgICAgICAgICAgICAgIHBlcmNlbnQgOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYoc2VsZi5pc1BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWRFcnJvciA9IGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfSlcbiAgICAub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZihzZWxmLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICBzZWxmLl91cHN0cmVhbUVuZGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuZW5kKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKCFHZW5lcmljV29ya2VyLnByb3RvdHlwZS5wYXVzZS5jYWxsKHRoaXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5fc3RyZWFtLnBhdXNlKCk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoIUdlbmVyaWNXb3JrZXIucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZih0aGlzLl91cHN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHRoaXMuZW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlJlYWRhYmxlO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnV0aWwuaW5oZXJpdHMoTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlciwgUmVhZGFibGUpO1xuXG4vKipcbiogQSBub2RlanMgc3RyZWFtIHVzaW5nIGEgd29ya2VyIGFzIHNvdXJjZS5cbiogQHNlZSB0aGUgU291cmNlV3JhcHBlciBpbiBodHRwOi8vbm9kZWpzLm9yZy9hcGkvc3RyZWFtLmh0bWxcbiogQGNvbnN0cnVjdG9yXG4qIEBwYXJhbSB7U3RyZWFtSGVscGVyfSBoZWxwZXIgdGhlIGhlbHBlciB3cmFwcGluZyB0aGUgd29ya2VyXG4qIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBub2RlanMgc3RyZWFtIG9wdGlvbnNcbiogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2IgdGhlIHVwZGF0ZSBjYWxsYmFjay5cbiovXG5mdW5jdGlvbiBOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyKGhlbHBlciwgb3B0aW9ucywgdXBkYXRlQ2IpIHtcbiAgICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuX2hlbHBlciA9IGhlbHBlcjtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBoZWxwZXIub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChkYXRhLCBtZXRhKSB7XG4gICAgICAgIGlmICghc2VsZi5wdXNoKGRhdGEpKSB7XG4gICAgICAgICAgICBzZWxmLl9oZWxwZXIucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZih1cGRhdGVDYikge1xuICAgICAgICAgICAgdXBkYXRlQ2IobWV0YSk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgIC5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0pXG4gICAgLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5wdXNoKG51bGwpO1xuICAgIH0pO1xufVxuXG5cbk5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5faGVscGVyLnJlc3VtZSgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIHRoaXMgaXMgcnVubmluZyBpbiBOb2RlanMsIHdpbGwgYmUgdW5kZWZpbmVkIGluIGEgYnJvd3Nlci5cbiAgICAgKiBJbiBhIGJyb3dzZXIsIGJyb3dzZXJpZnkgd29uJ3QgaW5jbHVkZSB0aGlzIGZpbGUgYW5kIHRoZSB3aG9sZSBtb2R1bGVcbiAgICAgKiB3aWxsIGJlIHJlc29sdmVkIGFuIGVtcHR5IG9iamVjdC5cbiAgICAgKi9cbiAgICBpc05vZGUgOiB0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiLFxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBub2RlanMgQnVmZmVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBlbmNvZGluZyB0aGUgZW5jb2RpbmcgdG8gdXNlLlxuICAgICAqIEByZXR1cm4ge0J1ZmZlcn0gYSBuZXcgQnVmZmVyLlxuICAgICAqL1xuICAgIG5ld0J1ZmZlciA6IGZ1bmN0aW9uKGRhdGEsIGVuY29kaW5nKXtcbiAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXIoZGF0YSwgZW5jb2RpbmcpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRmluZCBvdXQgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBiIHRoZSBvYmplY3QgdG8gdGVzdC5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBCdWZmZXIsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc0J1ZmZlciA6IGZ1bmN0aW9uKGIpe1xuICAgICAgICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKGIpO1xuICAgIH0sXG5cbiAgICBpc1N0cmVhbSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJlxuICAgICAgICAgICAgdHlwZW9mIG9iai5vbiA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLnBhdXNlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBvYmoucmVzdW1lID09PSBcImZ1bmN0aW9uXCI7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIHZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0dlbmVyaWNXb3JrZXInKTtcbi8vIHZhciBTdHJlYW1IZWxwZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9TdHJlYW1IZWxwZXInKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKTtcbnZhciBDb21wcmVzc2VkT2JqZWN0ID0gcmVxdWlyZSgnLi9jb21wcmVzc2VkT2JqZWN0Jyk7XG52YXIgWmlwT2JqZWN0ID0gcmVxdWlyZSgnLi96aXBPYmplY3QnKTtcbi8vIHZhciBnZW5lcmF0ZSA9IHJlcXVpcmUoXCIuL2dlbmVyYXRlXCIpO1xudmFyIG5vZGVqc1V0aWxzID0gcmVxdWlyZShcIi4vbm9kZWpzVXRpbHNcIik7XG52YXIgTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyID0gcmVxdWlyZShcIi4vbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlclwiKTtcblxuXG4vKipcbiAqIEFkZCBhIGZpbGUgaW4gdGhlIGN1cnJlbnQgZm9sZGVyLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgZGF0YSBvZiB0aGUgZmlsZVxuICogQHBhcmFtIHtPYmplY3R9IG8gdGhlIG9wdGlvbnMgb2YgdGhlIGZpbGVcbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIG5ldyBmaWxlLlxuICovXG52YXIgZmlsZUFkZCA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEsIG8pIHtcbiAgICAvLyBiZSBzdXJlIHN1YiBmb2xkZXJzIGV4aXN0XG4gICAgdmFyIGRhdGFUeXBlID0gdXRpbHMuZ2V0VHlwZU9mKGRhdGEpLFxuICAgICAgICBwYXJlbnQ7XG5cblxuICAgIC8qXG4gICAgICogQ29ycmVjdCBvcHRpb25zLlxuICAgICAqL1xuXG4gICAgbyA9IHV0aWxzLmV4dGVuZChvIHx8IHt9LCBkZWZhdWx0cyk7XG4gICAgby5kYXRlID0gby5kYXRlIHx8IG5ldyBEYXRlKCk7XG4gICAgaWYgKG8uY29tcHJlc3Npb24gIT09IG51bGwpIHtcbiAgICAgICAgby5jb21wcmVzc2lvbiA9IG8uY29tcHJlc3Npb24udG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG8udW5peFBlcm1pc3Npb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG8udW5peFBlcm1pc3Npb25zID0gcGFyc2VJbnQoby51bml4UGVybWlzc2lvbnMsIDgpO1xuICAgIH1cblxuICAgIC8vIFVOWF9JRkRJUiAgMDA0MDAwMCBzZWUgemlwaW5mby5jXG4gICAgaWYgKG8udW5peFBlcm1pc3Npb25zICYmIChvLnVuaXhQZXJtaXNzaW9ucyAmIDB4NDAwMCkpIHtcbiAgICAgICAgby5kaXIgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBCaXQgNCAgICBEaXJlY3RvcnlcbiAgICBpZiAoby5kb3NQZXJtaXNzaW9ucyAmJiAoby5kb3NQZXJtaXNzaW9ucyAmIDB4MDAxMCkpIHtcbiAgICAgICAgby5kaXIgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvLmRpcikge1xuICAgICAgICBuYW1lID0gZm9yY2VUcmFpbGluZ1NsYXNoKG5hbWUpO1xuICAgIH1cbiAgICBpZiAoby5jcmVhdGVGb2xkZXJzICYmIChwYXJlbnQgPSBwYXJlbnRGb2xkZXIobmFtZSkpKSB7XG4gICAgICAgIGZvbGRlckFkZC5jYWxsKHRoaXMsIHBhcmVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdmFyIGlzVW5pY29kZVN0cmluZyA9IGRhdGFUeXBlID09PSBcInN0cmluZ1wiICYmIG8uYmluYXJ5ID09PSBmYWxzZSAmJiBvLmJhc2U2NCA9PT0gZmFsc2U7XG4gICAgby5iaW5hcnkgPSAhaXNVbmljb2RlU3RyaW5nO1xuXG5cbiAgICB2YXIgaXNDb21wcmVzc2VkRW1wdHkgPSAoZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QpICYmIGRhdGEudW5jb21wcmVzc2VkU2l6ZSA9PT0gMDtcblxuICAgIGlmIChpc0NvbXByZXNzZWRFbXB0eSB8fCBvLmRpciB8fCAhZGF0YSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBvLmJhc2U2NCA9IGZhbHNlO1xuICAgICAgICBvLmJpbmFyeSA9IHRydWU7XG4gICAgICAgIGRhdGEgPSBcIlwiO1xuICAgICAgICBvLmNvbXByZXNzaW9uID0gXCJTVE9SRVwiO1xuICAgICAgICBkYXRhVHlwZSA9IFwic3RyaW5nXCI7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBDb252ZXJ0IGNvbnRlbnQgdG8gZml0LlxuICAgICAqL1xuXG4gICAgdmFyIHppcE9iamVjdENvbnRlbnQgPSBudWxsO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCB8fCBkYXRhIGluc3RhbmNlb2YgR2VuZXJpY1dvcmtlcikge1xuICAgICAgICB6aXBPYmplY3RDb250ZW50ID0gZGF0YTtcbiAgICB9IGVsc2UgaWYgKG5vZGVqc1V0aWxzLmlzTm9kZSAmJiBub2RlanNVdGlscy5pc1N0cmVhbShkYXRhKSkge1xuICAgICAgICB6aXBPYmplY3RDb250ZW50ID0gbmV3IE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlcihuYW1lLCBkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB6aXBPYmplY3RDb250ZW50ID0gdXRpbHMucHJlcGFyZUNvbnRlbnQobmFtZSwgZGF0YSwgby5iaW5hcnksIG8ub3B0aW1pemVkQmluYXJ5U3RyaW5nLCBvLmJhc2U2NCk7XG4gICAgfVxuXG4gICAgdmFyIG9iamVjdCA9IG5ldyBaaXBPYmplY3QobmFtZSwgemlwT2JqZWN0Q29udGVudCwgbyk7XG4gICAgdGhpcy5maWxlc1tuYW1lXSA9IG9iamVjdDtcbiAgICAvKlxuICAgIFRPRE86IHdlIGNhbid0IHRocm93IGFuIGV4Y2VwdGlvbiBiZWNhdXNlIHdlIGhhdmUgYXN5bmMgcHJvbWlzZXNcbiAgICAod2UgY2FuIGhhdmUgYSBwcm9taXNlIG9mIGEgRGF0ZSgpIGZvciBleGFtcGxlKSBidXQgcmV0dXJuaW5nIGFcbiAgICBwcm9taXNlIGlzIHVzZWxlc3MgYmVjYXVzZSBmaWxlKG5hbWUsIGRhdGEpIHJldHVybnMgdGhlIEpTWmlwXG4gICAgb2JqZWN0IGZvciBjaGFpbmluZy4gU2hvdWxkIHdlIGJyZWFrIHRoYXQgdG8gYWxsb3cgdGhlIHVzZXJcbiAgICB0byBjYXRjaCB0aGUgZXJyb3IgP1xuXG4gICAgcmV0dXJuIGV4dGVybmFsLlByb21pc2UucmVzb2x2ZSh6aXBPYmplY3RDb250ZW50KVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcbiAgICAqL1xufTtcblxuLyoqXG4gKiBGaW5kIHRoZSBwYXJlbnQgZm9sZGVyIG9mIHRoZSBwYXRoLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBwYXRoIHRvIHVzZVxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgcGFyZW50IGZvbGRlciwgb3IgXCJcIlxuICovXG52YXIgcGFyZW50Rm9sZGVyID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICBpZiAocGF0aC5zbGljZSgtMSkgPT09ICcvJykge1xuICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgdmFyIGxhc3RTbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTtcbiAgICByZXR1cm4gKGxhc3RTbGFzaCA+IDApID8gcGF0aC5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoKSA6IFwiXCI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhdGggd2l0aCBhIHNsYXNoIGF0IHRoZSBlbmQuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGggdGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBwYXRoIHdpdGggYSB0cmFpbGluZyBzbGFzaC5cbiAqL1xudmFyIGZvcmNlVHJhaWxpbmdTbGFzaCA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAvLyBDaGVjayB0aGUgbmFtZSBlbmRzIHdpdGggYSAvXG4gICAgaWYgKHBhdGguc2xpY2UoLTEpICE9PSBcIi9cIikge1xuICAgICAgICBwYXRoICs9IFwiL1wiOyAvLyBJRSBkb2Vzbid0IGxpa2Ugc3Vic3RyKC0xKVxuICAgIH1cbiAgICByZXR1cm4gcGF0aDtcbn07XG5cbi8qKlxuICogQWRkIGEgKHN1YikgZm9sZGVyIGluIHRoZSBjdXJyZW50IGZvbGRlci5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZm9sZGVyJ3MgbmFtZVxuICogQHBhcmFtIHtib29sZWFuPX0gW2NyZWF0ZUZvbGRlcnNdIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN1YlxuICogIGZvbGRlcnMuIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgbmV3IGZvbGRlci5cbiAqL1xudmFyIGZvbGRlckFkZCA9IGZ1bmN0aW9uKG5hbWUsIGNyZWF0ZUZvbGRlcnMpIHtcbiAgICBjcmVhdGVGb2xkZXJzID0gKHR5cGVvZiBjcmVhdGVGb2xkZXJzICE9PSAndW5kZWZpbmVkJykgPyBjcmVhdGVGb2xkZXJzIDogZGVmYXVsdHMuY3JlYXRlRm9sZGVycztcblxuICAgIG5hbWUgPSBmb3JjZVRyYWlsaW5nU2xhc2gobmFtZSk7XG5cbiAgICAvLyBEb2VzIHRoaXMgZm9sZGVyIGFscmVhZHkgZXhpc3Q/XG4gICAgaWYgKCF0aGlzLmZpbGVzW25hbWVdKSB7XG4gICAgICAgIGZpbGVBZGQuY2FsbCh0aGlzLCBuYW1lLCBudWxsLCB7XG4gICAgICAgICAgICBkaXI6IHRydWUsXG4gICAgICAgICAgICBjcmVhdGVGb2xkZXJzOiBjcmVhdGVGb2xkZXJzXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maWxlc1tuYW1lXTtcbn07XG5cbi8qKlxuKiBDcm9zcy13aW5kb3csIGNyb3NzLU5vZGUtY29udGV4dCByZWd1bGFyIGV4cHJlc3Npb24gZGV0ZWN0aW9uXG4qIEBwYXJhbSAge09iamVjdH0gIG9iamVjdCBBbnl0aGluZ1xuKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgcmVndWxhciBleHByZXNzaW9uLFxuKiBmYWxzZSBvdGhlcndpc2VcbiovXG5mdW5jdGlvbiBpc1JlZ0V4cChvYmplY3QpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09IFwiW29iamVjdCBSZWdFeHBdXCI7XG59XG5cbi8vIHJldHVybiB0aGUgYWN0dWFsIHByb3RvdHlwZSBvZiBKU1ppcFxudmFyIG91dCA9IHtcbiAgICAvKipcbiAgICAgKiBAc2VlIGxvYWRBc3luY1xuICAgICAqL1xuICAgIGxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLlwiKTtcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBDYWxsIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVhY2ggZW50cnkgYXQgdGhpcyBmb2xkZXIgbGV2ZWwuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uOlxuICAgICAqIGZ1bmN0aW9uIChyZWxhdGl2ZVBhdGgsIGZpbGUpIHsuLi59XG4gICAgICogSXQgdGFrZXMgMiBhcmd1bWVudHMgOiB0aGUgcmVsYXRpdmUgcGF0aCBhbmQgdGhlIGZpbGUuXG4gICAgICovXG4gICAgZm9yRWFjaDogZnVuY3Rpb24oY2IpIHtcbiAgICAgICAgdmFyIGZpbGVuYW1lLCByZWxhdGl2ZVBhdGgsIGZpbGU7XG4gICAgICAgIGZvciAoZmlsZW5hbWUgaW4gdGhpcy5maWxlcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVzLmhhc093blByb3BlcnR5KGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbZmlsZW5hbWVdO1xuICAgICAgICAgICAgcmVsYXRpdmVQYXRoID0gZmlsZW5hbWUuc2xpY2UodGhpcy5yb290Lmxlbmd0aCwgZmlsZW5hbWUubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChyZWxhdGl2ZVBhdGggJiYgZmlsZW5hbWUuc2xpY2UoMCwgdGhpcy5yb290Lmxlbmd0aCkgPT09IHRoaXMucm9vdCkgeyAvLyB0aGUgZmlsZSBpcyBpbiB0aGUgY3VycmVudCByb290XG4gICAgICAgICAgICAgICAgY2IocmVsYXRpdmVQYXRoLCBmaWxlKTsgLy8gVE9ETyByZXZlcnNlIHRoZSBwYXJhbWV0ZXJzID8gbmVlZCB0byBiZSBjbGVhbiBBTkQgY29uc2lzdGVudCB3aXRoIHRoZSBmaWx0ZXIgc2VhcmNoIGZuLi4uXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmlsdGVyIG5lc3RlZCBmaWxlcy9mb2xkZXJzIHdpdGggdGhlIHNwZWNpZmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWFyY2ggdGhlIHByZWRpY2F0ZSB0byB1c2UgOlxuICAgICAqIGZ1bmN0aW9uIChyZWxhdGl2ZVBhdGgsIGZpbGUpIHsuLi59XG4gICAgICogSXQgdGFrZXMgMiBhcmd1bWVudHMgOiB0aGUgcmVsYXRpdmUgcGF0aCBhbmQgdGhlIGZpbGUuXG4gICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIG1hdGNoaW5nIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZpbHRlcjogZnVuY3Rpb24oc2VhcmNoKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGl2ZVBhdGgsIGVudHJ5KSB7XG4gICAgICAgICAgICBpZiAoc2VhcmNoKHJlbGF0aXZlUGF0aCwgZW50cnkpKSB7IC8vIHRoZSBmaWxlIG1hdGNoZXMgdGhlIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZW50cnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBmaWxlIHRvIHRoZSB6aXAgZmlsZSwgb3Igc2VhcmNoIGEgZmlsZS5cbiAgICAgKiBAcGFyYW0gICB7c3RyaW5nfFJlZ0V4cH0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBhZGQgKGlmIGRhdGEgaXMgZGVmaW5lZCksXG4gICAgICogdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gZmluZCAoaWYgbm8gZGF0YSkgb3IgYSByZWdleCB0byBtYXRjaCBmaWxlcy5cbiAgICAgKiBAcGFyYW0gICB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhICBUaGUgZmlsZSBkYXRhLCBlaXRoZXIgcmF3IG9yIGJhc2U2NCBlbmNvZGVkXG4gICAgICogQHBhcmFtICAge09iamVjdH0gbyAgICAgRmlsZSBvcHRpb25zXG4gICAgICogQHJldHVybiAge0pTWmlwfE9iamVjdHxBcnJheX0gdGhpcyBKU1ppcCBvYmplY3QgKHdoZW4gYWRkaW5nIGEgZmlsZSksXG4gICAgICogYSBmaWxlICh3aGVuIHNlYXJjaGluZyBieSBzdHJpbmcpIG9yIGFuIGFycmF5IG9mIGZpbGVzICh3aGVuIHNlYXJjaGluZyBieSByZWdleCkuXG4gICAgICovXG4gICAgZmlsZTogZnVuY3Rpb24obmFtZSwgZGF0YSwgbykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKGlzUmVnRXhwKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZ2V4cCA9IG5hbWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKHJlbGF0aXZlUGF0aCwgZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWZpbGUuZGlyICYmIHJlZ2V4cC50ZXN0KHJlbGF0aXZlUGF0aCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gdGV4dFxuICAgICAgICAgICAgICAgIHZhciBvYmogPSB0aGlzLmZpbGVzW3RoaXMucm9vdCArIG5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChvYmogJiYgIW9iai5kaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgOiB3ZSBoYXZlIGRhdGEgIVxuICAgICAgICAgICAgbmFtZSA9IHRoaXMucm9vdCArIG5hbWU7XG4gICAgICAgICAgICBmaWxlQWRkLmNhbGwodGhpcywgbmFtZSwgZGF0YSwgbyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgemlwIGZpbGUsIG9yIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0gICB7U3RyaW5nfFJlZ0V4cH0gYXJnIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdG8gYWRkLCBvciBhIHJlZ2V4IHRvIHNlYXJjaCBmb2xkZXJzLlxuICAgICAqIEByZXR1cm4gIHtKU1ppcH0gYW4gb2JqZWN0IHdpdGggdGhlIG5ldyBkaXJlY3RvcnkgYXMgdGhlIHJvb3QsIG9yIGFuIGFycmF5IGNvbnRhaW5pbmcgbWF0Y2hpbmcgZm9sZGVycy5cbiAgICAgKi9cbiAgICBmb2xkZXI6IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICBpZiAoIWFyZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNSZWdFeHAoYXJnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKHJlbGF0aXZlUGF0aCwgZmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLmRpciAmJiBhcmcudGVzdChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbHNlLCBuYW1lIGlzIGEgbmV3IGZvbGRlclxuICAgICAgICB2YXIgbmFtZSA9IHRoaXMucm9vdCArIGFyZztcbiAgICAgICAgdmFyIG5ld0ZvbGRlciA9IGZvbGRlckFkZC5jYWxsKHRoaXMsIG5hbWUpO1xuXG4gICAgICAgIC8vIEFsbG93IGNoYWluaW5nIGJ5IHJldHVybmluZyBhIG5ldyBvYmplY3Qgd2l0aCB0aGlzIGZvbGRlciBhcyB0aGUgcm9vdFxuICAgICAgICB2YXIgcmV0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXQucm9vdCA9IG5ld0ZvbGRlci5uYW1lO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH0vLyxcblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIGZpbGUsIG9yIGEgZGlyZWN0b3J5IGFuZCBhbGwgc3ViLWZpbGVzLCBmcm9tIHRoZSB6aXBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBkZWxldGVcbiAgICAgKiBAcmV0dXJuIHtKU1ppcH0gdGhpcyBKU1ppcCBvYmplY3RcbiAgICAgKi9cbiAgICAvLyByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAvLyAgICAgbmFtZSA9IHRoaXMucm9vdCArIG5hbWU7XG4gICAgLy8gICAgIHZhciBmaWxlID0gdGhpcy5maWxlc1tuYW1lXTtcbiAgICAvLyAgICAgaWYgKCFmaWxlKSB7XG4gICAgLy8gICAgICAgICAvLyBMb29rIGZvciBhbnkgZm9sZGVyc1xuICAgIC8vICAgICAgICAgaWYgKG5hbWUuc2xpY2UoLTEpICE9PSBcIi9cIikge1xuICAgIC8vICAgICAgICAgICAgIG5hbWUgKz0gXCIvXCI7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICBmaWxlID0gdGhpcy5maWxlc1tuYW1lXTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIGlmIChmaWxlICYmICFmaWxlLmRpcikge1xuICAgIC8vICAgICAgICAgLy8gZmlsZVxuICAgIC8vICAgICAgICAgZGVsZXRlIHRoaXMuZmlsZXNbbmFtZV07XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICAvLyBtYXliZSBhIGZvbGRlciwgZGVsZXRlIHJlY3Vyc2l2ZWx5XG4gICAgLy8gICAgICAgICB2YXIga2lkcyA9IHRoaXMuZmlsdGVyKGZ1bmN0aW9uKHJlbGF0aXZlUGF0aCwgZmlsZSkge1xuICAgIC8vICAgICAgICAgICAgIHJldHVybiBmaWxlLm5hbWUuc2xpY2UoMCwgbmFtZS5sZW5ndGgpID09PSBuYW1lO1xuICAgIC8vICAgICAgICAgfSk7XG4gICAgLy8gICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyAgICAgICAgICAgICBkZWxldGUgdGhpcy5maWxlc1traWRzW2ldLm5hbWVdO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgcmV0dXJuIHRoaXM7XG4gICAgLy8gfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIGdlbmVyYXRlIHRoZSB6aXAgZmlsZSA6XG4gICAgICogLSBjb21wcmVzc2lvbiwgXCJTVE9SRVwiIGJ5IGRlZmF1bHQuXG4gICAgICogLSB0eXBlLCBcImJhc2U2NFwiIGJ5IGRlZmF1bHQuIFZhbHVlcyBhcmUgOiBzdHJpbmcsIGJhc2U2NCwgdWludDhhcnJheSwgYXJyYXlidWZmZXIsIGJsb2IuXG4gICAgICogQHJldHVybiB7U3RyaW5nfFVpbnQ4QXJyYXl8QXJyYXlCdWZmZXJ8QnVmZmVyfEJsb2J9IHRoZSB6aXAgZmlsZVxuICAgICAqL1xuICAgIC8vIGdlbmVyYXRlOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xuICAgIC8vIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGUgYXMgYW4gaW50ZXJuYWwgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIGdlbmVyYXRlIHRoZSB6aXAgZmlsZSA6XG4gICAgICogLSBjb21wcmVzc2lvbiwgXCJTVE9SRVwiIGJ5IGRlZmF1bHQuXG4gICAgICogLSB0eXBlLCBcImJhc2U2NFwiIGJ5IGRlZmF1bHQuIFZhbHVlcyBhcmUgOiBzdHJpbmcsIGJhc2U2NCwgdWludDhhcnJheSwgYXJyYXlidWZmZXIsIGJsb2IuXG4gICAgICogQHJldHVybiB7U3RyZWFtSGVscGVyfSB0aGUgc3RyZWFtZWQgemlwIGZpbGUuXG4gICAgICovXG4gICAgLy8gZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIC8vICAgdmFyIHdvcmtlciwgb3B0cyA9IHt9O1xuICAgIC8vICAgdHJ5IHtcbiAgICAvLyAgICAgICBvcHRzID0gdXRpbHMuZXh0ZW5kKG9wdGlvbnMgfHwge30sIHtcbiAgICAvLyAgICAgICAgICAgc3RyZWFtRmlsZXM6IGZhbHNlLFxuICAgIC8vICAgICAgICAgICBjb21wcmVzc2lvbjogXCJTVE9SRVwiLFxuICAgIC8vICAgICAgICAgICBjb21wcmVzc2lvbk9wdGlvbnMgOiBudWxsLFxuICAgIC8vICAgICAgICAgICB0eXBlOiBcIlwiLFxuICAgIC8vICAgICAgICAgICBwbGF0Zm9ybTogXCJET1NcIixcbiAgICAvLyAgICAgICAgICAgY29tbWVudDogbnVsbCxcbiAgICAvLyAgICAgICAgICAgbWltZVR5cGU6ICdhcHBsaWNhdGlvbi96aXAnLFxuICAgIC8vICAgICAgICAgICBlbmNvZGVGaWxlTmFtZTogdXRmOC51dGY4ZW5jb2RlXG4gICAgLy8gICAgICAgfSk7XG5cbiAgICAvLyAgICAgICBvcHRzLnR5cGUgPSBvcHRzLnR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAvLyAgICAgICBvcHRzLmNvbXByZXNzaW9uID0gb3B0cy5jb21wcmVzc2lvbi50b1VwcGVyQ2FzZSgpO1xuXG4gICAgLy8gICAgICAgLy8gXCJiaW5hcnlzdHJpbmdcIiBpcyBwcmVmZXJlZCBidXQgdGhlIGludGVybmFscyB1c2UgXCJzdHJpbmdcIi5cbiAgICAvLyAgICAgICBpZihvcHRzLnR5cGUgPT09IFwiYmluYXJ5c3RyaW5nXCIpIHtcbiAgICAvLyAgICAgICAgIG9wdHMudHlwZSA9IFwic3RyaW5nXCI7XG4gICAgLy8gICAgICAgfVxuXG4gICAgLy8gICAgICAgaWYgKCFvcHRzLnR5cGUpIHtcbiAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG91dHB1dCB0eXBlIHNwZWNpZmllZC5cIik7XG4gICAgLy8gICAgICAgfVxuXG4gICAgLy8gICAgICAgdXRpbHMuY2hlY2tTdXBwb3J0KG9wdHMudHlwZSk7XG5cbiAgICAvLyAgICAgICAvLyBhY2NlcHQgbm9kZWpzIGBwcm9jZXNzLnBsYXRmb3JtYFxuICAgIC8vICAgICAgIGlmKFxuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID09PSAnZGFyd2luJyB8fFxuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID09PSAnZnJlZWJzZCcgfHxcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ2xpbnV4JyB8fFxuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID09PSAnc3Vub3MnXG4gICAgLy8gICAgICAgKSB7XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPSBcIlVOSVhcIjtcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgICAgaWYgKG9wdGlvbnMucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9IFwiRE9TXCI7XG4gICAgLy8gICAgICAgfVxuXG4gICAgLy8gICAgICAgdmFyIGNvbW1lbnQgPSBvcHRzLmNvbW1lbnQgfHwgdGhpcy5jb21tZW50IHx8IFwiXCI7XG4gICAgLy8gICAgICAgd29ya2VyID0gZ2VuZXJhdGUuZ2VuZXJhdGVXb3JrZXIodGhpcywgb3B0cywgY29tbWVudCk7XG4gICAgLy8gICB9IGNhdGNoIChlKSB7XG4gICAgLy8gICAgIHdvcmtlciA9IG5ldyBHZW5lcmljV29ya2VyKFwiZXJyb3JcIik7XG4gICAgLy8gICAgIHdvcmtlci5lcnJvcihlKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIHJldHVybiBuZXcgU3RyZWFtSGVscGVyKHdvcmtlciwgb3B0cy50eXBlIHx8IFwic3RyaW5nXCIsIG9wdHMubWltZVR5cGUpO1xuICAgIC8vIH0sXG4gICAgLy8gLyoqXG4gICAgLy8gICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlIGFzeW5jaHJvbm91c2x5LlxuICAgIC8vICAqIEBzZWUgZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbVxuICAgIC8vICAqL1xuICAgIC8vIGdlbmVyYXRlQXN5bmM6IGZ1bmN0aW9uKG9wdGlvbnMsIG9uVXBkYXRlKSB7XG4gICAgLy8gICAgIHJldHVybiB0aGlzLmdlbmVyYXRlSW50ZXJuYWxTdHJlYW0ob3B0aW9ucykuYWNjdW11bGF0ZShvblVwZGF0ZSk7XG4gICAgLy8gfSxcbiAgICAvLyAvKipcbiAgICAvLyAgKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGUgYXN5bmNocm9ub3VzbHkuXG4gICAgLy8gICogQHNlZSBnZW5lcmF0ZUludGVybmFsU3RyZWFtXG4gICAgLy8gICovXG4gICAgLy8gZ2VuZXJhdGVOb2RlU3RyZWFtOiBmdW5jdGlvbihvcHRpb25zLCBvblVwZGF0ZSkge1xuICAgIC8vICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAvLyAgICAgaWYgKCFvcHRpb25zLnR5cGUpIHtcbiAgICAvLyAgICAgICAgIG9wdGlvbnMudHlwZSA9IFwibm9kZWJ1ZmZlclwiO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIHJldHVybiB0aGlzLmdlbmVyYXRlSW50ZXJuYWxTdHJlYW0ob3B0aW9ucykudG9Ob2RlanNTdHJlYW0ob25VcGRhdGUpO1xuICAgIC8vIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IG91dDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBEYXRhUmVhZGVyID0gcmVxdWlyZSgnLi9EYXRhUmVhZGVyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5mdW5jdGlvbiBBcnJheVJlYWRlcihkYXRhKSB7XG4gICAgRGF0YVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0ZGF0YVtpXSA9IGRhdGFbaV0gJiAweEZGO1xuXHR9XG59XG51dGlscy5pbmhlcml0cyhBcnJheVJlYWRlciwgRGF0YVJlYWRlcik7XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5ieXRlQXRcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLmJ5dGVBdCA9IGZ1bmN0aW9uKGkpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhW3RoaXMuemVybyArIGldO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlXG4gKi9cbkFycmF5UmVhZGVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZSA9IGZ1bmN0aW9uKHNpZykge1xuICAgIHZhciBzaWcwID0gc2lnLmNoYXJDb2RlQXQoMCksXG4gICAgICAgIHNpZzEgPSBzaWcuY2hhckNvZGVBdCgxKSxcbiAgICAgICAgc2lnMiA9IHNpZy5jaGFyQ29kZUF0KDIpLFxuICAgICAgICBzaWczID0gc2lnLmNoYXJDb2RlQXQoMyk7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gNDsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtpXSA9PT0gc2lnMCAmJiB0aGlzLmRhdGFbaSArIDFdID09PSBzaWcxICYmIHRoaXMuZGF0YVtpICsgMl0gPT09IHNpZzIgJiYgdGhpcy5kYXRhW2kgKyAzXSA9PT0gc2lnMykge1xuICAgICAgICAgICAgcmV0dXJuIGkgLSB0aGlzLnplcm87XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlXG4gKi9cbkFycmF5UmVhZGVyLnByb3RvdHlwZS5yZWFkQW5kQ2hlY2tTaWduYXR1cmUgPSBmdW5jdGlvbiAoc2lnKSB7XG4gICAgdmFyIHNpZzAgPSBzaWcuY2hhckNvZGVBdCgwKSxcbiAgICAgICAgc2lnMSA9IHNpZy5jaGFyQ29kZUF0KDEpLFxuICAgICAgICBzaWcyID0gc2lnLmNoYXJDb2RlQXQoMiksXG4gICAgICAgIHNpZzMgPSBzaWcuY2hhckNvZGVBdCgzKSxcbiAgICAgICAgZGF0YSA9IHRoaXMucmVhZERhdGEoNCk7XG4gICAgcmV0dXJuIHNpZzAgPT09IGRhdGFbMF0gJiYgc2lnMSA9PT0gZGF0YVsxXSAmJiBzaWcyID09PSBkYXRhWzJdICYmIHNpZzMgPT09IGRhdGFbM107XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgaWYoc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSB0aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvICsgdGhpcy5pbmRleCwgdGhpcy56ZXJvICsgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbm1vZHVsZS5leHBvcnRzID0gQXJyYXlSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5mdW5jdGlvbiBEYXRhUmVhZGVyKGRhdGEpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhOyAvLyB0eXBlIDogc2VlIGltcGxlbWVudGF0aW9uXG4gICAgdGhpcy5sZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB0aGlzLnplcm8gPSAwO1xufVxuRGF0YVJlYWRlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCB0aGUgb2Zmc2V0IHdpbGwgbm90IGdvIHRvbyBmYXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9mZnNldCB0aGUgYWRkaXRpb25hbCBvZmZzZXQgdG8gY2hlY2suXG4gICAgICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcy5cbiAgICAgKi9cbiAgICBjaGVja09mZnNldDogZnVuY3Rpb24ob2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuY2hlY2tJbmRleCh0aGlzLmluZGV4ICsgb2Zmc2V0KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENoZWNrIHRoYXQgdGhlIHNwZWNpZmVkIGluZGV4IHdpbGwgbm90IGJlIHRvbyBmYXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld0luZGV4IHRoZSBpbmRleCB0byBjaGVjay5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMuXG4gICAgICovXG4gICAgY2hlY2tJbmRleDogZnVuY3Rpb24obmV3SW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIDwgdGhpcy56ZXJvICsgbmV3SW5kZXggfHwgbmV3SW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbmQgb2YgZGF0YSByZWFjaGVkIChkYXRhIGxlbmd0aCA9IFwiICsgdGhpcy5sZW5ndGggKyBcIiwgYXNrZWQgaW5kZXggPSBcIiArIChuZXdJbmRleCkgKyBcIikuIENvcnJ1cHRlZCB6aXAgP1wiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbmV3SW5kZXggVGhlIG5ldyBpbmRleC5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIG5ldyBpbmRleCBpcyBvdXQgb2YgdGhlIGRhdGEuXG4gICAgICovXG4gICAgc2V0SW5kZXg6IGZ1bmN0aW9uKG5ld0luZGV4KSB7XG4gICAgICAgIHRoaXMuY2hlY2tJbmRleChuZXdJbmRleCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBuZXdJbmRleDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFNraXAgdGhlIG5leHQgbiBieXRlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuXG4gICAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBuZXcgaW5kZXggaXMgb3V0IG9mIHRoZSBkYXRhLlxuICAgICAqL1xuICAgIHNraXA6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgdGhpcy5zZXRJbmRleCh0aGlzLmluZGV4ICsgbik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGJ5dGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaSB0aGUgaW5kZXggdG8gdXNlLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gYSBieXRlLlxuICAgICAqL1xuICAgIGJ5dGVBdDogZnVuY3Rpb24oaSkge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgbnVtYmVyIHdpdGggYSBnaXZlbiBieXRlIHNpemUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyLlxuICAgICAqL1xuICAgIHJlYWRJbnQ6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IDAsXG4gICAgICAgICAgICBpO1xuICAgICAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgICAgICBmb3IgKGkgPSB0aGlzLmluZGV4ICsgc2l6ZSAtIDE7IGkgPj0gdGhpcy5pbmRleDsgaS0tKSB7XG4gICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpICsgdGhpcy5ieXRlQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBuZXh0IHN0cmluZyB3aXRoIGEgZ2l2ZW4gYnl0ZSBzaXplLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZy5cbiAgICAgKi9cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbihzaXplKSB7XG4gICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1UbyhcInN0cmluZ1wiLCB0aGlzLnJlYWREYXRhKHNpemUpKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCByYXcgZGF0YSB3aXRob3V0IGNvbnZlcnNpb24sIDxzaXplPiBieXRlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgcmF3IGRhdGEsIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLlxuICAgICAqL1xuICAgIHJlYWREYXRhOiBmdW5jdGlvbihzaXplKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIGEgemlwIHNpZ25hdHVyZSAoNCBieXRlcykuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNpZyB0aGUgc2lnbmF0dXJlIHRvIGZpbmQuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJlbmNlLCAtMSBpZiBub3QgZm91bmQuXG4gICAgICovXG4gICAgbGFzdEluZGV4T2ZTaWduYXR1cmU6IGZ1bmN0aW9uKHNpZykge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBzaWduYXR1cmUgKDQgYnl0ZXMpIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBjb21wYXJlIGl0IHdpdGggc2lnLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaWcgdGhlIGV4cGVjdGVkIHNpZ25hdHVyZVxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIHNpZ25hdHVyZSBtYXRjaGVzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcmVhZEFuZENoZWNrU2lnbmF0dXJlOiBmdW5jdGlvbihzaWcpIHtcbiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9uc1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBuZXh0IGRhdGUuXG4gICAgICogQHJldHVybiB7RGF0ZX0gdGhlIGRhdGUuXG4gICAgICovXG4gICAgcmVhZERhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZG9zdGltZSA9IHRoaXMucmVhZEludCg0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKFxuICAgICAgICAoKGRvc3RpbWUgPj4gMjUpICYgMHg3ZikgKyAxOTgwLCAvLyB5ZWFyXG4gICAgICAgICgoZG9zdGltZSA+PiAyMSkgJiAweDBmKSAtIDEsIC8vIG1vbnRoXG4gICAgICAgIChkb3N0aW1lID4+IDE2KSAmIDB4MWYsIC8vIGRheVxuICAgICAgICAoZG9zdGltZSA+PiAxMSkgJiAweDFmLCAvLyBob3VyXG4gICAgICAgIChkb3N0aW1lID4+IDUpICYgMHgzZiwgLy8gbWludXRlXG4gICAgICAgIChkb3N0aW1lICYgMHgxZikgPDwgMSkpOyAvLyBzZWNvbmRcbiAgICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBEYXRhUmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFVpbnQ4QXJyYXlSZWFkZXIgPSByZXF1aXJlKCcuL1VpbnQ4QXJyYXlSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIE5vZGVCdWZmZXJSZWFkZXIoZGF0YSkge1xuICAgIFVpbnQ4QXJyYXlSZWFkZXIuY2FsbCh0aGlzLCBkYXRhKTtcbn1cbnV0aWxzLmluaGVyaXRzKE5vZGVCdWZmZXJSZWFkZXIsIFVpbnQ4QXJyYXlSZWFkZXIpO1xuXG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5Ob2RlQnVmZmVyUmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIHZhciByZXN1bHQgPSB0aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvICsgdGhpcy5pbmRleCwgdGhpcy56ZXJvICsgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbm1vZHVsZS5leHBvcnRzID0gTm9kZUJ1ZmZlclJlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBEYXRhUmVhZGVyID0gcmVxdWlyZSgnLi9EYXRhUmVhZGVyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5mdW5jdGlvbiBTdHJpbmdSZWFkZXIoZGF0YSkge1xuICAgIERhdGFSZWFkZXIuY2FsbCh0aGlzLCBkYXRhKTtcbn1cbnV0aWxzLmluaGVyaXRzKFN0cmluZ1JlYWRlciwgRGF0YVJlYWRlcik7XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5ieXRlQXRcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5ieXRlQXQgPSBmdW5jdGlvbihpKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMuemVybyArIGkpO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlXG4gKi9cblN0cmluZ1JlYWRlci5wcm90b3R5cGUubGFzdEluZGV4T2ZTaWduYXR1cmUgPSBmdW5jdGlvbihzaWcpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmxhc3RJbmRleE9mKHNpZykgLSB0aGlzLnplcm87XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlXG4gKi9cblN0cmluZ1JlYWRlci5wcm90b3R5cGUucmVhZEFuZENoZWNrU2lnbmF0dXJlID0gZnVuY3Rpb24gKHNpZykge1xuICAgIHZhciBkYXRhID0gdGhpcy5yZWFkRGF0YSg0KTtcbiAgICByZXR1cm4gc2lnID09PSBkYXRhO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWREYXRhXG4gKi9cblN0cmluZ1JlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICAvLyB0aGlzIHdpbGwgd29yayBiZWNhdXNlIHRoZSBjb25zdHJ1Y3RvciBhcHBsaWVkIHRoZSBcIiYgMHhmZlwiIG1hc2suXG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmdSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgQXJyYXlSZWFkZXIgPSByZXF1aXJlKCcuL0FycmF5UmVhZGVyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5mdW5jdGlvbiBVaW50OEFycmF5UmVhZGVyKGRhdGEpIHtcbiAgICBBcnJheVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xufVxudXRpbHMuaW5oZXJpdHMoVWludDhBcnJheVJlYWRlciwgQXJyYXlSZWFkZXIpO1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuVWludDhBcnJheVJlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICBpZihzaXplID09PSAwKSB7XG4gICAgICAgIC8vIGluIElFMTAsIHdoZW4gdXNpbmcgc3ViYXJyYXkoaWR4LCBpZHgpLCB3ZSBnZXQgdGhlIGFycmF5IFsweDAwXSBpbnN0ZWFkIG9mIFtdLlxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSB0aGlzLmRhdGEuc3ViYXJyYXkodGhpcy56ZXJvICsgdGhpcy5pbmRleCwgdGhpcy56ZXJvICsgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheVJlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi4vc3VwcG9ydCcpO1xudmFyIEFycmF5UmVhZGVyID0gcmVxdWlyZSgnLi9BcnJheVJlYWRlcicpO1xudmFyIFN0cmluZ1JlYWRlciA9IHJlcXVpcmUoJy4vU3RyaW5nUmVhZGVyJyk7XG52YXIgTm9kZUJ1ZmZlclJlYWRlciA9IHJlcXVpcmUoJy4vTm9kZUJ1ZmZlclJlYWRlcicpO1xudmFyIFVpbnQ4QXJyYXlSZWFkZXIgPSByZXF1aXJlKCcuL1VpbnQ4QXJyYXlSZWFkZXInKTtcblxuLyoqXG4gKiBDcmVhdGUgYSByZWFkZXIgYWRhcHRlZCB0byB0aGUgZGF0YS5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhIHRvIHJlYWQuXG4gKiBAcmV0dXJuIHtEYXRhUmVhZGVyfSB0aGUgZGF0YSByZWFkZXIuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgdHlwZSA9IHV0aWxzLmdldFR5cGVPZihkYXRhKTtcbiAgICB1dGlscy5jaGVja1N1cHBvcnQodHlwZSk7XG4gICAgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIgJiYgIXN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1JlYWRlcihkYXRhKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFwibm9kZWJ1ZmZlclwiKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZUJ1ZmZlclJlYWRlcihkYXRhKTtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXlSZWFkZXIodXRpbHMudHJhbnNmb3JtVG8oXCJ1aW50OGFycmF5XCIsIGRhdGEpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBcnJheVJlYWRlcih1dGlscy50cmFuc2Zvcm1UbyhcImFycmF5XCIsIGRhdGEpKTtcbn07XG5cbi8vIHZpbTogc2V0IHNoaWZ0d2lkdGg9NCBzb2Z0dGFic3RvcD00OlxuIiwiJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy5MT0NBTF9GSUxFX0hFQURFUiA9IFwiUEtcXHgwM1xceDA0XCI7XG5leHBvcnRzLkNFTlRSQUxfRklMRV9IRUFERVIgPSBcIlBLXFx4MDFcXHgwMlwiO1xuZXhwb3J0cy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQgPSBcIlBLXFx4MDVcXHgwNlwiO1xuZXhwb3J0cy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SID0gXCJQS1xceDA2XFx4MDdcIjtcbmV4cG9ydHMuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EID0gXCJQS1xceDA2XFx4MDZcIjtcbmV4cG9ydHMuREFUQV9ERVNDUklQVE9SID0gXCJQS1xceDA3XFx4MDhcIjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbi8qKlxuICogQSB3b3JrZXIgd2hpY2ggY29udmVydCBjaHVua3MgdG8gYSBzcGVjaWZpZWQgdHlwZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IGRlc3RUeXBlIHRoZSBkZXN0aW5hdGlvbiB0eXBlLlxuICovXG5mdW5jdGlvbiBDb252ZXJ0V29ya2VyKGRlc3RUeXBlKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiQ29udmVydFdvcmtlciB0byBcIiArIGRlc3RUeXBlKTtcbiAgICB0aGlzLmRlc3RUeXBlID0gZGVzdFR5cGU7XG59XG51dGlscy5pbmhlcml0cyhDb252ZXJ0V29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cbkNvbnZlcnRXb3JrZXIucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHRoaXMucHVzaCh7XG4gICAgICAgIGRhdGEgOiB1dGlscy50cmFuc2Zvcm1Ubyh0aGlzLmRlc3RUeXBlLCBjaHVuay5kYXRhKSxcbiAgICAgICAgbWV0YSA6IGNodW5rLm1ldGFcbiAgICB9KTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IENvbnZlcnRXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7XG52YXIgY3JjMzIgPSByZXF1aXJlKCcuLi9jcmMzMicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBBIHdvcmtlciB3aGljaCBjYWxjdWxhdGUgdGhlIGNyYzMyIG9mIHRoZSBkYXRhIGZsb3dpbmcgdGhyb3VnaC5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBDcmMzMlByb2JlKCkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkNyYzMyUHJvYmVcIik7XG59XG51dGlscy5pbmhlcml0cyhDcmMzMlByb2JlLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cbkNyYzMyUHJvYmUucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHRoaXMuc3RyZWFtSW5mby5jcmMzMiA9IGNyYzMyKGNodW5rLmRhdGEsIHRoaXMuc3RyZWFtSW5mby5jcmMzMiB8fCAwKTtcbiAgICB0aGlzLnB1c2goY2h1bmspO1xufTtcbm1vZHVsZS5leHBvcnRzID0gQ3JjMzJQcm9iZTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7XG5cbi8qKlxuICogQSB3b3JrZXIgd2hpY2ggY2FsY3VsYXRlIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGRhdGEgZmxvd2luZyB0aHJvdWdoLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcE5hbWUgdGhlIG5hbWUgdXNlZCB0byBleHBvc2UgdGhlIGxlbmd0aFxuICovXG5mdW5jdGlvbiBEYXRhTGVuZ3RoUHJvYmUocHJvcE5hbWUpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJEYXRhTGVuZ3RoUHJvYmUgZm9yIFwiICsgcHJvcE5hbWUpO1xuICAgIHRoaXMucHJvcE5hbWUgPSBwcm9wTmFtZTtcbiAgICB0aGlzLndpdGhTdHJlYW1JbmZvKHByb3BOYW1lLCAwKTtcbn1cbnV0aWxzLmluaGVyaXRzKERhdGFMZW5ndGhQcm9iZSwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5EYXRhTGVuZ3RoUHJvYmUucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGlmKGNodW5rKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLnN0cmVhbUluZm9bdGhpcy5wcm9wTmFtZV0gfHwgMDtcbiAgICAgICAgdGhpcy5zdHJlYW1JbmZvW3RoaXMucHJvcE5hbWVdID0gbGVuZ3RoICsgY2h1bmsuZGF0YS5sZW5ndGg7XG4gICAgfVxuICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLnByb2Nlc3NDaHVuay5jYWxsKHRoaXMsIGNodW5rKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IERhdGFMZW5ndGhQcm9iZTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcblxuLy8gdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjaHVua3Ncbi8vIFRPRE8gZXhwb3NlIHRoaXMgYXMgYSBwdWJsaWMgdmFyaWFibGVcbnZhciBERUZBVUxUX0JMT0NLX1NJWkUgPSAxNiAqIDEwMjQ7XG5cbi8qKlxuICogQSB3b3JrZXIgdGhhdCByZWFkcyBhIGNvbnRlbnQgYW5kIGVtaXRzIGNodW5rcy5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtQcm9taXNlfSBkYXRhUCB0aGUgcHJvbWlzZSBvZiB0aGUgZGF0YSB0byBzcGxpdFxuICovXG5mdW5jdGlvbiBEYXRhV29ya2VyKGRhdGFQKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiRGF0YVdvcmtlclwiKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5kYXRhSXNSZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIHRoaXMubWF4ID0gMDtcbiAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgIHRoaXMudHlwZSA9IFwiXCI7XG5cbiAgICB0aGlzLl90aWNrU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgICBkYXRhUC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHNlbGYuZGF0YUlzUmVhZHkgPSB0cnVlO1xuICAgICAgICBzZWxmLmRhdGEgPSBkYXRhO1xuICAgICAgICBzZWxmLm1heCA9IGRhdGEgJiYgZGF0YS5sZW5ndGggfHwgMDtcbiAgICAgICAgc2VsZi50eXBlID0gdXRpbHMuZ2V0VHlwZU9mKGRhdGEpO1xuICAgICAgICBpZighc2VsZi5pc1BhdXNlZCkge1xuICAgICAgICAgICAgc2VsZi5fdGlja0FuZFJlcGVhdCgpO1xuICAgICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICB9KTtcbn1cblxudXRpbHMuaW5oZXJpdHMoRGF0YVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmNsZWFuVXBcbiAqL1xuRGF0YVdvcmtlci5wcm90b3R5cGUuY2xlYW5VcCA9IGZ1bmN0aW9uICgpIHtcbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5jbGVhblVwLmNhbGwodGhpcyk7XG4gICAgdGhpcy5kYXRhID0gbnVsbDtcbn07XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnJlc3VtZVxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoIUdlbmVyaWNXb3JrZXIucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3RpY2tTY2hlZHVsZWQgJiYgdGhpcy5kYXRhSXNSZWFkeSkge1xuICAgICAgICB0aGlzLl90aWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgdXRpbHMuZGVsYXkodGhpcy5fdGlja0FuZFJlcGVhdCwgW10sIHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBhIHRpY2sgYSBzY2hlZHVsZSBhbiBvdGhlciBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uXG4gKi9cbkRhdGFXb3JrZXIucHJvdG90eXBlLl90aWNrQW5kUmVwZWF0ID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fdGlja1NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGlmKHRoaXMuaXNQYXVzZWQgfHwgdGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdGljaygpO1xuICAgIGlmKCF0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgdXRpbHMuZGVsYXkodGhpcy5fdGlja0FuZFJlcGVhdCwgW10sIHRoaXMpO1xuICAgICAgICB0aGlzLl90aWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFJlYWQgYW5kIHB1c2ggYSBjaHVuay5cbiAqL1xuRGF0YVdvcmtlci5wcm90b3R5cGUuX3RpY2sgPSBmdW5jdGlvbigpIHtcblxuICAgIGlmKHRoaXMuaXNQYXVzZWQgfHwgdGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgc2l6ZSA9IERFRkFVTFRfQkxPQ0tfU0laRTtcbiAgICB2YXIgZGF0YSA9IG51bGwsIG5leHRJbmRleCA9IE1hdGgubWluKHRoaXMubWF4LCB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgaWYgKHRoaXMuaW5kZXggPj0gdGhpcy5tYXgpIHtcbiAgICAgICAgLy8gRU9GXG4gICAgICAgIHJldHVybiB0aGlzLmVuZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXRjaCh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhLnN1YnN0cmluZyh0aGlzLmluZGV4LCBuZXh0SW5kZXgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwidWludDhhcnJheVwiOlxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmRhdGEuc3ViYXJyYXkodGhpcy5pbmRleCwgbmV4dEluZGV4KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwibm9kZWJ1ZmZlclwiOlxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmRhdGEuc2xpY2UodGhpcy5pbmRleCwgbmV4dEluZGV4KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgIHJldHVybiB0aGlzLnB1c2goe1xuICAgICAgICAgICAgZGF0YSA6IGRhdGEsXG4gICAgICAgICAgICBtZXRhIDoge1xuICAgICAgICAgICAgICAgIHBlcmNlbnQgOiB0aGlzLm1heCA/IHRoaXMuaW5kZXggLyB0aGlzLm1heCAqIDEwMCA6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYXRhV29ya2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEEgd29ya2VyIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCBwYXNzaW5nIGNodW5rcyB0byB0aGUgbmV4dCBvbmUuIFRoaXMgaXMgbGlrZVxuICogYSBub2RlanMgc3RyZWFtIGJ1dCB3aXRoIHNvbWUgZGlmZmVyZW5jZXMuIE9uIHRoZSBnb29kIHNpZGUgOlxuICogLSBpdCB3b3JrcyBvbiBJRSA2LTkgd2l0aG91dCBhbnkgaXNzdWUgLyBwb2x5ZmlsbFxuICogLSBpdCB3ZWlnaHRzIGxlc3MgdGhhbiB0aGUgZnVsbCBkZXBlbmRlbmNpZXMgYnVuZGxlZCB3aXRoIGJyb3dzZXJpZnlcbiAqIC0gaXQgZm9yd2FyZHMgZXJyb3JzIChubyBuZWVkIHRvIGRlY2xhcmUgYW4gZXJyb3IgaGFuZGxlciBFVkVSWVdIRVJFKVxuICpcbiAqIEEgY2h1bmsgaXMgYW4gb2JqZWN0IHdpdGggMiBhdHRyaWJ1dGVzIDogYG1ldGFgIGFuZCBgZGF0YWAuIFRoZSBmb3JtZXIgaXMgYW5cbiAqIG9iamVjdCBjb250YWluaW5nIGFueXRoaW5nIChgcGVyY2VudGAgZm9yIGV4YW1wbGUpLCBzZWUgZWFjaCB3b3JrZXIgZm9yIG1vcmVcbiAqIGRldGFpbHMuIFRoZSBsYXR0ZXIgaXMgdGhlIHJlYWwgZGF0YSAoU3RyaW5nLCBVaW50OEFycmF5LCBldGMpLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHN0cmVhbSAobWFpbmx5IHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcylcbiAqL1xuZnVuY3Rpb24gR2VuZXJpY1dvcmtlcihuYW1lKSB7XG4gICAgLy8gdGhlIG5hbWUgb2YgdGhlIHdvcmtlclxuICAgIHRoaXMubmFtZSA9IG5hbWUgfHwgXCJkZWZhdWx0XCI7XG4gICAgLy8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgYWJvdXQgdGhlIHdvcmtlcnMgY2hhaW5cbiAgICB0aGlzLnN0cmVhbUluZm8gPSB7fTtcbiAgICAvLyBhbiBlcnJvciB3aGljaCBoYXBwZW5lZCB3aGVuIHRoZSB3b3JrZXIgd2FzIHBhdXNlZFxuICAgIHRoaXMuZ2VuZXJhdGVkRXJyb3IgPSBudWxsO1xuICAgIC8vIGFuIG9iamVjdCBjb250YWluaW5nIG1ldGFkYXRhIHRvIGJlIG1lcmdlZCBieSB0aGlzIHdvcmtlciBpbnRvIHRoZSBnZW5lcmFsIG1ldGFkYXRhXG4gICAgdGhpcy5leHRyYVN0cmVhbUluZm8gPSB7fTtcbiAgICAvLyB0cnVlIGlmIHRoZSBzdHJlYW0gaXMgcGF1c2VkIChhbmQgc2hvdWxkIG5vdCBkbyBhbnl0aGluZyksIGZhbHNlIG90aGVyd2lzZVxuICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xuICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBmaW5pc2hlZCAoYW5kIHNob3VsZCBub3QgZG8gYW55dGhpbmcpLCBmYWxzZSBvdGhlcndpc2VcbiAgICB0aGlzLmlzRmluaXNoZWQgPSBmYWxzZTtcbiAgICAvLyB0cnVlIGlmIHRoZSBzdHJlYW0gaXMgbG9ja2VkIHRvIHByZXZlbnQgZnVydGhlciBzdHJ1Y3R1cmUgdXBkYXRlcyAocGlwZSksIGZhbHNlIG90aGVyd2lzZVxuICAgIHRoaXMuaXNMb2NrZWQgPSBmYWxzZTtcbiAgICAvLyB0aGUgZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5fbGlzdGVuZXJzID0ge1xuICAgICAgICAnZGF0YSc6W10sXG4gICAgICAgICdlbmQnOltdLFxuICAgICAgICAnZXJyb3InOltdXG4gICAgfTtcbiAgICAvLyB0aGUgcHJldmlvdXMgd29ya2VyLCBpZiBhbnlcbiAgICB0aGlzLnByZXZpb3VzID0gbnVsbDtcbn1cblxuR2VuZXJpY1dvcmtlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogUHVzaCBhIGNodW5rIHRvIHRoZSBuZXh0IHdvcmtlcnMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNodW5rIHRoZSBjaHVuayB0byBwdXNoXG4gICAgICovXG4gICAgcHVzaCA6IGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICB0aGlzLmVtaXQoXCJkYXRhXCIsIGNodW5rKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEVuZCB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBjYWxsIGVuZGVkIHRoZSB3b3JrZXIsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBlbmQgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImVuZFwiKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW5VcCgpO1xuICAgICAgICAgICAgdGhpcy5pc0ZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBFbmQgdGhlIHN0cmVhbSB3aXRoIGFuIGVycm9yLlxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGUgdGhlIGVycm9yIHdoaWNoIGNhdXNlZCB0aGUgcHJlbWF0dXJlIGVuZC5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCBlbmRlZCB0aGUgd29ya2VyIHdpdGggYW4gZXJyb3IsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBlcnJvciA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVkRXJyb3IgPSBlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0ZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZSk7XG5cbiAgICAgICAgICAgIC8vIGluIHRoZSB3b3JrZXJzIGNoYWluIGV4cGxvZGVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIGNoYWluLFxuICAgICAgICAgICAgLy8gdGhlIGVycm9yIGV2ZW50IHdpbGwgZ28gZG93bndhcmQgYnV0IHdlIGFsc28gbmVlZCB0byBub3RpZnlcbiAgICAgICAgICAgIC8vIHdvcmtlcnMgdXB3YXJkIHRoYXQgdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IuXG4gICAgICAgICAgICBpZih0aGlzLnByZXZpb3VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91cy5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jbGVhblVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBZGQgYSBjYWxsYmFjayBvbiBhbiBldmVudC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgKGRhdGEsIGVuZCwgZXJyb3IpXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkXG4gICAgICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIGN1cnJlbnQgb2JqZWN0IGZvciBjaGFpbmFiaWxpdHlcbiAgICAgKi9cbiAgICBvbiA6IGZ1bmN0aW9uIChuYW1lLCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnNbbmFtZV0ucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2xlYW4gYW55IHJlZmVyZW5jZXMgd2hlbiBhIHdvcmtlciBpcyBlbmRpbmcuXG4gICAgICovXG4gICAgY2xlYW5VcCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zdHJlYW1JbmZvID0gdGhpcy5nZW5lcmF0ZWRFcnJvciA9IHRoaXMuZXh0cmFTdHJlYW1JbmZvID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW107XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyIGFuIGV2ZW50LiBUaGlzIHdpbGwgY2FsbCByZWdpc3RlcmVkIGNhbGxiYWNrIHdpdGggdGhlIHByb3ZpZGVkIGFyZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgKGRhdGEsIGVuZCwgZXJyb3IpXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFyZyB0aGUgYXJndW1lbnQgdG8gY2FsbCB0aGUgY2FsbGJhY2sgd2l0aC5cbiAgICAgKi9cbiAgICBlbWl0IDogZnVuY3Rpb24gKG5hbWUsIGFyZykge1xuICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW25hbWVdKSB7XG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5fbGlzdGVuZXJzW25hbWVdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzW25hbWVdW2ldLmNhbGwodGhpcywgYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hhaW4gYSB3b3JrZXIgd2l0aCBhbiBvdGhlci5cbiAgICAgKiBAcGFyYW0ge1dvcmtlcn0gbmV4dCB0aGUgd29ya2VyIHJlY2VpdmluZyBldmVudHMgZnJvbSB0aGUgY3VycmVudCBvbmUuXG4gICAgICogQHJldHVybiB7d29ya2VyfSB0aGUgbmV4dCB3b3JrZXIgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIHBpcGUgOiBmdW5jdGlvbiAobmV4dCkge1xuICAgICAgICByZXR1cm4gbmV4dC5yZWdpc3RlclByZXZpb3VzKHRoaXMpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogU2FtZSBhcyBgcGlwZWAgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgICAgKiBVc2luZyBhbiBBUEkgd2l0aCBgcGlwZShuZXh0KWAgaXMgdmVyeSBlYXN5LlxuICAgICAqIEltcGxlbWVudGluZyB0aGUgQVBJIHdpdGggdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIG5leHQgb25lIHJlZ2lzdGVyaW5nXG4gICAgICogYSBzb3VyY2UgaXMgZWFzaWVyLCBzZWUgdGhlIFppcEZpbGVXb3JrZXIuXG4gICAgICogQHBhcmFtIHtXb3JrZXJ9IHByZXZpb3VzIHRoZSBwcmV2aW91cyB3b3JrZXIsIHNlbmRpbmcgZXZlbnRzIHRvIHRoaXMgb25lXG4gICAgICogQHJldHVybiB7V29ya2VyfSB0aGUgY3VycmVudCB3b3JrZXIgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIHJlZ2lzdGVyUHJldmlvdXMgOiBmdW5jdGlvbiAocHJldmlvdXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2NrZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBzdHJlYW0gJ1wiICsgdGhpcyArIFwiJyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2hhcmluZyB0aGUgc3RyZWFtSW5mby4uLlxuICAgICAgICB0aGlzLnN0cmVhbUluZm8gPSBwcmV2aW91cy5zdHJlYW1JbmZvO1xuICAgICAgICAvLyAuLi4gYW5kIGFkZGluZyBvdXIgb3duIGJpdHNcbiAgICAgICAgdGhpcy5tZXJnZVN0cmVhbUluZm8oKTtcbiAgICAgICAgdGhpcy5wcmV2aW91cyA9ICBwcmV2aW91cztcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBwcmV2aW91cy5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgc2VsZi5wcm9jZXNzQ2h1bmsoY2h1bmspO1xuICAgICAgICB9KTtcbiAgICAgICAgcHJldmlvdXMub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYuZW5kKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBwcmV2aW91cy5vbignZXJyb3InLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUGF1c2UgdGhlIHN0cmVhbSBzbyBpdCBkb2Vzbid0IHNlbmQgZXZlbnRzIGFueW1vcmUuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgcGF1c2VkIHRoZSB3b3JrZXIsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwYXVzZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYodGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcblxuICAgICAgICBpZih0aGlzLnByZXZpb3VzKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzLnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXN1bWUgYSBwYXVzZWQgc3RyZWFtLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBjYWxsIHJlc3VtZWQgdGhlIHdvcmtlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHJlc3VtZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYoIXRoaXMuaXNQYXVzZWQgfHwgdGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGlmIHRydWUsIHRoZSB3b3JrZXIgdHJpZWQgdG8gcmVzdW1lIGJ1dCBmYWlsZWRcbiAgICAgICAgdmFyIHdpdGhFcnJvciA9IGZhbHNlO1xuICAgICAgICBpZih0aGlzLmdlbmVyYXRlZEVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yKHRoaXMuZ2VuZXJhdGVkRXJyb3IpO1xuICAgICAgICAgICAgd2l0aEVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLnByZXZpb3VzKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzLnJlc3VtZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICF3aXRoRXJyb3I7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBGbHVzaCBhbnkgcmVtYWluaW5nIGJ5dGVzIGFzIHRoZSBzdHJlYW0gaXMgZW5kaW5nLlxuICAgICAqL1xuICAgIGZsdXNoIDogZnVuY3Rpb24gKCkge30sXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyBhIGNodW5rLiBUaGlzIGlzIHVzdWFsbHkgdGhlIG1ldGhvZCBvdmVycmlkZGVuLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaHVuayB0aGUgY2h1bmsgdG8gcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBwcm9jZXNzQ2h1bmsgOiBmdW5jdGlvbihjaHVuaykge1xuICAgICAgICB0aGlzLnB1c2goY2h1bmspO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQWRkIGEga2V5L3ZhbHVlIHRvIGJlIGFkZGVkIGluIHRoZSB3b3JrZXJzIGNoYWluIHN0cmVhbUluZm8gb25jZSBhY3RpdmF0ZWQuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUga2V5IHRvIHVzZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSB0aGUgYXNzb2NpYXRlZCB2YWx1ZVxuICAgICAqIEByZXR1cm4ge1dvcmtlcn0gdGhlIGN1cnJlbnQgd29ya2VyIGZvciBjaGFpbmFiaWxpdHlcbiAgICAgKi9cbiAgICB3aXRoU3RyZWFtSW5mbyA6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZXh0cmFTdHJlYW1JbmZvW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5tZXJnZVN0cmVhbUluZm8oKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBNZXJnZSB0aGlzIHdvcmtlcidzIHN0cmVhbUluZm8gaW50byB0aGUgY2hhaW4ncyBzdHJlYW1JbmZvLlxuICAgICAqL1xuICAgIG1lcmdlU3RyZWFtSW5mbyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gdGhpcy5leHRyYVN0cmVhbUluZm8pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5leHRyYVN0cmVhbUluZm8uaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdHJlYW1JbmZvW2tleV0gPSB0aGlzLmV4dHJhU3RyZWFtSW5mb1trZXldO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExvY2sgdGhlIHN0cmVhbSB0byBwcmV2ZW50IGZ1cnRoZXIgdXBkYXRlcyBvbiB0aGUgd29ya2VycyBjaGFpbi5cbiAgICAgKiBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBhbGwgY2FsbHMgdG8gcGlwZSB3aWxsIGZhaWwuXG4gICAgICovXG4gICAgbG9jazogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc0xvY2tlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0cmVhbSAnXCIgKyB0aGlzICsgXCInIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0xvY2tlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzLmxvY2soKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIFByZXR0eSBwcmludCB0aGUgd29ya2VycyBjaGFpbi5cbiAgICAgKi9cbiAgICB0b1N0cmluZyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1lID0gXCJXb3JrZXIgXCIgKyB0aGlzLm5hbWU7XG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91cyArIFwiIC0+IFwiICsgbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbWU7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdlbmVyaWNXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgQ29udmVydFdvcmtlciA9IHJlcXVpcmUoJy4vQ29udmVydFdvcmtlcicpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuLi9iYXNlNjQnKTtcbnZhciBOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyID0gcmVxdWlyZSgnLi4vbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXInKTtcbnZhciBleHRlcm5hbCA9IHJlcXVpcmUoXCIuLi9leHRlcm5hbFwiKTtcblxuLyoqXG4gKiBBcHBseSB0aGUgZmluYWwgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGRhdGEuIElmIHRoZSB1c2VyIHdhbnRzIGEgQmxvYiBmb3JcbiAqIGV4YW1wbGUsIGl0J3MgZWFzaWVyIHRvIHdvcmsgd2l0aCBhbiBVOGludEFycmF5IGFuZCBmaW5hbGx5IGRvIHRoZVxuICogQXJyYXlCdWZmZXIvQmxvYiBjb252ZXJzaW9uLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIG5hbWUgb2YgdGhlIGZpbmFsIHR5cGVcbiAqIEBwYXJhbSB7U3RyaW5nfFVpbnQ4QXJyYXl8QnVmZmVyfSBjb250ZW50IHRoZSBjb250ZW50IHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVUeXBlIHRoZSBtaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQsIGlmIGFwcGxpY2FibGUuXG4gKiBAcmV0dXJuIHtTdHJpbmd8VWludDhBcnJheXxBcnJheUJ1ZmZlcnxCdWZmZXJ8QmxvYn0gdGhlIGNvbnRlbnQgaW4gdGhlIHJpZ2h0IGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtWmlwT3V0cHV0KHR5cGUsIGNvbnRlbnQsIG1pbWVUeXBlKSB7XG4gICAgc3dpdGNoKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImJsb2JcIiA6XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMubmV3QmxvYih1dGlscy50cmFuc2Zvcm1UbyhcImFycmF5YnVmZmVyXCIsIGNvbnRlbnQpLCBtaW1lVHlwZSk7XG4gICAgICAgIGNhc2UgXCJiYXNlNjRcIiA6XG4gICAgICAgICAgICByZXR1cm4gYmFzZTY0LmVuY29kZShjb250ZW50KTtcbiAgICAgICAgZGVmYXVsdCA6XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMudHJhbnNmb3JtVG8odHlwZSwgY29udGVudCk7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlIGFuIGFycmF5IG9mIGRhdGEgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiB0aGUgZGF0YSBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5fSBkYXRhQXJyYXkgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgY2h1bmtzIHRvIGNvbmNhdGVuYXRlXG4gKiBAcmV0dXJuIHtTdHJpbmd8VWludDhBcnJheXxCdWZmZXJ9IHRoZSBjb25jYXRlbmF0ZWQgZGF0YVxuICogQHRocm93cyBFcnJvciBpZiB0aGUgYXNrZWQgdHlwZSBpcyB1bnN1cHBvcnRlZFxuICovXG5mdW5jdGlvbiBjb25jYXQgKHR5cGUsIGRhdGFBcnJheSkge1xuICAgIHZhciBpLCBpbmRleCA9IDAsIHJlcyA9IG51bGwsIHRvdGFsTGVuZ3RoID0gMDtcbiAgICBmb3IoaSA9IDA7IGkgPCBkYXRhQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdG90YWxMZW5ndGggKz0gZGF0YUFycmF5W2ldLmxlbmd0aDtcbiAgICB9XG4gICAgc3dpdGNoKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIGRhdGFBcnJheS5qb2luKFwiXCIpO1xuICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIGRhdGFBcnJheSk7XG4gICAgICAgIGNhc2UgXCJ1aW50OGFycmF5XCI6XG4gICAgICAgICAgICByZXMgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBkYXRhQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZXMuc2V0KGRhdGFBcnJheVtpXSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIGluZGV4ICs9IGRhdGFBcnJheVtpXS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICBjYXNlIFwibm9kZWJ1ZmZlclwiOlxuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoZGF0YUFycmF5KTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvbmNhdCA6IHVuc3VwcG9ydGVkIHR5cGUgJ1wiICArIHR5cGUgKyBcIidcIik7XG4gICAgfVxufVxuXG4vKipcbiAqIExpc3RlbiBhIFN0cmVhbUhlbHBlciwgYWNjdW11bGF0ZSBpdHMgY29udGVudCBhbmQgY29uY2F0ZW5hdGUgaXQgaW50byBhXG4gKiBjb21wbGV0ZSBibG9jay5cbiAqIEBwYXJhbSB7U3RyZWFtSGVscGVyfSBoZWxwZXIgdGhlIGhlbHBlciB0byB1c2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYWxsYmFjayBhIGNhbGxiYWNrIGNhbGxlZCBvbiBlYWNoIHVwZGF0ZS4gQ2FsbGVkXG4gKiB3aXRoIG9uZSBhcmcgOlxuICogLSB0aGUgbWV0YWRhdGEgbGlua2VkIHRvIHRoZSB1cGRhdGUgcmVjZWl2ZWQuXG4gKiBAcmV0dXJuIFByb21pc2UgdGhlIHByb21pc2UgZm9yIHRoZSBhY2N1bXVsYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGUoaGVscGVyLCB1cGRhdGVDYWxsYmFjaykge1xuICAgIHJldHVybiBuZXcgZXh0ZXJuYWwuUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICAgICAgdmFyIGRhdGFBcnJheSA9IFtdO1xuICAgICAgICB2YXIgY2h1bmtUeXBlID0gaGVscGVyLl9pbnRlcm5hbFR5cGUsXG4gICAgICAgICAgICByZXN1bHRUeXBlID0gaGVscGVyLl9vdXRwdXRUeXBlLFxuICAgICAgICAgICAgbWltZVR5cGUgPSBoZWxwZXIuX21pbWVUeXBlO1xuICAgICAgICBoZWxwZXJcbiAgICAgICAgLm9uKCdkYXRhJywgZnVuY3Rpb24gKGRhdGEsIG1ldGEpIHtcbiAgICAgICAgICAgIGRhdGFBcnJheS5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgaWYodXBkYXRlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVDYWxsYmFjayhtZXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgZGF0YUFycmF5ID0gW107XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlbmQnLCBmdW5jdGlvbiAoKXtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRyYW5zZm9ybVppcE91dHB1dChyZXN1bHRUeXBlLCBjb25jYXQoY2h1bmtUeXBlLCBkYXRhQXJyYXkpLCBtaW1lVHlwZSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGFBcnJheSA9IFtdO1xuICAgICAgICB9KVxuICAgICAgICAucmVzdW1lKCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQW4gaGVscGVyIHRvIGVhc2lseSB1c2Ugd29ya2VycyBvdXRzaWRlIG9mIEpTWmlwLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1dvcmtlcn0gd29ya2VyIHRoZSB3b3JrZXIgdG8gd3JhcFxuICogQHBhcmFtIHtTdHJpbmd9IG91dHB1dFR5cGUgdGhlIHR5cGUgb2YgZGF0YSBleHBlY3RlZCBieSB0aGUgdXNlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWltZVR5cGUgdGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgaWYgYXBwbGljYWJsZS5cbiAqL1xuZnVuY3Rpb24gU3RyZWFtSGVscGVyKHdvcmtlciwgb3V0cHV0VHlwZSwgbWltZVR5cGUpIHtcbiAgICB2YXIgaW50ZXJuYWxUeXBlID0gb3V0cHV0VHlwZTtcbiAgICBzd2l0Y2gob3V0cHV0VHlwZSkge1xuICAgICAgICBjYXNlIFwiYmxvYlwiOlxuICAgICAgICBjYXNlIFwiYXJyYXlidWZmZXJcIjpcbiAgICAgICAgICAgIGludGVybmFsVHlwZSA9IFwidWludDhhcnJheVwiO1xuICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImJhc2U2NFwiOlxuICAgICAgICAgICAgaW50ZXJuYWxUeXBlID0gXCJzdHJpbmdcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gdGhlIHR5cGUgdXNlZCBpbnRlcm5hbGx5XG4gICAgICAgIHRoaXMuX2ludGVybmFsVHlwZSA9IGludGVybmFsVHlwZTtcbiAgICAgICAgLy8gdGhlIHR5cGUgdXNlZCB0byBvdXRwdXQgcmVzdWx0c1xuICAgICAgICB0aGlzLl9vdXRwdXRUeXBlID0gb3V0cHV0VHlwZTtcbiAgICAgICAgLy8gdGhlIG1pbWUgdHlwZVxuICAgICAgICB0aGlzLl9taW1lVHlwZSA9IG1pbWVUeXBlO1xuICAgICAgICB1dGlscy5jaGVja1N1cHBvcnQoaW50ZXJuYWxUeXBlKTtcbiAgICAgICAgdGhpcy5fd29ya2VyID0gd29ya2VyLnBpcGUobmV3IENvbnZlcnRXb3JrZXIoaW50ZXJuYWxUeXBlKSk7XG4gICAgICAgIC8vIHRoZSBsYXN0IHdvcmtlcnMgY2FuIGJlIHJld2lyZWQgd2l0aG91dCBpc3N1ZXMgYnV0IHdlIG5lZWQgdG9cbiAgICAgICAgLy8gcHJldmVudCBhbnkgdXBkYXRlcyBvbiBwcmV2aW91cyB3b3JrZXJzLlxuICAgICAgICB3b3JrZXIubG9jaygpO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICB0aGlzLl93b3JrZXIgPSBuZXcgR2VuZXJpY1dvcmtlcihcImVycm9yXCIpO1xuICAgICAgICB0aGlzLl93b3JrZXIuZXJyb3IoZSk7XG4gICAgfVxufVxuXG5TdHJlYW1IZWxwZXIucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIExpc3RlbiBhIFN0cmVhbUhlbHBlciwgYWNjdW11bGF0ZSBpdHMgY29udGVudCBhbmQgY29uY2F0ZW5hdGUgaXQgaW50byBhXG4gICAgICogY29tcGxldGUgYmxvY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2IgdGhlIHVwZGF0ZSBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJuIFByb21pc2UgdGhlIHByb21pc2UgZm9yIHRoZSBhY2N1bXVsYXRpb24uXG4gICAgICovXG4gICAgYWNjdW11bGF0ZSA6IGZ1bmN0aW9uICh1cGRhdGVDYikge1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0ZSh0aGlzLCB1cGRhdGVDYik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBZGQgYSBsaXN0ZW5lciBvbiBhbiBldmVudCB0cmlnZ2VyZWQgb24gYSBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2dCB0aGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiB0aGUgbGlzdGVuZXJcbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBjdXJyZW50IGhlbHBlci5cbiAgICAgKi9cbiAgICBvbiA6IGZ1bmN0aW9uIChldnQsIGZuKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICBpZihldnQgPT09IFwiZGF0YVwiKSB7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIub24oZXZ0LCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgICAgICAgICBmbi5jYWxsKHNlbGYsIGNodW5rLmRhdGEsIGNodW5rLm1ldGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIub24oZXZ0LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdXRpbHMuZGVsYXkoZm4sIGFyZ3VtZW50cywgc2VsZik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlc3VtZSB0aGUgZmxvdyBvZiBjaHVua3MuXG4gICAgICogQHJldHVybiB7U3RyZWFtSGVscGVyfSB0aGUgY3VycmVudCBoZWxwZXIuXG4gICAgICovXG4gICAgcmVzdW1lIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB1dGlscy5kZWxheSh0aGlzLl93b3JrZXIucmVzdW1lLCBbXSwgdGhpcy5fd29ya2VyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgZmxvdyBvZiBjaHVua3MuXG4gICAgICogQHJldHVybiB7U3RyZWFtSGVscGVyfSB0aGUgY3VycmVudCBoZWxwZXIuXG4gICAgICovXG4gICAgcGF1c2UgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3dvcmtlci5wYXVzZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIG5vZGVqcyBzdHJlYW0gZm9yIHRoaXMgaGVscGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZUNiIHRoZSB1cGRhdGUgY2FsbGJhY2suXG4gICAgICogQHJldHVybiB7Tm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcn0gdGhlIG5vZGVqcyBzdHJlYW0uXG4gICAgICovXG4gICAgdG9Ob2RlanNTdHJlYW0gOiBmdW5jdGlvbiAodXBkYXRlQ2IpIHtcbiAgICAgICAgdXRpbHMuY2hlY2tTdXBwb3J0KFwibm9kZXN0cmVhbVwiKTtcbiAgICAgICAgaWYgKHRoaXMuX291dHB1dFR5cGUgIT09IFwibm9kZWJ1ZmZlclwiKSB7XG4gICAgICAgICAgICAvLyBhbiBvYmplY3Qgc3RyZWFtIGNvbnRhaW5pbmcgYmxvYi9hcnJheWJ1ZmZlci91aW50OGFycmF5L3N0cmluZ1xuICAgICAgICAgICAgLy8gaXMgc3RyYW5nZSBhbmQgSSBkb24ndCBrbm93IGlmIGl0IHdvdWxkIGJlIHVzZWZ1bC5cbiAgICAgICAgICAgIC8vIEkgeW91IGZpbmQgdGhpcyBjb21tZW50IGFuZCBoYXZlIGEgZ29vZCB1c2VjYXNlLCBwbGVhc2Ugb3BlbiBhXG4gICAgICAgICAgICAvLyBidWcgcmVwb3J0ICFcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLl9vdXRwdXRUeXBlICsgXCIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1ldGhvZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcih0aGlzLCB7XG4gICAgICAgICAgICBvYmplY3RNb2RlIDogdGhpcy5fb3V0cHV0VHlwZSAhPT0gXCJub2RlYnVmZmVyXCJcbiAgICAgICAgfSwgdXBkYXRlQ2IpO1xuICAgIH1cbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTdHJlYW1IZWxwZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuYmFzZTY0ID0gdHJ1ZTtcbmV4cG9ydHMuYXJyYXkgPSB0cnVlO1xuZXhwb3J0cy5zdHJpbmcgPSB0cnVlO1xuZXhwb3J0cy5hcnJheWJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgVWludDhBcnJheSAhPT0gXCJ1bmRlZmluZWRcIjtcbmV4cG9ydHMubm9kZWJ1ZmZlciA9IHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCI7XG4vLyBjb250YWlucyB0cnVlIGlmIEpTWmlwIGNhbiByZWFkL2dlbmVyYXRlIFVpbnQ4QXJyYXksIGZhbHNlIG90aGVyd2lzZS5cbmV4cG9ydHMudWludDhhcnJheSA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSBcInVuZGVmaW5lZFwiO1xuXG5pZiAodHlwZW9mIEFycmF5QnVmZmVyID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZXhwb3J0cy5ibG9iID0gZmFsc2U7XG59XG5lbHNlIHtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgIHRyeSB7XG4gICAgICAgIGV4cG9ydHMuYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7XG4gICAgICAgICAgICB0eXBlOiBcImFwcGxpY2F0aW9uL3ppcFwiXG4gICAgICAgIH0pLnNpemUgPT09IDA7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgQnVpbGRlciA9IHdpbmRvdy5CbG9iQnVpbGRlciB8fCB3aW5kb3cuV2ViS2l0QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1vekJsb2JCdWlsZGVyIHx8IHdpbmRvdy5NU0Jsb2JCdWlsZGVyO1xuICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpO1xuICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyKTtcbiAgICAgICAgICAgIGV4cG9ydHMuYmxvYiA9IGJ1aWxkZXIuZ2V0QmxvYignYXBwbGljYXRpb24vemlwJykuc2l6ZSA9PT0gMDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZXhwb3J0cy5ibG9iID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydHMubm9kZXN0cmVhbSA9ICEhcmVxdWlyZShcIi4vbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXJcIikucHJvdG90eXBlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xudmFyIG5vZGVqc1V0aWxzID0gcmVxdWlyZSgnLi9ub2RlanNVdGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9HZW5lcmljV29ya2VyJyk7XG5cbi8qKlxuICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY29tZSBmcm9tIHBha28sIGZyb20gcGFrby9saWIvdXRpbHMvc3RyaW5nc1xuICogcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLCBzZWUgcGFrbyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28vXG4gKi9cblxuLy8gVGFibGUgd2l0aCB1dGY4IGxlbmd0aHMgKGNhbGN1bGF0ZWQgYnkgZmlyc3QgYnl0ZSBvZiBzZXF1ZW5jZSlcbi8vIE5vdGUsIHRoYXQgNSAmIDYtYnl0ZSB2YWx1ZXMgYW5kIHNvbWUgNC1ieXRlIHZhbHVlcyBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGluIEpTLFxuLy8gYmVjYXVzZSBtYXggcG9zc2libGUgY29kZXBvaW50IGlzIDB4MTBmZmZmXG52YXIgX3V0ZjhsZW4gPSBuZXcgQXJyYXkoMjU2KTtcbmZvciAodmFyIGk9MDsgaTwyNTY7IGkrKykge1xuICBfdXRmOGxlbltpXSA9IChpID49IDI1MiA/IDYgOiBpID49IDI0OCA/IDUgOiBpID49IDI0MCA/IDQgOiBpID49IDIyNCA/IDMgOiBpID49IDE5MiA/IDIgOiAxKTtcbn1cbl91dGY4bGVuWzI1NF09X3V0ZjhsZW5bMjU0XT0xOyAvLyBJbnZhbGlkIHNlcXVlbmNlIHN0YXJ0XG5cbi8vIGNvbnZlcnQgc3RyaW5nIHRvIGFycmF5ICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbnZhciBzdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHZhciBidWYsIGMsIGMyLCBtX3BvcywgaSwgc3RyX2xlbiA9IHN0ci5sZW5ndGgsIGJ1Zl9sZW4gPSAwO1xuXG4gICAgLy8gY291bnQgYmluYXJ5IHNpemVcbiAgICBmb3IgKG1fcG9zID0gMDsgbV9wb3MgPCBzdHJfbGVuOyBtX3BvcysrKSB7XG4gICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MrMSA8IHN0cl9sZW4pKSB7XG4gICAgICAgICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKzEpO1xuICAgICAgICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICAgICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICAgICAgICAgIG1fcG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnVmX2xlbiArPSBjIDwgMHg4MCA/IDEgOiBjIDwgMHg4MDAgPyAyIDogYyA8IDB4MTAwMDAgPyAzIDogNDtcbiAgICB9XG5cbiAgICAvLyBhbGxvY2F0ZSBidWZmZXJcbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGJ1Zl9sZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1ZiA9IG5ldyBBcnJheShidWZfbGVuKTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0XG4gICAgZm9yIChpPTAsIG1fcG9zID0gMDsgaSA8IGJ1Zl9sZW47IG1fcG9zKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICAgICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcysxIDwgc3RyX2xlbikpIHtcbiAgICAgICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MrMSk7XG4gICAgICAgICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgICAgICAgICAgbV9wb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgIC8qIG9uZSBieXRlICovXG4gICAgICAgICAgICBidWZbaSsrXSA9IGM7XG4gICAgICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICAvKiB0d28gYnl0ZXMgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhDMCB8IChjID4+PiA2KTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgICAgIH0gZWxzZSBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgICAgICAgIC8qIHRocmVlIGJ5dGVzICovXG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4RTAgfCAoYyA+Pj4gMTIpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBmb3VyIGJ5dGVzICovXG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ZjAgfCAoYyA+Pj4gMTgpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDEyICYgMHgzZik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBidWY7XG59O1xuXG4vLyBDYWxjdWxhdGUgbWF4IHBvc3NpYmxlIHBvc2l0aW9uIGluIHV0ZjggYnVmZmVyLFxuLy8gdGhhdCB3aWxsIG5vdCBicmVhayBzZXF1ZW5jZS4gSWYgdGhhdCdzIG5vdCBwb3NzaWJsZVxuLy8gLSAodmVyeSBzbWFsbCBsaW1pdHMpIHJldHVybiBtYXggc2l6ZSBhcyBpcy5cbi8vXG4vLyBidWZbXSAtIHV0ZjggYnl0ZXMgYXJyYXlcbi8vIG1heCAgIC0gbGVuZ3RoIGxpbWl0IChtYW5kYXRvcnkpO1xudmFyIHV0Zjhib3JkZXIgPSBmdW5jdGlvbihidWYsIG1heCkge1xuICAgIHZhciBwb3M7XG5cbiAgICBtYXggPSBtYXggfHwgYnVmLmxlbmd0aDtcbiAgICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgICAvLyBnbyBiYWNrIGZyb20gbGFzdCBwb3NpdGlvbiwgdW50aWwgc3RhcnQgb2Ygc2VxdWVuY2UgZm91bmRcbiAgICBwb3MgPSBtYXgtMTtcbiAgICB3aGlsZSAocG9zID49IDAgJiYgKGJ1Zltwb3NdICYgMHhDMCkgPT09IDB4ODApIHsgcG9zLS07IH1cblxuICAgIC8vIEZ1Y2t1cCAtIHZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgICAvLyByZXR1cm4gbWF4LCBiZWNhdXNlIHdlIHNob3VsZCByZXR1cm4gc29tZXRoaW5nIGFueXdheS5cbiAgICBpZiAocG9zIDwgMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgdnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgICAvLyByZXR1cm4gbWF4IHRvby5cbiAgICBpZiAocG9zID09PSAwKSB7IHJldHVybiBtYXg7IH1cblxuICAgIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG5cbi8vIGNvbnZlcnQgYXJyYXkgdG8gc3RyaW5nXG52YXIgYnVmMnN0cmluZyA9IGZ1bmN0aW9uIChidWYpIHtcbiAgICB2YXIgc3RyLCBpLCBvdXQsIGMsIGNfbGVuO1xuICAgIHZhciBsZW4gPSBidWYubGVuZ3RoO1xuXG4gICAgLy8gUmVzZXJ2ZSBtYXggcG9zc2libGUgbGVuZ3RoICgyIHdvcmRzIHBlciBjaGFyKVxuICAgIC8vIE5COiBieSB1bmtub3duIHJlYXNvbnMsIEFycmF5IGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIGZvclxuICAgIC8vICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5IHRoYW4gVWludDE2QXJyYXkuXG4gICAgdmFyIHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbioyKTtcblxuICAgIGZvciAob3V0PTAsIGk9MDsgaTxsZW47KSB7XG4gICAgICAgIGMgPSBidWZbaSsrXTtcbiAgICAgICAgLy8gcXVpY2sgcHJvY2VzcyBhc2NpaVxuICAgICAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgICAgICBjX2xlbiA9IF91dGY4bGVuW2NdO1xuICAgICAgICAvLyBza2lwIDUgJiA2IGJ5dGUgY29kZXNcbiAgICAgICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4tMTsgY29udGludWU7IH1cblxuICAgICAgICAvLyBhcHBseSBtYXNrIG9uIGZpcnN0IGJ5dGVcbiAgICAgICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgICAgICAvLyBqb2luIHRoZSByZXN0XG4gICAgICAgIHdoaWxlIChjX2xlbiA+IDEgJiYgaSA8IGxlbikge1xuICAgICAgICAgICAgYyA9IChjIDw8IDYpIHwgKGJ1ZltpKytdICYgMHgzZik7XG4gICAgICAgICAgICBjX2xlbi0tO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGVybWluYXRlZCBieSBlbmQgb2Ygc3RyaW5nP1xuICAgICAgICBpZiAoY19sZW4gPiAxKSB7IHV0ZjE2YnVmW291dCsrXSA9IDB4ZmZmZDsgY29udGludWU7IH1cblxuICAgICAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjIC09IDB4MTAwMDA7XG4gICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGQ4MDAgfCAoKGMgPj4gMTApICYgMHgzZmYpO1xuICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkYzAwIHwgKGMgJiAweDNmZik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzaHJpbmtCdWYodXRmMTZidWYsIG91dClcbiAgICBpZiAodXRmMTZidWYubGVuZ3RoICE9PSBvdXQpIHtcbiAgICAgICAgaWYodXRmMTZidWYuc3ViYXJyYXkpIHtcbiAgICAgICAgICAgIHV0ZjE2YnVmID0gdXRmMTZidWYuc3ViYXJyYXkoMCwgb3V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHV0ZjE2YnVmLmxlbmd0aCA9IG91dDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0ZjE2YnVmKTtcbiAgICByZXR1cm4gdXRpbHMuYXBwbHlGcm9tQ2hhckNvZGUodXRmMTZidWYpO1xufTtcblxuXG4vLyBUaGF0J3MgYWxsIGZvciB0aGUgcGFrbyBmdW5jdGlvbnMuXG5cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSBqYXZhc2NyaXB0IHN0cmluZyBpbnRvIGFuIGFycmF5ICh0eXBlZCBpZiBwb3NzaWJsZSkgb2YgYnl0ZXMsXG4gKiBVVEYtOCBlbmNvZGVkLlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIGVuY29kZVxuICogQHJldHVybiB7QXJyYXl8VWludDhBcnJheXxCdWZmZXJ9IHRoZSBVVEYtOCBlbmNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0cy51dGY4ZW5jb2RlID0gZnVuY3Rpb24gdXRmOGVuY29kZShzdHIpIHtcbiAgICBpZiAoc3VwcG9ydC5ub2RlYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBub2RlanNVdGlscy5uZXdCdWZmZXIoc3RyLCBcInV0Zi04XCIpO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmcyYnVmKHN0cik7XG59O1xuXG5cbi8qKlxuICogVHJhbnNmb3JtIGEgYnl0ZXMgYXJyYXkgKG9yIGEgcmVwcmVzZW50YXRpb24pIHJlcHJlc2VudGluZyBhbiBVVEYtOCBlbmNvZGVkXG4gKiBzdHJpbmcgaW50byBhIGphdmFzY3JpcHQgc3RyaW5nLlxuICogQHBhcmFtIHtBcnJheXxVaW50OEFycmF5fEJ1ZmZlcn0gYnVmIHRoZSBkYXRhIGRlIGRlY29kZVxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgZGVjb2RlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydHMudXRmOGRlY29kZSA9IGZ1bmN0aW9uIHV0ZjhkZWNvZGUoYnVmKSB7XG4gICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gdXRpbHMudHJhbnNmb3JtVG8oXCJub2RlYnVmZmVyXCIsIGJ1ZikudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICB9XG5cbiAgICBidWYgPSB1dGlscy50cmFuc2Zvcm1UbyhzdXBwb3J0LnVpbnQ4YXJyYXkgPyBcInVpbnQ4YXJyYXlcIiA6IFwiYXJyYXlcIiwgYnVmKTtcblxuICAgIHJldHVybiBidWYyc3RyaW5nKGJ1Zik7XG59O1xuXG4vKipcbiAqIEEgd29ya2VyIHRvIGRlY29kZSB1dGY4IGVuY29kZWQgYmluYXJ5IGNodW5rcyBpbnRvIHN0cmluZyBjaHVua3MuXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gVXRmOERlY29kZVdvcmtlcigpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJ1dGYtOCBkZWNvZGVcIik7XG4gICAgLy8gdGhlIGxhc3QgYnl0ZXMgaWYgYSBjaHVuayBkaWRuJ3QgZW5kIHdpdGggYSBjb21wbGV0ZSBjb2RlcG9pbnQuXG4gICAgdGhpcy5sZWZ0T3ZlciA9IG51bGw7XG59XG51dGlscy5pbmhlcml0cyhVdGY4RGVjb2RlV29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cblV0ZjhEZWNvZGVXb3JrZXIucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuXG4gICAgdmFyIGRhdGEgPSB1dGlscy50cmFuc2Zvcm1UbyhzdXBwb3J0LnVpbnQ4YXJyYXkgPyBcInVpbnQ4YXJyYXlcIiA6IFwiYXJyYXlcIiwgY2h1bmsuZGF0YSk7XG5cbiAgICAvLyAxc3Qgc3RlcCwgcmUtdXNlIHdoYXQncyBsZWZ0IG9mIHRoZSBwcmV2aW91cyBjaHVua1xuICAgIGlmICh0aGlzLmxlZnRPdmVyICYmIHRoaXMubGVmdE92ZXIubGVuZ3RoKSB7XG4gICAgICAgIGlmKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICAgICAgdmFyIHByZXZpb3VzRGF0YSA9IGRhdGE7XG4gICAgICAgICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocHJldmlvdXNEYXRhLmxlbmd0aCArIHRoaXMubGVmdE92ZXIubGVuZ3RoKTtcbiAgICAgICAgICAgIGRhdGEuc2V0KHRoaXMubGVmdE92ZXIsIDApO1xuICAgICAgICAgICAgZGF0YS5zZXQocHJldmlvdXNEYXRhLCB0aGlzLmxlZnRPdmVyLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy5sZWZ0T3Zlci5jb25jYXQoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG5leHRCb3VuZGFyeSA9IHV0Zjhib3JkZXIoZGF0YSk7XG4gICAgdmFyIHVzYWJsZURhdGEgPSBkYXRhO1xuICAgIGlmIChuZXh0Qm91bmRhcnkgIT09IGRhdGEubGVuZ3RoKSB7XG4gICAgICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgICAgIHVzYWJsZURhdGEgPSBkYXRhLnN1YmFycmF5KDAsIG5leHRCb3VuZGFyeSk7XG4gICAgICAgICAgICB0aGlzLmxlZnRPdmVyID0gZGF0YS5zdWJhcnJheShuZXh0Qm91bmRhcnksIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVzYWJsZURhdGEgPSBkYXRhLnNsaWNlKDAsIG5leHRCb3VuZGFyeSk7XG4gICAgICAgICAgICB0aGlzLmxlZnRPdmVyID0gZGF0YS5zbGljZShuZXh0Qm91bmRhcnksIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucHVzaCh7XG4gICAgICAgIGRhdGEgOiBleHBvcnRzLnV0ZjhkZWNvZGUodXNhYmxlRGF0YSksXG4gICAgICAgIG1ldGEgOiBjaHVuay5tZXRhXG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5mbHVzaFxuICovXG5VdGY4RGVjb2RlV29ya2VyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZih0aGlzLmxlZnRPdmVyICYmIHRoaXMubGVmdE92ZXIubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucHVzaCh7XG4gICAgICAgICAgICBkYXRhIDogZXhwb3J0cy51dGY4ZGVjb2RlKHRoaXMubGVmdE92ZXIpLFxuICAgICAgICAgICAgbWV0YSA6IHt9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmxlZnRPdmVyID0gbnVsbDtcbiAgICB9XG59O1xuZXhwb3J0cy5VdGY4RGVjb2RlV29ya2VyID0gVXRmOERlY29kZVdvcmtlcjtcblxuLyoqXG4gKiBBIHdvcmtlciB0byBlbmRjb2RlIHN0cmluZyBjaHVua3MgaW50byB1dGY4IGVuY29kZWQgYmluYXJ5IGNodW5rcy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBVdGY4RW5jb2RlV29ya2VyKCkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcInV0Zi04IGVuY29kZVwiKTtcbn1cbnV0aWxzLmluaGVyaXRzKFV0ZjhFbmNvZGVXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuVXRmOEVuY29kZVdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5wdXNoKHtcbiAgICAgICAgZGF0YSA6IGV4cG9ydHMudXRmOGVuY29kZShjaHVuay5kYXRhKSxcbiAgICAgICAgbWV0YSA6IGNodW5rLm1ldGFcbiAgICB9KTtcbn07XG5leHBvcnRzLlV0ZjhFbmNvZGVXb3JrZXIgPSBVdGY4RW5jb2RlV29ya2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4vYmFzZTY0Jyk7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKCcuL25vZGVqc1V0aWxzJyk7XG52YXIgYXNhcCA9IHJlcXVpcmUoJ2FzYXAnKTtcbnZhciBleHRlcm5hbCA9IHJlcXVpcmUoXCIuL2V4dGVybmFsXCIpO1xuXG5cbi8qKlxuICogQ29udmVydCBhIHN0cmluZyB0aGF0IHBhc3MgYXMgYSBcImJpbmFyeSBzdHJpbmdcIjogaXQgc2hvdWxkIHJlcHJlc2VudCBhIGJ5dGVcbiAqIGFycmF5IGJ1dCBtYXkgaGF2ZSA+IDI1NSBjaGFyIGNvZGVzLiBCZSBzdXJlIHRvIHRha2Ugb25seSB0aGUgZmlyc3QgYnl0ZVxuICogYW5kIHJldHVybnMgdGhlIGJ5dGUgYXJyYXkuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7QXJyYXl8VWludDhBcnJheX0gdGhlIHN0cmluZyBpbiBhIGJpbmFyeSBmb3JtYXQuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZzJiaW5hcnkoc3RyKSB7XG4gICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShzdHIubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cmluZ1RvQXJyYXlMaWtlKHN0ciwgcmVzdWx0KTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgYmxvYiB3aXRoIHRoZSBnaXZlbiBjb250ZW50IGFuZCB0aGUgZ2l2ZW4gdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfSBwYXJ0IHRoZSBjb250ZW50IHRvIHB1dCBpbiB0aGUgYmxvYi4gRE8gTk9UIHVzZVxuICogYW4gVWludDhBcnJheSBiZWNhdXNlIHRoZSBzdG9jayBicm93c2VyIG9mIGFuZHJvaWQgNCB3b24ndCBhY2NlcHQgaXQgKGl0XG4gKiB3aWxsIGJlIHNpbGVudGx5IGNvbnZlcnRlZCB0byBhIHN0cmluZywgXCJbb2JqZWN0IFVpbnQ4QXJyYXldXCIpLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIG1pbWUgdHlwZSBvZiB0aGUgYmxvYi5cbiAqIEByZXR1cm4ge0Jsb2J9IHRoZSBjcmVhdGVkIGJsb2IuXG4gKi9cbmV4cG9ydHMubmV3QmxvYiA9IGZ1bmN0aW9uKHBhcnQsIHR5cGUpIHtcbiAgICBleHBvcnRzLmNoZWNrU3VwcG9ydChcImJsb2JcIik7XG5cbiAgICB0cnkge1xuICAgICAgICAvLyBCbG9iIGNvbnN0cnVjdG9yXG4gICAgICAgIHJldHVybiBuZXcgQmxvYihbcGFydF0sIHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGRlcHJlY2F0ZWQsIGJyb3dzZXIgb25seSwgb2xkIHdheVxuICAgICAgICAgICAgdmFyIEJ1aWxkZXIgPSB3aW5kb3cuQmxvYkJ1aWxkZXIgfHwgd2luZG93LldlYktpdEJsb2JCdWlsZGVyIHx8IHdpbmRvdy5Nb3pCbG9iQnVpbGRlciB8fCB3aW5kb3cuTVNCbG9iQnVpbGRlcjtcbiAgICAgICAgICAgIHZhciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTtcbiAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHBhcnQpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0QmxvYih0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuXG4gICAgICAgICAgICAvLyB3ZWxsLCBmdWNrID8hXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCdWcgOiBjYW4ndCBjb25zdHJ1Y3QgdGhlIEJsb2IuXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn07XG4vKipcbiAqIFRoZSBpZGVudGl0eSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCB0aGUgaW5wdXQuXG4gKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBzYW1lIGlucHV0LlxuICovXG5mdW5jdGlvbiBpZGVudGl0eShpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dDtcbn1cblxuLyoqXG4gKiBGaWxsIGluIGFuIGFycmF5IHdpdGggYSBzdHJpbmcuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gdXNlLlxuICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXkgdGhlIGFycmF5IHRvIGZpbGwgaW4gKHdpbGwgYmUgbXV0YXRlZCkuXG4gKiBAcmV0dXJuIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIHVwZGF0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ1RvQXJyYXlMaWtlKHN0ciwgYXJyYXkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgICAgICBhcnJheVtpXSA9IHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRjtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIEFuIGhlbHBlciBmb3IgdGhlIGZ1bmN0aW9uIGFycmF5TGlrZVRvU3RyaW5nLlxuICogVGhpcyBjb250YWlucyBzdGF0aWMgaW5mb3JtYXRpb25zIGFuZCBmdW5jdGlvbnMgdGhhdFxuICogY2FuIGJlIG9wdGltaXplZCBieSB0aGUgYnJvd3NlciBKSVQgY29tcGlsZXIuXG4gKi9cbnZhciBhcnJheVRvU3RyaW5nSGVscGVyID0ge1xuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBhbiBhcnJheSBvZiBpbnQgaW50byBhIHN0cmluZywgY2h1bmsgYnkgY2h1bmsuXG4gICAgICogU2VlIHRoZSBwZXJmb3JtYW5jZXMgbm90ZXMgb24gYXJyYXlMaWtlVG9TdHJpbmcuXG4gICAgICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXkgdGhlIGFycmF5IHRvIHRyYW5zZm9ybS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjaHVuayB0aGUgY2h1bmsgc2l6ZS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSByZXN1bHRpbmcgc3RyaW5nLlxuICAgICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGNodW5rIGlzIHRvbyBiaWcgZm9yIHRoZSBzdGFjay5cbiAgICAgKi9cbiAgICBzdHJpbmdpZnlCeUNodW5rOiBmdW5jdGlvbihhcnJheSwgdHlwZSwgY2h1bmspIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdLCBrID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgICAgICAvLyBzaG9ydGN1dFxuICAgICAgICBpZiAobGVuIDw9IGNodW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGsgPCBsZW4pIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcImFycmF5XCIgfHwgdHlwZSA9PT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5LnNsaWNlKGssIE1hdGgubWluKGsgKyBjaHVuaywgbGVuKSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkuc3ViYXJyYXkoaywgTWF0aC5taW4oayArIGNodW5rLCBsZW4pKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgayArPSBjaHVuaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCJcIik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDYWxsIFN0cmluZy5mcm9tQ2hhckNvZGUgb24gZXZlcnkgaXRlbSBpbiB0aGUgYXJyYXkuXG4gICAgICogVGhpcyBpcyB0aGUgbmFpdmUgaW1wbGVtZW50YXRpb24sIHdoaWNoIGdlbmVyYXRlIEEgTE9UIG9mIGludGVybWVkaWF0ZSBzdHJpbmcuXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuIGV2ZXJ5dGhpbmcgZWxzZSBmYWlsLlxuICAgICAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byB0cmFuc2Zvcm0uXG4gICAgICogQHJldHVybiB7U3RyaW5nfSB0aGUgcmVzdWx0LlxuICAgICAqL1xuICAgIHN0cmluZ2lmeUJ5Q2hhcjogZnVuY3Rpb24oYXJyYXkpe1xuICAgICAgICB2YXIgcmVzdWx0U3RyID0gXCJcIjtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHRTdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhcnJheVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdFN0cjtcbiAgICB9LFxuICAgIGFwcGx5Q2FuQmVVc2VkIDoge1xuICAgICAgICAvKipcbiAgICAgICAgICogdHJ1ZSBpZiB0aGUgYnJvd3NlciBhY2NlcHRzIHRvIHVzZSBTdHJpbmcuZnJvbUNoYXJDb2RlIG9uIFVpbnQ4QXJyYXlcbiAgICAgICAgICovXG4gICAgICAgIHVpbnQ4YXJyYXkgOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwcG9ydC51aW50OGFycmF5ICYmIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoMSkpLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCksXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0cnVlIGlmIHRoZSBicm93c2VyIGFjY2VwdHMgdG8gdXNlIFN0cmluZy5mcm9tQ2hhckNvZGUgb24gbm9kZWpzIEJ1ZmZlci5cbiAgICAgICAgICovXG4gICAgICAgIG5vZGVidWZmZXIgOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwcG9ydC5ub2RlYnVmZmVyICYmIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbm9kZWpzVXRpbHMubmV3QnVmZmVyKDEpKS5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgfVxufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gYXJyYXktbGlrZSBvYmplY3QgdG8gYSBzdHJpbmcuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VUb1N0cmluZyhhcnJheSkge1xuICAgIC8vIFBlcmZvcm1hbmNlcyBub3RlcyA6XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KSBpcyB0aGUgZmFzdGVzdCwgc2VlXG4gICAgLy8gc2VlIGh0dHA6Ly9qc3BlcmYuY29tL2NvbnZlcnRpbmctYS11aW50OGFycmF5LXRvLWEtc3RyaW5nLzJcbiAgICAvLyBidXQgdGhlIHN0YWNrIGlzIGxpbWl0ZWQgKGFuZCB3ZSBjYW4gZ2V0IGh1Z2UgYXJyYXlzICEpLlxuICAgIC8vXG4gICAgLy8gcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXJyYXlbaV0pOyBnZW5lcmF0ZSB0b28gbWFueSBzdHJpbmdzICFcbiAgICAvL1xuICAgIC8vIFRoaXMgY29kZSBpcyBpbnNwaXJlZCBieSBodHRwOi8vanNwZXJmLmNvbS9hcnJheWJ1ZmZlci10by1zdHJpbmctYXBwbHktcGVyZm9ybWFuY2UvMlxuICAgIC8vIFRPRE8gOiB3ZSBub3cgaGF2ZSB3b3JrZXJzIHRoYXQgc3BsaXQgdGhlIHdvcmsuIERvIHdlIHN0aWxsIG5lZWQgdGhhdCA/XG4gICAgdmFyIGNodW5rID0gNjU1MzYsXG4gICAgICAgIHR5cGUgPSBleHBvcnRzLmdldFR5cGVPZihhcnJheSksXG4gICAgICAgIGNhblVzZUFwcGx5ID0gdHJ1ZTtcbiAgICBpZiAodHlwZSA9PT0gXCJ1aW50OGFycmF5XCIpIHtcbiAgICAgICAgY2FuVXNlQXBwbHkgPSBhcnJheVRvU3RyaW5nSGVscGVyLmFwcGx5Q2FuQmVVc2VkLnVpbnQ4YXJyYXk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICBjYW5Vc2VBcHBseSA9IGFycmF5VG9TdHJpbmdIZWxwZXIuYXBwbHlDYW5CZVVzZWQubm9kZWJ1ZmZlcjtcbiAgICB9XG5cbiAgICBpZiAoY2FuVXNlQXBwbHkpIHtcbiAgICAgICAgd2hpbGUgKGNodW5rID4gMSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlUb1N0cmluZ0hlbHBlci5zdHJpbmdpZnlCeUNodW5rKGFycmF5LCB0eXBlLCBjaHVuayk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY2h1bmsgPSBNYXRoLmZsb29yKGNodW5rIC8gMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBubyBhcHBseSBvciBjaHVuayBlcnJvciA6IHNsb3cgYW5kIHBhaW5mdWwgYWxnb3JpdGhtXG4gICAgLy8gZGVmYXVsdCBicm93c2VyIG9uIGFuZHJvaWQgNC4qXG4gICAgcmV0dXJuIGFycmF5VG9TdHJpbmdIZWxwZXIuc3RyaW5naWZ5QnlDaGFyKGFycmF5KTtcbn1cblxuZXhwb3J0cy5hcHBseUZyb21DaGFyQ29kZSA9IGFycmF5TGlrZVRvU3RyaW5nO1xuXG5cbi8qKlxuICogQ29weSB0aGUgZGF0YSBmcm9tIGFuIGFycmF5LWxpa2UgdG8gYW4gb3RoZXIgYXJyYXktbGlrZS5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5RnJvbSB0aGUgb3JpZ2luIGFycmF5LlxuICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXlUbyB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hpY2ggd2lsbCBiZSBtdXRhdGVkLlxuICogQHJldHVybiB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IHRoZSB1cGRhdGVkIGRlc3RpbmF0aW9uIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VUb0FycmF5TGlrZShhcnJheUZyb20sIGFycmF5VG8pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5RnJvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJheVRvW2ldID0gYXJyYXlGcm9tW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlUbztcbn1cblxuLy8gYSBtYXRyaXggY29udGFpbmluZyBmdW5jdGlvbnMgdG8gdHJhbnNmb3JtIGV2ZXJ5dGhpbmcgaW50byBldmVyeXRoaW5nLlxudmFyIHRyYW5zZm9ybSA9IHt9O1xuXG4vLyBzdHJpbmcgdG8gP1xudHJhbnNmb3JtW1wic3RyaW5nXCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGlkZW50aXR5LFxuICAgIFwiYXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1RvQXJyYXlMaWtlKGlucHV0LCBuZXcgQXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1bXCJzdHJpbmdcIl1bXCJ1aW50OGFycmF5XCJdKGlucHV0KS5idWZmZXI7XG4gICAgfSxcbiAgICBcInVpbnQ4YXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1RvQXJyYXlMaWtlKGlucHV0LCBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2UoaW5wdXQsIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihpbnB1dC5sZW5ndGgpKTtcbiAgICB9XG59O1xuXG4vLyBhcnJheSB0byA/XG50cmFuc2Zvcm1bXCJhcnJheVwiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBhcnJheUxpa2VUb1N0cmluZyxcbiAgICBcImFycmF5XCI6IGlkZW50aXR5LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVWludDhBcnJheShpbnB1dCkpLmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaW5wdXQpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBub2RlanNVdGlscy5uZXdCdWZmZXIoaW5wdXQpO1xuICAgIH1cbn07XG5cbi8vIGFycmF5YnVmZmVyIHRvID9cbnRyYW5zZm9ybVtcImFycmF5YnVmZmVyXCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb1N0cmluZyhuZXcgVWludDhBcnJheShpbnB1dCkpO1xuICAgIH0sXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxpa2UobmV3IFVpbnQ4QXJyYXkoaW5wdXQpLCBuZXcgQXJyYXkoaW5wdXQuYnl0ZUxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBpZGVudGl0eSxcbiAgICBcInVpbnQ4YXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGlucHV0KTtcbiAgICB9LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyKG5ldyBVaW50OEFycmF5KGlucHV0KSk7XG4gICAgfVxufTtcblxuLy8gdWludDhhcnJheSB0byA/XG50cmFuc2Zvcm1bXCJ1aW50OGFycmF5XCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKGlucHV0LCBuZXcgQXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dC5idWZmZXI7XG4gICAgfSxcbiAgICBcInVpbnQ4YXJyYXlcIjogaWRlbnRpdHksXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBub2RlanNVdGlscy5uZXdCdWZmZXIoaW5wdXQpO1xuICAgIH1cbn07XG5cbi8vIG5vZGVidWZmZXIgdG8gP1xudHJhbnNmb3JtW1wibm9kZWJ1ZmZlclwiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBhcnJheUxpa2VUb1N0cmluZyxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShpbnB1dCwgbmV3IEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtW1wibm9kZWJ1ZmZlclwiXVtcInVpbnQ4YXJyYXlcIl0oaW5wdXQpLmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBVaW50OEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGlkZW50aXR5XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBpbnB1dCBpbnRvIGFueSB0eXBlLlxuICogVGhlIHN1cHBvcnRlZCBvdXRwdXQgdHlwZSBhcmUgOiBzdHJpbmcsIGFycmF5LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlciwgbm9kZWJ1ZmZlci5cbiAqIElmIG5vIG91dHB1dCB0eXBlIGlzIHNwZWNpZmllZCwgdGhlIHVubW9kaWZpZWQgaW5wdXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBvdXRwdXRUeXBlIHRoZSBvdXRwdXQgdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBpbnB1dCB0aGUgaW5wdXQgdG8gY29udmVydC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBvdXRwdXQgdHlwZS5cbiAqL1xuZXhwb3J0cy50cmFuc2Zvcm1UbyA9IGZ1bmN0aW9uKG91dHB1dFR5cGUsIGlucHV0KSB7XG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgICAvLyB1bmRlZmluZWQsIG51bGwsIGV0Y1xuICAgICAgICAvLyBhbiBlbXB0eSBzdHJpbmcgd29uJ3QgaGFybS5cbiAgICAgICAgaW5wdXQgPSBcIlwiO1xuICAgIH1cbiAgICBpZiAoIW91dHB1dFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbiAgICBleHBvcnRzLmNoZWNrU3VwcG9ydChvdXRwdXRUeXBlKTtcbiAgICB2YXIgaW5wdXRUeXBlID0gZXhwb3J0cy5nZXRUeXBlT2YoaW5wdXQpO1xuICAgIHZhciByZXN1bHQgPSB0cmFuc2Zvcm1baW5wdXRUeXBlXVtvdXRwdXRUeXBlXShpbnB1dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBpbnB1dC5cbiAqIFRoZSB0eXBlIHdpbGwgYmUgaW4gYSBmb3JtYXQgdmFsaWQgZm9yIEpTWmlwLnV0aWxzLnRyYW5zZm9ybVRvIDogc3RyaW5nLCBhcnJheSwgdWludDhhcnJheSwgYXJyYXlidWZmZXIuXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXQgdGhlIGlucHV0IHRvIGlkZW50aWZ5LlxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgKGxvd2VyY2FzZSkgdHlwZSBvZiB0aGUgaW5wdXQuXG4gKi9cbmV4cG9ydHMuZ2V0VHlwZU9mID0gZnVuY3Rpb24oaW5wdXQpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG4gICAgICAgIHJldHVybiBcImFycmF5XCI7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0Lm5vZGVidWZmZXIgJiYgbm9kZWpzVXRpbHMuaXNCdWZmZXIoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBcIm5vZGVidWZmZXJcIjtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQudWludDhhcnJheSAmJiBpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIFwidWludDhhcnJheVwiO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC5hcnJheWJ1ZmZlciAmJiBpbnB1dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBcImFycmF5YnVmZmVyXCI7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHR5cGUgaXMgbm90IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIHRvIGNoZWNrLlxuICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIHR5cGUuXG4gKi9cbmV4cG9ydHMuY2hlY2tTdXBwb3J0ID0gZnVuY3Rpb24odHlwZSkge1xuICAgIHZhciBzdXBwb3J0ZWQgPSBzdXBwb3J0W3R5cGUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKCFzdXBwb3J0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHR5cGUgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm1cIik7XG4gICAgfVxufTtcblxuZXhwb3J0cy5NQVhfVkFMVUVfMTZCSVRTID0gNjU1MzU7XG5leHBvcnRzLk1BWF9WQUxVRV8zMkJJVFMgPSAtMTsgLy8gd2VsbCwgXCJcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXCIgaXMgcGFyc2VkIGFzIC0xXG5cbi8qKlxuICogUHJldHRpZnkgYSBzdHJpbmcgcmVhZCBhcyBiaW5hcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gcHJldHRpZnkuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGEgcHJldHR5IHN0cmluZy5cbiAqL1xuZXhwb3J0cy5wcmV0dHkgPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgcmVzID0gJycsXG4gICAgICAgIGNvZGUsIGk7XG4gICAgZm9yIChpID0gMDsgaSA8IChzdHIgfHwgXCJcIikubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICByZXMgKz0gJ1xcXFx4JyArIChjb2RlIDwgMTYgPyBcIjBcIiA6IFwiXCIpICsgY29kZS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogRGVmZXIgdGhlIGNhbGwgb2YgYSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBjYWxsIGFzeW5jaHJvbm91c2x5LlxuICogQHBhcmFtIHtBcnJheX0gYXJncyB0aGUgYXJndW1lbnRzIHRvIGdpdmUgdG8gdGhlIGNhbGxiYWNrLlxuICovXG5leHBvcnRzLmRlbGF5ID0gZnVuY3Rpb24oY2FsbGJhY2ssIGFyZ3MsIHNlbGYpIHtcbiAgICBhc2FwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2suYXBwbHkoc2VsZiB8fCBudWxsLCBhcmdzIHx8IFtdKTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogRXh0ZW5kcyBhIHByb3RvdHlwZSB3aXRoIGFuIG90aGVyLCB3aXRob3V0IGNhbGxpbmcgYSBjb25zdHJ1Y3RvciB3aXRoXG4gKiBzaWRlIGVmZmVjdHMuIEluc3BpcmVkIGJ5IG5vZGVqcycgYHV0aWxzLmluaGVyaXRzYFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3RvciB0aGUgY29uc3RydWN0b3IgdG8gYXVnbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VwZXJDdG9yIHRoZSBwYXJlbnQgY29uc3RydWN0b3IgdG8gdXNlXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSBmdW5jdGlvbiAoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgdmFyIE9iaiA9IGZ1bmN0aW9uKCkge307XG4gICAgT2JqLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGU7XG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgT2JqKCk7XG59O1xuXG4vKipcbiAqIE1lcmdlIHRoZSBvYmplY3RzIHBhc3NlZCBhcyBwYXJhbWV0ZXJzIGludG8gYSBuZXcgb25lLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSB2YXJfYXJncyBBbGwgb2JqZWN0cyB0byBtZXJnZS5cbiAqIEByZXR1cm4ge09iamVjdH0gYSBuZXcgb2JqZWN0IHdpdGggdGhlIGRhdGEgb2YgdGhlIG90aGVycy5cbiAqL1xuZXhwb3J0cy5leHRlbmQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzdWx0ID0ge30sIGksIGF0dHI7XG4gICAgZm9yIChpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyAvLyBhcmd1bWVudHMgaXMgbm90IGVudW1lcmFibGUgaW4gc29tZSBicm93c2Vyc1xuICAgICAgICBmb3IgKGF0dHIgaW4gYXJndW1lbnRzW2ldKSB7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldLmhhc093blByb3BlcnR5KGF0dHIpICYmIHR5cGVvZiByZXN1bHRbYXR0cl0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbYXR0cl0gPSBhcmd1bWVudHNbaV1bYXR0cl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtIGFyYml0cmFyeSBjb250ZW50IGludG8gYSBQcm9taXNlLlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgYSBuYW1lIGZvciB0aGUgY29udGVudCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhIHRoZSBjb250ZW50IHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzQmluYXJ5IHRydWUgaWYgdGhlIGNvbnRlbnQgaXMgbm90IGFuIHVuaWNvZGUgc3RyaW5nXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzT3B0aW1pemVkQmluYXJ5U3RyaW5nIHRydWUgaWYgdGhlIHN0cmluZyBjb250ZW50IG9ubHkgaGFzIG9uZSBieXRlIHBlciBjaGFyYWN0ZXIuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzQmFzZTY0IHRydWUgaWYgdGhlIHN0cmluZyBjb250ZW50IGlzIGVuY29kZWQgd2l0aCBiYXNlNjQuXG4gKiBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgaW4gYSBmb3JtYXQgdXNhYmxlIGJ5IEpTWmlwLlxuICovXG5leHBvcnRzLnByZXBhcmVDb250ZW50ID0gZnVuY3Rpb24obmFtZSwgaW5wdXREYXRhLCBpc0JpbmFyeSwgaXNPcHRpbWl6ZWRCaW5hcnlTdHJpbmcsIGlzQmFzZTY0KSB7XG5cbiAgICB2YXIgcHJvbWlzZSA9IG51bGw7XG4gICAgaWYgKHN1cHBvcnQuYmxvYiAmJiBpbnB1dERhdGEgaW5zdGFuY2VvZiBCbG9iICYmIHR5cGVvZiBGaWxlUmVhZGVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHByb21pc2UgPSBuZXcgZXh0ZXJuYWwuUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGUudGFyZ2V0LnJlc3VsdCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUudGFyZ2V0LmVycm9yKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoaW5wdXREYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgZGF0YSBpcyBhbHJlYWR5IGEgcHJvbWlzZSwgdGhpcyBmbGF0dGVuIGl0LlxuICAgICAgICBwcm9taXNlID0gZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKGlucHV0RGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHZhciBkYXRhVHlwZSA9IGV4cG9ydHMuZ2V0VHlwZU9mKGRhdGEpO1xuXG4gICAgICAgIGlmICghZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBleHRlcm5hbC5Qcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgICBuZXcgRXJyb3IoXCJUaGUgZGF0YSBvZiAnXCIgKyBuYW1lICsgXCInIGlzIGluIGFuIHVuc3VwcG9ydGVkIGZvcm1hdCAhXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNwZWNpYWwgY2FzZSA6IGl0J3Mgd2F5IGVhc2llciB0byB3b3JrIHdpdGggVWludDhBcnJheSB0aGFuIHdpdGggQXJyYXlCdWZmZXJcbiAgICAgICAgaWYgKGRhdGFUeXBlID09PSBcImFycmF5YnVmZmVyXCIpIHtcbiAgICAgICAgICAgIGRhdGEgPSBleHBvcnRzLnRyYW5zZm9ybVRvKFwidWludDhhcnJheVwiLCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKGlzQmFzZTY0KSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGJhc2U2NC5kZWNvZGUoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0JpbmFyeSkge1xuICAgICAgICAgICAgICAgIC8vIG9wdGltaXplZEJpbmFyeVN0cmluZyA9PT0gdHJ1ZSBtZWFucyB0aGF0IHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gZmlsdGVyZWQgd2l0aCBhIDB4RkYgbWFza1xuICAgICAgICAgICAgICAgIGlmIChpc09wdGltaXplZEJpbmFyeVN0cmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgc3RyaW5nLCBub3QgaW4gYSBiYXNlNjQgZm9ybWF0LlxuICAgICAgICAgICAgICAgICAgICAvLyBCZSBzdXJlIHRoYXQgdGhpcyBpcyBhIGNvcnJlY3QgXCJiaW5hcnkgc3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHN0cmluZzJiaW5hcnkoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciByZWFkZXJGb3IgPSByZXF1aXJlKCcuL3JlYWRlci9yZWFkZXJGb3InKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBzaWcgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xudmFyIFppcEVudHJ5ID0gcmVxdWlyZSgnLi96aXBFbnRyeScpO1xudmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG4vLyAgY2xhc3MgWmlwRW50cmllcyB7e3tcbi8qKlxuICogQWxsIHRoZSBlbnRyaWVzIGluIHRoZSB6aXAgZmlsZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IGxvYWRPcHRpb25zIE9wdGlvbnMgZm9yIGxvYWRpbmcgdGhlIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gWmlwRW50cmllcyhsb2FkT3B0aW9ucykge1xuICAgIHRoaXMuZmlsZXMgPSBbXTtcbiAgICB0aGlzLmxvYWRPcHRpb25zID0gbG9hZE9wdGlvbnM7XG59XG5aaXBFbnRyaWVzLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGF0IHRoZSByZWFkZXIgaXMgb24gdGhlIHNwZWZpY2llZCBzaWduYXR1cmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkU2lnbmF0dXJlIHRoZSBleHBlY3RlZCBzaWduYXR1cmUuXG4gICAgICogQHRocm93cyB7RXJyb3J9IGlmIGl0IGlzIGFuIG90aGVyIHNpZ25hdHVyZS5cbiAgICAgKi9cbiAgICBjaGVja1NpZ25hdHVyZTogZnVuY3Rpb24oZXhwZWN0ZWRTaWduYXR1cmUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUoZXhwZWN0ZWRTaWduYXR1cmUpKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5pbmRleCAtPSA0O1xuICAgICAgICAgICAgdmFyIHNpZ25hdHVyZSA9IHRoaXMucmVhZGVyLnJlYWRTdHJpbmcoNCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIG9yIGJ1ZyA6IHVuZXhwZWN0ZWQgc2lnbmF0dXJlIFwiICsgXCIoXCIgKyB1dGlscy5wcmV0dHkoc2lnbmF0dXJlKSArIFwiLCBleHBlY3RlZCBcIiArIHV0aWxzLnByZXR0eShleHBlY3RlZFNpZ25hdHVyZSkgKyBcIilcIik7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBzaWduYXR1cmUgaXMgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhc2tlZEluZGV4IHRoZSBpbmRleCB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRTaWduYXR1cmUgdGhlIHNpZ25hdHVyZSB0byBleHBlY3QuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIGlzIGhlcmUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc1NpZ25hdHVyZTogZnVuY3Rpb24oYXNrZWRJbmRleCwgZXhwZWN0ZWRTaWduYXR1cmUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IHRoaXMucmVhZGVyLmluZGV4O1xuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChhc2tlZEluZGV4KTtcbiAgICAgICAgdmFyIHNpZ25hdHVyZSA9IHRoaXMucmVhZGVyLnJlYWRTdHJpbmcoNCk7XG4gICAgICAgIHZhciByZXN1bHQgPSBzaWduYXR1cmUgPT09IGV4cGVjdGVkU2lnbmF0dXJlO1xuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChjdXJyZW50SW5kZXgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW5kIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICByZWFkQmxvY2tFbmRPZkNlbnRyYWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmRpc2tOdW1iZXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2sgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyU2l6ZSA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpck9mZnNldCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG5cbiAgICAgICAgdGhpcy56aXBDb21tZW50TGVuZ3RoID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgLy8gd2FybmluZyA6IHRoZSBlbmNvZGluZyBkZXBlbmRzIG9mIHRoZSBzeXN0ZW0gbG9jYWxlXG4gICAgICAgIC8vIE9uIGEgbGludXggbWFjaGluZSB3aXRoIExBTkc9ZW5fVVMudXRmOCwgdGhpcyBmaWVsZCBpcyB1dGY4IGVuY29kZWQuXG4gICAgICAgIC8vIE9uIGEgd2luZG93cyBtYWNoaW5lLCB0aGlzIGZpZWxkIGlzIGVuY29kZWQgd2l0aCB0aGUgbG9jYWxpemVkIHdpbmRvd3MgY29kZSBwYWdlLlxuICAgICAgICB2YXIgemlwQ29tbWVudCA9IHRoaXMucmVhZGVyLnJlYWREYXRhKHRoaXMuemlwQ29tbWVudExlbmd0aCk7XG4gICAgICAgIHZhciBkZWNvZGVQYXJhbVR5cGUgPSBzdXBwb3J0LnVpbnQ4YXJyYXkgPyBcInVpbnQ4YXJyYXlcIiA6IFwiYXJyYXlcIjtcbiAgICAgICAgLy8gVG8gZ2V0IGNvbnNpc3RlbnQgYmVoYXZpb3Igd2l0aCB0aGUgZ2VuZXJhdGlvbiBwYXJ0LCB3ZSB3aWxsIGFzc3VtZSB0aGF0XG4gICAgICAgIC8vIHRoaXMgaXMgdXRmOCBlbmNvZGVkIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlLlxuICAgICAgICB2YXIgZGVjb2RlQ29udGVudCA9IHV0aWxzLnRyYW5zZm9ybVRvKGRlY29kZVBhcmFtVHlwZSwgemlwQ29tbWVudCk7XG4gICAgICAgIHRoaXMuemlwQ29tbWVudCA9IHRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoZGVjb2RlQ29udGVudCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgdGhlIFppcCA2NCBjZW50cmFsIGRpcmVjdG9yeS5cbiAgICAgKiBOb3QgbWVyZ2VkIHdpdGggdGhlIG1ldGhvZCByZWFkRW5kT2ZDZW50cmFsIDpcbiAgICAgKiBUaGUgZW5kIG9mIGNlbnRyYWwgY2FuIGNvZXhpc3Qgd2l0aCBpdHMgWmlwNjQgYnJvdGhlcixcbiAgICAgKiBJIGRvbid0IHdhbnQgdG8gcmVhZCB0aGUgd3JvbmcgbnVtYmVyIG9mIGJ5dGVzICFcbiAgICAgKi9cbiAgICByZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5yZWFkZXIuc2tpcCg0KTtcbiAgICAgICAgLy8gdGhpcy52ZXJzaW9uTWFkZUJ5ID0gdGhpcy5yZWFkZXIucmVhZFN0cmluZygyKTtcbiAgICAgICAgLy8gdGhpcy52ZXJzaW9uTmVlZGVkID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5kaXNrTnVtYmVyID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3JkcyA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclNpemUgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuXG4gICAgICAgIHRoaXMuemlwNjRFeHRlbnNpYmxlRGF0YSA9IHt9O1xuICAgICAgICB2YXIgZXh0cmFEYXRhU2l6ZSA9IHRoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplIC0gNDQsXG4gICAgICAgICAgICBpbmRleCA9IDAsXG4gICAgICAgICAgICBleHRyYUZpZWxkSWQsXG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoLFxuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBleHRyYURhdGFTaXplKSB7XG4gICAgICAgICAgICBleHRyYUZpZWxkSWQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAgICAgZXh0cmFGaWVsZExlbmd0aCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWUgPSB0aGlzLnJlYWRlci5yZWFkRGF0YShleHRyYUZpZWxkTGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuemlwNjRFeHRlbnNpYmxlRGF0YVtleHRyYUZpZWxkSWRdID0ge1xuICAgICAgICAgICAgICAgIGlkOiBleHRyYUZpZWxkSWQsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiBleHRyYUZpZWxkTGVuZ3RoLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBleHRyYUZpZWxkVmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiB0aGUgWmlwIDY0IGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IuXG4gICAgICovXG4gICAgcmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWxMb2NhdG9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5kaXNrV2l0aFppcDY0Q2VudHJhbERpclN0YXJ0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5kaXNrc0NvdW50ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgaWYgKHRoaXMuZGlza3NDb3VudCA+IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11bHRpLXZvbHVtZXMgemlwIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBsb2NhbCBmaWxlcywgYmFzZWQgb24gdGhlIG9mZnNldCByZWFkIGluIHRoZSBjZW50cmFsIHBhcnQuXG4gICAgICovXG4gICAgcmVhZExvY2FsRmlsZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaSwgZmlsZTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZpbGUgPSB0aGlzLmZpbGVzW2ldO1xuICAgICAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgoZmlsZS5sb2NhbEhlYWRlck9mZnNldCk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5MT0NBTF9GSUxFX0hFQURFUik7XG4gICAgICAgICAgICBmaWxlLnJlYWRMb2NhbFBhcnQodGhpcy5yZWFkZXIpO1xuICAgICAgICAgICAgZmlsZS5oYW5kbGVVVEY4KCk7XG4gICAgICAgICAgICBmaWxlLnByb2Nlc3NBdHRyaWJ1dGVzKCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIHJlYWRDZW50cmFsRGlyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGZpbGU7XG5cbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgodGhpcy5jZW50cmFsRGlyT2Zmc2V0KTtcbiAgICAgICAgd2hpbGUgKHRoaXMucmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZShzaWcuQ0VOVFJBTF9GSUxFX0hFQURFUikpIHtcbiAgICAgICAgICAgIGZpbGUgPSBuZXcgWmlwRW50cnkoe1xuICAgICAgICAgICAgICAgIHppcDY0OiB0aGlzLnppcDY0XG4gICAgICAgICAgICB9LCB0aGlzLmxvYWRPcHRpb25zKTtcbiAgICAgICAgICAgIGZpbGUucmVhZENlbnRyYWxQYXJ0KHRoaXMucmVhZGVyKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNlbnRyYWxEaXJSZWNvcmRzICE9PSB0aGlzLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2VudHJhbERpclJlY29yZHMgIT09IDAgJiYgdGhpcy5maWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBleHBlY3RlZCBzb21lIHJlY29yZHMgYnV0IGNvdWxkbid0IGZpbmQgQU5ZLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVhbGx5IHN1c3BpY2lvdXMsIGFzIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgb3IgYnVnOiBleHBlY3RlZCBcIiArIHRoaXMuY2VudHJhbERpclJlY29yZHMgKyBcIiByZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3QgXCIgKyB0aGlzLmZpbGVzLmxlbmd0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIHNvbWUgcmVjb3JkcyBidXQgbm90IGFsbC5cbiAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgaXMgd3JvbmcgYnV0IHdlIGdvdCBzb21ldGhpbmcgZm9yIHRoZSB1c2VyOiBubyBlcnJvciBoZXJlLlxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihcImV4cGVjdGVkXCIsIHRoaXMuY2VudHJhbERpclJlY29yZHMsIFwicmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290XCIsIHRoaXMuZmlsZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIHJlYWRFbmRPZkNlbnRyYWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoc2lnLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY29udGVudCBpcyBhIHRydW5jYXRlZCB6aXAgb3IgY29tcGxldGUgZ2FyYmFnZS5cbiAgICAgICAgICAgIC8vIEEgXCJMT0NBTF9GSUxFX0hFQURFUlwiIGlzIG5vdCByZXF1aXJlZCBhdCB0aGUgYmVnaW5uaW5nIChhdXRvXG4gICAgICAgICAgICAvLyBleHRyYWN0aWJsZSB6aXAgZm9yIGV4YW1wbGUpIGJ1dCBpdCBjYW4gZ2l2ZSBhIGdvb2QgaGludC5cbiAgICAgICAgICAgIC8vIElmIGFuIGFqYXggcmVxdWVzdCB3YXMgdXNlZCB3aXRob3V0IHJlc3BvbnNlVHlwZSwgd2Ugd2lsbCBhbHNvXG4gICAgICAgICAgICAvLyBnZXQgdW5yZWFkYWJsZSBkYXRhLlxuICAgICAgICAgICAgdmFyIGlzR2FyYmFnZSA9ICF0aGlzLmlzU2lnbmF0dXJlKDAsIHNpZy5MT0NBTF9GSUxFX0hFQURFUik7XG5cbiAgICAgICAgICAgIGlmIChpc0dhcmJhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBmaW5kIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSA6IGlzIHRoaXMgYSB6aXAgZmlsZSA/IFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJZiBpdCBpcywgc2VlIGh0dHA6Ly9zdHVrLmdpdGh1Yi5pby9qc3ppcC9kb2N1bWVudGF0aW9uL2hvd3RvL3JlYWRfemlwLmh0bWxcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjYW4ndCBmaW5kIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KG9mZnNldCk7XG4gICAgICAgIHZhciBlbmRPZkNlbnRyYWxEaXJPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgIHRoaXMucmVhZEJsb2NrRW5kT2ZDZW50cmFsKCk7XG5cblxuICAgICAgICAvKiBleHRyYWN0IGZyb20gdGhlIHppcCBzcGVjIDpcbiAgICAgICAgICAgIDQpICBJZiBvbmUgb2YgdGhlIGZpZWxkcyBpbiB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XG4gICAgICAgICAgICAgICAgcmVjb3JkIGlzIHRvbyBzbWFsbCB0byBob2xkIHJlcXVpcmVkIGRhdGEsIHRoZSBmaWVsZFxuICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzZXQgdG8gLTEgKDB4RkZGRiBvciAweEZGRkZGRkZGKSBhbmQgdGhlXG4gICAgICAgICAgICAgICAgWklQNjQgZm9ybWF0IHJlY29yZCBzaG91bGQgYmUgY3JlYXRlZC5cbiAgICAgICAgICAgIDUpICBUaGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IgcmVjb3JkIG11c3RcbiAgICAgICAgICAgICAgICByZXNpZGUgb24gdGhlIHNhbWUgZGlzayB3aGVuIHNwbGl0dGluZyBvciBzcGFubmluZ1xuICAgICAgICAgICAgICAgIGFuIGFyY2hpdmUuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpcy5kaXNrTnVtYmVyID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2sgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyUmVjb3JkcyA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmNlbnRyYWxEaXJTaXplID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTIHx8IHRoaXMuY2VudHJhbERpck9mZnNldCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUykge1xuICAgICAgICAgICAgdGhpcy56aXA2NCA9IHRydWU7XG5cbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICBXYXJuaW5nIDogdGhlIHppcDY0IGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQsIGJ1dCBPTkxZIGlmIHRoZSA2NGJpdHMgaW50ZWdlciByZWFkIGZyb21cbiAgICAgICAgICAgIHRoZSB6aXAgZmlsZSBjYW4gZml0IGludG8gYSAzMmJpdHMgaW50ZWdlci4gVGhpcyBjYW5ub3QgYmUgc29sdmVkIDogSmF2YXNjcmlwdCByZXByZXNlbnRzXG4gICAgICAgICAgICBhbGwgbnVtYmVycyBhcyA2NC1iaXQgZG91YmxlIHByZWNpc2lvbiBJRUVFIDc1NCBmbG9hdGluZyBwb2ludCBudW1iZXJzLlxuICAgICAgICAgICAgU28sIHdlIGhhdmUgNTNiaXRzIGZvciBpbnRlZ2VycyBhbmQgYml0d2lzZSBvcGVyYXRpb25zIHRyZWF0IGV2ZXJ5dGhpbmcgYXMgMzJiaXRzLlxuICAgICAgICAgICAgc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL0JpdHdpc2VfT3BlcmF0b3JzXG4gICAgICAgICAgICBhbmQgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VDTUEtMjYyLnBkZiBzZWN0aW9uIDguNVxuICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgLy8gc2hvdWxkIGxvb2sgZm9yIGEgemlwNjQgRU9DRCBsb2NhdG9yXG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUik7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KG9mZnNldCk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKTtcbiAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWxMb2NhdG9yKCk7XG5cbiAgICAgICAgICAgIC8vIG5vdyB0aGUgemlwNjQgRU9DRCByZWNvcmRcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1NpZ25hdHVyZSh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIsIHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKFwiWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IG5vdCB3aGVyZSBleHBlY3RlZC5cIik7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyID0gdGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNhbid0IGZpbmQgdGhlIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIpO1xuICAgICAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBleHBlY3RlZEVuZE9mQ2VudHJhbERpck9mZnNldCA9IHRoaXMuY2VudHJhbERpck9mZnNldCArIHRoaXMuY2VudHJhbERpclNpemU7XG4gICAgICAgIGlmICh0aGlzLnppcDY0KSB7XG4gICAgICAgICAgICBleHBlY3RlZEVuZE9mQ2VudHJhbERpck9mZnNldCArPSAyMDsgLy8gZW5kIG9mIGNlbnRyYWwgZGlyIDY0IGxvY2F0b3JcbiAgICAgICAgICAgIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0ICs9IDEyIC8qIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgbGVhZGluZyAxMiBieXRlcyAqLyArIHRoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4dHJhQnl0ZXMgPSBlbmRPZkNlbnRyYWxEaXJPZmZzZXQgLSBleHBlY3RlZEVuZE9mQ2VudHJhbERpck9mZnNldDtcblxuICAgICAgICBpZiAoZXh0cmFCeXRlcyA+IDApIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihleHRyYUJ5dGVzLCBcImV4dHJhIGJ5dGVzIGF0IGJlZ2lubmluZyBvciB3aXRoaW4gemlwZmlsZVwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2lnbmF0dXJlKGVuZE9mQ2VudHJhbERpck9mZnNldCwgc2lnLkNFTlRSQUxfRklMRV9IRUFERVIpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG9mZnNldHMgc2VlbSB3cm9uZywgYnV0IHdlIGhhdmUgc29tZXRoaW5nIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LlxuICAgICAgICAgICAgICAgIC8vIFNv4oCmIHdlIGtlZXAgaXQuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBvZmZzZXQgaXMgd3JvbmcsIHVwZGF0ZSB0aGUgXCJ6ZXJvXCIgb2YgdGhlIHJlYWRlclxuICAgICAgICAgICAgICAgIC8vIHRoaXMgaGFwcGVucyBpZiBkYXRhIGhhcyBiZWVuIHByZXBlbmRlZCAoY3J4IGZpbGVzIGZvciBleGFtcGxlKVxuICAgICAgICAgICAgICAgIHRoaXMucmVhZGVyLnplcm8gPSBleHRyYUJ5dGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwOiBtaXNzaW5nIFwiICsgTWF0aC5hYnMoZXh0cmFCeXRlcykgKyBcIiBieXRlcy5cIik7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHByZXBhcmVSZWFkZXI6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXJGb3IoZGF0YSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIGEgemlwIGZpbGUgYW5kIGNyZWF0ZSBaaXBFbnRyaWVzLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBiaW5hcnkgc3RyaW5nIHJlcHJlc2VudGluZyBhIHppcCBmaWxlLlxuICAgICAqL1xuICAgIGxvYWQ6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlUmVhZGVyKGRhdGEpO1xuICAgICAgICB0aGlzLnJlYWRFbmRPZkNlbnRyYWwoKTtcbiAgICAgICAgdGhpcy5yZWFkQ2VudHJhbERpcigpO1xuICAgICAgICB0aGlzLnJlYWRMb2NhbEZpbGVzKCk7XG4gICAgfVxufTtcbi8vIH19fSBlbmQgb2YgWmlwRW50cmllc1xubW9kdWxlLmV4cG9ydHMgPSBaaXBFbnRyaWVzO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlYWRlckZvciA9IHJlcXVpcmUoJy4vcmVhZGVyL3JlYWRlckZvcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIENvbXByZXNzZWRPYmplY3QgPSByZXF1aXJlKCcuL2NvbXByZXNzZWRPYmplY3QnKTtcbnZhciBjcmMzMmZuID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTtcbnZhciBjb21wcmVzc2lvbnMgPSByZXF1aXJlKCcuL2NvbXByZXNzaW9ucycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcblxudmFyIE1BREVfQllfRE9TID0gMHgwMDtcbnZhciBNQURFX0JZX1VOSVggPSAweDAzO1xuXG4vKipcbiAqIEZpbmQgYSBjb21wcmVzc2lvbiByZWdpc3RlcmVkIGluIEpTWmlwLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXByZXNzaW9uTWV0aG9kIHRoZSBtZXRob2QgbWFnaWMgdG8gZmluZC5cbiAqIEByZXR1cm4ge09iamVjdHxudWxsfSB0aGUgSlNaaXAgY29tcHJlc3Npb24gb2JqZWN0LCBudWxsIGlmIG5vbmUgZm91bmQuXG4gKi9cbnZhciBmaW5kQ29tcHJlc3Npb24gPSBmdW5jdGlvbihjb21wcmVzc2lvbk1ldGhvZCkge1xuICAgIGZvciAodmFyIG1ldGhvZCBpbiBjb21wcmVzc2lvbnMpIHtcbiAgICAgICAgaWYgKCFjb21wcmVzc2lvbnMuaGFzT3duUHJvcGVydHkobWV0aG9kKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXByZXNzaW9uc1ttZXRob2RdLm1hZ2ljID09PSBjb21wcmVzc2lvbk1ldGhvZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXByZXNzaW9uc1ttZXRob2RdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuLy8gY2xhc3MgWmlwRW50cnkge3t7XG4vKipcbiAqIEFuIGVudHJ5IGluIHRoZSB6aXAgZmlsZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvZiB0aGUgY3VycmVudCBmaWxlLlxuICogQHBhcmFtIHtPYmplY3R9IGxvYWRPcHRpb25zIE9wdGlvbnMgZm9yIGxvYWRpbmcgdGhlIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gWmlwRW50cnkob3B0aW9ucywgbG9hZE9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMubG9hZE9wdGlvbnMgPSBsb2FkT3B0aW9ucztcbn1cblppcEVudHJ5LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzYXkgaWYgdGhlIGZpbGUgaXMgZW5jcnlwdGVkLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGZpbGUgaXMgZW5jcnlwdGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNFbmNyeXB0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBiaXQgMSBpcyBzZXRcbiAgICAgICAgcmV0dXJuICh0aGlzLmJpdEZsYWcgJiAweDAwMDEpID09PSAweDAwMDE7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBzYXkgaWYgdGhlIGZpbGUgaGFzIHV0Zi04IGZpbGVuYW1lL2NvbW1lbnQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZmlsZW5hbWUvY29tbWVudCBpcyBpbiB1dGYtOCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHVzZVVURjg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBiaXQgMTEgaXMgc2V0XG4gICAgICAgIHJldHVybiAodGhpcy5iaXRGbGFnICYgMHgwODAwKSA9PT0gMHgwODAwO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgbG9jYWwgcGFydCBvZiBhIHppcCBmaWxlIGFuZCBhZGQgdGhlIGluZm8gaW4gdGhpcyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRlciB0byB1c2UuXG4gICAgICovXG4gICAgcmVhZExvY2FsUGFydDogZnVuY3Rpb24ocmVhZGVyKSB7XG4gICAgICAgIHZhciBjb21wcmVzc2lvbiwgbG9jYWxFeHRyYUZpZWxkc0xlbmd0aDtcblxuICAgICAgICAvLyB3ZSBhbHJlYWR5IGtub3cgZXZlcnl0aGluZyBmcm9tIHRoZSBjZW50cmFsIGRpciAhXG4gICAgICAgIC8vIElmIHRoZSBjZW50cmFsIGRpciBkYXRhIGFyZSBmYWxzZSwgd2UgYXJlIGRvb21lZC5cbiAgICAgICAgLy8gT24gdGhlIGJyaWdodCBzaWRlLCB0aGUgbG9jYWwgcGFydCBpcyBzY2FyeSAgOiB6aXA2NCwgZGF0YSBkZXNjcmlwdG9ycywgYm90aCwgZXRjLlxuICAgICAgICAvLyBUaGUgbGVzcyBkYXRhIHdlIGdldCBoZXJlLCB0aGUgbW9yZSByZWxpYWJsZSB0aGlzIHNob3VsZCBiZS5cbiAgICAgICAgLy8gTGV0J3Mgc2tpcCB0aGUgd2hvbGUgaGVhZGVyIGFuZCBkYXNoIHRvIHRoZSBkYXRhICFcbiAgICAgICAgcmVhZGVyLnNraXAoMjIpO1xuICAgICAgICAvLyBpbiBzb21lIHppcCBjcmVhdGVkIG9uIHdpbmRvd3MsIHRoZSBmaWxlbmFtZSBzdG9yZWQgaW4gdGhlIGNlbnRyYWwgZGlyIGNvbnRhaW5zIFxcIGluc3RlYWQgb2YgLy5cbiAgICAgICAgLy8gU3RyYW5nZWx5LCB0aGUgZmlsZW5hbWUgaGVyZSBpcyBPSy5cbiAgICAgICAgLy8gSSB3b3VsZCBsb3ZlIHRvIHRyZWF0IHRoZXNlIHppcCBmaWxlcyBhcyBjb3JydXB0ZWQgKHNlZSBodHRwOi8vd3d3LmluZm8temlwLm9yZy9GQVEuaHRtbCNiYWNrc2xhc2hlc1xuICAgICAgICAvLyBvciBBUFBOT1RFIzQuNC4xNy4xLCBcIkFsbCBzbGFzaGVzIE1VU1QgYmUgZm9yd2FyZCBzbGFzaGVzICcvJ1wiKSBidXQgdGhlcmUgYXJlIGEgbG90IG9mIGJhZCB6aXAgZ2VuZXJhdG9ycy4uLlxuICAgICAgICAvLyBTZWFyY2ggXCJ1bnppcCBtaXNtYXRjaGluZyBcImxvY2FsXCIgZmlsZW5hbWUgY29udGludWluZyB3aXRoIFwiY2VudHJhbFwiIGZpbGVuYW1lIHZlcnNpb25cIiBvblxuICAgICAgICAvLyB0aGUgaW50ZXJuZXQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEkgdGhpbmsgSSBzZWUgdGhlIGxvZ2ljIGhlcmUgOiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaXMgdXNlZCB0byBkaXNwbGF5XG4gICAgICAgIC8vIGNvbnRlbnQgYW5kIHRoZSBsb2NhbCBkaXJlY3RvcnkgaXMgdXNlZCB0byBleHRyYWN0IHRoZSBmaWxlcy4gTWl4aW5nIC8gYW5kIFxcXG4gICAgICAgIC8vIG1heSBiZSB1c2VkIHRvIGRpc3BsYXkgXFwgdG8gd2luZG93cyB1c2VycyBhbmQgdXNlIC8gd2hlbiBleHRyYWN0aW5nIHRoZSBmaWxlcy5cbiAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBsZWFkIGFsc28gdG8gc29tZSBpc3N1ZXMgOiBodHRwOi8vc2VjbGlzdHMub3JnL2Z1bGxkaXNjbG9zdXJlLzIwMDkvU2VwLzM5NFxuICAgICAgICB0aGlzLmZpbGVOYW1lTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIGxvY2FsRXh0cmFGaWVsZHNMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTsgLy8gY2FuJ3QgYmUgc3VyZSB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGNlbnRyYWwgZGlyXG4gICAgICAgIC8vIHRoZSBmaWxlTmFtZSBpcyBzdG9yZWQgYXMgYmluYXJ5IGRhdGEsIHRoZSBoYW5kbGVVVEY4IG1ldGhvZCB3aWxsIHRha2UgY2FyZSBvZiB0aGUgZW5jb2RpbmcuXG4gICAgICAgIHRoaXMuZmlsZU5hbWUgPSByZWFkZXIucmVhZERhdGEodGhpcy5maWxlTmFtZUxlbmd0aCk7XG4gICAgICAgIHJlYWRlci5za2lwKGxvY2FsRXh0cmFGaWVsZHNMZW5ndGgpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbXByZXNzZWRTaXplID09PSAtMSB8fCB0aGlzLnVuY29tcHJlc3NlZFNpemUgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCdWcgb3IgY29ycnVwdGVkIHppcCA6IGRpZG4ndCBnZXQgZW5vdWdoIGluZm9ybWF0aW9ucyBmcm9tIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBcIiArIFwiKGNvbXByZXNzZWRTaXplID09PSAtMSB8fCB1bmNvbXByZXNzZWRTaXplID09PSAtMSlcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wcmVzc2lvbiA9IGZpbmRDb21wcmVzc2lvbih0aGlzLmNvbXByZXNzaW9uTWV0aG9kKTtcbiAgICAgICAgaWYgKGNvbXByZXNzaW9uID09PSBudWxsKSB7IC8vIG5vIGNvbXByZXNzaW9uIGZvdW5kXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY29tcHJlc3Npb24gXCIgKyB1dGlscy5wcmV0dHkodGhpcy5jb21wcmVzc2lvbk1ldGhvZCkgKyBcIiB1bmtub3duIChpbm5lciBmaWxlIDogXCIgKyB1dGlscy50cmFuc2Zvcm1UbyhcInN0cmluZ1wiLCB0aGlzLmZpbGVOYW1lKSArIFwiKVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlY29tcHJlc3NlZCA9IG5ldyBDb21wcmVzc2VkT2JqZWN0KHRoaXMuY29tcHJlc3NlZFNpemUsIHRoaXMudW5jb21wcmVzc2VkU2l6ZSwgdGhpcy5jcmMzMiwgY29tcHJlc3Npb24sIHJlYWRlci5yZWFkRGF0YSh0aGlzLmNvbXByZXNzZWRTaXplKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGNlbnRyYWwgcGFydCBvZiBhIHppcCBmaWxlIGFuZCBhZGQgdGhlIGluZm8gaW4gdGhpcyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRlciB0byB1c2UuXG4gICAgICovXG4gICAgcmVhZENlbnRyYWxQYXJ0OiBmdW5jdGlvbihyZWFkZXIpIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uTWFkZUJ5ID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHJlYWRlci5za2lwKDIpO1xuICAgICAgICAvLyB0aGlzLnZlcnNpb25OZWVkZWQgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5iaXRGbGFnID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY29tcHJlc3Npb25NZXRob2QgPSByZWFkZXIucmVhZFN0cmluZygyKTtcbiAgICAgICAgdGhpcy5kYXRlID0gcmVhZGVyLnJlYWREYXRlKCk7XG4gICAgICAgIHRoaXMuY3JjMzIgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jb21wcmVzc2VkU2l6ZSA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLnVuY29tcHJlc3NlZFNpemUgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdmFyIGZpbGVOYW1lTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZXh0cmFGaWVsZHNMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5maWxlQ29tbWVudExlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmRpc2tOdW1iZXJTdGFydCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmludGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMubG9jYWxIZWFkZXJPZmZzZXQgPSByZWFkZXIucmVhZEludCg0KTtcblxuICAgICAgICBpZiAodGhpcy5pc0VuY3J5cHRlZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2lsbCBiZSByZWFkIGluIHRoZSBsb2NhbCBwYXJ0LCBzZWUgdGhlIGNvbW1lbnRzIHRoZXJlXG4gICAgICAgIHJlYWRlci5za2lwKGZpbGVOYW1lTGVuZ3RoKTtcbiAgICAgICAgdGhpcy5yZWFkRXh0cmFGaWVsZHMocmVhZGVyKTtcbiAgICAgICAgdGhpcy5wYXJzZVpJUDY0RXh0cmFGaWVsZChyZWFkZXIpO1xuICAgICAgICB0aGlzLmZpbGVDb21tZW50ID0gcmVhZGVyLnJlYWREYXRhKHRoaXMuZmlsZUNvbW1lbnRMZW5ndGgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSB0aGUgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIGFuZCBnZXQgdGhlIHVuaXgvZG9zIHBlcm1pc3Npb25zLlxuICAgICAqL1xuICAgIHByb2Nlc3NBdHRyaWJ1dGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudW5peFBlcm1pc3Npb25zID0gbnVsbDtcbiAgICAgICAgdGhpcy5kb3NQZXJtaXNzaW9ucyA9IG51bGw7XG4gICAgICAgIHZhciBtYWRlQnkgPSB0aGlzLnZlcnNpb25NYWRlQnkgPj4gODtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHRoZSBET1MgZGlyZWN0b3J5IGZsYWcgc2V0LlxuICAgICAgICAvLyBXZSBsb29rIGZvciBpdCBpbiB0aGUgRE9TIGFuZCBVTklYIHBlcm1pc3Npb25zXG4gICAgICAgIC8vIGJ1dCBzb21lIHVua25vd24gcGxhdGZvcm0gY291bGQgc2V0IGl0IGFzIGEgY29tcGF0aWJpbGl0eSBmbGFnLlxuICAgICAgICB0aGlzLmRpciA9IHRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyAmIDB4MDAxMCA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICBpZihtYWRlQnkgPT09IE1BREVfQllfRE9TKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCA2IGJpdHMgKDAgdG8gNSlcbiAgICAgICAgICAgIHRoaXMuZG9zUGVybWlzc2lvbnMgPSB0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgJiAweDNGO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobWFkZUJ5ID09PSBNQURFX0JZX1VOSVgpIHtcbiAgICAgICAgICAgIHRoaXMudW5peFBlcm1pc3Npb25zID0gKHRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyA+PiAxNikgJiAweEZGRkY7XG4gICAgICAgICAgICAvLyB0aGUgb2N0YWwgcGVybWlzc2lvbnMgYXJlIGluICh0aGlzLnVuaXhQZXJtaXNzaW9ucyAmIDB4MDFGRikudG9TdHJpbmcoOCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmYWlsIHNhZmUgOiBpZiB0aGUgbmFtZSBlbmRzIHdpdGggYSAvIGl0IHByb2JhYmx5IG1lYW5zIGEgZm9sZGVyXG4gICAgICAgIGlmICghdGhpcy5kaXIgJiYgdGhpcy5maWxlTmFtZVN0ci5zbGljZSgtMSkgPT09ICcvJykge1xuICAgICAgICAgICAgdGhpcy5kaXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBaSVA2NCBleHRyYSBmaWVsZCBhbmQgbWVyZ2UgdGhlIGluZm8gaW4gdGhlIGN1cnJlbnQgWmlwRW50cnkuXG4gICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRlciB0byB1c2UuXG4gICAgICovXG4gICAgcGFyc2VaSVA2NEV4dHJhRmllbGQ6IGZ1bmN0aW9uKHJlYWRlcikge1xuXG4gICAgICAgIGlmICghdGhpcy5leHRyYUZpZWxkc1sweDAwMDFdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaG91bGQgYmUgc29tZXRoaW5nLCBwcmVwYXJpbmcgdGhlIGV4dHJhIHJlYWRlclxuICAgICAgICB2YXIgZXh0cmFSZWFkZXIgPSByZWFkZXJGb3IodGhpcy5leHRyYUZpZWxkc1sweDAwMDFdLnZhbHVlKTtcblxuICAgICAgICAvLyBJIHJlYWxseSBob3BlIHRoYXQgdGhlc2UgNjRiaXRzIGludGVnZXIgY2FuIGZpdCBpbiAzMiBiaXRzIGludGVnZXIsIGJlY2F1c2UganNcbiAgICAgICAgLy8gd29uJ3QgbGV0IHVzIGhhdmUgbW9yZS5cbiAgICAgICAgaWYgKHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUykge1xuICAgICAgICAgICAgdGhpcy51bmNvbXByZXNzZWRTaXplID0gZXh0cmFSZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb21wcmVzc2VkU2l6ZSA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUykge1xuICAgICAgICAgICAgdGhpcy5jb21wcmVzc2VkU2l6ZSA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9jYWxIZWFkZXJPZmZzZXQgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMubG9jYWxIZWFkZXJPZmZzZXQgPSBleHRyYVJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRpc2tOdW1iZXJTdGFydCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUykge1xuICAgICAgICAgICAgdGhpcy5kaXNrTnVtYmVyU3RhcnQgPSBleHRyYVJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBjZW50cmFsIHBhcnQgb2YgYSB6aXAgZmlsZSBhbmQgYWRkIHRoZSBpbmZvIGluIHRoaXMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RGF0YVJlYWRlcn0gcmVhZGVyIHRoZSByZWFkZXIgdG8gdXNlLlxuICAgICAqL1xuICAgIHJlYWRFeHRyYUZpZWxkczogZnVuY3Rpb24ocmVhZGVyKSB7XG4gICAgICAgIHZhciBlbmQgPSByZWFkZXIuaW5kZXggKyB0aGlzLmV4dHJhRmllbGRzTGVuZ3RoLFxuICAgICAgICAgICAgZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZTtcblxuICAgICAgICBpZiAoIXRoaXMuZXh0cmFGaWVsZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZXh0cmFGaWVsZHMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChyZWFkZXIuaW5kZXggPCBlbmQpIHtcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAgICAgZXh0cmFGaWVsZExlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlID0gcmVhZGVyLnJlYWREYXRhKGV4dHJhRmllbGRMZW5ndGgpO1xuXG4gICAgICAgICAgICB0aGlzLmV4dHJhRmllbGRzW2V4dHJhRmllbGRJZF0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGV4dHJhRmllbGRWYWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQXBwbHkgYW4gVVRGOCB0cmFuc2Zvcm1hdGlvbiBpZiBuZWVkZWQuXG4gICAgICovXG4gICAgaGFuZGxlVVRGODogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkZWNvZGVQYXJhbVR5cGUgPSBzdXBwb3J0LnVpbnQ4YXJyYXkgPyBcInVpbnQ4YXJyYXlcIiA6IFwiYXJyYXlcIjtcbiAgICAgICAgaWYgKHRoaXMudXNlVVRGOCgpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVOYW1lU3RyID0gdXRmOC51dGY4ZGVjb2RlKHRoaXMuZmlsZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5maWxlQ29tbWVudFN0ciA9IHV0ZjgudXRmOGRlY29kZSh0aGlzLmZpbGVDb21tZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB1cGF0aCA9IHRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aCgpO1xuICAgICAgICAgICAgaWYgKHVwYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZVN0ciA9IHVwYXRoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBU0NJSSB0ZXh0IG9yIHVuc3VwcG9ydGVkIGNvZGUgcGFnZVxuICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZUJ5dGVBcnJheSA9ICB1dGlscy50cmFuc2Zvcm1UbyhkZWNvZGVQYXJhbVR5cGUsIHRoaXMuZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVTdHIgPSB0aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKGZpbGVOYW1lQnl0ZUFycmF5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHVjb21tZW50ID0gdGhpcy5maW5kRXh0cmFGaWVsZFVuaWNvZGVDb21tZW50KCk7XG4gICAgICAgICAgICBpZiAodWNvbW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVDb21tZW50U3RyID0gdWNvbW1lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFTQ0lJIHRleHQgb3IgdW5zdXBwb3J0ZWQgY29kZSBwYWdlXG4gICAgICAgICAgICAgICAgdmFyIGNvbW1lbnRCeXRlQXJyYXkgPSAgdXRpbHMudHJhbnNmb3JtVG8oZGVjb2RlUGFyYW1UeXBlLCB0aGlzLmZpbGVDb21tZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVDb21tZW50U3RyID0gdGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShjb21tZW50Qnl0ZUFycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSB1bmljb2RlIHBhdGggZGVjbGFyZWQgaW4gdGhlIGV4dHJhIGZpZWxkLCBpZiBhbnkuXG4gICAgICogQHJldHVybiB7U3RyaW5nfSB0aGUgdW5pY29kZSBwYXRoLCBudWxsIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBmaW5kRXh0cmFGaWVsZFVuaWNvZGVQYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHVwYXRoRmllbGQgPSB0aGlzLmV4dHJhRmllbGRzWzB4NzA3NV07XG4gICAgICAgIGlmICh1cGF0aEZpZWxkKSB7XG4gICAgICAgICAgICB2YXIgZXh0cmFSZWFkZXIgPSByZWFkZXJGb3IodXBhdGhGaWVsZC52YWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIHdyb25nIHZlcnNpb25cbiAgICAgICAgICAgIGlmIChleHRyYVJlYWRlci5yZWFkSW50KDEpICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHRoZSBjcmMgb2YgdGhlIGZpbGVuYW1lIGNoYW5nZWQsIHRoaXMgZmllbGQgaXMgb3V0IG9mIGRhdGUuXG4gICAgICAgICAgICBpZiAoY3JjMzJmbih0aGlzLmZpbGVOYW1lKSAhPT0gZXh0cmFSZWFkZXIucmVhZEludCg0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXRmOC51dGY4ZGVjb2RlKGV4dHJhUmVhZGVyLnJlYWREYXRhKHVwYXRoRmllbGQubGVuZ3RoIC0gNSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSB1bmljb2RlIGNvbW1lbnQgZGVjbGFyZWQgaW4gdGhlIGV4dHJhIGZpZWxkLCBpZiBhbnkuXG4gICAgICogQHJldHVybiB7U3RyaW5nfSB0aGUgdW5pY29kZSBjb21tZW50LCBudWxsIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBmaW5kRXh0cmFGaWVsZFVuaWNvZGVDb21tZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHVjb21tZW50RmllbGQgPSB0aGlzLmV4dHJhRmllbGRzWzB4NjM3NV07XG4gICAgICAgIGlmICh1Y29tbWVudEZpZWxkKSB7XG4gICAgICAgICAgICB2YXIgZXh0cmFSZWFkZXIgPSByZWFkZXJGb3IodWNvbW1lbnRGaWVsZC52YWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIHdyb25nIHZlcnNpb25cbiAgICAgICAgICAgIGlmIChleHRyYVJlYWRlci5yZWFkSW50KDEpICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHRoZSBjcmMgb2YgdGhlIGNvbW1lbnQgY2hhbmdlZCwgdGhpcyBmaWVsZCBpcyBvdXQgb2YgZGF0ZS5cbiAgICAgICAgICAgIGlmIChjcmMzMmZuKHRoaXMuZmlsZUNvbW1lbnQpICE9PSBleHRyYVJlYWRlci5yZWFkSW50KDQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1dGY4LnV0ZjhkZWNvZGUoZXh0cmFSZWFkZXIucmVhZERhdGEodWNvbW1lbnRGaWVsZC5sZW5ndGggLSA1KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gWmlwRW50cnk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBTdHJlYW1IZWxwZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9TdHJlYW1IZWxwZXInKTtcbnZhciBEYXRhV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vRGF0YVdvcmtlcicpO1xudmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTtcbnZhciBDb21wcmVzc2VkT2JqZWN0ID0gcmVxdWlyZSgnLi9jb21wcmVzc2VkT2JqZWN0Jyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBBIHNpbXBsZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgZmlsZSBpbiB0aGUgemlwIGZpbGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgZGF0YVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgb2YgdGhlIGZpbGVcbiAqL1xudmFyIFppcE9iamVjdCA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZGlyID0gb3B0aW9ucy5kaXI7XG4gICAgdGhpcy5kYXRlID0gb3B0aW9ucy5kYXRlO1xuICAgIHRoaXMuY29tbWVudCA9IG9wdGlvbnMuY29tbWVudDtcbiAgICB0aGlzLnVuaXhQZXJtaXNzaW9ucyA9IG9wdGlvbnMudW5peFBlcm1pc3Npb25zO1xuICAgIHRoaXMuZG9zUGVybWlzc2lvbnMgPSBvcHRpb25zLmRvc1Blcm1pc3Npb25zO1xuXG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5fZGF0YUJpbmFyeSA9IG9wdGlvbnMuYmluYXJ5O1xuICAgIC8vIGtlZXAgb25seSB0aGUgY29tcHJlc3Npb25cbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgIGNvbXByZXNzaW9uIDogb3B0aW9ucy5jb21wcmVzc2lvbixcbiAgICAgICAgY29tcHJlc3Npb25PcHRpb25zIDogb3B0aW9ucy5jb21wcmVzc2lvbk9wdGlvbnNcbiAgICB9O1xufTtcblxuWmlwT2JqZWN0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gaW50ZXJuYWwgc3RyZWFtIGZvciB0aGUgY29udGVudCBvZiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiBlYWNoIGNodW5rLlxuICAgICAqIEByZXR1cm4gU3RyZWFtSGVscGVyIHRoZSBzdHJlYW0uXG4gICAgICovXG4gICAgaW50ZXJuYWxTdHJlYW06IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHZhciBvdXRwdXRUeXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB2YXIgYXNrVW5pY29kZVN0cmluZyA9IG91dHB1dFR5cGUgPT09IFwic3RyaW5nXCIgfHwgb3V0cHV0VHlwZSA9PT0gXCJ0ZXh0XCI7XG4gICAgICAgIGlmIChvdXRwdXRUeXBlID09PSBcImJpbmFyeXN0cmluZ1wiIHx8IG91dHB1dFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gXCJzdHJpbmdcIjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fZGVjb21wcmVzc1dvcmtlcigpO1xuXG4gICAgICAgIHZhciBpc1VuaWNvZGVTdHJpbmcgPSAhdGhpcy5fZGF0YUJpbmFyeTtcblxuICAgICAgICBpZiAoaXNVbmljb2RlU3RyaW5nICYmICFhc2tVbmljb2RlU3RyaW5nKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucGlwZShuZXcgdXRmOC5VdGY4RW5jb2RlV29ya2VyKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmljb2RlU3RyaW5nICYmIGFza1VuaWNvZGVTdHJpbmcpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5waXBlKG5ldyB1dGY4LlV0ZjhEZWNvZGVXb3JrZXIoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFN0cmVhbUhlbHBlcihyZXN1bHQsIG91dHB1dFR5cGUsIFwiXCIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlIHRoZSBjb250ZW50IGluIHRoZSBhc2tlZCB0eXBlLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSByZXN1bHQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25VcGRhdGUgYSBmdW5jdGlvbiB0byBjYWxsIG9uIGVhY2ggaW50ZXJuYWwgdXBkYXRlLlxuICAgICAqIEByZXR1cm4gUHJvbWlzZSB0aGUgcHJvbWlzZSBvZiB0aGUgcmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jOiBmdW5jdGlvbiAodHlwZSwgb25VcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxTdHJlYW0odHlwZSkuYWNjdW11bGF0ZShvblVwZGF0ZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmUgdGhlIGNvbnRlbnQgYXMgYSBub2RlanMgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIGVhY2ggY2h1bmsuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25VcGRhdGUgYSBmdW5jdGlvbiB0byBjYWxsIG9uIGVhY2ggaW50ZXJuYWwgdXBkYXRlLlxuICAgICAqIEByZXR1cm4gU3RyZWFtIHRoZSBzdHJlYW0uXG4gICAgICovXG4gICAgbm9kZVN0cmVhbTogZnVuY3Rpb24gKHR5cGUsIG9uVXBkYXRlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU3RyZWFtKHR5cGUgfHwgXCJub2RlYnVmZmVyXCIpLnRvTm9kZWpzU3RyZWFtKG9uVXBkYXRlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgd29ya2VyIGZvciB0aGUgY29tcHJlc3NlZCBjb250ZW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbXByZXNzaW9uIHRoZSBjb21wcmVzc2lvbiBvYmplY3QgdG8gdXNlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbk9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gY29tcHJlc3NpbmcuXG4gICAgICogQHJldHVybiBXb3JrZXIgdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICAvLyBfY29tcHJlc3NXb3JrZXI6IGZ1bmN0aW9uIChjb21wcmVzc2lvbiwgY29tcHJlc3Npb25PcHRpb25zKSB7XG4gICAgLy8gICAgIGlmIChcbiAgICAvLyAgICAgICAgIHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0ICYmXG4gICAgLy8gICAgICAgICB0aGlzLl9kYXRhLmNvbXByZXNzaW9uLm1hZ2ljID09PSBjb21wcmVzc2lvbi5tYWdpY1xuICAgIC8vICAgICApIHtcbiAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdldENvbXByZXNzZWRXb3JrZXIoKTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9kZWNvbXByZXNzV29ya2VyKCk7XG4gICAgLy8gICAgICAgICBpZighdGhpcy5fZGF0YUJpbmFyeSkge1xuICAgIC8vICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5waXBlKG5ldyB1dGY4LlV0ZjhFbmNvZGVXb3JrZXIoKSk7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICByZXR1cm4gQ29tcHJlc3NlZE9iamVjdC5jcmVhdGVXb3JrZXJGcm9tKHJlc3VsdCwgY29tcHJlc3Npb24sIGNvbXByZXNzaW9uT3B0aW9ucyk7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9LFxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHdvcmtlciBmb3IgdGhlIGRlY29tcHJlc3NlZCBjb250ZW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybiBXb3JrZXIgdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICBfZGVjb21wcmVzc1dvcmtlciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5nZXRDb250ZW50V29ya2VyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZGF0YSBpbnN0YW5jZW9mIEdlbmVyaWNXb3JrZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhV29ya2VyKHRoaXMuX2RhdGEpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIHJlbW92ZWRNZXRob2RzID0gW1wiYXNUZXh0XCIsIFwiYXNCaW5hcnlcIiwgXCJhc05vZGVCdWZmZXJcIiwgXCJhc1VpbnQ4QXJyYXlcIiwgXCJhc0FycmF5QnVmZmVyXCJdO1xudmFyIHJlbW92ZWRGbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLlwiKTtcbn07XG5cbmZvcih2YXIgaSA9IDA7IGkgPCByZW1vdmVkTWV0aG9kcy5sZW5ndGg7IGkrKykge1xuICAgIFppcE9iamVjdC5wcm90b3R5cGVbcmVtb3ZlZE1ldGhvZHNbaV1dID0gcmVtb3ZlZEZuO1xufVxubW9kdWxlLmV4cG9ydHMgPSBaaXBPYmplY3Q7XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIG5vdE51bGwoeCkgIHsgcmV0dXJuIHggIT0gbnVsbDsgfVxuZnVuY3Rpb24gd3JhcCh4KSAgICAgeyByZXR1cm4gJygnICsgeCArICcpJzt9XG5cbmZ1bmN0aW9uIG1heWJlUXVvdGUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJ1wiJyArIHZhbHVlICsgJ1wiJztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBsb29rVXAoa2V5KSB7XG4gICAgaWYgKGtleVswXSA9PT0gJyQnKSB7XG4gICAgICAgIHJldHVybiAnY29udGV4dC4nICsga2V5LnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgcmV0dXJuICdjb250ZXh0LmZlYXR1cmUucHJvcGVydGllcy4nICsga2V5O1xufVxuXG5mdW5jdGlvbiBudWxsVmFsdWUoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiAnIHRydWUgJztcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlFcXVhbChrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHdyYXAobWF5YmVRdW90ZSh2YWx1ZSkgKyAnID09PSAnICsgbG9va1VwKGtleSkpO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eU9yKGtleSwgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHdyYXAodmFsdWVzLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gcHJvcGVydHlFcXVhbChrZXksIHgpOyB9KS5qb2luKCcgfHwgJykpO1xufVxuXG5mdW5jdGlvbiBwcmludE5lc3RlZCh2YWx1ZXMsIGpvaW5lcikge1xuICAgIHJldHVybiB3cmFwKHZhbHVlcy5maWx0ZXIobm90TnVsbCkubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB3cmFwKHguam9pbignICYmICcpKTtcbiAgICB9KS5qb2luKCcgJyArIGpvaW5lciArICcgJykpO1xufVxuXG5mdW5jdGlvbiBhbnkoXywgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApID8gcHJpbnROZXN0ZWQodmFsdWVzLm1hcChmdW5jdGlvbih2KSB7IHJldHVybiBwYXJzZUZpbHRlcih2LCBvcHRpb25zKSB9KSwgJ3x8JykgOiAndHJ1ZSc7XG59XG5cbmZ1bmN0aW9uIGFsbChfLCB2YWx1ZXMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkgPyBwcmludE5lc3RlZCh2YWx1ZXMubWFwKGZ1bmN0aW9uKHYpIHsgcmV0dXJuIHBhcnNlRmlsdGVyKHYsIG9wdGlvbnMpIH0pLCAnJiYnKSA6ICd0cnVlJztcbn1cblxuZnVuY3Rpb24gbm90KGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gJyEnICsgd3JhcChwYXJzZUZpbHRlcih2YWx1ZSwgb3B0aW9ucykuam9pbignICYmICcpKTtcbn1cblxuZnVuY3Rpb24gbm9uZShrZXksIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHJldHVybiAnIScgKyB3cmFwKGFueShudWxsLCB2YWx1ZXMsIG9wdGlvbnMpKTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlNYXRjaGVzQm9vbGVhbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHdyYXAobG9va1VwKGtleSkgKyAodmFsdWUgPyAnICE9ICcgOiAnID09ICcpICArICdudWxsJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmdlTWF0Y2goa2V5LCB2YWx1ZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTtcbiAgICB2YXIgdHJhbnNmb3JtID0gb3B0aW9ucyAmJiAodHlwZW9mIG9wdGlvbnMucmFuZ2VUcmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpICYmIG9wdGlvbnMucmFuZ2VUcmFuc2Zvcm07XG5cbiAgICBpZiAodmFsdWVzLm1heCkge1xuICAgICAgICB2YXIgbWF4ID0gdHJhbnNmb3JtID8gdHJhbnNmb3JtKHZhbHVlcy5tYXgpIDogdmFsdWVzLm1heDtcbiAgICAgICAgZXhwcmVzc2lvbnMucHVzaCgnJyArIGxvb2tVcChrZXkpICsgJyA8ICcgKyBtYXgpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZXMubWluKSB7XG4gICAgICAgIHZhciBtaW4gPSB0cmFuc2Zvcm0gPyBtaW4gPSB0cmFuc2Zvcm0odmFsdWVzLm1pbikgOiB2YWx1ZXMubWluO1xuICAgICAgICBleHByZXNzaW9ucy5wdXNoKCcnICsgbG9va1VwKGtleSkgKyAnID49ICcgKyBtaW4pO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwKGV4cHJlc3Npb25zLmpvaW4oJyAmJiAnKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRmlsdGVyKGZpbHRlciwgb3B0aW9ucykge1xuICAgIHZhciBmaWx0ZXJBU1QgPSBbXTtcblxuICAgIC8vIEZ1bmN0aW9uIGZpbHRlclxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBbd3JhcChmaWx0ZXIudG9TdHJpbmcoKSArICcoY29udGV4dCknKV07XG4gICAgfVxuICAgIC8vIEFycmF5IGZpbHRlciwgaW1wbGljaXQgJ2FueSdcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHtcbiAgICAgICAgcmV0dXJuIFthbnkobnVsbCwgZmlsdGVyLCBvcHRpb25zKV07XG4gICAgfVxuICAgIC8vIE51bGwgZmlsdGVyIG9iamVjdFxuICAgIGVsc2UgaWYgKGZpbHRlciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbJ3RydWUnXTtcbiAgICB9XG5cbiAgICAvLyBPYmplY3QgZmlsdGVyLCBlLmcuIGltcGxpY2l0ICdhbGwnXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmaWx0ZXIpO1xuICAgIGZvciAodmFyIGs9MDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNba107XG5cbiAgICAgICAgdmFyIHZhbHVlID0gZmlsdGVyW2tleV0sXG4gICAgICAgICAgICB0eXBlICA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChwcm9wZXJ0eUVxdWFsKGtleSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHByb3BlcnR5TWF0Y2hlc0Jvb2xlYW4oa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ25vdCcpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG5vdChrZXksIHZhbHVlLCBvcHRpb25zKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnYW55Jykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2goYW55KGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChhbGwoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChub25lKGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gocHJvcGVydHlPcihrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLm1heCB8fCB2YWx1ZS5taW4pIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChyYW5nZU1hdGNoKGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChudWxsVmFsdWUoa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIFF1ZXJ5IHN5dG5heDogJyArIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBrZXlzLmxlbmd0aCA9PT0gMCA/IFsndHJ1ZSddIDogZmlsdGVyQVNUO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJUb1N0cmluZyhmaWx0ZXJBU1QpIHtcbiAgICByZXR1cm4gd3JhcChmaWx0ZXJBU1Quam9pbignICYmICcpKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2goZmlsdGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKGZpbHRlciA9PSBudWxsKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9OyB9XG4gICAgLy8ganNoaW50IGV2aWw6IHRydWVcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ3JldHVybiAnICsgZmlsdGVyVG9TdHJpbmcocGFyc2VGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSkgKyAnOycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBtYXRjaDogbWF0Y2gsXG4gICAgZmlsdGVyVG9TdHJpbmc6IGZpbHRlclRvU3RyaW5nLFxuICAgIHBhcnNlRmlsdGVyOiBwYXJzZUZpbHRlclxufTtcbiIsIi8vIFRvcCBsZXZlbCBmaWxlIGlzIGp1c3QgYSBtaXhpbiBvZiBzdWJtb2R1bGVzICYgY29uc3RhbnRzXG4ndXNlIHN0cmljdCc7XG5cbnZhciBhc3NpZ24gICAgPSByZXF1aXJlKCcuL2xpYi91dGlscy9jb21tb24nKS5hc3NpZ247XG5cbnZhciBkZWZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9kZWZsYXRlJyk7XG52YXIgaW5mbGF0ZSAgID0gcmVxdWlyZSgnLi9saWIvaW5mbGF0ZScpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vbGliL3psaWIvY29uc3RhbnRzJyk7XG5cbnZhciBwYWtvID0ge307XG5cbmFzc2lnbihwYWtvLCBkZWZsYXRlLCBpbmZsYXRlLCBjb25zdGFudHMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBha287XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHpsaWJfZGVmbGF0ZSA9IHJlcXVpcmUoJy4vemxpYi9kZWZsYXRlJyk7XG52YXIgdXRpbHMgICAgICAgID0gcmVxdWlyZSgnLi91dGlscy9jb21tb24nKTtcbnZhciBzdHJpbmdzICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL3N0cmluZ3MnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcblxudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbnZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuXG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cbnZhciBaX0RFRkFVTFRfU1RSQVRFR1kgICAgPSAwO1xuXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qKlxuICogY2xhc3MgRGVmbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2RlZmxhdGVdXSxcbiAqIFtbZGVmbGF0ZVJhd11dIGFuZCBbW2d6aXBdXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIERlZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0RlZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRlbi5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5XG4gKlxuICogQ29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbRGVmbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbRGVmbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pICBvciBpZiB5b3VcbiAqIHB1c2ggYSBjaHVuayB3aXRoIGV4cGxpY2l0IGZsdXNoIChjYWxsIFtbRGVmbGF0ZSNwdXNoXV0gd2l0aFxuICogYFpfU1lOQ19GTFVTSGAgcGFyYW0pLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUuZXJyIC0+IE51bWJlclxuICpcbiAqIEVycm9yIGNvZGUgYWZ0ZXIgZGVmbGF0ZSBmaW5pc2hlZC4gMCAoWl9PSykgb24gc3VjY2Vzcy5cbiAqIFlvdSB3aWxsIG5vdCBuZWVkIGl0IGluIHJlYWwgbGlmZSwgYmVjYXVzZSBkZWZsYXRlIGVycm9yc1xuICogYXJlIHBvc3NpYmxlIG9ubHkgb24gd3Jvbmcgb3B0aW9ucyBvciBiYWQgYG9uRGF0YWAgLyBgb25FbmRgXG4gKiBjdXN0b20gaGFuZGxlcnMuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tEZWZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBEZWZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGRlZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgbGV2ZWxgXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgbWVtTGV2ZWxgXG4gKiAtIGBzdHJhdGVneWBcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGRlZmxhdGVcbiAqIC0gYGd6aXBgIChCb29sZWFuKSAtIGNyZWF0ZSBnemlwIHdyYXBwZXJcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIFwiYmluYXJ5IHN0cmluZ1wiXG4gKiAgICAoZWFjaCBjaGFyIGNvZGUgWzAuLjI1NV0pXG4gKiAtIGBoZWFkZXJgIChPYmplY3QpIC0gY3VzdG9tIGhlYWRlciBmb3IgZ3ppcFxuICogICAtIGB0ZXh0YCAoQm9vbGVhbikgLSB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0XG4gKiAgIC0gYHRpbWVgIChOdW1iZXIpIC0gbW9kaWZpY2F0aW9uIHRpbWUsIHVuaXggdGltZXN0YW1wXG4gKiAgIC0gYG9zYCAoTnVtYmVyKSAtIG9wZXJhdGlvbiBzeXN0ZW0gY29kZVxuICogICAtIGBleHRyYWAgKEFycmF5KSAtIGFycmF5IG9mIGJ5dGVzIHdpdGggZXh0cmEgZGF0YSAobWF4IDY1NTM2KVxuICogICAtIGBuYW1lYCAoU3RyaW5nKSAtIGZpbGUgbmFtZSAoYmluYXJ5IHN0cmluZylcbiAqICAgLSBgY29tbWVudGAgKFN0cmluZykgLSBjb21tZW50IChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBoY3JjYCAoQm9vbGVhbikgLSB0cnVlIGlmIGhlYWRlciBjcmMgc2hvdWxkIGJlIGFkZGVkXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGNodW5rMSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSlcbiAqICAgLCBjaHVuazIgPSBVaW50OEFycmF5KFsxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOV0pO1xuICpcbiAqIHZhciBkZWZsYXRlID0gbmV3IHBha28uRGVmbGF0ZSh7IGxldmVsOiAzfSk7XG4gKlxuICogZGVmbGF0ZS5wdXNoKGNodW5rMSwgZmFsc2UpO1xuICogZGVmbGF0ZS5wdXNoKGNodW5rMiwgdHJ1ZSk7ICAvLyB0cnVlIC0+IGxhc3QgY2h1bmtcbiAqXG4gKiBpZiAoZGVmbGF0ZS5lcnIpIHsgdGhyb3cgbmV3IEVycm9yKGRlZmxhdGUuZXJyKTsgfVxuICpcbiAqIGNvbnNvbGUubG9nKGRlZmxhdGUucmVzdWx0KTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gRGVmbGF0ZShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWZsYXRlKSkgcmV0dXJuIG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIHRoaXMub3B0aW9ucyA9IHV0aWxzLmFzc2lnbih7XG4gICAgbGV2ZWw6IFpfREVGQVVMVF9DT01QUkVTU0lPTixcbiAgICBtZXRob2Q6IFpfREVGTEFURUQsXG4gICAgY2h1bmtTaXplOiAxNjM4NCxcbiAgICB3aW5kb3dCaXRzOiAxNSxcbiAgICBtZW1MZXZlbDogOCxcbiAgICBzdHJhdGVneTogWl9ERUZBVUxUX1NUUkFURUdZLFxuICAgIHRvOiAnJ1xuICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICB2YXIgb3B0ID0gdGhpcy5vcHRpb25zO1xuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+IDApKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmIChvcHQuZ3ppcCAmJiAob3B0LndpbmRvd0JpdHMgPiAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAxNjtcbiAgfVxuXG4gIHRoaXMuZXJyICAgID0gMDsgICAgICAvLyBlcnJvciBjb2RlLCBpZiBoYXBwZW5zICgwID0gWl9PSylcbiAgdGhpcy5tc2cgICAgPSAnJzsgICAgIC8vIGVycm9yIG1lc3NhZ2VcbiAgdGhpcy5lbmRlZCAgPSBmYWxzZTsgIC8vIHVzZWQgdG8gYXZvaWQgbXVsdGlwbGUgb25FbmQoKSBjYWxsc1xuICB0aGlzLmNodW5rcyA9IFtdOyAgICAgLy8gY2h1bmtzIG9mIGNvbXByZXNzZWQgZGF0YVxuXG4gIHRoaXMuc3RybSA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUluaXQyKFxuICAgIHRoaXMuc3RybSxcbiAgICBvcHQubGV2ZWwsXG4gICAgb3B0Lm1ldGhvZCxcbiAgICBvcHQud2luZG93Qml0cyxcbiAgICBvcHQubWVtTGV2ZWwsXG4gICAgb3B0LnN0cmF0ZWd5XG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gWl9PSykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gIH1cblxuICBpZiAob3B0LmhlYWRlcikge1xuICAgIHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSwgb3B0LmhlYWRlcik7XG4gIH1cblxuICBpZiAob3B0LmRpY3Rpb25hcnkpIHtcbiAgICB2YXIgZGljdDtcbiAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBvcHQuZGljdGlvbmFyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguXG4gICAgICBkaWN0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICBkaWN0ID0gbmV3IFVpbnQ4QXJyYXkob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWN0ID0gb3B0LmRpY3Rpb25hcnk7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdCk7XG5cbiAgICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICAgIH1cblxuICAgIHRoaXMuX2RpY3Rfc2V0ID0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIERlZmxhdGUjcHVzaChkYXRhWywgbW9kZV0pIC0+IEJvb2xlYW5cbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxBcnJheUJ1ZmZlcnxTdHJpbmcpOiBpbnB1dCBkYXRhLiBTdHJpbmdzIHdpbGwgYmVcbiAqICAgY29udmVydGVkIHRvIHV0ZjggYnl0ZSBzZXF1ZW5jZS5cbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFuc2ggWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBkZWZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tEZWZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBjb21wcmVzc2VkIGNodW5rcy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4gVGhlIGxhc3QgZGF0YSBibG9jayBtdXN0IGhhdmVcbiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nIGJ1ZmZlcnMgYW5kIGNhbGxcbiAqIFtbRGVmbGF0ZSNvbkVuZF1dLiBGb3IgaW50ZXJpbSBleHBsaWNpdCBmbHVzaGVzICh3aXRob3V0IGVuZGluZyB0aGUgc3RyZWFtKSB5b3VcbiAqIGNhbiB1c2UgbW9kZSBaX1NZTkNfRkxVU0gsIGtlZXBpbmcgdGhlIGNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbRGVmbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGFycmF5IGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIKTtcblxuICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBJZiB3ZSBuZWVkIHRvIGNvbXByZXNzIHRleHQsIGNoYW5nZSBlbmNvZGluZyB0byB1dGY4LlxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZShzdHJtLCBfbW9kZSk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgIT09IFpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBaX0ZJTklTSCB8fCBfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSkpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMub25EYXRhKHN0cmluZ3MuYnVmMmJpbnN0cmluZyh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gd2hpbGUgKChzdHJtLmF2YWlsX2luID4gMCB8fCBzdHJtLmF2YWlsX291dCA9PT0gMCkgJiYgc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQpO1xuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IFpfRklOSVNIKSB7XG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChaX09LKTtcbiAgICBzdHJtLmF2YWlsX291dCA9IDA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBvdXB1dCBkYXRhLiBUeXBlIG9mIGFycmF5IGRlcGVuZHNcbiAqICAgb24ganMgZW5naW5lIHN1cHBvcnQuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsIGVhY2ggY2h1bmtcbiAqICAgd2lsbCBiZSBzdHJpbmcuXG4gKlxuICogQnkgZGVmYXVsdCwgc3RvcmVzIGRhdGEgYmxvY2tzIGluIGBjaHVua3NbXWAgcHJvcGVydHkgYW5kIGdsdWVcbiAqIHRob3NlIGluIGBvbkVuZGAuIE92ZXJyaWRlIHRoaXMgaGFuZGxlciwgaWYgeW91IG5lZWQgYW5vdGhlciBiZWhhdmlvdXIuXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG59O1xuXG5cbi8qKlxuICogRGVmbGF0ZSNvbkVuZChzdGF0dXMpIC0+IFZvaWRcbiAqIC0gc3RhdHVzIChOdW1iZXIpOiBkZWZsYXRlIHN0YXR1cy4gMCAoWl9PSykgb24gc3VjY2VzcyxcbiAqICAgb3RoZXIgaWYgbm90LlxuICpcbiAqIENhbGxlZCBvbmNlIGFmdGVyIHlvdSB0ZWxsIGRlZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHV0aWxzLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpO1xuICAgIH1cbiAgfVxuICB0aGlzLmNodW5rcyA9IFtdO1xuICB0aGlzLmVyciA9IHN0YXR1cztcbiAgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnO1xufTtcblxuXG4vKipcbiAqIGRlZmxhdGUoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENvbXByZXNzIGBkYXRhYCB3aXRoIGRlZmxhdGUgYWxnb3JpdGhtIGFuZCBgb3B0aW9uc2AuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gbGV2ZWxcbiAqIC0gd2luZG93Qml0c1xuICogLSBtZW1MZXZlbFxuICogLSBzdHJhdGVneVxuICogLSBkaWN0aW9uYXJ5XG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgZGF0YSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSk7XG4gKlxuICogY29uc29sZS5sb2cocGFrby5kZWZsYXRlKGRhdGEpKTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgZGVmbGF0b3IgPSBuZXcgRGVmbGF0ZShvcHRpb25zKTtcblxuICBkZWZsYXRvci5wdXNoKGlucHV0LCB0cnVlKTtcblxuICAvLyBUaGF0IHdpbGwgbmV2ZXIgaGFwcGVucywgaWYgeW91IGRvbid0IGNoZWF0IHdpdGggb3B0aW9ucyA6KVxuICBpZiAoZGVmbGF0b3IuZXJyKSB7IHRocm93IGRlZmxhdG9yLm1zZzsgfVxuXG4gIHJldHVybiBkZWZsYXRvci5yZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBkZWZsYXRlUmF3KGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gZGVmbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiBnemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCBvZlxuICogZGVmbGF0ZSBvbmUuXG4gKiovXG5mdW5jdGlvbiBnemlwKGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLmd6aXAgPSB0cnVlO1xuICByZXR1cm4gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuZXhwb3J0cy5EZWZsYXRlID0gRGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZSA9IGRlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGVSYXcgPSBkZWZsYXRlUmF3O1xuZXhwb3J0cy5nemlwID0gZ3ppcDtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9pbmZsYXRlID0gcmVxdWlyZSgnLi96bGliL2luZmxhdGUnKTtcbnZhciB1dGlscyAgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL2NvbW1vbicpO1xudmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIGMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9jb25zdGFudHMnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xudmFyIEdaaGVhZGVyICAgICA9IHJlcXVpcmUoJy4vemxpYi9nemhlYWRlcicpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIGNsYXNzIEluZmxhdGVcbiAqXG4gKiBHZW5lcmljIEpTLXN0eWxlIHdyYXBwZXIgZm9yIHpsaWIgY2FsbHMuIElmIHlvdSBkb24ndCBuZWVkXG4gKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNlIG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tpbmZsYXRlXV1cbiAqIGFuZCBbW2luZmxhdGVSYXddXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIGluZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0luZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRlbi5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICpcbiAqIFVuY29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbSW5mbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbSW5mbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBpbmZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogU2hvdWxkIGJlIGNoZWNrZWQgaWYgYnJva2VuIGRhdGEgcG9zc2libGUuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tJbmZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBJbmZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGluZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgd2luZG93Qml0c2BcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGluZmxhdGVcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICogQnkgZGVmYXVsdCwgd2hlbiBubyBvcHRpb25zIHNldCwgYXV0b2RldGVjdCBkZWZsYXRlL2d6aXAgZGF0YSBmb3JtYXQgdmlhXG4gKiB3cmFwcGVyIGhlYWRlci5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGluZmxhdGUgPSBuZXcgcGFrby5JbmZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBpbmZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBpbmZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChpbmZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoaW5mbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coaW5mbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBJbmZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGUpKSByZXR1cm4gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDAsXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgLy8gRm9yY2Ugd2luZG93IHNpemUgZm9yIGByYXdgIGRhdGEsIGlmIG5vdCBzZXQgZGlyZWN0bHksXG4gIC8vIGJlY2F1c2Ugd2UgaGF2ZSBubyBoZWFkZXIgZm9yIGF1dG9kZXRlY3QuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgICBpZiAob3B0LndpbmRvd0JpdHMgPT09IDApIHsgb3B0LndpbmRvd0JpdHMgPSAtMTU7IH1cbiAgfVxuXG4gIC8vIElmIGB3aW5kb3dCaXRzYCBub3QgZGVmaW5lZCAoYW5kIG1vZGUgbm90IHJhdykgLSBzZXQgYXV0b2RldGVjdCBmbGFnIGZvciBnemlwL2RlZmxhdGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikgJiZcbiAgICAgICEob3B0aW9ucyAmJiBvcHRpb25zLndpbmRvd0JpdHMpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgKz0gMzI7XG4gIH1cblxuICAvLyBHemlwIGhlYWRlciBoYXMgbm8gaW5mbyBhYm91dCB3aW5kb3dzIHNpemUsIHdlIGNhbiBkbyBhdXRvZGV0ZWN0IG9ubHlcbiAgLy8gZm9yIGRlZmxhdGUuIFNvLCBpZiB3aW5kb3cgc2l6ZSBub3Qgc2V0LCBmb3JjZSBpdCB0byBtYXggd2hlbiBnemlwIHBvc3NpYmxlXG4gIGlmICgob3B0LndpbmRvd0JpdHMgPiAxNSkgJiYgKG9wdC53aW5kb3dCaXRzIDwgNDgpKSB7XG4gICAgLy8gYml0IDMgKDE2KSAtPiBnemlwcGVkIGRhdGFcbiAgICAvLyBiaXQgNCAoMzIpIC0+IGF1dG9kZXRlY3QgZ3ppcC9kZWZsYXRlXG4gICAgaWYgKChvcHQud2luZG93Qml0cyAmIDE1KSA9PT0gMCkge1xuICAgICAgb3B0LndpbmRvd0JpdHMgfD0gMTU7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtICAgPSBuZXcgWlN0cmVhbSgpO1xuICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDtcblxuICB2YXIgc3RhdHVzICA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC53aW5kb3dCaXRzXG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIHRoaXMuaGVhZGVyID0gbmV3IEdaaGVhZGVyKCk7XG5cbiAgemxpYl9pbmZsYXRlLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLCB0aGlzLmhlYWRlcik7XG59XG5cbi8qKlxuICogSW5mbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGFcbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFuc2ggWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBpbmZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tJbmZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBvdXRwdXQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZVxuICogbW9kZSBaX0ZJTklTSCAob3IgYHRydWVgKS4gVGhhdCB3aWxsIGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tJbmZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdVxuICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgZGVjb21wcmVzc2lvbiBjb250ZXh0LlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0luZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIGBVaW50OEFycmF5YCBvbiBpbnB1dCBmb3IgYmVzdCBzcGVlZCAob3V0cHV0XG4gKiBmb3JtYXQgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSkuIEFsc28sIGRvbid0IHNraXAgbGFzdCBwYXJhbSBhbmQgYWx3YXlzXG4gKiB1c2UgdGhlIHNhbWUgdHlwZSBpbiB5b3VyIGNvZGUgKGJvb2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuXG4gKlxuICogRm9yIHJlZ3VsYXIgYEFycmF5YC1zIG1ha2Ugc3VyZSBhbGwgZWxlbWVudHMgYXJlIFswLi4yNTVdLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBwdXNoKGNodW5rLCBmYWxzZSk7IC8vIHB1c2ggb25lIG9mIGRhdGEgY2h1bmtzXG4gKiAuLi5cbiAqIHB1c2goY2h1bmssIHRydWUpOyAgLy8gcHVzaCBsYXN0IGNodW5rXG4gKiBgYGBcbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkge1xuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgdmFyIGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7XG4gIHZhciBkaWN0aW9uYXJ5ID0gdGhpcy5vcHRpb25zLmRpY3Rpb25hcnk7XG4gIHZhciBzdGF0dXMsIF9tb2RlO1xuICB2YXIgbmV4dF9vdXRfdXRmOCwgdGFpbCwgdXRmOHN0cjtcbiAgdmFyIGRpY3Q7XG5cbiAgLy8gRmxhZyB0byBwcm9wZXJseSBwcm9jZXNzIFpfQlVGX0VSUk9SIG9uIHRlc3RpbmcgaW5mbGF0ZSBjYWxsXG4gIC8vIHdoZW4gd2UgY2hlY2sgdGhhdCBhbGwgb3V0cHV0IGRhdGEgd2FzIGZsdXNoZWQuXG4gIHZhciBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IGMuWl9GSU5JU0ggOiBjLlpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIE9ubHkgYmluYXJ5IHN0cmluZ3MgY2FuIGJlIGRlY29tcHJlc3NlZCBvbiBwcmFjdGljZVxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLmJpbnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cblxuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHN0cm0sIGMuWl9OT19GTFVTSCk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9ORUVEX0RJQ1QgJiYgZGljdGlvbmFyeSkge1xuICAgICAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICAgICAgaWYgKHR5cGVvZiBkaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBkaWN0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKGRpY3Rpb25hcnkpO1xuICAgICAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShkaWN0aW9uYXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpY3QgPSBkaWN0aW9uYXJ5O1xuICAgICAgfVxuXG4gICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9CVUZfRVJST1IgJiYgYWxsb3dCdWZFcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdHVzID0gYy5aX09LO1xuICAgICAgYWxsb3dCdWZFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RybS5uZXh0X291dCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBjLlpfRklOSVNIIHx8IF9tb2RlID09PSBjLlpfU1lOQ19GTFVTSCkpKSB7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcblxuICAgICAgICAgIG5leHRfb3V0X3V0ZjggPSBzdHJpbmdzLnV0Zjhib3JkZXIoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpO1xuXG4gICAgICAgICAgdGFpbCA9IHN0cm0ubmV4dF9vdXQgLSBuZXh0X291dF91dGY4O1xuICAgICAgICAgIHV0ZjhzdHIgPSBzdHJpbmdzLmJ1ZjJzdHJpbmcoc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgpO1xuXG4gICAgICAgICAgLy8gbW92ZSB0YWlsXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHRhaWw7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemUgLSB0YWlsO1xuICAgICAgICAgIGlmICh0YWlsKSB7IHV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LCBzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCwgdGFpbCwgMCk7IH1cblxuICAgICAgICAgIHRoaXMub25EYXRhKHV0ZjhzdHIpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXaGVuIG5vIG1vcmUgaW5wdXQgZGF0YSwgd2Ugc2hvdWxkIGNoZWNrIHRoYXQgaW50ZXJuYWwgaW5mbGF0ZSBidWZmZXJzXG4gICAgLy8gYXJlIGZsdXNoZWQuIFRoZSBvbmx5IHdheSB0byBkbyBpdCB3aGVuIGF2YWlsX291dCA9IDAgLSBydW4gb25lIG1vcmVcbiAgICAvLyBpbmZsYXRlIHBhc3MuIEJ1dCBpZiBvdXRwdXQgZGF0YSBub3QgZXhpc3RzLCBpbmZsYXRlIHJldHVybiBaX0JVRl9FUlJPUi5cbiAgICAvLyBIZXJlIHdlIHNldCBmbGFnIHRvIHByb2Nlc3MgdGhpcyBlcnJvciBwcm9wZXJseS5cbiAgICAvL1xuICAgIC8vIE5PVEUuIERlZmxhdGUgZG9lcyBub3QgcmV0dXJuIGVycm9yIGluIHRoaXMgY2FzZSBhbmQgZG9lcyBub3QgbmVlZHMgc3VjaFxuICAgIC8vIGxvZ2ljLlxuICAgIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gdHJ1ZTtcbiAgICB9XG5cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EKTtcblxuICBpZiAoc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCkge1xuICAgIF9tb2RlID0gYy5aX0ZJTklTSDtcbiAgfVxuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IGMuWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBjLlpfT0s7XG4gIH1cblxuICAvLyBjYWxsYmFjayBpbnRlcmltIHJlc3VsdHMgaWYgWl9TWU5DX0ZMVVNILlxuICBpZiAoX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChjLlpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGluZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIGVpdGhlciBhZnRlciB5b3UgdGVsbCBpbmZsYXRlIHRoYXQgdGhlIGlucHV0IHN0cmVhbSBpc1xuICogY29tcGxldGUgKFpfRklOSVNIKSBvciBzaG91bGQgYmUgZmx1c2hlZCAoWl9TWU5DX0ZMVVNIKVxuICogb3IgaWYgYW4gZXJyb3IgaGFwcGVuZWQuIEJ5IGRlZmF1bHQgLSBqb2luIGNvbGxlY3RlZCBjaHVua3MsXG4gKiBmcmVlIG1lbW9yeSBhbmQgZmlsbCBgcmVzdWx0c2AgLyBgZXJyYCBwcm9wZXJ0aWVzLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IGMuWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBHbHVlICYgY29udmVydCBoZXJlLCB1bnRpbCB3ZSB0ZWFjaCBwYWtvIHRvIHNlbmRcbiAgICAgIC8vIHV0ZjggYWxsaWduZWQgc3RyaW5ncyB0byBvbkRhdGFcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogaW5mbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBEZWNvbXByZXNzIGBkYXRhYCB3aXRoIGluZmxhdGUvdW5nemlwIGFuZCBgb3B0aW9uc2AuIEF1dG9kZXRlY3RcbiAqIGZvcm1hdCB2aWEgd3JhcHBlciBoZWFkZXIgYnkgZGVmYXVsdC4gVGhhdCdzIHdoeSB3ZSBkb24ndCBwcm92aWRlXG4gKiBzZXBhcmF0ZSBgdW5nemlwYCBtZXRob2QuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gd2luZG93Qml0c1xuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIFN1Z2FyIChvcHRpb25zKTpcbiAqXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5XG4gKiAgIG5lZ2F0aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS5cbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBpbnB1dCA9IHBha28uZGVmbGF0ZShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIG91dHB1dDtcbiAqXG4gKiB0cnkge1xuICogICBvdXRwdXQgPSBwYWtvLmluZmxhdGUoaW5wdXQpO1xuICogfSBjYXRjaCAoZXJyKVxuICogICBjb25zb2xlLmxvZyhlcnIpO1xuICogfVxuICogYGBgXG4gKiovXG5mdW5jdGlvbiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBpbmZsYXRvciA9IG5ldyBJbmZsYXRlKG9wdGlvbnMpO1xuXG4gIGluZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChpbmZsYXRvci5lcnIpIHsgdGhyb3cgaW5mbGF0b3IubXNnOyB9XG5cbiAgcmV0dXJuIGluZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGluZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tpbmZsYXRlXV0sIGJ1dCBjcmVhdGVzIHJhdyBkYXRhLCB3aXRob3V0IHdyYXBwZXJcbiAqIChoZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS5cbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMucmF3ID0gdHJ1ZTtcbiAgcmV0dXJuIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogdW5nemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIEp1c3Qgc2hvcnRjdXQgdG8gW1tpbmZsYXRlXV0sIGJlY2F1c2UgaXQgYXV0b2RldGVjdHMgZm9ybWF0XG4gKiBieSBoZWFkZXIuY29udGVudC4gRG9uZSBmb3IgY29udmVuaWVuY2UuXG4gKiovXG5cblxuZXhwb3J0cy5JbmZsYXRlID0gSW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVSYXcgPSBpbmZsYXRlUmF3O1xuZXhwb3J0cy51bmd6aXAgID0gaW5mbGF0ZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgVFlQRURfT0sgPSAgKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKTtcblxuXG5leHBvcnRzLmFzc2lnbiA9IGZ1bmN0aW9uIChvYmogLypmcm9tMSwgZnJvbTIsIGZyb20zLCAuLi4qLykge1xuICB2YXIgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHdoaWxlIChzb3VyY2VzLmxlbmd0aCkge1xuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7XG4gICAgaWYgKCFzb3VyY2UpIHsgY29udGludWU7IH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzb3VyY2UgKyAnbXVzdCBiZSBub24tb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcCBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgb2JqW3BdID0gc291cmNlW3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG5cbi8vIHJlZHVjZSBidWZmZXIgc2l6ZSwgYXZvaWRpbmcgbWVtIGNvcHlcbmV4cG9ydHMuc2hyaW5rQnVmID0gZnVuY3Rpb24gKGJ1Ziwgc2l6ZSkge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gc2l6ZSkgeyByZXR1cm4gYnVmOyB9XG4gIGlmIChidWYuc3ViYXJyYXkpIHsgcmV0dXJuIGJ1Zi5zdWJhcnJheSgwLCBzaXplKTsgfVxuICBidWYubGVuZ3RoID0gc2l6ZTtcbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxudmFyIGZuVHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBpZiAoc3JjLnN1YmFycmF5ICYmIGRlc3Quc3ViYXJyYXkpIHtcbiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNfb2Zmcywgc3JjX29mZnMgKyBsZW4pLCBkZXN0X29mZnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBvcmRpbmFyeSBhcnJheVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHZhciBpLCBsLCBsZW4sIHBvcywgY2h1bmssIHJlc3VsdDtcblxuICAgIC8vIGNhbGN1bGF0ZSBkYXRhIGxlbmd0aFxuICAgIGxlbiA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGxlbiArPSBjaHVua3NbaV0ubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIGpvaW4gY2h1bmtzXG4gICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICBwb3MgPSAwO1xuICAgIGZvciAoaSA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjaHVuayA9IGNodW5rc1tpXTtcbiAgICAgIHJlc3VsdC5zZXQoY2h1bmssIHBvcyk7XG4gICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBmblVudHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gICAgfVxuICB9LFxuICAvLyBKb2luIGFycmF5IG9mIGNodW5rcyB0byBzaW5nbGUgYXJyYXkuXG4gIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uIChjaHVua3MpIHtcbiAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBjaHVua3MpO1xuICB9XG59O1xuXG5cbi8vIEVuYWJsZS9EaXNhYmxlIHR5cGVkIGFycmF5cyB1c2UsIGZvciB0ZXN0aW5nXG4vL1xuZXhwb3J0cy5zZXRUeXBlZCA9IGZ1bmN0aW9uIChvbikge1xuICBpZiAob24pIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gVWludDhBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjE2ID0gVWludDE2QXJyYXk7XG4gICAgZXhwb3J0cy5CdWYzMiA9IEludDMyQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5UeXBlZCk7XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5CdWY4ICA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5VbnR5cGVkKTtcbiAgfVxufTtcblxuZXhwb3J0cy5zZXRUeXBlZChUWVBFRF9PSyk7XG4iLCIvLyBTdHJpbmcgZW5jb2RlL2RlY29kZSBoZWxwZXJzXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxuXG4vLyBRdWljayBjaGVjayBpZiB3ZSBjYW4gdXNlIGZhc3QgYXJyYXkgdG8gYmluIHN0cmluZyBjb252ZXJzaW9uXG4vL1xuLy8gLSBhcHBseShBcnJheSkgY2FuIGZhaWwgb24gQW5kcm9pZCAyLjJcbi8vIC0gYXBwbHkoVWludDhBcnJheSkgY2FuIGZhaWwgb24gaU9TIDUuMSBTYWZhcnlcbi8vXG52YXIgU1RSX0FQUExZX09LID0gdHJ1ZTtcbnZhciBTVFJfQVBQTFlfVUlBX09LID0gdHJ1ZTtcblxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBbIDAgXSk7IH0gY2F0Y2ggKF9fKSB7IFNUUl9BUFBMWV9PSyA9IGZhbHNlOyB9XG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KDEpKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX1VJQV9PSyA9IGZhbHNlOyB9XG5cblxuLy8gVGFibGUgd2l0aCB1dGY4IGxlbmd0aHMgKGNhbGN1bGF0ZWQgYnkgZmlyc3QgYnl0ZSBvZiBzZXF1ZW5jZSlcbi8vIE5vdGUsIHRoYXQgNSAmIDYtYnl0ZSB2YWx1ZXMgYW5kIHNvbWUgNC1ieXRlIHZhbHVlcyBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGluIEpTLFxuLy8gYmVjYXVzZSBtYXggcG9zc2libGUgY29kZXBvaW50IGlzIDB4MTBmZmZmXG52YXIgX3V0ZjhsZW4gPSBuZXcgdXRpbHMuQnVmOCgyNTYpO1xuZm9yICh2YXIgcSA9IDA7IHEgPCAyNTY7IHErKykge1xuICBfdXRmOGxlbltxXSA9IChxID49IDI1MiA/IDYgOiBxID49IDI0OCA/IDUgOiBxID49IDI0MCA/IDQgOiBxID49IDIyNCA/IDMgOiBxID49IDE5MiA/IDIgOiAxKTtcbn1cbl91dGY4bGVuWzI1NF0gPSBfdXRmOGxlblsyNTRdID0gMTsgLy8gSW52YWxpZCBzZXF1ZW5jZSBzdGFydFxuXG5cbi8vIGNvbnZlcnQgc3RyaW5nIHRvIGFycmF5ICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgLy8gY291bnQgYmluYXJ5IHNpemVcbiAgZm9yIChtX3BvcyA9IDA7IG1fcG9zIDwgc3RyX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgYnVmX2xlbiArPSBjIDwgMHg4MCA/IDEgOiBjIDwgMHg4MDAgPyAyIDogYyA8IDB4MTAwMDAgPyAzIDogNDtcbiAgfVxuXG4gIC8vIGFsbG9jYXRlIGJ1ZmZlclxuICBidWYgPSBuZXcgdXRpbHMuQnVmOChidWZfbGVuKTtcblxuICAvLyBjb252ZXJ0XG4gIGZvciAoaSA9IDAsIG1fcG9zID0gMDsgaSA8IGJ1Zl9sZW47IG1fcG9zKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHtcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTtcbiAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgIG1fcG9zKys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgIGJ1ZltpKytdID0gYztcbiAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgLyogdHdvIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4QzAgfCAoYyA+Pj4gNik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIC8qIHRocmVlIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4RTAgfCAoYyA+Pj4gMTIpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhmMCB8IChjID4+PiAxOCk7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gMTIgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWY7XG59O1xuXG4vLyBIZWxwZXIgKHVzZWQgaW4gMiBwbGFjZXMpXG5mdW5jdGlvbiBidWYyYmluc3RyaW5nKGJ1ZiwgbGVuKSB7XG4gIC8vIHVzZSBmYWxsYmFjayBmb3IgYmlnIGFycmF5cyB0byBhdm9pZCBzdGFjayBvdmVyZmxvd1xuICBpZiAobGVuIDwgNjU1MzcpIHtcbiAgICBpZiAoKGJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfVUlBX09LKSB8fCAoIWJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfT0spKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB1dGlscy5zaHJpbmtCdWYoYnVmLCBsZW4pKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuLy8gQ29udmVydCBieXRlIGFycmF5IHRvIGJpbmFyeSBzdHJpbmdcbmV4cG9ydHMuYnVmMmJpbnN0cmluZyA9IGZ1bmN0aW9uIChidWYpIHtcbiAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcoYnVmLCBidWYubGVuZ3RoKTtcbn07XG5cblxuLy8gQ29udmVydCBiaW5hcnkgc3RyaW5nICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuYmluc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KHN0ci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnVmLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYnVmW2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxuLy8gY29udmVydCBhcnJheSB0byBzdHJpbmdcbmV4cG9ydHMuYnVmMnN0cmluZyA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgaSwgb3V0LCBjLCBjX2xlbjtcbiAgdmFyIGxlbiA9IG1heCB8fCBidWYubGVuZ3RoO1xuXG4gIC8vIFJlc2VydmUgbWF4IHBvc3NpYmxlIGxlbmd0aCAoMiB3b3JkcyBwZXIgY2hhcilcbiAgLy8gTkI6IGJ5IHVua25vd24gcmVhc29ucywgQXJyYXkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZm9yXG4gIC8vICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5IHRoYW4gVWludDE2QXJyYXkuXG4gIHZhciB1dGYxNmJ1ZiA9IG5ldyBBcnJheShsZW4gKiAyKTtcblxuICBmb3IgKG91dCA9IDAsIGkgPSAwOyBpIDwgbGVuOykge1xuICAgIGMgPSBidWZbaSsrXTtcbiAgICAvLyBxdWljayBwcm9jZXNzIGFzY2lpXG4gICAgaWYgKGMgPCAweDgwKSB7IHV0ZjE2YnVmW291dCsrXSA9IGM7IGNvbnRpbnVlOyB9XG5cbiAgICBjX2xlbiA9IF91dGY4bGVuW2NdO1xuICAgIC8vIHNraXAgNSAmIDYgYnl0ZSBjb2Rlc1xuICAgIGlmIChjX2xlbiA+IDQpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBpICs9IGNfbGVuIC0gMTsgY29udGludWU7IH1cblxuICAgIC8vIGFwcGx5IG1hc2sgb24gZmlyc3QgYnl0ZVxuICAgIGMgJj0gY19sZW4gPT09IDIgPyAweDFmIDogY19sZW4gPT09IDMgPyAweDBmIDogMHgwNztcbiAgICAvLyBqb2luIHRoZSByZXN0XG4gICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuKSB7XG4gICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTtcbiAgICAgIGNfbGVuLS07XG4gICAgfVxuXG4gICAgLy8gdGVybWluYXRlZCBieSBlbmQgb2Ygc3RyaW5nP1xuICAgIGlmIChjX2xlbiA+IDEpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBjb250aW51ZTsgfVxuXG4gICAgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSBjO1xuICAgIH0gZWxzZSB7XG4gICAgICBjIC09IDB4MTAwMDA7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGQ4MDAgfCAoKGMgPj4gMTApICYgMHgzZmYpO1xuICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkYzAwIHwgKGMgJiAweDNmZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcodXRmMTZidWYsIG91dCk7XG59O1xuXG5cbi8vIENhbGN1bGF0ZSBtYXggcG9zc2libGUgcG9zaXRpb24gaW4gdXRmOCBidWZmZXIsXG4vLyB0aGF0IHdpbGwgbm90IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlXG4vLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLlxuLy9cbi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheVxuLy8gbWF4ICAgLSBsZW5ndGggbGltaXQgKG1hbmRhdG9yeSk7XG5leHBvcnRzLnV0Zjhib3JkZXIgPSBmdW5jdGlvbiAoYnVmLCBtYXgpIHtcbiAgdmFyIHBvcztcblxuICBtYXggPSBtYXggfHwgYnVmLmxlbmd0aDtcbiAgaWYgKG1heCA+IGJ1Zi5sZW5ndGgpIHsgbWF4ID0gYnVmLmxlbmd0aDsgfVxuXG4gIC8vIGdvIGJhY2sgZnJvbSBsYXN0IHBvc2l0aW9uLCB1bnRpbCBzdGFydCBvZiBzZXF1ZW5jZSBmb3VuZFxuICBwb3MgPSBtYXggLSAxO1xuICB3aGlsZSAocG9zID49IDAgJiYgKGJ1Zltwb3NdICYgMHhDMCkgPT09IDB4ODApIHsgcG9zLS07IH1cblxuICAvLyBGdWNrdXAgLSB2ZXJ5IHNtYWxsIGFuZCBicm9rZW4gc2VxdWVuY2UsXG4gIC8vIHJldHVybiBtYXgsIGJlY2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LlxuICBpZiAocG9zIDwgMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgLy8gSWYgd2UgY2FtZSB0byBzdGFydCBvZiBidWZmZXIgLSB0aGF0IG1lYW5zIHZ1ZmZlciBpcyB0b28gc21hbGwsXG4gIC8vIHJldHVybiBtYXggdG9vLlxuICBpZiAocG9zID09PSAwKSB7IHJldHVybiBtYXg7IH1cblxuICByZXR1cm4gKHBvcyArIF91dGY4bGVuW2J1Zltwb3NdXSA+IG1heCkgPyBwb3MgOiBtYXg7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiBhZGxlcjMyIHRha2VzIDEyJSBmb3IgbGV2ZWwgMCBhbmQgMiUgZm9yIGxldmVsIDYuXG4vLyBJdCBkb2Vzbid0IHdvcnRoIHRvIG1ha2UgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25hIGFzIGluIG9yaWdpbmFsLlxuLy8gU21hbGwgc2l6ZSBpcyBwcmVmZXJhYmxlLlxuXG5mdW5jdGlvbiBhZGxlcjMyKGFkbGVyLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciBzMSA9IChhZGxlciAmIDB4ZmZmZikgfDAsXG4gICAgICBzMiA9ICgoYWRsZXIgPj4+IDE2KSAmIDB4ZmZmZikgfDAsXG4gICAgICBuID0gMDtcblxuICB3aGlsZSAobGVuICE9PSAwKSB7XG4gICAgLy8gU2V0IGxpbWl0IH4gdHdpY2UgbGVzcyB0aGFuIDU1NTIsIHRvIGtlZXBcbiAgICAvLyBzMiBpbiAzMS1iaXRzLCBiZWNhdXNlIHdlIGZvcmNlIHNpZ25lZCBpbnRzLlxuICAgIC8vIGluIG90aGVyIGNhc2UgJT0gd2lsbCBmYWlsLlxuICAgIG4gPSBsZW4gPiAyMDAwID8gMjAwMCA6IGxlbjtcbiAgICBsZW4gLT0gbjtcblxuICAgIGRvIHtcbiAgICAgIHMxID0gKHMxICsgYnVmW3BvcysrXSkgfDA7XG4gICAgICBzMiA9IChzMiArIHMxKSB8MDtcbiAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgczEgJT0gNjU1MjE7XG4gICAgczIgJT0gNjU1MjE7XG4gIH1cblxuICByZXR1cm4gKHMxIHwgKHMyIDw8IDE2KSkgfDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBhZGxlcjMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbiAgWl9OT19GTFVTSDogICAgICAgICAwLFxuICBaX1BBUlRJQUxfRkxVU0g6ICAgIDEsXG4gIFpfU1lOQ19GTFVTSDogICAgICAgMixcbiAgWl9GVUxMX0ZMVVNIOiAgICAgICAzLFxuICBaX0ZJTklTSDogICAgICAgICAgIDQsXG4gIFpfQkxPQ0s6ICAgICAgICAgICAgNSxcbiAgWl9UUkVFUzogICAgICAgICAgICA2LFxuXG4gIC8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAgKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gICovXG4gIFpfT0s6ICAgICAgICAgICAgICAgMCxcbiAgWl9TVFJFQU1fRU5EOiAgICAgICAxLFxuICBaX05FRURfRElDVDogICAgICAgIDIsXG4gIFpfRVJSTk86ICAgICAgICAgICAtMSxcbiAgWl9TVFJFQU1fRVJST1I6ICAgIC0yLFxuICBaX0RBVEFfRVJST1I6ICAgICAgLTMsXG4gIC8vWl9NRU1fRVJST1I6ICAgICAtNCxcbiAgWl9CVUZfRVJST1I6ICAgICAgIC01LFxuICAvL1pfVkVSU0lPTl9FUlJPUjogLTYsXG5cbiAgLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4gIFpfTk9fQ09NUFJFU1NJT046ICAgICAgICAgMCxcbiAgWl9CRVNUX1NQRUVEOiAgICAgICAgICAgICAxLFxuICBaX0JFU1RfQ09NUFJFU1NJT046ICAgICAgIDksXG4gIFpfREVGQVVMVF9DT01QUkVTU0lPTjogICAtMSxcblxuXG4gIFpfRklMVEVSRUQ6ICAgICAgICAgICAgICAgMSxcbiAgWl9IVUZGTUFOX09OTFk6ICAgICAgICAgICAyLFxuICBaX1JMRTogICAgICAgICAgICAgICAgICAgIDMsXG4gIFpfRklYRUQ6ICAgICAgICAgICAgICAgICAgNCxcbiAgWl9ERUZBVUxUX1NUUkFURUdZOiAgICAgICAwLFxuXG4gIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbiAgWl9CSU5BUlk6ICAgICAgICAgICAgICAgICAwLFxuICBaX1RFWFQ6ICAgICAgICAgICAgICAgICAgIDEsXG4gIC8vWl9BU0NJSTogICAgICAgICAgICAgICAgMSwgLy8gPSBaX1RFWFQgKGRlcHJlY2F0ZWQpXG4gIFpfVU5LTk9XTjogICAgICAgICAgICAgICAgMixcblxuICAvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbiAgWl9ERUZMQVRFRDogICAgICAgICAgICAgICA4XG4gIC8vWl9OVUxMOiAgICAgICAgICAgICAgICAgbnVsbCAvLyBVc2UgLTEgb3IgbnVsbCBpbmxpbmUsIGRlcGVuZGluZyBvbiB2YXIgdHlwZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogd2UgY2FuJ3QgZ2V0IHNpZ25pZmljYW50IHNwZWVkIGJvb3N0IGhlcmUuXG4vLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzXG4vLyBhbmQgYXJyYXkgdG9vbHMgZGVwZW5kZW5jaWVzLlxuXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgMjU2OyBuKyspIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykge1xuICAgICAgYyA9ICgoYyAmIDEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciB0ID0gY3JjVGFibGUsXG4gICAgICBlbmQgPSBwb3MgKyBsZW47XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjcmMzMjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciB0cmVlcyAgID0gcmVxdWlyZSgnLi90cmVlcycpO1xudmFyIGFkbGVyMzIgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIG1zZyAgICAgPSByZXF1aXJlKCcuL21lc3NhZ2VzJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xudmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xuLy92YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG4vL3ZhciBaX05FRURfRElDVCAgICAgPSAyO1xuLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7XG52YXIgWl9TVFJFQU1fRVJST1IgID0gLTI7XG52YXIgWl9EQVRBX0VSUk9SICAgID0gLTM7XG4vL3ZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG5cbi8qIGNvbXByZXNzaW9uIGxldmVscyAqL1xuLy92YXIgWl9OT19DT01QUkVTU0lPTiAgICAgID0gMDtcbi8vdmFyIFpfQkVTVF9TUEVFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0JFU1RfQ09NUFJFU1NJT04gICAgPSA5O1xudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG5cbnZhciBaX0ZJTFRFUkVEICAgICAgICAgICAgPSAxO1xudmFyIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7XG52YXIgWl9STEUgICAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbi8vdmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG4vL3ZhciBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy92YXIgWl9BU0NJSSAgICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgTUFYX01FTV9MRVZFTCA9IDk7XG4vKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi9cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9NRU1fTEVWRUwgPSA4O1xuXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG52YXIgTF9DT0RFUyAgICAgICA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUztcbi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xudmFyIEhFQVBfU0laRSAgICAgPSAyICogTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xudmFyIE1BWF9CSVRTICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBNSU5fTUFUQ0ggPSAzO1xudmFyIE1BWF9NQVRDSCA9IDI1ODtcbnZhciBNSU5fTE9PS0FIRUFEID0gKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpO1xuXG52YXIgUFJFU0VUX0RJQ1QgPSAweDIwO1xuXG52YXIgSU5JVF9TVEFURSA9IDQyO1xudmFyIEVYVFJBX1NUQVRFID0gNjk7XG52YXIgTkFNRV9TVEFURSA9IDczO1xudmFyIENPTU1FTlRfU1RBVEUgPSA5MTtcbnZhciBIQ1JDX1NUQVRFID0gMTAzO1xudmFyIEJVU1lfU1RBVEUgPSAxMTM7XG52YXIgRklOSVNIX1NUQVRFID0gNjY2O1xuXG52YXIgQlNfTkVFRF9NT1JFICAgICAgPSAxOyAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi9cbnZhciBCU19CTE9DS19ET05FICAgICA9IDI7IC8qIGJsb2NrIGZsdXNoIHBlcmZvcm1lZCAqL1xudmFyIEJTX0ZJTklTSF9TVEFSVEVEID0gMzsgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi9cbnZhciBCU19GSU5JU0hfRE9ORSAgICA9IDQ7IC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi9cblxudmFyIE9TX0NPREUgPSAweDAzOyAvLyBVbml4IDopIC4gRG9uJ3QgZGV0ZWN0LCB1c2UgdGhpcyBkZWZhdWx0LlxuXG5mdW5jdGlvbiBlcnIoc3RybSwgZXJyb3JDb2RlKSB7XG4gIHN0cm0ubXNnID0gbXNnW2Vycm9yQ29kZV07XG4gIHJldHVybiBlcnJvckNvZGU7XG59XG5cbmZ1bmN0aW9uIHJhbmsoZikge1xuICByZXR1cm4gKChmKSA8PCAxKSAtICgoZikgPiA0ID8gOSA6IDApO1xufVxuXG5mdW5jdGlvbiB6ZXJvKGJ1ZikgeyB2YXIgbGVuID0gYnVmLmxlbmd0aDsgd2hpbGUgKC0tbGVuID49IDApIHsgYnVmW2xlbl0gPSAwOyB9IH1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzXG4gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0XG4gKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+b3V0cHV0IGJ1ZmZlciBhbmQgY29weWluZyBpbnRvIGl0LlxuICogKFNlZSBhbHNvIHJlYWRfYnVmKCkpLlxuICovXG5mdW5jdGlvbiBmbHVzaF9wZW5kaW5nKHN0cm0pIHtcbiAgdmFyIHMgPSBzdHJtLnN0YXRlO1xuXG4gIC8vX3RyX2ZsdXNoX2JpdHMocyk7XG4gIHZhciBsZW4gPSBzLnBlbmRpbmc7XG4gIGlmIChsZW4gPiBzdHJtLmF2YWlsX291dCkge1xuICAgIGxlbiA9IHN0cm0uYXZhaWxfb3V0O1xuICB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHMucGVuZGluZ19idWYsIHMucGVuZGluZ19vdXQsIGxlbiwgc3RybS5uZXh0X291dCk7XG4gIHN0cm0ubmV4dF9vdXQgKz0gbGVuO1xuICBzLnBlbmRpbmdfb3V0ICs9IGxlbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gbGVuO1xuICBzdHJtLmF2YWlsX291dCAtPSBsZW47XG4gIHMucGVuZGluZyAtPSBsZW47XG4gIGlmIChzLnBlbmRpbmcgPT09IDApIHtcbiAgICBzLnBlbmRpbmdfb3V0ID0gMDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocywgbGFzdCkge1xuICB0cmVlcy5fdHJfZmx1c2hfYmxvY2socywgKHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSksIHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0LCBsYXN0KTtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIGZsdXNoX3BlbmRpbmcocy5zdHJtKTtcbn1cblxuXG5mdW5jdGlvbiBwdXRfYnl0ZShzLCBiKSB7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci5cbiAqIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzdGF0ZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpblxuICogcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIHB1dFNob3J0TVNCKHMsIGIpIHtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7XG4vLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKGIgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiICYgMHhmZjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLCB1cGRhdGUgdGhlIGFkbGVyMzJcbiAqIGFuZCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIEFsbCBkZWZsYXRlKCkgaW5wdXQgZ29lcyB0aHJvdWdoXG4gKiB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdCB0byBhdm9pZFxuICogYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPmlucHV0IGJ1ZmZlciBhbmQgY29weWluZyBmcm9tIGl0LlxuICogKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRfYnVmKHN0cm0sIGJ1Ziwgc3RhcnQsIHNpemUpIHtcbiAgdmFyIGxlbiA9IHN0cm0uYXZhaWxfaW47XG5cbiAgaWYgKGxlbiA+IHNpemUpIHsgbGVuID0gc2l6ZTsgfVxuICBpZiAobGVuID09PSAwKSB7IHJldHVybiAwOyB9XG5cbiAgc3RybS5hdmFpbF9pbiAtPSBsZW47XG5cbiAgLy8gem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7XG4gIHV0aWxzLmFycmF5U2V0KGJ1Ziwgc3RybS5pbnB1dCwgc3RybS5uZXh0X2luLCBsZW4sIHN0YXJ0KTtcbiAgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMSkge1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBlbHNlIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDIpIHtcbiAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiArPSBsZW47XG4gIHN0cm0udG90YWxfaW4gKz0gbGVuO1xuXG4gIHJldHVybiBsZW47XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmRcbiAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCxcbiAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXNcbiAqIGdhcmJhZ2UuXG4gKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50XG4gKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLlxuICovXG5mdW5jdGlvbiBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkge1xuICB2YXIgY2hhaW5fbGVuZ3RoID0gcy5tYXhfY2hhaW5fbGVuZ3RoOyAgICAgIC8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqL1xuICB2YXIgc2NhbiA9IHMuc3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovXG4gIHZhciBtYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi9cbiAgdmFyIGJlc3RfbGVuID0gcy5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqL1xuICB2YXIgbmljZV9tYXRjaCA9IHMubmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqL1xuICB2YXIgbGltaXQgPSAocy5zdHJzdGFydCA+IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSA/XG4gICAgICBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwLypOSUwqLztcblxuICB2YXIgX3dpbiA9IHMud2luZG93OyAvLyBzaG9ydGN1dFxuXG4gIHZhciB3bWFzayA9IHMud19tYXNrO1xuICB2YXIgcHJldiAgPSBzLnByZXY7XG5cbiAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSxcbiAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC5cbiAgICovXG5cbiAgdmFyIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gIHZhciBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgdmFyIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG5cbiAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuXG4gICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICAvLyBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgXCJDb2RlIHRvbyBjbGV2ZXJcIik7XG5cbiAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi9cbiAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7XG4gICAgY2hhaW5fbGVuZ3RoID4+PSAyO1xuICB9XG4gIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnlcbiAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuXG4gICAqL1xuICBpZiAobmljZV9tYXRjaCA+IHMubG9va2FoZWFkKSB7IG5pY2VfbWF0Y2ggPSBzLmxvb2thaGVhZDsgfVxuXG4gIC8vIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsIFwibmVlZCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIC8vIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgXCJubyBmdXR1cmVcIik7XG4gICAgbWF0Y2ggPSBjdXJfbWF0Y2g7XG5cbiAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2VcbiAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyLiAgTm90ZSB0aGF0IHRoZSBjaGVja3MgYmVsb3dcbiAgICAgKiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IG9jY3VyIG9jY2FzaW9uYWxseSBmb3IgcGVyZm9ybWFuY2VcbiAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZFxuICAgICAqIGNvbmRpdGlvbmFsIGp1bXBzIHdpbGwgYmUgbWFkZSB0aGF0IGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMuXG4gICAgICogSG93ZXZlciB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBsaW1pdGVkIHRvIHRoZSBsb29rYWhlYWQsIHNvXG4gICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuXG4gICAgICovXG5cbiAgICBpZiAoX3dpblttYXRjaCArIGJlc3RfbGVuXSAgICAgIT09IHNjYW5fZW5kICB8fFxuICAgICAgICBfd2luW21hdGNoICsgYmVzdF9sZW4gLSAxXSAhPT0gc2Nhbl9lbmQxIHx8XG4gICAgICAgIF93aW5bbWF0Y2hdICAgICAgICAgICAgICAgICE9PSBfd2luW3NjYW5dIHx8XG4gICAgICAgIF93aW5bKyttYXRjaF0gICAgICAgICAgICAgICE9PSBfd2luW3NjYW4gKyAxXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGVcbiAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKVxuICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5XG4gICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdFxuICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LlxuICAgICAqL1xuICAgIHNjYW4gKz0gMjtcbiAgICBtYXRjaCsrO1xuICAgIC8vIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsIFwibWF0Y2hbMl0/XCIpO1xuXG4gICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjtcbiAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC5cbiAgICAgKi9cbiAgICBkbyB7XG4gICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICB9IHdoaWxlIChfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG5cbiAgICAvLyBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG5cbiAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDtcblxuICAgIGlmIChsZW4gPiBiZXN0X2xlbikge1xuICAgICAgcy5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDtcbiAgICAgIGJlc3RfbGVuID0gbGVuO1xuICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc2Nhbl9lbmQxICA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gICAgICBzY2FuX2VuZCAgID0gX3dpbltzY2FuICsgYmVzdF9sZW5dO1xuICAgIH1cbiAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0ICYmIC0tY2hhaW5fbGVuZ3RoICE9PSAwKTtcblxuICBpZiAoYmVzdF9sZW4gPD0gcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gYmVzdF9sZW47XG4gIH1cbiAgcmV0dXJuIHMubG9va2FoZWFkO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC5cbiAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC5cbiAqXG4gKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQURcbiAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFEXG4gKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmVcbiAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sXG4gKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS5cbiAqL1xuZnVuY3Rpb24gZmlsbF93aW5kb3cocykge1xuICB2YXIgX3dfc2l6ZSA9IHMud19zaXplO1xuICB2YXIgcCwgbiwgbSwgbW9yZSwgc3RyO1xuXG4gIC8vQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsIFwiYWxyZWFkeSBlbm91Z2ggbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICBtb3JlID0gcy53aW5kb3dfc2l6ZSAtIHMubG9va2FoZWFkIC0gcy5zdHJzdGFydDtcblxuICAgIC8vIEpTIGludHMgaGF2ZSAzMiBiaXQsIGJsb2NrIGJlbG93IG5vdCBuZWVkZWRcbiAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqL1xuICAgIC8vaWYgKHNpemVvZihpbnQpIDw9IDIpIHtcbiAgICAvLyAgICBpZiAobW9yZSA9PSAwICYmIHMtPnN0cnN0YXJ0ID09IDAgJiYgcy0+bG9va2FoZWFkID09IDApIHtcbiAgICAvLyAgICAgICAgbW9yZSA9IHdzaXplO1xuICAgIC8vXG4gICAgLy8gIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkge1xuICAgIC8vICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWZcbiAgICAvLyAgICAgICAgICogc3Ryc3RhcnQgPT0gMCAmJiBsb29rYWhlYWQgPT0gMSAoaW5wdXQgZG9uZSBhIGJ5dGUgYXQgdGltZSlcbiAgICAvLyAgICAgICAgICovXG4gICAgLy8gICAgICAgIG1vcmUtLTtcbiAgICAvLyAgICB9XG4gICAgLy99XG5cblxuICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsXG4gICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCA+PSBfd19zaXplICsgKF93X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuXG4gICAgICB1dGlscy5hcnJheVNldChzLndpbmRvdywgcy53aW5kb3csIF93X3NpemUsIF93X3NpemUsIDApO1xuICAgICAgcy5tYXRjaF9zdGFydCAtPSBfd19zaXplO1xuICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplO1xuICAgICAgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi9cbiAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTtcblxuICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzXG4gICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDBcbiAgICAgICB0byBrZWVwIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RlbnQgaWYgd2Ugc3dpdGNoIGJhY2sgdG8gbGV2ZWwgPiAwXG4gICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mXG4gICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLilcbiAgICAgICAqL1xuXG4gICAgICBuID0gcy5oYXNoX3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMuaGVhZFstLXBdO1xuICAgICAgICBzLmhlYWRbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG4gPSBfd19zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLnByZXZbLS1wXTtcbiAgICAgICAgcy5wcmV2W3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0XG4gICAgICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuXG4gICAgICAgICAqL1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbW9yZSArPSBfd19zaXplO1xuICAgIH1cbiAgICBpZiAocy5zdHJtLmF2YWlsX2luID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzpcbiAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJlxuICAgICAqICAgIG1vcmUgPT0gd2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydFxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKVxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMlxuICAgICAqIEluIHRoZSBCSUdfTUVNIG9yIE1NQVAgY2FzZSAobm90IHlldCBzdXBwb3J0ZWQpLFxuICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmXG4gICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC5cbiAgICAgKiBPdGhlcndpc2UsIHdpbmRvd19zaXplID09IDIqV1NJWkUgc28gbW9yZSA+PSAyLlxuICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi5cbiAgICAgKi9cbiAgICAvL0Fzc2VydChtb3JlID49IDIsIFwibW9yZSA8IDJcIik7XG4gICAgbiA9IHJlYWRfYnVmKHMuc3RybSwgcy53aW5kb3csIHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCwgbW9yZSk7XG4gICAgcy5sb29rYWhlYWQgKz0gbjtcblxuICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0ID49IE1JTl9NQVRDSCkge1xuICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0O1xuICAgICAgcy5pbnNfaCA9IHMud2luZG93W3N0cl07XG5cbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgMV0pICYgcy5oYXNoX21hc2s7XG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgIENhbGwgdXBkYXRlX2hhc2goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgd2hpbGUgKHMuaW5zZXJ0KSB7XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgICBzdHIrKztcbiAgICAgICAgcy5pbnNlcnQtLTtcbiAgICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPCBNSU5fTUFUQ0gpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsXG4gICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLlxuICAgICAqL1xuXG4gIH0gd2hpbGUgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLnN0cm0uYXZhaWxfaW4gIT09IDApO1xuXG4gIC8qIElmIHRoZSBXSU5fSU5JVCBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgaGF2ZSBuZXZlciBiZWVuXG4gICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZlxuICAgKiB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgKG9yIHVuaW5pdGlhbGlzZWQgYXMgSnVsaWFuIHdyaXRlcykgYnl0ZXMgYnlcbiAgICogdGhlIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMuICBVcGRhdGUgdGhlIGhpZ2ggd2F0ZXIgbWFyayBmb3IgdGhlIG5leHRcbiAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAqIHJvdXRpbmVzIGFsbG93IHNjYW5uaW5nIHRvIHN0cnN0YXJ0ICsgTUFYX01BVENILCBpZ25vcmluZyBsb29rYWhlYWQuXG4gICAqL1xuLy8gIGlmIChzLmhpZ2hfd2F0ZXIgPCBzLndpbmRvd19zaXplKSB7XG4vLyAgICB2YXIgY3VyciA9IHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZDtcbi8vICAgIHZhciBpbml0ID0gMDtcbi8vXG4vLyAgICBpZiAocy5oaWdoX3dhdGVyIDwgY3Vycikge1xuLy8gICAgICAvKiBQcmV2aW91cyBoaWdoIHdhdGVyIG1hcmsgYmVsb3cgY3VycmVudCBkYXRhIC0tIHplcm8gV0lOX0lOSVRcbi8vICAgICAgICogYnl0ZXMgb3IgdXAgdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gcy53aW5kb3dfc2l6ZSAtIGN1cnI7XG4vLyAgICAgIGlmIChpbml0ID4gV0lOX0lOSVQpXG4vLyAgICAgICAgaW5pdCA9IFdJTl9JTklUO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBjdXJyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgPSBjdXJyICsgaW5pdDtcbi8vICAgIH1cbi8vICAgIGVsc2UgaWYgKHMtPmhpZ2hfd2F0ZXIgPCAodWxnKWN1cnIgKyBXSU5fSU5JVCkge1xuLy8gICAgICAvKiBIaWdoIHdhdGVyIG1hcmsgYXQgb3IgYWJvdmUgY3VycmVudCBkYXRhLCBidXQgYmVsb3cgY3VycmVudCBkYXRhXG4vLyAgICAgICAqIHBsdXMgV0lOX0lOSVQgLS0gemVybyBvdXQgdG8gY3VycmVudCBkYXRhIHBsdXMgV0lOX0lOSVQsIG9yIHVwXG4vLyAgICAgICAqIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLlxuLy8gICAgICAgKi9cbi8vICAgICAgaW5pdCA9ICh1bGcpY3VyciArIFdJTl9JTklUIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgaWYgKGluaXQgPiBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXIpXG4vLyAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgcy0+aGlnaF93YXRlciwgKHVuc2lnbmVkKWluaXQpO1xuLy8gICAgICBzLT5oaWdoX3dhdGVyICs9IGluaXQ7XG4vLyAgICB9XG4vLyAgfVxuLy9cbi8vICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQsXG4vLyAgICBcIm5vdCBlbm91Z2ggcm9vbSBmb3Igc2VhcmNoXCIpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuXG4gKiB0aGUgY3VycmVudCBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IHNpbmNlXG4gKiB1bmNvbXByZXNzaWJsZSBkYXRhIGlzIHByb2JhYmx5IG5vdCB1c2VmdWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZFxuICogb25seSBmb3IgdGhlIGxldmVsPTAgY29tcHJlc3Npb24gb3B0aW9uLlxuICogTk9URTogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGF2b2lkIGV4dHJhIGNvcHlpbmcgZnJvbVxuICogd2luZG93IHRvIHBlbmRpbmdfYnVmLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3N0b3JlZChzLCBmbHVzaCkge1xuICAvKiBTdG9yZWQgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDB4ZmZmZiBieXRlcywgcGVuZGluZ19idWYgaXMgbGltaXRlZFxuICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjpcbiAgICovXG4gIHZhciBtYXhfYmxvY2tfc2l6ZSA9IDB4ZmZmZjtcblxuICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7XG4gICAgbWF4X2Jsb2NrX3NpemUgPSBzLnBlbmRpbmdfYnVmX3NpemUgLSA1O1xuICB9XG5cbiAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IDEpIHtcblxuICAgICAgLy9Bc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHxcbiAgICAgIC8vICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsIFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIGlmICghKHMuc3Ryc3RhcnQgPCBzLndfc2l6ZSArIChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHx8XG4vLyAgICAgICAgcy5ibG9ja19zdGFydCA+PSBzLndfc2l6ZSkpIHtcbi8vICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIH1cblxuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDAgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cblxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG4gICAgLy9Bc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsIFwiYmxvY2sgZ29uZVwiKTtcbi8vICAgIGlmIChzLmJsb2NrX3N0YXJ0IDwgMCkgdGhyb3cgbmV3IEVycm9yKFwiYmxvY2sgZ29uZVwiKTtcblxuICAgIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7XG4gICAgcy5sb29rYWhlYWQgPSAwO1xuXG4gICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovXG4gICAgdmFyIG1heF9zdGFydCA9IHMuYmxvY2tfc3RhcnQgKyBtYXhfYmxvY2tfc2l6ZTtcblxuICAgIGlmIChzLnN0cnN0YXJ0ID09PSAwIHx8IHMuc3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7XG4gICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqL1xuICAgICAgcy5sb29rYWhlYWQgPSBzLnN0cnN0YXJ0IC0gbWF4X3N0YXJ0O1xuICAgICAgcy5zdHJzdGFydCA9IG1heF9zdGFydDtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG5cblxuICAgIH1cbiAgICAvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWVcbiAgICAgKiBuZWdhdGl2ZSBhbmQgdGhlIGRhdGEgd2lsbCBiZSBnb25lOlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCA+PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cblxuICBzLmluc2VydCA9IDA7XG5cbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG5cbiAgaWYgKHMuc3Ryc3RhcnQgPiBzLmJsb2NrX3N0YXJ0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX05FRURfTU9SRTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wcmVzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSBjdXJyZW50XG4gKiBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBhbmQgaW5zZXJ0c1xuICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0cmluZ3Mgb3IgZm9yIHNob3J0XG4gKiBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfZmFzdChzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgLyogaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlXG4gICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSFxuICAgICAqL1xuICAgIGlmIChoYXNoX2hlYWQgIT09IDAvKk5JTCovICYmICgocy5zdHJzdGFydCAtIGhhc2hfaGVhZCkgPD0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cbiAgICB9XG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy8gY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGgpOyAvLyBmb3IgZGVidWcgb25seVxuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcblxuICAgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgICogaXMgbm90IHRvbyBsYXJnZS4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IHMubWF4X2xhenlfbWF0Y2gvKm1heF9pbnNlcnRfbGVuZ3RoKi8gJiYgcy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmVcbiAgICAgICAgICAgKiBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLlxuICAgICAgICAgICAqL1xuICAgICAgICB9IHdoaWxlICgtLXMubWF0Y2hfbGVuZ3RoICE9PSAwKTtcbiAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgfSBlbHNlXG4gICAgICB7XG4gICAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICAgICAgcy5pbnNfaCA9IHMud2luZG93W3Muc3Ryc3RhcnRdO1xuICAgICAgICAvKiBVUERBVEVfSEFTSChzLCBzLmluc19oLCBzLndpbmRvd1tzLnN0cnN0YXJ0KzFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICAgIC8qIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90XG4gICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMud2luZG93W3Muc3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gKChzLnN0cnN0YXJ0IDwgKE1JTl9NQVRDSCAtIDEpKSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxKTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenlcbiAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXNcbiAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgICAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIHZhciBtYXhfaW5zZXJ0O1xuXG4gIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICovXG4gICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoO1xuICAgIHMucHJldl9tYXRjaCA9IHMubWF0Y2hfc3RhcnQ7XG4gICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgcy5wcmV2X2xlbmd0aCA8IHMubWF4X2xhenlfbWF0Y2ggJiZcbiAgICAgICAgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKS8qTUFYX0RJU1QocykqLykge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG5cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSA1ICYmXG4gICAgICAgICAocy5zdHJhdGVneSA9PT0gWl9GSUxURVJFRCB8fCAocy5tYXRjaF9sZW5ndGggPT09IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCA+IDQwOTYvKlRPT19GQVIqLykpKSB7XG5cbiAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZVxuICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LlxuICAgICAgICAgKi9cbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBhdCB0aGUgcHJldmlvdXMgc3RlcCBhbmQgdGhlIGN1cnJlbnRcbiAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOlxuICAgICAqL1xuICAgIGlmIChzLnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLm1hdGNoX2xlbmd0aCA8PSBzLnByZXZfbGVuZ3RoKSB7XG4gICAgICBtYXhfaW5zZXJ0ID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkIC0gTUlOX01BVENIO1xuICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovXG5cbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydC0xLCBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGgpO1xuXG4gICAgICAvKioqX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7XG4gICAgICAvKiBJbnNlcnQgaW4gaGFzaCB0YWJsZSBhbGwgc3RyaW5ncyB1cCB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaC5cbiAgICAgICAqIHN0cnN0YXJ0LTEgYW5kIHN0cnN0YXJ0IGFyZSBhbHJlYWR5IGluc2VydGVkLiBJZiB0aGVyZSBpcyBub3RcbiAgICAgICAqIGVub3VnaCBsb29rYWhlYWQsIHRoZSBsYXN0IHR3byBzdHJpbmdzIGFyZSBub3QgaW5zZXJ0ZWQgaW5cbiAgICAgICAqIHRoZSBoYXNoIHRhYmxlLlxuICAgICAgICovXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLnByZXZfbGVuZ3RoIC0gMTtcbiAgICAgIHMucHJldl9sZW5ndGggLT0gMjtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKCsrcy5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICgtLXMucHJldl9sZW5ndGggIT09IDApO1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuXG4gICAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgICAgfVxuICAgICAgICAvKioqL1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkge1xuICAgICAgLyogSWYgdGhlcmUgd2FzIG5vIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvbiwgb3V0cHV0IGFcbiAgICAgICAqIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2hcbiAgICAgICAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhlIHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuXG4gICAgICAgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DS19PTkxZKHMsIDApICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIC8qKiovXG4gICAgICB9XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvclxuICAgICAgICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChmbHVzaCAhPSBaX05PX0ZMVVNILCBcIm5vIGZsdXNoP1wiKTtcbiAgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pO1xuXG4gICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICB9XG4gIHMuaW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSCAtIDEgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGb3IgWl9STEUsIHNpbXBseSBsb29rIGZvciBydW5zIG9mIGJ5dGVzLCBnZW5lcmF0ZSBtYXRjaGVzIG9ubHkgb2YgZGlzdGFuY2VcbiAqIG9uZS4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuICAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZlxuICogZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gWl9STEUuKVxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3JsZShzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuICB2YXIgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovXG4gIHZhciBzY2FuLCBzdHJlbmQ7ICAgICAgLyogc2NhbiBnb2VzIHVwIHRvIHN0cmVuZCBmb3IgbGVuZ3RoIG9mIHJ1biAqL1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7XG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBsb25nZXN0IHJ1biwgcGx1cyBvbmUgZm9yIHRoZSB1bnJvbGxlZCBsb29wLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8PSBNQVhfTUFUQ0gpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0ID4gMCkge1xuICAgICAgc2NhbiA9IHMuc3Ryc3RhcnQgLSAxO1xuICAgICAgcHJldiA9IF93aW5bc2Nhbl07XG4gICAgICBpZiAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0pIHtcbiAgICAgICAgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgICAgICB9IHdoaWxlIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID4gcy5sb29rYWhlYWQpIHtcbiAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IHMubG9va2FoZWFkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL0Fzc2VydChzY2FuIDw9IHMtPndpbmRvdysodUludCkocy0+d2luZG93X3NpemUtMSksIFwid2lsZCBzY2FuXCIpO1xuICAgIH1cblxuICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBlbWl0IGxpdGVyYWwgKi9cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMuc3Ryc3RhcnQgLSAxLCBzLm1hdGNoX2xlbmd0aCk7XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3QocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gMDtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX0hVRkZNQU5fT05MWSwgZG8gbm90IGxvb2sgZm9yIG1hdGNoZXMuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLlxuICogKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2YgZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gSHVmZm1hbi4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfaHVmZihzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGxpdGVyYWwgdG8gd3JpdGUuICovXG4gICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogT3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG4gICAgcy5sb29rYWhlYWQtLTtcbiAgICBzLnN0cnN0YXJ0Kys7XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvblxuICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvXG4gKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmVcbiAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy5cbiAqL1xuZnVuY3Rpb24gQ29uZmlnKGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbiwgZnVuYykge1xuICB0aGlzLmdvb2RfbGVuZ3RoID0gZ29vZF9sZW5ndGg7XG4gIHRoaXMubWF4X2xhenkgPSBtYXhfbGF6eTtcbiAgdGhpcy5uaWNlX2xlbmd0aCA9IG5pY2VfbGVuZ3RoO1xuICB0aGlzLm1heF9jaGFpbiA9IG1heF9jaGFpbjtcbiAgdGhpcy5mdW5jID0gZnVuYztcbn1cblxudmFyIGNvbmZpZ3VyYXRpb25fdGFibGU7XG5cbmNvbmZpZ3VyYXRpb25fdGFibGUgPSBbXG4gIC8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi9cbiAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksICAgICAgICAgIC8qIDAgc3RvcmUgb25seSAqL1xuICBuZXcgQ29uZmlnKDQsIDQsIDgsIDQsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAgLyogMSBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAgLyogMiAqL1xuICBuZXcgQ29uZmlnKDQsIDYsIDMyLCAzMiwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgLyogMyAqL1xuXG4gIG5ldyBDb25maWcoNCwgNCwgMTYsIDE2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAgICAvKiA0IGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAzMiwgMzIsIGRlZmxhdGVfc2xvdyksICAgICAgICAgLyogNSAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNiAqL1xuICBuZXcgQ29uZmlnKDgsIDMyLCAxMjgsIDI1NiwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNyAqL1xuICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwgICAgLyogOCAqL1xuICBuZXcgQ29uZmlnKDMyLCAyNTgsIDI1OCwgNDA5NiwgZGVmbGF0ZV9zbG93KSAgICAgLyogOSBtYXggY29tcHJlc3Npb24gKi9cbl07XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSBcImxvbmdlc3QgbWF0Y2hcIiByb3V0aW5lcyBmb3IgYSBuZXcgemxpYiBzdHJlYW1cbiAqL1xuZnVuY3Rpb24gbG1faW5pdChzKSB7XG4gIHMud2luZG93X3NpemUgPSAyICogcy53X3NpemU7XG5cbiAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOlxuICAgKi9cbiAgcy5tYXhfbGF6eV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2xhenk7XG4gIHMuZ29vZF9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZ29vZF9sZW5ndGg7XG4gIHMubmljZV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubmljZV9sZW5ndGg7XG4gIHMubWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2NoYWluO1xuXG4gIHMuc3Ryc3RhcnQgPSAwO1xuICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLmluc2VydCA9IDA7XG4gIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgcy5pbnNfaCA9IDA7XG59XG5cblxuZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCkge1xuICB0aGlzLnN0cm0gPSBudWxsOyAgICAgICAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovXG4gIHRoaXMuc3RhdHVzID0gMDsgICAgICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovXG4gIHRoaXMucGVuZGluZ19idWYgPSBudWxsOyAgICAgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovXG4gIHRoaXMucGVuZGluZ19idWZfc2l6ZSA9IDA7ICAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovXG4gIHRoaXMucGVuZGluZ19vdXQgPSAwOyAgICAgICAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqL1xuICB0aGlzLnBlbmRpbmcgPSAwOyAgICAgICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuZ3poZWFkID0gbnVsbDsgICAgICAgICAvKiBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiB0byB3cml0ZSAqL1xuICB0aGlzLmd6aW5kZXggPSAwOyAgICAgICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi9cbiAgdGhpcy5tZXRob2QgPSBaX0RFRkxBVEVEOyAvKiBjYW4gb25seSBiZSBERUZMQVRFRCAqL1xuICB0aGlzLmxhc3RfZmx1c2ggPSAtMTsgICAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovXG5cbiAgdGhpcy53X3NpemUgPSAwOyAgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovXG4gIHRoaXMud19iaXRzID0gMDsgIC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqL1xuICB0aGlzLndfbWFzayA9IDA7ICAvKiB3X3NpemUgLSAxICovXG5cbiAgdGhpcy53aW5kb3cgPSBudWxsO1xuICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdyxcbiAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemVcbiAgICogYnl0ZXMuIFdpdGggdGhpcyBvcmdhbml6YXRpb24sIG1hdGNoZXMgYXJlIGxpbWl0ZWQgdG8gYSBkaXN0YW5jZSBvZlxuICAgKiB3U2l6ZS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXNcbiAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuXG4gICAqL1xuXG4gIHRoaXMud2luZG93X3NpemUgPSAwO1xuICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlclxuICAgKiBpcyBkaXJlY3RseSB1c2VkIGFzIHNsaWRpbmcgd2luZG93LlxuICAgKi9cblxuICB0aGlzLnByZXYgPSBudWxsO1xuICAvKiBMaW5rIHRvIG9sZGVyIHN0cmluZyB3aXRoIHNhbWUgaGFzaCBpbmRleC4gVG8gbGltaXQgdGhlIHNpemUgb2YgdGhpc1xuICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLlxuICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy5cbiAgICovXG5cbiAgdGhpcy5oZWFkID0gbnVsbDsgICAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqL1xuXG4gIHRoaXMuaW5zX2ggPSAwOyAgICAgICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqL1xuICB0aGlzLmhhc2hfc2l6ZSA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi9cbiAgdGhpcy5oYXNoX2JpdHMgPSAwOyAgIC8qIGxvZzIoaGFzaF9zaXplKSAqL1xuICB0aGlzLmhhc2hfbWFzayA9IDA7ICAgLyogaGFzaF9zaXplLTEgKi9cblxuICB0aGlzLmhhc2hfc2hpZnQgPSAwO1xuICAvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dFxuICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3RcbiAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6XG4gICAqICAgaGFzaF9zaGlmdCAqIE1JTl9NQVRDSCA+PSBoYXNoX2JpdHNcbiAgICovXG5cbiAgdGhpcy5ibG9ja19zdGFydCA9IDA7XG4gIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0c1xuICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLlxuICAgKi9cblxuICB0aGlzLm1hdGNoX2xlbmd0aCA9IDA7ICAgICAgLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi9cbiAgdGhpcy5wcmV2X21hdGNoID0gMDsgICAgICAgIC8qIHByZXZpb3VzIG1hdGNoICovXG4gIHRoaXMubWF0Y2hfYXZhaWxhYmxlID0gMDsgICAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovXG4gIHRoaXMuc3Ryc3RhcnQgPSAwOyAgICAgICAgICAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovXG4gIHRoaXMubWF0Y2hfc3RhcnQgPSAwOyAgICAgICAvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi9cbiAgdGhpcy5sb29rYWhlYWQgPSAwOyAgICAgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi9cblxuICB0aGlzLnByZXZfbGVuZ3RoID0gMDtcbiAgLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzXG4gICAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLlxuICAgKi9cblxuICB0aGlzLm1heF9jaGFpbl9sZW5ndGggPSAwO1xuICAvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpc1xuICAgKiBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlXG4gICAqIHNwZWVkLlxuICAgKi9cblxuICB0aGlzLm1heF9sYXp5X21hdGNoID0gMDtcbiAgLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseVxuICAgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvblxuICAgKiBsZXZlbHMgPj0gNC5cbiAgICovXG4gIC8vIFRoYXQncyBhbGlhcyB0byBtYXhfbGF6eV9tYXRjaCwgZG9uJ3QgdXNlIGRpcmVjdGx5XG4gIC8vdGhpcy5tYXhfaW5zZXJ0X2xlbmd0aCA9IDA7XG4gIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90XG4gICAqIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy5cbiAgICovXG5cbiAgdGhpcy5sZXZlbCA9IDA7ICAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAoMS4uOSkgKi9cbiAgdGhpcy5zdHJhdGVneSA9IDA7ICAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovXG5cbiAgdGhpcy5nb29kX21hdGNoID0gMDtcbiAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovXG5cbiAgdGhpcy5uaWNlX21hdGNoID0gMDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqL1xuXG4gICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi9cblxuICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5nICovXG5cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fbHRyZWVbSEVBUF9TSVpFXTsgICAvKiBsaXRlcmFsIGFuZCBsZW5ndGggdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovXG5cbiAgLy8gVXNlIGZsYXQgYXJyYXkgb2YgRE9VQkxFIHNpemUsIHdpdGggaW50ZXJsZWF2ZWQgZmF0YSxcbiAgLy8gYmVjYXVzZSBKUyBkb2VzIG5vdCBzdXBwb3J0IGVmZmVjdGl2ZVxuICB0aGlzLmR5bl9sdHJlZSAgPSBuZXcgdXRpbHMuQnVmMTYoSEVBUF9TSVpFICogMik7XG4gIHRoaXMuZHluX2R0cmVlICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIERfQ09ERVMgKyAxKSAqIDIpO1xuICB0aGlzLmJsX3RyZWUgICAgPSBuZXcgdXRpbHMuQnVmMTYoKDIgKiBCTF9DT0RFUyArIDEpICogMik7XG4gIHplcm8odGhpcy5keW5fbHRyZWUpO1xuICB6ZXJvKHRoaXMuZHluX2R0cmVlKTtcbiAgemVybyh0aGlzLmJsX3RyZWUpO1xuXG4gIHRoaXMubF9kZXNjICAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi9cbiAgdGhpcy5kX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi9cbiAgdGhpcy5ibF9kZXNjICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGJpdCBsZW5ndGggdHJlZSAqL1xuXG4gIC8vdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdO1xuICB0aGlzLmJsX2NvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWF9CSVRTICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vaW50IGhlYXBbMipMX0NPREVTKzFdOyAgICAgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB0aGlzLmhlYXAgPSBuZXcgdXRpbHMuQnVmMTYoMiAqIExfQ09ERVMgKyAxKTsgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB6ZXJvKHRoaXMuaGVhcCk7XG5cbiAgdGhpcy5oZWFwX2xlbiA9IDA7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovXG4gIHRoaXMuaGVhcF9tYXggPSAwOyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi9cbiAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy5cbiAgICovXG5cbiAgdGhpcy5kZXB0aCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAvL3VjaCBkZXB0aFsyKkxfQ09ERVMrMV07XG4gIHplcm8odGhpcy5kZXB0aCk7XG4gIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3lcbiAgICovXG5cbiAgdGhpcy5sX2J1ZiA9IDA7ICAgICAgICAgIC8qIGJ1ZmZlciBpbmRleCBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqL1xuXG4gIHRoaXMubGl0X2J1ZnNpemUgPSAwO1xuICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yXG4gICAqIGxpbWl0aW5nIGxpdF9idWZzaXplIHRvIDY0SzpcbiAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVyc1xuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0XG4gICAqICAgICBkYXRhIGlzIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlblxuICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3JcbiAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKVxuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW5cbiAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS5cbiAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLlxuICAgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0XG4gICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yXG4gICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnlcbiAgICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlXG4gICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmdcbiAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS5cbiAgICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNFxuICAgKi9cblxuICB0aGlzLmxhc3RfbGl0ID0gMDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG5cbiAgdGhpcy5kX2J1ZiA9IDA7XG4gIC8qIEJ1ZmZlciBpbmRleCBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmVcbiAgICogdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUbyB1c2UgZGlmZmVyZW50IGxlbmd0aHMsIGFuIGV4dHJhIGZsYWdcbiAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LlxuICAgKi9cblxuICB0aGlzLm9wdF9sZW4gPSAwOyAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovXG4gIHRoaXMuc3RhdGljX2xlbiA9IDA7ICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqL1xuICB0aGlzLm1hdGNoZXMgPSAwOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqL1xuICB0aGlzLmluc2VydCA9IDA7ICAgICAgICAvKiBieXRlcyBhdCBlbmQgb2Ygd2luZG93IGxlZnQgdG8gaW5zZXJ0ICovXG5cblxuICB0aGlzLmJpX2J1ZiA9IDA7XG4gIC8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0XG4gICAqIHNpZ25pZmljYW50IGJpdHMpLlxuICAgKi9cbiAgdGhpcy5iaV92YWxpZCA9IDA7XG4gIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdFxuICAgKiBhcmUgYWx3YXlzIHplcm8uXG4gICAqL1xuXG4gIC8vIFVzZWQgZm9yIHdpbmRvdyBtZW1vcnkgaW5pdC4gV2Ugc2FmZWx5IGlnbm9yZSBpdCBmb3IgSlMuIFRoYXQgbWFrZXNcbiAgLy8gc2Vuc2Ugb25seSBmb3IgcG9pbnRlcnMgYW5kIG1lbW9yeSBjaGVjayB0b29scy5cbiAgLy90aGlzLmhpZ2hfd2F0ZXIgPSAwO1xuICAvKiBIaWdoIHdhdGVyIG1hcmsgb2Zmc2V0IGluIHdpbmRvdyBmb3IgaW5pdGlhbGl6ZWQgYnl0ZXMgLS0gYnl0ZXMgYWJvdmVcbiAgICogdGhpcyBhcmUgc2V0IHRvIHplcm8gaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHdhcm5pbmdzIHdoZW5cbiAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZW5cbiAgICogdXBkYXRlZCB0byB0aGUgbmV3IGhpZ2ggd2F0ZXIgbWFyay5cbiAgICovXG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gMDtcbiAgc3RybS5kYXRhX3R5cGUgPSBaX1VOS05PV047XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHMucGVuZGluZyA9IDA7XG4gIHMucGVuZGluZ19vdXQgPSAwO1xuXG4gIGlmIChzLndyYXAgPCAwKSB7XG4gICAgcy53cmFwID0gLXMud3JhcDtcbiAgICAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqL1xuICB9XG4gIHMuc3RhdHVzID0gKHMud3JhcCA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFKTtcbiAgc3RybS5hZGxlciA9IChzLndyYXAgPT09IDIpID9cbiAgICAwICAvLyBjcmMzMigwLCBaX05VTEwsIDApXG4gIDpcbiAgICAxOyAvLyBhZGxlcjMyKDAsIFpfTlVMTCwgMClcbiAgcy5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSDtcbiAgdHJlZXMuX3RyX2luaXQocyk7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciByZXQgPSBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuICBpZiAocmV0ID09PSBaX09LKSB7XG4gICAgbG1faW5pdChzdHJtLnN0YXRlKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVTZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIGlmIChzdHJtLnN0YXRlLndyYXAgIT09IDIpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0cm0uc3RhdGUuZ3poZWFkID0gaGVhZDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkge1xuICBpZiAoIXN0cm0pIHsgLy8gPT09IFpfTlVMTFxuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICB2YXIgd3JhcCA9IDE7XG5cbiAgaWYgKGxldmVsID09PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIHtcbiAgICBsZXZlbCA9IDY7XG4gIH1cblxuICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovXG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAod2luZG93Qml0cyA+IDE1KSB7XG4gICAgd3JhcCA9IDI7ICAgICAgICAgICAvKiB3cml0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCAqL1xuICAgIHdpbmRvd0JpdHMgLT0gMTY7XG4gIH1cblxuXG4gIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPT0gWl9ERUZMQVRFRCB8fFxuICAgIHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8XG4gICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cblxuICBpZiAod2luZG93Qml0cyA9PT0gOCkge1xuICAgIHdpbmRvd0JpdHMgPSA5O1xuICB9XG4gIC8qIHVudGlsIDI1Ni1ieXRlIHdpbmRvdyBidWcgZml4ZWQgKi9cblxuICB2YXIgcyA9IG5ldyBEZWZsYXRlU3RhdGUoKTtcblxuICBzdHJtLnN0YXRlID0gcztcbiAgcy5zdHJtID0gc3RybTtcblxuICBzLndyYXAgPSB3cmFwO1xuICBzLmd6aGVhZCA9IG51bGw7XG4gIHMud19iaXRzID0gd2luZG93Qml0cztcbiAgcy53X3NpemUgPSAxIDw8IHMud19iaXRzO1xuICBzLndfbWFzayA9IHMud19zaXplIC0gMTtcblxuICBzLmhhc2hfYml0cyA9IG1lbUxldmVsICsgNztcbiAgcy5oYXNoX3NpemUgPSAxIDw8IHMuaGFzaF9iaXRzO1xuICBzLmhhc2hfbWFzayA9IHMuaGFzaF9zaXplIC0gMTtcbiAgcy5oYXNoX3NoaWZ0ID0gfn4oKHMuaGFzaF9iaXRzICsgTUlOX01BVENIIC0gMSkgLyBNSU5fTUFUQ0gpO1xuXG4gIHMud2luZG93ID0gbmV3IHV0aWxzLkJ1Zjgocy53X3NpemUgKiAyKTtcbiAgcy5oZWFkID0gbmV3IHV0aWxzLkJ1ZjE2KHMuaGFzaF9zaXplKTtcbiAgcy5wcmV2ID0gbmV3IHV0aWxzLkJ1ZjE2KHMud19zaXplKTtcblxuICAvLyBEb24ndCBuZWVkIG1lbSBpbml0IG1hZ2ljIGZvciBKUy5cbiAgLy9zLmhpZ2hfd2F0ZXIgPSAwOyAgLyogbm90aGluZyB3cml0dGVuIHRvIHMtPndpbmRvdyB5ZXQgKi9cblxuICBzLmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi9cblxuICBzLnBlbmRpbmdfYnVmX3NpemUgPSBzLmxpdF9idWZzaXplICogNDtcblxuICAvL292ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpO1xuICAvL3MtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTtcbiAgcy5wZW5kaW5nX2J1ZiA9IG5ldyB1dGlscy5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSk7XG5cbiAgLy8gSXQgaXMgb2Zmc2V0IGZyb20gYHMucGVuZGluZ19idWZgIChzaXplIGlzIGBzLmxpdF9idWZzaXplICogMmApXG4gIC8vcy0+ZF9idWYgPSBvdmVybGF5ICsgcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7XG4gIHMuZF9idWYgPSAxICogcy5saXRfYnVmc2l6ZTtcblxuICAvL3MtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7XG4gIHMubF9idWYgPSAoMSArIDIpICogcy5saXRfYnVmc2l6ZTtcblxuICBzLmxldmVsID0gbGV2ZWw7XG4gIHMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgcy5tZXRob2QgPSBtZXRob2Q7XG5cbiAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIHtcbiAgcmV0dXJuIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgWl9ERUZMQVRFRCwgTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kpO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIG9sZF9mbHVzaCwgcztcbiAgdmFyIGJlZywgdmFsOyAvLyBmb3IgZ3ppcCBoZWFkZXIgd3JpdGUgb25seVxuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fFxuICAgIGZsdXNoID4gWl9CTE9DSyB8fCBmbHVzaCA8IDApIHtcbiAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUikgOiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuXG4gIGlmICghc3RybS5vdXRwdXQgfHxcbiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB8fFxuICAgICAgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT09IFpfRklOSVNIKSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IFpfQlVGX0VSUk9SIDogWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgcy5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovXG4gIG9sZF9mbHVzaCA9IHMubGFzdF9mbHVzaDtcbiAgcy5sYXN0X2ZsdXNoID0gZmx1c2g7XG5cbiAgLyogV3JpdGUgdGhlIGhlYWRlciAqL1xuICBpZiAocy5zdGF0dXMgPT09IElOSVRfU1RBVEUpIHtcblxuICAgIGlmIChzLndyYXAgPT09IDIpIHsgLy8gR1pJUCBoZWFkZXJcbiAgICAgIHN0cm0uYWRsZXIgPSAwOyAgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgIHB1dF9ieXRlKHMsIDMxKTtcbiAgICAgIHB1dF9ieXRlKHMsIDEzOSk7XG4gICAgICBwdXRfYnl0ZShzLCA4KTtcbiAgICAgIGlmICghcy5nemhlYWQpIHsgLy8gcy0+Z3poZWFkID09IFpfTlVMTFxuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGV4dCA/IDEgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzLmd6aGVhZC5oY3JjID8gMiA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5leHRyYSA/IDAgOiA0KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQubmFtZSA/IDAgOiA4KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQuY29tbWVudCA/IDAgOiAxNilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDgpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDE2KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAyNCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5vcyAmIDB4ZmYpO1xuICAgICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZik7XG4gICAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZywgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBFWFRSQV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSAvLyBERUZMQVRFIGhlYWRlclxuICAgIHtcbiAgICAgIHZhciBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy53X2JpdHMgLSA4KSA8PCA0KSkgPDwgODtcbiAgICAgIHZhciBsZXZlbF9mbGFncyA9IC0xO1xuXG4gICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPCA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA9PT0gNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDM7XG4gICAgICB9XG4gICAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpO1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHsgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOyB9XG4gICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpO1xuXG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpO1xuXG4gICAgICAvKiBTYXZlIHRoZSBhZGxlcjMyIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeTogKi9cbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gMTsgLy8gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTtcbiAgICB9XG4gIH1cblxuLy8jaWZkZWYgR1pJUFxuICBpZiAocy5zdGF0dXMgPT09IEVYVFJBX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmV4dHJhLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cblxuICAgICAgd2hpbGUgKHMuZ3ppbmRleCA8IChzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmZmYpKSB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmFbcy5nemluZGV4XSAmIDB4ZmYpO1xuICAgICAgICBzLmd6aW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3ppbmRleCA9PT0gcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gTkFNRV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5uYW1lLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBDT01NRU5UX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmNvbW1lbnQvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5jb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgaWYgKHMucGVuZGluZyArIDIgPiBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyIDw9IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgICAgIHN0cm0uYWRsZXIgPSAwOyAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgIH1cbiAgfVxuLy8jZW5kaWZcblxuICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovXG4gIGlmIChzLnBlbmRpbmcgIT09IDApIHtcbiAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aFxuICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmRcbiAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLFxuICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2VcbiAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZTpcbiAgICAgICAqL1xuICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICByZXR1cm4gWl9PSztcbiAgICB9XG5cbiAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmVcbiAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcFxuICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi5cbiAgICAgKi9cbiAgfSBlbHNlIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHJhbmsoZmx1c2gpIDw9IHJhbmsob2xkX2ZsdXNoKSAmJlxuICAgIGZsdXNoICE9PSBaX0ZJTklTSCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogVXNlciBtdXN0IG5vdCBwcm92aWRlIG1vcmUgaW5wdXQgYWZ0ZXIgdGhlIGZpcnN0IEZJTklTSDogKi9cbiAgaWYgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLlxuICAgKi9cbiAgaWYgKHN0cm0uYXZhaWxfaW4gIT09IDAgfHwgcy5sb29rYWhlYWQgIT09IDAgfHxcbiAgICAoZmx1c2ggIT09IFpfTk9fRkxVU0ggJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkpIHtcbiAgICB2YXIgYnN0YXRlID0gKHMuc3RyYXRlZ3kgPT09IFpfSFVGRk1BTl9PTkxZKSA/IGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgOlxuICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfUkxFID8gZGVmbGF0ZV9ybGUocywgZmx1c2gpIDpcbiAgICAgICAgY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5mdW5jKHMsIGZsdXNoKSk7XG5cbiAgICBpZiAoYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9ET05FKSB7XG4gICAgICBzLnN0YXR1cyA9IEZJTklTSF9TVEFURTtcbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfTkVFRF9NT1JFIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQpIHtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgICAgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICB9XG4gICAgICByZXR1cm4gWl9PSztcbiAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGxcbiAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlXG4gICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW5cbiAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvXG4gICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3RcbiAgICAgICAqIG9uZSBlbXB0eSBibG9jay5cbiAgICAgICAqL1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19CTE9DS19ET05FKSB7XG4gICAgICBpZiAoZmx1c2ggPT09IFpfUEFSVElBTF9GTFVTSCkge1xuICAgICAgICB0cmVlcy5fdHJfYWxpZ24ocyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChmbHVzaCAhPT0gWl9CTE9DSykgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi9cblxuICAgICAgICB0cmVlcy5fdHJfc3RvcmVkX2Jsb2NrKHMsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWRcbiAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZsYXRlX3N5bmMoKS5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9GVUxMX0ZMVVNIKSB7XG4gICAgICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovICAgICAgICAgICAgIC8qIGZvcmdldCBoaXN0b3J5ICovXG4gICAgICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5pbnNlcnQgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICAgIHJldHVybiBaX09LO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL0Fzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCBcImJ1ZzJcIik7XG4gIC8vaWYgKHN0cm0uYXZhaWxfb3V0IDw9IDApIHsgdGhyb3cgbmV3IEVycm9yKFwiYnVnMlwiKTt9XG5cbiAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCkgeyByZXR1cm4gWl9PSzsgfVxuICBpZiAocy53cmFwIDw9IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VORDsgfVxuXG4gIC8qIFdyaXRlIHRoZSB0cmFpbGVyICovXG4gIGlmIChzLndyYXAgPT09IDIpIHtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAyNCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLnRvdGFsX2luICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAyNCkgJiAweGZmKTtcbiAgfVxuICBlbHNlXG4gIHtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gIH1cblxuICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAvKiBJZiBhdmFpbF9vdXQgaXMgemVybywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCBkZWZsYXRlIGFnYWluXG4gICAqIHRvIGZsdXNoIHRoZSByZXN0LlxuICAgKi9cbiAgaWYgKHMud3JhcCA+IDApIHsgcy53cmFwID0gLXMud3JhcDsgfVxuICAvKiB3cml0ZSB0aGUgdHJhaWxlciBvbmx5IG9uY2UhICovXG4gIHJldHVybiBzLnBlbmRpbmcgIT09IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlRW5kKHN0cm0pIHtcbiAgdmFyIHN0YXR1cztcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSBJTklUX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBFWFRSQV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gTkFNRV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQ09NTUVOVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gSENSQ19TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQlVTWV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRklOSVNIX1NUQVRFXG4gICkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG5cbiAgcmV0dXJuIHN0YXR1cyA9PT0gQlVTWV9TVEFURSA/IGVycihzdHJtLCBaX0RBVEFfRVJST1IpIDogWl9PSztcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlXG4gKiBzZXF1ZW5jZSB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgcztcbiAgdmFyIHN0ciwgbjtcbiAgdmFyIHdyYXA7XG4gIHZhciBhdmFpbDtcbiAgdmFyIG5leHQ7XG4gIHZhciBpbnB1dDtcbiAgdmFyIHRtcERpY3Q7XG5cbiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzID0gc3RybS5zdGF0ZTtcbiAgd3JhcCA9IHMud3JhcDtcblxuICBpZiAod3JhcCA9PT0gMiB8fCAod3JhcCA9PT0gMSAmJiBzLnN0YXR1cyAhPT0gSU5JVF9TVEFURSkgfHwgcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiB3aGVuIHVzaW5nIHpsaWIgd3JhcHBlcnMsIGNvbXB1dGUgQWRsZXItMzIgZm9yIHByb3ZpZGVkIGRpY3Rpb25hcnkgKi9cbiAgaWYgKHdyYXAgPT09IDEpIHtcbiAgICAvKiBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBzdHJtLmFkbGVyID0gYWRsZXIzMihzdHJtLmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgfVxuXG4gIHMud3JhcCA9IDA7ICAgLyogYXZvaWQgY29tcHV0aW5nIEFkbGVyLTMyIGluIHJlYWRfYnVmICovXG5cbiAgLyogaWYgZGljdGlvbmFyeSB3b3VsZCBmaWxsIHdpbmRvdywganVzdCByZXBsYWNlIHRoZSBoaXN0b3J5ICovXG4gIGlmIChkaWN0TGVuZ3RoID49IHMud19zaXplKSB7XG4gICAgaWYgKHdyYXAgPT09IDApIHsgICAgICAgICAgICAvKiBhbHJlYWR5IGVtcHR5IG90aGVyd2lzZSAqL1xuICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG4gICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgcy5pbnNlcnQgPSAwO1xuICAgIH1cbiAgICAvKiB1c2UgdGhlIHRhaWwgKi9cbiAgICAvLyBkaWN0aW9uYXJ5ID0gZGljdGlvbmFyeS5zbGljZShkaWN0TGVuZ3RoIC0gcy53X3NpemUpO1xuICAgIHRtcERpY3QgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSk7XG4gICAgdXRpbHMuYXJyYXlTZXQodG1wRGljdCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCAtIHMud19zaXplLCBzLndfc2l6ZSwgMCk7XG4gICAgZGljdGlvbmFyeSA9IHRtcERpY3Q7XG4gICAgZGljdExlbmd0aCA9IHMud19zaXplO1xuICB9XG4gIC8qIGluc2VydCBkaWN0aW9uYXJ5IGludG8gd2luZG93IGFuZCBoYXNoICovXG4gIGF2YWlsID0gc3RybS5hdmFpbF9pbjtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBzdHJtLmF2YWlsX2luID0gZGljdExlbmd0aDtcbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5pbnB1dCA9IGRpY3Rpb25hcnk7XG4gIGZpbGxfd2luZG93KHMpO1xuICB3aGlsZSAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgc3RyID0gcy5zdHJzdGFydDtcbiAgICBuID0gcy5sb29rYWhlYWQgLSAoTUlOX01BVENIIC0gMSk7XG4gICAgZG8ge1xuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG5cbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjtcbiAgICAgIHN0cisrO1xuICAgIH0gd2hpbGUgKC0tbik7XG4gICAgcy5zdHJzdGFydCA9IHN0cjtcbiAgICBzLmxvb2thaGVhZCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgZmlsbF93aW5kb3cocyk7XG4gIH1cbiAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIHMuaW5zZXJ0ID0gcy5sb29rYWhlYWQ7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmlucHV0ID0gaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBhdmFpbDtcbiAgcy53cmFwID0gd3JhcDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZXhwb3J0cy5kZWZsYXRlSW5pdCA9IGRlZmxhdGVJbml0O1xuZXhwb3J0cy5kZWZsYXRlSW5pdDIgPSBkZWZsYXRlSW5pdDI7XG5leHBvcnRzLmRlZmxhdGVSZXNldCA9IGRlZmxhdGVSZXNldDtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0S2VlcCA9IGRlZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmRlZmxhdGVTZXRIZWFkZXIgPSBkZWZsYXRlU2V0SGVhZGVyO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZUVuZCA9IGRlZmxhdGVFbmQ7XG5leHBvcnRzLmRlZmxhdGVTZXREaWN0aW9uYXJ5ID0gZGVmbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmRlZmxhdGVJbmZvID0gJ3Bha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuZGVmbGF0ZUJvdW5kID0gZGVmbGF0ZUJvdW5kO1xuZXhwb3J0cy5kZWZsYXRlQ29weSA9IGRlZmxhdGVDb3B5O1xuZXhwb3J0cy5kZWZsYXRlUGFyYW1zID0gZGVmbGF0ZVBhcmFtcztcbmV4cG9ydHMuZGVmbGF0ZVBlbmRpbmcgPSBkZWZsYXRlUGVuZGluZztcbmV4cG9ydHMuZGVmbGF0ZVByaW1lID0gZGVmbGF0ZVByaW1lO1xuZXhwb3J0cy5kZWZsYXRlVHVuZSA9IGRlZmxhdGVUdW5lO1xuKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5mdW5jdGlvbiBHWmhlYWRlcigpIHtcbiAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqL1xuICB0aGlzLnRleHQgICAgICAgPSAwO1xuICAvKiBtb2RpZmljYXRpb24gdGltZSAqL1xuICB0aGlzLnRpbWUgICAgICAgPSAwO1xuICAvKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLnhmbGFncyAgICAgPSAwO1xuICAvKiBvcGVyYXRpbmcgc3lzdGVtICovXG4gIHRoaXMub3MgICAgICAgICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi9cbiAgdGhpcy5leHRyYSAgICAgID0gbnVsbDtcbiAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICh2YWxpZCBpZiBleHRyYSAhPSBaX05VTEwpICovXG4gIHRoaXMuZXh0cmFfbGVuICA9IDA7IC8vIEFjdHVhbGx5LCB3ZSBkb24ndCBuZWVkIGl0IGluIEpTLFxuICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbGVhdmUgZm9yIGZldyBjb2RlIG1vZGlmaWNhdGlvbnNcblxuICAvL1xuICAvLyBTZXR1cCBsaW1pdHMgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5XG4gIC8vIGZvciBpbmZsYXRlIHVzZSBjb25zdGFudCBsaW1pdCBpbiA2NTUzNiBieXRlc1xuICAvL1xuXG4gIC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMuZXh0cmFfbWF4ICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi9cbiAgdGhpcy5uYW1lICAgICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5uYW1lX21heCAgID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKi9cbiAgdGhpcy5jb21tZW50ICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5jb21tX21heCAgID0gMDtcbiAgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi9cbiAgdGhpcy5oY3JjICAgICAgID0gMDtcbiAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLmRvbmUgICAgICAgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHWmhlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gU2VlIHN0YXRlIGRlZnMgZnJvbSBpbmZsYXRlLmpzXG52YXIgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xuXG4vKlxuICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZ1xuICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzXG4gICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLlxuICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvclxuICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZVxuICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuXG5cbiAgIEVudHJ5IGFzc3VtcHRpb25zOlxuXG4gICAgICAgIHN0YXRlLm1vZGUgPT09IExFTlxuICAgICAgICBzdHJtLmF2YWlsX2luID49IDZcbiAgICAgICAgc3RybS5hdmFpbF9vdXQgPj0gMjU4XG4gICAgICAgIHN0YXJ0ID49IHN0cm0uYXZhaWxfb3V0XG4gICAgICAgIHN0YXRlLmJpdHMgPCA4XG5cbiAgIE9uIHJldHVybiwgc3RhdGUubW9kZSBpcyBvbmUgb2Y6XG5cbiAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0XG4gICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrXG4gICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhXG5cbiAgIE5vdGVzOlxuXG4gICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGVcbiAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLFxuICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy5cbiAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkXG4gICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLlxuXG4gICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4XG4gICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KClcbiAgICAgIHJlcXVpcmVzIHN0cm0uYXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvclxuICAgICAgb3V0cHV0IHNwYWNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkge1xuICB2YXIgc3RhdGU7XG4gIHZhciBfaW47ICAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmlucHV0ICovXG4gIHZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBoYXZlIGVub3VnaCBpbnB1dCB3aGlsZSBpbiA8IGxhc3QgKi9cbiAgdmFyIF9vdXQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBiZWc7ICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBvdXQgPCBlbmQsIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgKi9cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIHZhciBkbWF4OyAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gemxpYiBoZWFkZXIgKi9cbi8vI2VuZGlmXG4gIHZhciB3c2l6ZTsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdmFyIHdoYXZlOyAgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdmFyIHduZXh0OyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICAvLyBVc2UgYHNfd2luZG93YCBpbnN0ZWFkIGB3aW5kb3dgLCBhdm9pZCBjb25mbGljdCB3aXRoIGluc3RydW1lbnRhdGlvbiB0b29sc1xuICB2YXIgc193aW5kb3c7ICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovXG4gIHZhciBob2xkOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmhvbGQgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uYml0cyAqL1xuICB2YXIgbGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5sZW5jb2RlICovXG4gIHZhciBkY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmRpc3Rjb2RlICovXG4gIHZhciBsbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi9cbiAgdmFyIGRtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovXG4gIHZhciBoZXJlOyAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZWQgdGFibGUgZW50cnkgKi9cbiAgdmFyIG9wOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCwgdW51c2VkIGJ5dGVzICovXG4gIHZhciBkaXN0OyAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqL1xuICB2YXIgZnJvbTsgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovXG4gIHZhciBmcm9tX3NvdXJjZTtcblxuXG4gIHZhciBpbnB1dCwgb3V0cHV0OyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG5cbiAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi9cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICAvL2hlcmUgPSBzdGF0ZS5oZXJlO1xuICBfaW4gPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7XG4gIF9vdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTtcbiAgZW5kID0gX291dCArIChzdHJtLmF2YWlsX291dCAtIDI1Nyk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICBkbWF4ID0gc3RhdGUuZG1heDtcbi8vI2VuZGlmXG4gIHdzaXplID0gc3RhdGUud3NpemU7XG4gIHdoYXZlID0gc3RhdGUud2hhdmU7XG4gIHduZXh0ID0gc3RhdGUud25leHQ7XG4gIHNfd2luZG93ID0gc3RhdGUud2luZG93O1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIGxjb2RlID0gc3RhdGUubGVuY29kZTtcbiAgZGNvZGUgPSBzdGF0ZS5kaXN0Y29kZTtcbiAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7XG4gIGRtYXNrID0gKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMTtcblxuXG4gIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaFxuICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqL1xuXG4gIHRvcDpcbiAgZG8ge1xuICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgIH1cblxuICAgIGhlcmUgPSBsY29kZVtob2xkICYgbG1hc2tdO1xuXG4gICAgZG9sZW46XG4gICAgZm9yICg7OykgeyAvLyBHb3RvIGVtdWxhdGlvblxuICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICBob2xkID4+Pj0gb3A7XG4gICAgICBiaXRzIC09IG9wO1xuICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuICAgICAgaWYgKG9wID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIG91dHB1dFtfb3V0KytdID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqL1xuICAgICAgICBsZW4gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICBpZiAob3ApIHtcbiAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW4gKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBsZW4pKTtcbiAgICAgICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGhlcmUgPSBkY29kZVtob2xkICYgZG1hc2tdO1xuXG4gICAgICAgIGRvZGlzdDpcbiAgICAgICAgZm9yICg7OykgeyAvLyBnb3RvIGVtdWxhdGlvblxuICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcblxuICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi9cbiAgICAgICAgICAgIGRpc3QgPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgICAgIGlmIChkaXN0ID4gZG1heCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBkaXN0KSk7XG4gICAgICAgICAgICBvcCA9IF9vdXQgLSBiZWc7ICAgICAgICAgICAgICAgIC8qIG1heCBkaXN0YW5jZSBpbiBvdXRwdXQgKi9cbiAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgICAgICB9XG5cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gb3AgLSB3aGF2ZSkge1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgIGxlbiAtPSBvcCAtIHdoYXZlO1xuLy8gICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpO1xuLy8gICAgICAgICAgICAgICAgaWYgKG9wID09PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmcm9tID0gMDsgLy8gd2luZG93IGluZGV4XG4gICAgICAgICAgICAgIGZyb21fc291cmNlID0gc193aW5kb3c7XG4gICAgICAgICAgICAgIGlmICh3bmV4dCA9PT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24gY2FzZSAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHduZXh0IDwgb3ApIHsgICAgICAvKiB3cmFwIGFyb3VuZCB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gZW5kIG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSAwO1xuICAgICAgICAgICAgICAgICAgaWYgKHduZXh0IDwgbGVuKSB7ICAvKiBzb21lIGZyb20gc3RhcnQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICAgIG9wID0gd25leHQ7XG4gICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogY29udGlndW91cyBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgICAgIC8qIGNvcHkgZGlyZWN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGxlbmd0aCBpcyB0aHJlZSAqL1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTtcbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAvKiAybmQgbGV2ZWwgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICAgICAgaGVyZSA9IGRjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgICAgICBjb250aW51ZSBkb2Rpc3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgaGVyZSA9IGxjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgIGNvbnRpbnVlIGRvbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuXG4gICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgIH1cbiAgfSB3aGlsZSAoX2luIDwgbGFzdCAmJiBfb3V0IDwgZW5kKTtcblxuICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi9cbiAgbGVuID0gYml0cyA+PiAzO1xuICBfaW4gLT0gbGVuO1xuICBiaXRzIC09IGxlbiA8PCAzO1xuICBob2xkICY9ICgxIDw8IGJpdHMpIC0gMTtcblxuICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJldHVybiAqL1xuICBzdHJtLm5leHRfaW4gPSBfaW47XG4gIHN0cm0ubmV4dF9vdXQgPSBfb3V0O1xuICBzdHJtLmF2YWlsX2luID0gKF9pbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBfaW4pIDogNSAtIChfaW4gLSBsYXN0KSk7XG4gIHN0cm0uYXZhaWxfb3V0ID0gKF9vdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gX291dCkgOiAyNTcgLSAoX291dCAtIGVuZCkpO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIHJldHVybjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzICAgICAgICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciBhZGxlcjMyICAgICAgID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICAgICAgICA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciBpbmZsYXRlX2Zhc3QgID0gcmVxdWlyZSgnLi9pbmZmYXN0Jyk7XG52YXIgaW5mbGF0ZV90YWJsZSA9IHJlcXVpcmUoJy4vaW5mdHJlZXMnKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbi8vdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG4vL3ZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbi8vdmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xudmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbnZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cblxuLyogU1RBVEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyICAgIEhFQUQgPSAxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi9cbnZhciAgICBGTEFHUyA9IDI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi9cbnZhciAgICBUSU1FID0gMzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovXG52YXIgICAgT1MgPSA0OyAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqL1xudmFyICAgIEVYTEVOID0gNTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovXG52YXIgICAgRVhUUkEgPSA2OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqL1xudmFyICAgIE5BTUUgPSA3OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqL1xudmFyICAgIENPTU1FTlQgPSA4OyAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi9cbnZhciAgICBIQ1JDID0gOTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi9cbnZhciAgICBESUNUSUQgPSAxMDsgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqL1xudmFyICAgIERJQ1QgPSAxMTsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi9cbnZhciAgICAgICAgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cbnZhciAgICAgICAgVFlQRURPID0gMTM7ICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi9cbnZhciAgICAgICAgU1RPUkVEID0gMTQ7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG52YXIgICAgICAgIENPUFlfID0gMTU7ICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICBDT1BZID0gMTY7ICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi9cbnZhciAgICAgICAgVEFCTEUgPSAxNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBMRU5MRU5TID0gMTg7ICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgIENPREVMRU5TID0gMTk7ICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgICAgIExFTl8gPSAyMDsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICAgICAgTEVOID0gMjE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi9cbnZhciAgICAgICAgICAgIExFTkVYVCA9IDIyOyAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgRElTVCA9IDIzOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbnZhciAgICAgICAgICAgIERJU1RFWFQgPSAyNDsgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBNQVRDSCA9IDI1OyAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovXG52YXIgICAgICAgICAgICBMSVQgPSAyNjsgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbnZhciAgICBDSEVDSyA9IDI3OyAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovXG52YXIgICAgTEVOR1RIID0gMjg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovXG52YXIgICAgRE9ORSA9IDI5OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBNRU0gPSAzMTsgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBTWU5DID0gMzI7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7XG5cblxuZnVuY3Rpb24genN3YXAzMihxKSB7XG4gIHJldHVybiAgKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICAgICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAgICAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAgICAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufVxuXG5cbmZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5tb2RlID0gMDsgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7ICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi9cbiAgdGhpcy5mbGFncyA9IDA7ICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi9cbiAgdGhpcy5kbWF4ID0gMDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqL1xuXG4gIC8qIHNsaWRpbmcgd2luZG93ICovXG4gIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqL1xuICB0aGlzLndzaXplID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHRoaXMud2hhdmUgPSAwOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHRoaXMud25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdGhpcy53aW5kb3cgPSBudWxsOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7ICAgICAgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5iaXRzID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi9cbiAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmRpc3QgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG4gIHRoaXMuaGF2ZSA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyB1dGlscy5CdWYxNigzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyB1dGlscy5CdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuZHluID0gbnVsbDsgICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5kaXN0ZHluID0gbnVsbDsgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLnNhbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovXG4gIHRoaXMuYmFjayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi9cbiAgdGhpcy53YXMgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi9cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwO1xuICBzdHJtLm1zZyA9ICcnOyAvKlpfTlVMTCovXG4gIGlmIChzdGF0ZS53cmFwKSB7ICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi9cbiAgICBzdHJtLmFkbGVyID0gc3RhdGUud3JhcCAmIDE7XG4gIH1cbiAgc3RhdGUubW9kZSA9IEhFQUQ7XG4gIHN0YXRlLmxhc3QgPSAwO1xuICBzdGF0ZS5oYXZlZGljdCA9IDA7XG4gIHN0YXRlLmRtYXggPSAzMjc2ODtcbiAgc3RhdGUuaGVhZCA9IG51bGwvKlpfTlVMTCovO1xuICBzdGF0ZS5ob2xkID0gMDtcbiAgc3RhdGUuYml0cyA9IDA7XG4gIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9ESVNUUyk7XG5cbiAgc3RhdGUuc2FuZSA9IDE7XG4gIHN0YXRlLmJhY2sgPSAtMTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiByZXNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0YXRlLndzaXplID0gMDtcbiAgc3RhdGUud2hhdmUgPSAwO1xuICBzdGF0ZS53bmV4dCA9IDA7XG4gIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgd3JhcDtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGdldCB0aGUgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogZXh0cmFjdCB3cmFwIHJlcXVlc3QgZnJvbSB3aW5kb3dCaXRzIHBhcmFtZXRlciAqL1xuICBpZiAod2luZG93Qml0cyA8IDApIHtcbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgd3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTtcbiAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7XG4gICAgICB3aW5kb3dCaXRzICY9IDE1O1xuICAgIH1cbiAgfVxuXG4gIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqL1xuICBpZiAod2luZG93Qml0cyAmJiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHJldDtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgLy9zdHJtLm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovXG5cbiAgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7XG5cbiAgLy9pZiAoc3RhdGUgPT09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IGFsbG9jYXRlZFxcblwiKSk7XG4gIHN0cm0uc3RhdGUgPSBzdGF0ZTtcbiAgc3RhdGUud2luZG93ID0gbnVsbC8qWl9OVUxMKi87XG4gIHJldCA9IGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cyk7XG4gIGlmIChyZXQgIT09IFpfT0spIHtcbiAgICBzdHJtLnN0YXRlID0gbnVsbC8qWl9OVUxMKi87XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQoc3RybSkge1xuICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7XG59XG5cblxuLypcbiBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvXG4gZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLlxuIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGVcbiBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kXG4gdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW5cbiBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmVcbiB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luXG4gbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS5cbiAqL1xudmFyIHZpcmdpbiA9IHRydWU7XG5cbnZhciBsZW5maXgsIGRpc3RmaXg7IC8vIFdlIGhhdmUgbm8gcG9pbnRlcnMgaW4gSlMsIHNvIGtlZXAgdGFibGVzIHNlcGFyYXRlXG5cbmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7XG4gIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovXG4gIGlmICh2aXJnaW4pIHtcbiAgICB2YXIgc3ltO1xuXG4gICAgbGVuZml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyB1dGlscy5CdWYzMigzMik7XG5cbiAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gOTsgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cblxuICAgIGluZmxhdGVfdGFibGUoTEVOUywgIHN0YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAgIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTtcblxuICAgIC8qIGRpc3RhbmNlIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMzIpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA1OyB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgICBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7XG5cbiAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqL1xuICAgIHZpcmdpbiA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDtcbiAgc3RhdGUubGVuYml0cyA9IDk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gZGlzdGZpeDtcbiAgc3RhdGUuZGlzdGJpdHMgPSA1O1xufVxuXG5cbi8qXG4gVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZVxuIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWRcbiB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzXG4gaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LlxuIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5XG4gaXMgbG9hZGVkLlxuXG4gUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZFxuIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3dcbiB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZlxuIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci5cbiBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLlxuICovXG5mdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3JjLCBlbmQsIGNvcHkpIHtcbiAgdmFyIGRpc3Q7XG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqL1xuICBpZiAoc3RhdGUud2luZG93ID09PSBudWxsKSB7XG4gICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IDA7XG5cbiAgICBzdGF0ZS53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzdGF0ZS53c2l6ZSk7XG4gIH1cblxuICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi9cbiAgaWYgKGNvcHkgPj0gc3RhdGUud3NpemUpIHtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gc3RhdGUud3NpemUsIHN0YXRlLndzaXplLCAwKTtcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBkaXN0ID0gc3RhdGUud3NpemUgLSBzdGF0ZS53bmV4dDtcbiAgICBpZiAoZGlzdCA+IGNvcHkpIHtcbiAgICAgIGRpc3QgPSBjb3B5O1xuICAgIH1cbiAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7XG4gICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGRpc3QsIHN0YXRlLnduZXh0KTtcbiAgICBjb3B5IC09IGRpc3Q7XG4gICAgaWYgKGNvcHkpIHtcbiAgICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBjb3B5LCBjb3B5KTtcbiAgICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBjb3B5LCAwKTtcbiAgICAgIHN0YXRlLnduZXh0ID0gY29weTtcbiAgICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3RhdGUud25leHQgKz0gZGlzdDtcbiAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHsgc3RhdGUud25leHQgPSAwOyB9XG4gICAgICBpZiAoc3RhdGUud2hhdmUgPCBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53aGF2ZSArPSBkaXN0OyB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIGlucHV0LCBvdXRwdXQ7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBidWZmZXJzXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGlucHV0IElOREVYICovXG4gIHZhciBwdXQ7ICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG91dHB1dCBJTkRFWCAqL1xuICB2YXIgaGF2ZSwgbGVmdDsgICAgICAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqL1xuICB2YXIgX2luLCBfb3V0OyAgICAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgY29weTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuICB2YXIgaGVyZSA9IDA7ICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqL1xuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsgLy8gcGFrZWQgXCJoZXJlXCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgLy92YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovXG4gIHZhciBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOyAvLyBwYWtlZCBcImxhc3RcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqL1xuICB2YXIgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi9cbiAgdmFyIGhidWYgPSBuZXcgdXRpbHMuQnVmOCg0KTsgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi9cbiAgdmFyIG9wdHM7XG5cbiAgdmFyIG47IC8vIHRlbXBvcmFyeSB2YXIgZm9yIE5FRURfQklUU1xuXG4gIHZhciBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqL1xuICAgIFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdO1xuXG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgeyBzdGF0ZS5tb2RlID0gVFlQRURPOyB9ICAgIC8qIHNraXAgY2hlY2sgKi9cblxuXG4gIC8vLS0tIExPQUQoKSAtLS1cbiAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAvLy0tLVxuXG4gIF9pbiA9IGhhdmU7XG4gIF9vdXQgPSBsZWZ0O1xuICByZXQgPSBaX09LO1xuXG4gIGluZl9sZWF2ZTogLy8gZ290byBlbXVsYXRpb25cbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoc3RhdGUubW9kZSkge1xuICAgIGNhc2UgSEVBRDpcbiAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpO1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgJiYgaG9sZCA9PT0gMHg4YjFmKSB7ICAvKiBnemlwIGhlYWRlciAqL1xuICAgICAgICBzdGF0ZS5jaGVjayA9IDAvKmNyYzMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgLy89PT0vL1xuXG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRkxBR1M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZmxhZ3MgPSAwOyAgICAgICAgICAgLyogZXhwZWN0IHpsaWIgaGVhZGVyICovXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi9cbiAgICAgICAgKCgoaG9sZCAmIDB4ZmYpLypCSVRTKDgpKi8gPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgaGVhZGVyIGNoZWNrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICBiaXRzIC09IDQ7XG4gICAgICAvLy0tLS8vXG4gICAgICBsZW4gPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA4O1xuICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7XG4gICAgICAgIHN0YXRlLndiaXRzID0gbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUud2JpdHMpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCB3aW5kb3cgc2l6ZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuO1xuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXFxuXCIpKTtcbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgIHN0YXRlLm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBicmVhaztcbiAgICBjYXNlIEZMQUdTOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkO1xuICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweGUwMDApIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSAoKGhvbGQgPj4gOCkgJiAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUSU1FOlxuICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkM0KHN0YXRlLmNoZWNrLCBob2xkKVxuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBoYnVmWzJdID0gKGhvbGQgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhidWZbM10gPSAoaG9sZCA+Pj4gMjQpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgNCwgMCk7XG4gICAgICAgIC8vPT09XG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE9TOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICBzdGF0ZS5oZWFkLm9zID0gKGhvbGQgPj4gOCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIEVYTEVOOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkO1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbGVuID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbnVsbC8qWl9OVUxMKi87XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBFWFRSQTpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgLy8gVXNlIHVudHlwZWQgYXJyYXkgZm9yIG1vcmUgY29udmVuaWVuZCBwcm9jZXNzaW5nIGxhdGVyXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBuZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXRpbHMuYXJyYXlTZXQoXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsXG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCBpcyBsaW1pdGVkIHRvIDY1NTM2IGJ5dGVzXG4gICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgIGNvcHksXG4gICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovXG4gICAgICAgICAgICAgIGxlblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vem1lbWNweShzdGF0ZS5oZWFkLmV4dHJhICsgbGVuLCBuZXh0LFxuICAgICAgICAgICAgLy8gICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCA/XG4gICAgICAgICAgICAvLyAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gTkFNRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE5BTUU6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA4MDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLy8gVE9ETzogMiBvciAxIGJ5dGVzP1xuICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQubmFtZV9tYXgqLykpIHtcbiAgICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5uYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gQ09NTUVOVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPTU1FTlQ6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDEwMDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5jb21tX21heCovKSkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgSENSQzpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDB4ZmZmZikpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdoZWFkZXIgY3JjIG1pc21hdGNoJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gKChzdGF0ZS5mbGFncyA+PiA5KSAmIDEpO1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBESUNUSUQ6XG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSB6c3dhcDMyKGhvbGQpO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gRElDVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERJQ1Q6XG4gICAgICBpZiAoc3RhdGUuaGF2ZWRpY3QgPT09IDApIHtcbiAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgIC8vLS0tXG4gICAgICAgIHJldHVybiBaX05FRURfRElDVDtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgVFlQRTpcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9CTE9DSyB8fCBmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIFRZUEVETzpcbiAgICAgIGlmIChzdGF0ZS5sYXN0KSB7XG4gICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICBiaXRzIC09IGJpdHMgJiA3O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBDSEVDSztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLz09PSBORUVEQklUUygzKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubGFzdCA9IChob2xkICYgMHgwMSkvKkJJVFMoMSkqLztcbiAgICAgIC8vLS0tIERST1BCSVRTKDEpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gMTtcbiAgICAgIGJpdHMgLT0gMTtcbiAgICAgIC8vLS0tLy9cblxuICAgICAgc3dpdGNoICgoaG9sZCAmIDB4MDMpLypCSVRTKDIpKi8pIHtcbiAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkIGJsb2NrICovXG4gICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykge1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVEFCTEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJsb2NrIHR5cGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgfVxuICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgYml0cyAtPSAyO1xuICAgICAgLy8tLS0vL1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBTVE9SRUQ6XG4gICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi9cbiAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAvLy0tLS8vXG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9PSAoKGhvbGQgPj4+IDE2KSBeIDB4ZmZmZikpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3Rocyc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZCAmIDB4ZmZmZjtcbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxcblwiLFxuICAgICAgLy8gICAgICAgIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gQ09QWV87XG4gICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT1BZXzpcbiAgICAgIHN0YXRlLm1vZGUgPSBDT1BZO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgQ09QWTpcbiAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICBpZiAoY29weSkge1xuICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgIGlmIChjb3B5ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvLy0tLSB6bWVtY3B5KHB1dCwgbmV4dCwgY29weSk7IC0tLVxuICAgICAgICB1dGlscy5hcnJheVNldChvdXRwdXQsIGlucHV0LCBuZXh0LCBjb3B5LCBwdXQpO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgIHB1dCArPSBjb3B5O1xuICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcXG5cIikpO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFRBQkxFOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTQpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubmxlbiA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDI1NztcbiAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNTtcbiAgICAgIGJpdHMgLT0gNTtcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLm5kaXN0ID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMTtcbiAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNTtcbiAgICAgIGJpdHMgLT0gNTtcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgNDtcbiAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNDtcbiAgICAgIGJpdHMgLT0gNDtcbiAgICAgIC8vLS0tLy9cbi8vI2lmbmRlZiBQS1pJUF9CVUdfV09SS0FST1VORFxuICAgICAgaWYgKHN0YXRlLm5sZW4gPiAyODYgfHwgc3RhdGUubmRpc3QgPiAzMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICd0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuLy8jZW5kaWZcbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcXG5cIikpO1xuICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTkxFTlM6XG4gICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7XG4gICAgICAgIHN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV0gPSAwO1xuICAgICAgfVxuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICAgICAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcbiAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5bjtcbiAgICAgIHN0YXRlLmxlbmJpdHMgPSA3O1xuXG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS5sZW5zLCAwLCAxOSwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29kZSBsZW5ndGhzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcXG5cIikpO1xuICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gQ09ERUxFTlM7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT0RFTEVOUzpcbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGhlcmVfdmFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChoZXJlX3ZhbCA9PT0gMTYpIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDIpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDI7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxlbiA9IHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSAtIDFdO1xuICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDMpOy8vQklUUygyKTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaGVyZV92YWwgPT09IDE3KSB7XG4gICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTtcbiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzO1xuICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDcpOy8vQklUUygzKTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICAgIGJpdHMgLT0gMztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTtcbiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3O1xuICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgY29weSA9IDExICsgKGhvbGQgJiAweDdmKTsvL0JJVFMoNyk7XG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyg3KSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IDc7XG4gICAgICAgICAgICBiaXRzIC09IDc7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5oYXZlICsgY29weSA+IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlIChjb3B5LS0pIHtcbiAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGxlbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogaGFuZGxlIGVycm9yIGJyZWFrcyBpbiB3aGlsZSAqL1xuICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkgeyBicmVhazsgfVxuXG4gICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi9cbiAgICAgIGlmIChzdGF0ZS5sZW5zWzI1Nl0gPT09IDApIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzIC0tIG5vdGU6IGRvIG5vdCBjaGFuZ2UgdGhlIGxlbmJpdHMgb3IgZGlzdGJpdHNcbiAgICAgICAgIHZhbHVlcyBoZXJlICg5IGFuZCA2KSB3aXRob3V0IHJlYWRpbmcgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi9cbiAgICAgIHN0YXRlLmxlbmJpdHMgPSA5O1xuXG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLmxlbnMsIDAsIHN0YXRlLm5sZW4sIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5kaXN0Yml0cyA9IDY7XG4gICAgICAvL3N0YXRlLmRpc3Rjb2RlLmNvcHkoc3RhdGUuY29kZXMpO1xuICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW47XG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5kaXN0Yml0cyB9O1xuICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy8gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2VzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgJ2luZmxhdGU6ICAgICAgIGNvZGVzIG9rXFxuJykpO1xuICAgICAgc3RhdGUubW9kZSA9IExFTl87XG4gICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU5fOlxuICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTjpcbiAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHtcbiAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgIC8vLS0tXG4gICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBfb3V0KTtcbiAgICAgICAgLy8tLS0gTE9BRCgpIC0tLVxuICAgICAgICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICAgICAgICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgICAgICAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICAgICAgICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICAgICAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gICAgICAgIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICAgICAgICBob2xkID0gc3RhdGUuaG9sZDtcbiAgICAgICAgYml0cyA9IHN0YXRlLmJpdHM7XG4gICAgICAgIC8vLS0tXG5cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHtcbiAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5iYWNrID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsgIC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmJiAoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgfVxuICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICBzdGF0ZS5sZW5ndGggPSBoZXJlX3ZhbDtcbiAgICAgIGlmIChoZXJlX29wID09PSAwKSB7XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMSVQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhlcmVfb3AgJiAzMikge1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1O1xuICAgICAgc3RhdGUubW9kZSA9IExFTkVYVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTkVYVDpcbiAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxlbmd0aCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICB9XG4gICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgIHN0YXRlLndhcyA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIHN0YXRlLm1vZGUgPSBESVNUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElTVDpcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5kaXN0Yml0cykqL1xuICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5vZmZzZXQgPSBoZXJlX3ZhbDtcbiAgICAgIHN0YXRlLmV4dHJhID0gKGhlcmVfb3ApICYgMTU7XG4gICAgICBzdGF0ZS5tb2RlID0gRElTVEVYVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERJU1RFWFQ6XG4gICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5vZmZzZXQgKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgfVxuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBzdGF0ZS5kbWF4KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4vLyNlbmRpZlxuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBzdGF0ZS5vZmZzZXQpKTtcbiAgICAgIHN0YXRlLm1vZGUgPSBNQVRDSDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE1BVENIOlxuICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICBjb3B5ID0gX291dCAtIGxlZnQ7XG4gICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gY29weSkgeyAgICAgICAgIC8qIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgY29weSA9IHN0YXRlLm9mZnNldCAtIGNvcHk7XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgIFRyYWNlKChzdGRlcnIsIFwiaW5mbGF0ZS5jIHRvbyBmYXJcXG5cIikpO1xuLy8gICAgICAgICAgY29weSAtPSBzdGF0ZS53aGF2ZTtcbi8vICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbi8vICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuLy8gICAgICAgICAgbGVmdCAtPSBjb3B5O1xuLy8gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4vLyAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgIG91dHB1dFtwdXQrK10gPSAwO1xuLy8gICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbi8vICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuLy8gICAgICAgICAgYnJlYWs7XG4vLyNlbmRpZlxuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUud25leHQpIHtcbiAgICAgICAgICBjb3B5IC09IHN0YXRlLnduZXh0O1xuICAgICAgICAgIGZyb20gPSBzdGF0ZS53c2l6ZSAtIGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4gICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93O1xuICAgICAgfVxuICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqL1xuICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLm9mZnNldDtcbiAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICBkbyB7XG4gICAgICAgIG91dHB1dFtwdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbiAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBMSVQ6XG4gICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIG91dHB1dFtwdXQrK10gPSBzdGF0ZS5sZW5ndGg7XG4gICAgICBsZWZ0LS07XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBDSEVDSzpcbiAgICAgIGlmIChzdGF0ZS53cmFwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAvLyBVc2UgJ3wnIGluc2RlYWQgb2YgJysnIHRvIG1ha2Ugc3VyZSB0aGF0IHJlc3VsdCBpcyBzaWduZWRcbiAgICAgICAgICBob2xkIHw9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBfb3V0IC09IGxlZnQ7XG4gICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gICAgICAgIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gICAgICAgIGlmIChfb3V0KSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID1cbiAgICAgICAgICAgICAgLypVUERBVEUoc3RhdGUuY2hlY2ssIHB1dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAgICAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSk7XG5cbiAgICAgICAgfVxuICAgICAgICBfb3V0ID0gbGVmdDtcbiAgICAgICAgLy8gTkI6IGNyYzMyIHN0b3JlZCBhcyBzaWduZWQgMzItYml0IGludCwgenN3YXAzMiByZXR1cm5zIHNpZ25lZCB0b29cbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyA/IGhvbGQgOiB6c3dhcDMyKGhvbGQpKSAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgZGF0YSBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOR1RIO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOR1RIOlxuICAgICAgaWYgKHN0YXRlLndyYXAgJiYgc3RhdGUuZmxhZ3MpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUudG90YWwgJiAweGZmZmZmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBsZW5ndGggY2hlY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBsZW5ndGggbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBET05FO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRE9ORTpcbiAgICAgIHJldCA9IFpfU1RSRUFNX0VORDtcbiAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICBjYXNlIEJBRDpcbiAgICAgIHJldCA9IFpfREFUQV9FUlJPUjtcbiAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICBjYXNlIE1FTTpcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICBjYXNlIFNZTkM6XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgICB9XG4gIH1cblxuICAvLyBpbmZfbGVhdmUgPC0gaGVyZSBpcyByZWFsIHBsYWNlIGZvciBcImdvdG8gaW5mX2xlYXZlXCIsIGVtdWxhdGVkIHZpYSBcImJyZWFrIGluZl9sZWF2ZVwiXG5cbiAgLypcbiAgICAgUmV0dXJuIGZyb20gaW5mbGF0ZSgpLCB1cGRhdGluZyB0aGUgdG90YWwgY291bnRzIGFuZCB0aGUgY2hlY2sgdmFsdWUuXG4gICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXJcbiAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuXG4gICAgIE5vdGU6IGEgbWVtb3J5IGVycm9yIGZyb20gaW5mbGF0ZSgpIGlzIG5vbi1yZWNvdmVyYWJsZS5cbiAgICovXG5cbiAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIC8vLS0tXG5cbiAgaWYgKHN0YXRlLndzaXplIHx8IChfb3V0ICE9PSBzdHJtLmF2YWlsX291dCAmJiBzdGF0ZS5tb2RlIDwgQkFEICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPCBDSEVDSyB8fCBmbHVzaCAhPT0gWl9GSU5JU0gpKSkge1xuICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQsIF9vdXQgLSBzdHJtLmF2YWlsX291dCkpIHtcbiAgICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgfVxuICB9XG4gIF9pbiAtPSBzdHJtLmF2YWlsX2luO1xuICBfb3V0IC09IHN0cm0uYXZhaWxfb3V0O1xuICBzdHJtLnRvdGFsX2luICs9IF9pbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgaWYgKHN0YXRlLndyYXAgJiYgX291dCkge1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBzdHJtLm5leHRfb3V0IC0gX291dCwgX291dCk7Ki9cbiAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpKTtcbiAgfVxuICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IExFTl8gfHwgc3RhdGUubW9kZSA9PT0gQ09QWV8gPyAyNTYgOiAwKTtcbiAgaWYgKCgoX2luID09PSAwICYmIF9vdXQgPT09IDApIHx8IGZsdXNoID09PSBaX0ZJTklTSCkgJiYgcmV0ID09PSBaX09LKSB7XG4gICAgcmV0ID0gWl9CVUZfRVJST1I7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUVuZChzdHJtKSB7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIC8qfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUud2luZG93KSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuICBzdHJtLnN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICB2YXIgc3RhdGU7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmICgoc3RhdGUud3JhcCAmIDIpID09PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuXG4gIC8qIHNhdmUgaGVhZGVyIHN0cnVjdHVyZSAqL1xuICBzdGF0ZS5oZWFkID0gaGVhZDtcbiAgaGVhZC5kb25lID0gZmFsc2U7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHN0YXRlO1xuICB2YXIgZGljdGlkO1xuICB2YXIgcmV0O1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSAvKiA9PSBaX05VTEwgKi8gfHwgIXN0cm0uc3RhdGUgLyogPT0gWl9OVUxMICovKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKHN0YXRlLndyYXAgIT09IDAgJiYgc3RhdGUubW9kZSAhPT0gRElDVCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWRlbnRpZmllciAqL1xuICBpZiAoc3RhdGUubW9kZSA9PT0gRElDVCkge1xuICAgIGRpY3RpZCA9IDE7IC8qIGFkbGVyMzIoMCwgbnVsbCwgMCkqL1xuICAgIC8qIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7XG4gICAgfVxuICB9XG4gIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgdXNpbmcgdXBkYXRld2luZG93KCksIHdoaWNoIHdpbGwgYW1lbmQgdGhlXG4gICBleGlzdGluZyBkaWN0aW9uYXJ5IGlmIGFwcHJvcHJpYXRlICovXG4gIHJldCA9IHVwZGF0ZXdpbmRvdyhzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCBkaWN0TGVuZ3RoKTtcbiAgaWYgKHJldCkge1xuICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICB9XG4gIHN0YXRlLmhhdmVkaWN0ID0gMTtcbiAgLy8gVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBkaWN0aW9uYXJ5IHNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5leHBvcnRzLmluZmxhdGVSZXNldCA9IGluZmxhdGVSZXNldDtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0MiA9IGluZmxhdGVSZXNldDI7XG5leHBvcnRzLmluZmxhdGVSZXNldEtlZXAgPSBpbmZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5pbmZsYXRlSW5pdCA9IGluZmxhdGVJbml0O1xuZXhwb3J0cy5pbmZsYXRlSW5pdDIgPSBpbmZsYXRlSW5pdDI7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlRW5kID0gaW5mbGF0ZUVuZDtcbmV4cG9ydHMuaW5mbGF0ZUdldEhlYWRlciA9IGluZmxhdGVHZXRIZWFkZXI7XG5leHBvcnRzLmluZmxhdGVTZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVJbmZvID0gJ3Bha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuaW5mbGF0ZUNvcHkgPSBpbmZsYXRlQ29weTtcbmV4cG9ydHMuaW5mbGF0ZUdldERpY3Rpb25hcnkgPSBpbmZsYXRlR2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZU1hcmsgPSBpbmZsYXRlTWFyaztcbmV4cG9ydHMuaW5mbGF0ZVByaW1lID0gaW5mbGF0ZVByaW1lO1xuZXhwb3J0cy5pbmZsYXRlU3luYyA9IGluZmxhdGVTeW5jO1xuZXhwb3J0cy5pbmZsYXRlU3luY1BvaW50ID0gaW5mbGF0ZVN5bmNQb2ludDtcbmV4cG9ydHMuaW5mbGF0ZVVuZGVybWluZSA9IGluZmxhdGVVbmRlcm1pbmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xuXG52YXIgTUFYQklUUyA9IDE1O1xudmFyIEVOT1VHSF9MRU5TID0gODUyO1xudmFyIEVOT1VHSF9ESVNUUyA9IDU5Mjtcbi8vdmFyIEVOT1VHSCA9IChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxudmFyIGxiYXNlID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqL1xuICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLFxuICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMFxuXTtcblxudmFyIGxleHQgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCxcbiAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDcyLCA3OFxuXTtcblxudmFyIGRiYXNlID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovXG4gIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MyxcbiAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LFxuICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwXG5dO1xuXG52YXIgZGV4dCA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsXG4gIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LFxuICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0XG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfdGFibGUodHlwZSwgbGVucywgbGVuc19pbmRleCwgY29kZXMsIHRhYmxlLCB0YWJsZV9pbmRleCwgd29yaywgb3B0cylcbntcbiAgdmFyIGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvL2hlcmUgPSBvcHRzLmhlcmU7IC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqL1xuXG4gIHZhciBsZW4gPSAwOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovXG4gIHZhciBzeW0gPSAwOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqL1xuICB2YXIgbWluID0gMCwgbWF4ID0gMDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi9cbiAgdmFyIHJvb3QgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi9cbiAgdmFyIGN1cnIgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi9cbiAgdmFyIGRyb3AgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqL1xuICB2YXIgbGVmdCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovXG4gIHZhciB1c2VkID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovXG4gIHZhciBodWZmID0gMDsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqL1xuICB2YXIgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi9cbiAgdmFyIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqL1xuICB2YXIgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi9cbiAgdmFyIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqL1xuICB2YXIgYmFzZSA9IG51bGw7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgYmFzZV9pbmRleCA9IDA7XG4vLyAgdmFyIHNob2V4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi9cbiAgdmFyIGNvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovXG4gIHZhciBvZmZzID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovXG4gIHZhciBleHRyYSA9IG51bGw7XG4gIHZhciBleHRyYV9pbmRleCA9IDA7XG5cbiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7XG5cbiAgLypcbiAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGVcbiAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZVxuICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGVcbiAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyXG4gICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzXG4gICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlclxuICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGhcbiAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHNcbiAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzXG4gICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLlxuXG4gICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpblxuICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy5cbiAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0XG4gICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLlxuXG4gICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsXG4gICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGVcbiAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZFxuICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5XG4gICB0aGUgY2FsbGVyLlxuXG4gICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nXG4gICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnlcbiAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkXG4gICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcy5cbiAgICovXG5cbiAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovXG4gIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgY291bnRbbGVuXSA9IDA7XG4gIH1cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBjb3VudFtsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrO1xuICB9XG5cbiAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi9cbiAgcm9vdCA9IGJpdHM7XG4gIGZvciAobWF4ID0gTUFYQklUUzsgbWF4ID49IDE7IG1heC0tKSB7XG4gICAgaWYgKGNvdW50W21heF0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA+IG1heCkge1xuICAgIHJvb3QgPSBtYXg7XG4gIH1cbiAgaWYgKG1heCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi9cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7ICAvL2hlcmUub3AgPSAodmFyIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxOyAgIC8vaGVyZS5iaXRzID0gKHZhciBjaGFyKTE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7ICAgLy9oZXJlLnZhbCA9ICh2YXIgc2hvcnQpMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG5cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7XG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG4gICAgb3B0cy5iaXRzID0gMTtcbiAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi9cbiAgfVxuICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspIHtcbiAgICBpZiAoY291bnRbbWluXSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290IDwgbWluKSB7XG4gICAgcm9vdCA9IG1pbjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqL1xuICBsZWZ0ID0gMTtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBsZWZ0IDw8PSAxO1xuICAgIGxlZnQgLT0gY291bnRbbGVuXTtcbiAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi9cbiAgfVxuICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT09IENPREVTIHx8IG1heCAhPT0gMSkpIHtcbiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovXG4gIH1cblxuICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqL1xuICBvZmZzWzFdID0gMDtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykge1xuICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dO1xuICB9XG5cbiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqL1xuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGlmIChsZW5zW2xlbnNfaW5kZXggKyBzeW1dICE9PSAwKSB7XG4gICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZ1xuICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmZcbiAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcFxuICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLFxuICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0b1xuICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuXG5cbiAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHNcbiAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4XG4gICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYVxuICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzXG4gICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuXG5cbiAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlXG4gICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aFxuICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmVcbiAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy5cblxuICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGVcbiAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3RcbiAgIHRoZSBjb25zdGFudHMgRU5PVUdIX0xFTlMgYW5kIEVOT1VHSF9ESVNUUyB0byBndWFyZCBhZ2FpbnN0IGNoYW5nZXMgaW5cbiAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4gICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuXG4gICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzXG4gICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzXG4gICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuXG4gICAqL1xuXG4gIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovXG4gIC8vIHBvb3IgbWFuIG9wdGltaXphdGlvbiAtIHVzZSBpZi1lbHNlIGluc3RlYWQgb2Ygc3dpdGNoLFxuICAvLyB0byBhdm9pZCBkZW9wdHMgaW4gb2xkIHY4XG4gIGlmICh0eXBlID09PSBDT0RFUykge1xuICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqL1xuICAgIGVuZCA9IDE5O1xuXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTEVOUykge1xuICAgIGJhc2UgPSBsYmFzZTtcbiAgICBiYXNlX2luZGV4IC09IDI1NztcbiAgICBleHRyYSA9IGxleHQ7XG4gICAgZXh0cmFfaW5kZXggLT0gMjU3O1xuICAgIGVuZCA9IDI1NjtcblxuICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogRElTVFMgKi9cbiAgICBiYXNlID0gZGJhc2U7XG4gICAgZXh0cmEgPSBkZXh0O1xuICAgIGVuZCA9IC0xO1xuICB9XG5cbiAgLyogaW5pdGlhbGl6ZSBvcHRzIGZvciBsb29wICovXG4gIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovXG4gIHN5bSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqL1xuICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi9cbiAgbmV4dCA9IHRhYmxlX2luZGV4OyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovXG4gIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi9cbiAgZHJvcCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyB0byBkcm9wIGZyb20gY29kZSBmb3IgaW5kZXggKi9cbiAgbG93ID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi9cbiAgdXNlZCA9IDEgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqL1xuICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqL1xuXG4gIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqL1xuICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGkgPSAwO1xuICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovXG4gIGZvciAoOzspIHtcbiAgICBpKys7XG4gICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovXG4gICAgaGVyZV9iaXRzID0gbGVuIC0gZHJvcDtcbiAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7XG4gICAgICBoZXJlX29wID0gMDtcbiAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dO1xuICAgIH1cbiAgICBlbHNlIGlmICh3b3JrW3N5bV0gPiBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSBleHRyYVtleHRyYV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgICBoZXJlX3ZhbCA9IGJhc2VbYmFzZV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovXG4gICAgICBoZXJlX3ZhbCA9IDA7XG4gICAgfVxuXG4gICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gZHJvcCk7XG4gICAgZmlsbCA9IDEgPDwgY3VycjtcbiAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqL1xuICAgIGRvIHtcbiAgICAgIGZpbGwgLT0gaW5jcjtcbiAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gKGhlcmVfYml0cyA8PCAyNCkgfCAoaGVyZV9vcCA8PCAxNikgfCBoZXJlX3ZhbCB8MDtcbiAgICB9IHdoaWxlIChmaWxsICE9PSAwKTtcblxuICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIDEpO1xuICAgIHdoaWxlIChodWZmICYgaW5jcikge1xuICAgICAgaW5jciA+Pj0gMTtcbiAgICB9XG4gICAgaWYgKGluY3IgIT09IDApIHtcbiAgICAgIGh1ZmYgJj0gaW5jciAtIDE7XG4gICAgICBodWZmICs9IGluY3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh1ZmYgPSAwO1xuICAgIH1cblxuICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqL1xuICAgIHN5bSsrO1xuICAgIGlmICgtLWNvdW50W2xlbl0gPT09IDApIHtcbiAgICAgIGlmIChsZW4gPT09IG1heCkgeyBicmVhazsgfVxuICAgICAgbGVuID0gbGVuc1tsZW5zX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG5cbiAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi9cbiAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9PSBsb3cpIHtcbiAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqL1xuICAgICAgaWYgKGRyb3AgPT09IDApIHtcbiAgICAgICAgZHJvcCA9IHJvb3Q7XG4gICAgICB9XG5cbiAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi9cbiAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqL1xuXG4gICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi9cbiAgICAgIGN1cnIgPSBsZW4gLSBkcm9wO1xuICAgICAgbGVmdCA9IDEgPDwgY3VycjtcbiAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkge1xuICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkgeyBicmVhazsgfVxuICAgICAgICBjdXJyKys7XG4gICAgICAgIGxlZnQgPDw9IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi9cbiAgICAgIHVzZWQgKz0gMSA8PCBjdXJyO1xuICAgICAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAgICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqL1xuICAgICAgbG93ID0gaHVmZiAmIG1hc2s7XG4gICAgICAvKnRhYmxlLm9wW2xvd10gPSBjdXJyO1xuICAgICAgdGFibGUuYml0c1tsb3ddID0gcm9vdDtcbiAgICAgIHRhYmxlLnZhbFtsb3ddID0gbmV4dCAtIG9wdHMudGFibGVfaW5kZXg7Ki9cbiAgICAgIHRhYmxlW2xvd10gPSAocm9vdCA8PCAyNCkgfCAoY3VyciA8PCAxNikgfCAobmV4dCAtIHRhYmxlX2luZGV4KSB8MDtcbiAgICB9XG4gIH1cblxuICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZVxuICAgYXQgbW9zdCBvbmUgcmVtYWluaW5nIGVudHJ5LCBzaW5jZSBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlLCB0aGVcbiAgIG1heGltdW0gY29kZSBsZW5ndGggdGhhdCB3YXMgYWxsb3dlZCB0byBnZXQgdGhpcyBmYXIgaXMgb25lIGJpdCkgKi9cbiAgaWYgKGh1ZmYgIT09IDApIHtcbiAgICAvL3RhYmxlLm9wW25leHQgKyBodWZmXSA9IDY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbbmV4dCArIGh1ZmZdID0gbGVuIC0gZHJvcDtcbiAgICAvL3RhYmxlLnZhbFtuZXh0ICsgaHVmZl0gPSAwO1xuICAgIHRhYmxlW25leHQgKyBodWZmXSA9ICgobGVuIC0gZHJvcCkgPDwgMjQpIHwgKDY0IDw8IDE2KSB8MDtcbiAgfVxuXG4gIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqL1xuICAvL29wdHMudGFibGVfaW5kZXggKz0gdXNlZDtcbiAgb3B0cy5iaXRzID0gcm9vdDtcbiAgcmV0dXJuIDA7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgMjogICAgICAnbmVlZCBkaWN0aW9uYXJ5JywgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovXG4gIDE6ICAgICAgJ3N0cmVhbSBlbmQnLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqL1xuICAwOiAgICAgICcnLCAgICAgICAgICAgICAgICAgICAgLyogWl9PSyAgICAgICAgICAgICAgMCAgKi9cbiAgJy0xJzogICAnZmlsZSBlcnJvcicsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovXG4gICctMic6ICAgJ3N0cmVhbSBlcnJvcicsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqL1xuICAnLTMnOiAgICdkYXRhIGVycm9yJywgICAgICAgICAgLyogWl9EQVRBX0VSUk9SICAgICgtMykgKi9cbiAgJy00JzogICAnaW5zdWZmaWNpZW50IG1lbW9yeScsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovXG4gICctNSc6ICAgJ2J1ZmZlciBlcnJvcicsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqL1xuICAnLTYnOiAgICdpbmNvbXBhdGlibGUgdmVyc2lvbicgLyogWl9WRVJTSU9OX0VSUk9SICgtNikgKi9cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vdmFyIFpfRklMVEVSRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9IVUZGTUFOX09OTFkgICAgICA9IDI7XG4vL3ZhciBaX1JMRSAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xuLy92YXIgWl9ERUZBVUxUX1NUUkFURUdZICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbnZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xudmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG4vLyBGcm9tIHp1dGlsLmhcblxudmFyIFNUT1JFRF9CTE9DSyA9IDA7XG52YXIgU1RBVElDX1RSRUVTID0gMTtcbnZhciBEWU5fVFJFRVMgICAgPSAyO1xuLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi9cblxudmFyIE1JTl9NQVRDSCAgICA9IDM7XG52YXIgTUFYX01BVENIICAgID0gMjU4O1xuLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqL1xuXG4vLyBGcm9tIGRlZmxhdGUuaFxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS5cbiAqL1xuXG52YXIgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG5cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cblxudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xuXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG5cbnZhciBNQVhfQklUUyAgICAgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIEJ1Zl9zaXplICAgICAgPSAxNjtcbi8qIHNpemUgb2YgYml0IGJ1ZmZlciBpbiBiaV9idWYgKi9cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0YW50c1xuICovXG5cbnZhciBNQVhfQkxfQklUUyA9IDc7XG4vKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovXG5cbnZhciBFTkRfQkxPQ0sgICA9IDI1Njtcbi8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi9cblxudmFyIFJFUF8zXzYgICAgID0gMTY7XG4vKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzNfMTAgICA9IDE3O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzExXzEzOCA9IDE4O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxuLyogZXNsaW50LWRpc2FibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cbnZhciBleHRyYV9sYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXTtcblxudmFyIGV4dHJhX2RiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi9cbiAgWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdO1xuXG52YXIgZXh0cmFfYmxiaXRzID0gIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XTtcblxudmFyIGJsX29yZGVyID1cbiAgWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO1xuLyogZXNsaW50LWVuYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xuXG4vKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nXG4gKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy5cbiAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuXG4gKi9cblxuLy8gV2UgcHJlLWZpbGwgYXJyYXlzIHdpdGggMCB0byBhdm9pZCB1bmluaXRpYWxpemVkIGdhcHNcblxudmFyIERJU1RfQ09ERV9MRU4gPSA1MTI7IC8qIHNlZSBkZWZpbml0aW9uIG9mIGFycmF5IGRpc3RfY29kZSBiZWxvdyAqL1xuXG4vLyAhISEhIFVzZSBmbGF0IGFycmF5IGluc2RlYWQgb2Ygc3RydWN0dXJlLCBGcmVxID0gaSoyLCBMZW4gPSBpKjIrMVxudmFyIHN0YXRpY19sdHJlZSAgPSBuZXcgQXJyYXkoKExfQ09ERVMgKyAyKSAqIDIpO1xuemVybyhzdGF0aWNfbHRyZWUpO1xuLyogVGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUuIFNpbmNlIHRoZSBiaXQgbGVuZ3RocyBhcmUgaW1wb3NlZCwgdGhlcmUgaXMgbm9cbiAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyXG4gKiBUaGUgY29kZXMgMjg2IGFuZCAyODcgYXJlIG5lZWRlZCB0byBidWlsZCBhIGNhbm9uaWNhbCB0cmVlIChzZWUgX3RyX2luaXRcbiAqIGJlbG93KS5cbiAqL1xuXG52YXIgc3RhdGljX2R0cmVlICA9IG5ldyBBcnJheShEX0NPREVTICogMik7XG56ZXJvKHN0YXRpY19kdHJlZSk7XG4vKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlXG4gKiA1IGJpdHMuKVxuICovXG5cbnZhciBfZGlzdF9jb2RlICAgID0gbmV3IEFycmF5KERJU1RfQ09ERV9MRU4pO1xuemVybyhfZGlzdF9jb2RlKTtcbi8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXNcbiAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2ZcbiAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLlxuICovXG5cbnZhciBfbGVuZ3RoX2NvZGUgID0gbmV3IEFycmF5KE1BWF9NQVRDSCAtIE1JTl9NQVRDSCArIDEpO1xuemVybyhfbGVuZ3RoX2NvZGUpO1xuLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9sZW5ndGggICA9IG5ldyBBcnJheShMRU5HVEhfQ09ERVMpO1xuemVybyhiYXNlX2xlbmd0aCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9kaXN0ICAgICA9IG5ldyBBcnJheShEX0NPREVTKTtcbnplcm8oYmFzZV9kaXN0KTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZm9yIGVhY2ggY29kZSAoMCA9IGRpc3RhbmNlIG9mIDEpICovXG5cblxuZnVuY3Rpb24gU3RhdGljVHJlZURlc2Moc3RhdGljX3RyZWUsIGV4dHJhX2JpdHMsIGV4dHJhX2Jhc2UsIGVsZW1zLCBtYXhfbGVuZ3RoKSB7XG5cbiAgdGhpcy5zdGF0aWNfdHJlZSAgPSBzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iaXRzICAgPSBleHRyYV9iaXRzOyAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovXG4gIHRoaXMuZXh0cmFfYmFzZSAgID0gZXh0cmFfYmFzZTsgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovXG4gIHRoaXMuZWxlbXMgICAgICAgID0gZWxlbXM7ICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovXG4gIHRoaXMubWF4X2xlbmd0aCAgID0gbWF4X2xlbmd0aDsgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovXG5cbiAgLy8gc2hvdyBpZiBgc3RhdGljX3RyZWVgIGhhcyBkYXRhIG9yIGR1bW15IC0gbmVlZGVkIGZvciBtb25vbW9ycGhpYyBvYmplY3RzXG4gIHRoaXMuaGFzX3N0cmVlICAgID0gc3RhdGljX3RyZWUgJiYgc3RhdGljX3RyZWUubGVuZ3RoO1xufVxuXG5cbnZhciBzdGF0aWNfbF9kZXNjO1xudmFyIHN0YXRpY19kX2Rlc2M7XG52YXIgc3RhdGljX2JsX2Rlc2M7XG5cblxuZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsIHN0YXRfZGVzYykge1xuICB0aGlzLmR5bl90cmVlID0gZHluX3RyZWU7ICAgICAvKiB0aGUgZHluYW1pYyB0cmVlICovXG4gIHRoaXMubWF4X2NvZGUgPSAwOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsgICAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqL1xufVxuXG5cblxuZnVuY3Rpb24gZF9jb2RlKGRpc3QpIHtcbiAgcmV0dXJuIGRpc3QgPCAyNTYgPyBfZGlzdF9jb2RlW2Rpc3RdIDogX2Rpc3RfY29kZVsyNTYgKyAoZGlzdCA+Pj4gNyldO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uXG4gKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuXG4gKi9cbmZ1bmN0aW9uIHB1dF9zaG9ydChzLCB3KSB7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodykgJiAweGZmKSk7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodXNoKSh3KSA+PiA4KSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodyA+Pj4gOCkgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuXG4gKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy5cbiAqL1xuZnVuY3Rpb24gc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPiAoQnVmX3NpemUgLSBsZW5ndGgpKSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSB2YWx1ZSA+PiAoQnVmX3NpemUgLSBzLmJpX3ZhbGlkKTtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplO1xuICB9IGVsc2Uge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHNlbmRfY29kZShzLCBjLCB0cmVlKSB7XG4gIHNlbmRfYml0cyhzLCB0cmVlW2MgKiAyXS8qLkNvZGUqLywgdHJlZVtjICogMiArIDFdLyouTGVuKi8pO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXJcbiAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSlcbiAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTVcbiAqL1xuZnVuY3Rpb24gYmlfcmV2ZXJzZShjb2RlLCBsZW4pIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGRvIHtcbiAgICByZXMgfD0gY29kZSAmIDE7XG4gICAgY29kZSA+Pj49IDE7XG4gICAgcmVzIDw8PSAxO1xuICB9IHdoaWxlICgtLWxlbiA+IDApO1xuICByZXR1cm4gcmVzID4+PiAxO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuXG4gKi9cbmZ1bmN0aW9uIGJpX2ZsdXNoKHMpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPT09IDE2KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IDA7XG4gICAgcy5iaV92YWxpZCA9IDA7XG5cbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID49IDgpIHtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmICYgMHhmZjtcbiAgICBzLmJpX2J1ZiA+Pj0gODtcbiAgICBzLmJpX3ZhbGlkIC09IDg7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoXG4gKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZFxuICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGVcbiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC5cbiAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXNcbiAqICAgICBub3QgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2JpdGxlbihzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgICAgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIG1heF9jb2RlICAgICAgICA9IGRlc2MubWF4X2NvZGU7XG4gIHZhciBzdHJlZSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGV4dHJhICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2JpdHM7XG4gIHZhciBiYXNlICAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iYXNlO1xuICB2YXIgbWF4X2xlbmd0aCAgICAgID0gZGVzYy5zdGF0X2Rlc2MubWF4X2xlbmd0aDtcbiAgdmFyIGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovXG4gIHZhciBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqL1xuICB2YXIgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi9cbiAgdmFyIGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi9cbiAgdmFyIG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqL1xuXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIHMuYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXlcbiAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuXG4gICAqL1xuICB0cmVlW3MuaGVhcFtzLmhlYXBfbWF4XSAqIDIgKyAxXS8qLkxlbiovID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqL1xuXG4gIGZvciAoaCA9IHMuaGVhcF9tYXggKyAxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHtcbiAgICBuID0gcy5oZWFwW2hdO1xuICAgIGJpdHMgPSB0cmVlW3RyZWVbbiAqIDIgKyAxXS8qLkRhZCovICogMiArIDFdLyouTGVuKi8gKyAxO1xuICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkge1xuICAgICAgYml0cyA9IG1heF9sZW5ndGg7XG4gICAgICBvdmVyZmxvdysrO1xuICAgIH1cbiAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi9cblxuICAgIGlmIChuID4gbWF4X2NvZGUpIHsgY29udGludWU7IH0gLyogbm90IGEgbGVhZiBub2RlICovXG5cbiAgICBzLmJsX2NvdW50W2JpdHNdKys7XG4gICAgeGJpdHMgPSAwO1xuICAgIGlmIChuID49IGJhc2UpIHtcbiAgICAgIHhiaXRzID0gZXh0cmFbbiAtIGJhc2VdO1xuICAgIH1cbiAgICBmID0gdHJlZVtuICogMl0vKi5GcmVxKi87XG4gICAgcy5vcHRfbGVuICs9IGYgKiAoYml0cyArIHhiaXRzKTtcbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdLyouTGVuKi8gKyB4Yml0cyk7XG4gICAgfVxuICB9XG4gIGlmIChvdmVyZmxvdyA9PT0gMCkgeyByZXR1cm47IH1cblxuICAvLyBUcmFjZSgoc3RkZXJyLFwiXFxuYml0IGxlbmd0aCBvdmVyZmxvd1xcblwiKSk7XG4gIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovXG5cbiAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi9cbiAgZG8ge1xuICAgIGJpdHMgPSBtYXhfbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAocy5ibF9jb3VudFtiaXRzXSA9PT0gMCkgeyBiaXRzLS07IH1cbiAgICBzLmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovXG4gICAgcy5ibF9jb3VudFtiaXRzICsgMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqL1xuICAgIHMuYmxfY291bnRbbWF4X2xlbmd0aF0tLTtcbiAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLFxuICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXVxuICAgICAqL1xuICAgIG92ZXJmbG93IC09IDI7XG4gIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7XG5cbiAgLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsXG4gICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuXG4gICAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKVxuICAgKi9cbiAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPT0gMDsgYml0cy0tKSB7XG4gICAgbiA9IHMuYmxfY291bnRbYml0c107XG4gICAgd2hpbGUgKG4gIT09IDApIHtcbiAgICAgIG0gPSBzLmhlYXBbLS1oXTtcbiAgICAgIGlmIChtID4gbWF4X2NvZGUpIHsgY29udGludWU7IH1cbiAgICAgIGlmICh0cmVlW20gKiAyICsgMV0vKi5MZW4qLyAhPT0gYml0cykge1xuICAgICAgICAvLyBUcmFjZSgoc3RkZXJyLFwiY29kZSAlZCBiaXRzICVkLT4lZFxcblwiLCBtLCB0cmVlW21dLkxlbiwgYml0cykpO1xuICAgICAgICBzLm9wdF9sZW4gKz0gKGJpdHMgLSB0cmVlW20gKiAyICsgMV0vKi5MZW4qLykgKiB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICAgICAgdHJlZVttICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgICAgfVxuICAgICAgbi0tO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlXG4gKiBvcHRpbWFsKS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yXG4gKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub25cbiAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KVxuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuLy8gICAgdXNoZiAqYmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqL1xue1xuICB2YXIgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovXG4gIHZhciBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi9cbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqL1xuXG4gIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlc1xuICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC5cbiAgICovXG4gIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMgLSAxXSkgPDwgMTtcbiAgfVxuICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlXG4gICAqIG11c3QgYmUgYWxsIG9uZXMuXG4gICAqL1xuICAvL0Fzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSxcbiAgLy8gICAgICAgIFwiaW5jb25zaXN0ZW50IGJpdCBjb3VudHNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5nZW5fY29kZXM6IG1heF9jb2RlICVkIFwiLCBtYXhfY29kZSkpO1xuXG4gIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICB2YXIgbGVuID0gdHJlZVtuICogMiArIDFdLyouTGVuKi87XG4gICAgaWYgKGxlbiA9PT0gMCkgeyBjb250aW51ZTsgfVxuICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovXG4gICAgdHJlZVtuICogMl0vKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7XG5cbiAgICAvL1RyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsXCJcXG5uICUzZCAlYyBsICUyZCBjICU0eCAoJXgpIFwiLFxuICAgIC8vICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpO1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLlxuICovXG5mdW5jdGlvbiB0cl9zdGF0aWNfaW5pdCgpIHtcbiAgdmFyIG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqL1xuICB2YXIgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqL1xuICB2YXIgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqL1xuICB2YXIgYmxfY291bnQgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy8gZG8gY2hlY2sgaW4gX3RyX2luaXQoKVxuICAvL2lmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47XG5cbiAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqL1xuLyojaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlNcbiAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTtcbiAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7XG4gIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7XG4gIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzO1xuICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzO1xuI2VuZGlmKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovXG4gIGxlbmd0aCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMgLSAxOyBjb2RlKyspIHtcbiAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfbGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAobGVuZ3RoID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogbGVuZ3RoICE9IDI1NlwiKTtcbiAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWRcbiAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2VcbiAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOlxuICAgKi9cbiAgX2xlbmd0aF9jb2RlW2xlbmd0aCAtIDFdID0gY29kZTtcblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi9cbiAgZGlzdCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCAxNjsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTZcIik7XG4gIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqL1xuICBmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNztcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgKGV4dHJhX2RiaXRzW2NvZGVdIC0gNykpOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyXCIpO1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi9cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgbiA9IDA7XG4gIHdoaWxlIChuIDw9IDE0Mykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI1NSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA5O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs5XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI3OSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA3O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs3XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI4Nykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZVxuICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGVcbiAgICogYWxsIG9uZXMpXG4gICAqL1xuICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTICsgMSwgYmxfY291bnQpO1xuXG4gIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDU7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7XG4gIH1cblxuICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2FuIGluaXQgc3RhdGljIHRyZWVzXG4gIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMgKyAxLCBMX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19kX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfYmxfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgICAgICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMpO1xuXG4gIC8vc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLlxuICovXG5mdW5jdGlvbiBpbml0X2Jsb2NrKHMpIHtcbiAgdmFyIG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgeyBzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyAgbisrKSB7IHMuZHluX2R0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIHsgcy5ibF90cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cblxuICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXS8qLkZyZXEqLyA9IDE7XG4gIHMub3B0X2xlbiA9IHMuc3RhdGljX2xlbiA9IDA7XG4gIHMubGFzdF9saXQgPSBzLm1hdGNoZXMgPSAwO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5XG4gKi9cbmZ1bmN0aW9uIGJpX3dpbmR1cChzKVxue1xuICBpZiAocy5iaV92YWxpZCA+IDgpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPiAwKSB7XG4gICAgLy9wdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpO1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWY7XG4gIH1cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0c1xuICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcilcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAgICAqYnVmOyAgICAvKiB0aGUgaW5wdXQgZGF0YSAqL1xuLy91bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovXG4vL2ludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqL1xue1xuICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovXG5cbiAgaWYgKGhlYWRlcikge1xuICAgIHB1dF9zaG9ydChzLCBsZW4pO1xuICAgIHB1dF9zaG9ydChzLCB+bGVuKTtcbiAgfVxuLy8gIHdoaWxlIChsZW4tLSkge1xuLy8gICAgcHV0X2J5dGUocywgKmJ1ZisrKTtcbi8vICB9XG4gIHV0aWxzLmFycmF5U2V0KHMucGVuZGluZ19idWYsIHMud2luZG93LCBidWYsIGxlbiwgcy5wZW5kaW5nKTtcbiAgcy5wZW5kaW5nICs9IGxlbjtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlblxuICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIHtcbiAgdmFyIF9uMiA9IG4gKiAyO1xuICB2YXIgX20yID0gbSAqIDI7XG4gIHJldHVybiAodHJlZVtfbjJdLyouRnJlcSovIDwgdHJlZVtfbTJdLyouRnJlcSovIHx8XG4gICAgICAgICAodHJlZVtfbjJdLyouRnJlcSovID09PSB0cmVlW19tMl0vKi5GcmVxKi8gJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgayxcbiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nXG4gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzXG4gKiB0d28gc29ucykuXG4gKi9cbmZ1bmN0aW9uIHBxZG93bmhlYXAocywgdHJlZSwgaylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqL1xuLy8gICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi9cbntcbiAgdmFyIHYgPSBzLmhlYXBba107XG4gIHZhciBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqL1xuICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7XG4gICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi9cbiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiZcbiAgICAgIHNtYWxsZXIodHJlZSwgcy5oZWFwW2ogKyAxXSwgcy5oZWFwW2pdLCBzLmRlcHRoKSkge1xuICAgICAgaisrO1xuICAgIH1cbiAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqL1xuICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHsgYnJlYWs7IH1cblxuICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovXG4gICAgcy5oZWFwW2tdID0gcy5oZWFwW2pdO1xuICAgIGsgPSBqO1xuXG4gICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqL1xuICAgIGogPDw9IDE7XG4gIH1cbiAgcy5oZWFwW2tdID0gdjtcbn1cblxuXG4vLyBpbmxpbmVkIG1hbnVhbGx5XG4vLyB2YXIgU01BTExFU1QgPSAxO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlc1xuICovXG5mdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY29uc3QgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqL1xuLy8gICAgY29uc3QgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbntcbiAgdmFyIGRpc3Q7ICAgICAgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqL1xuICB2YXIgbHggPSAwOyAgICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cbiAgdmFyIGNvZGU7ICAgICAgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovXG4gIHZhciBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqL1xuXG4gIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7XG4gICAgZG8ge1xuICAgICAgZGlzdCA9IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDJdIDw8IDgpIHwgKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMiArIDFdKTtcbiAgICAgIGxjID0gcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgbHhdO1xuICAgICAgbHgrKztcblxuICAgICAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgICAgLy9UcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLFwiICclYycgXCIsIGxjKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdO1xuICAgICAgICBzZW5kX2NvZGUocywgY29kZSArIExJVEVSQUxTICsgMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTtcbiAgICAgICAgLy9Bc3NlcnQgKGNvZGUgPCBEX0NPREVTLCBcImJhZCBkX2NvZGVcIik7XG5cbiAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUsIGR0cmVlKTsgICAgICAgLyogc2VuZCB0aGUgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqL1xuXG4gICAgICAvKiBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmIGlzIG9rOiAqL1xuICAgICAgLy9Bc3NlcnQoKHVJbnQpKHMtPnBlbmRpbmcpIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LFxuICAgICAgLy8gICAgICAgXCJwZW5kaW5nQnVmIG92ZXJmbG93XCIpO1xuXG4gICAgfSB3aGlsZSAobHggPCBzLmxhc3RfbGl0KTtcbiAgfVxuXG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLlxuICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhcbiAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpc1xuICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfdHJlZShzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgc3RyZWUgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGVsZW1zICAgID0gZGVzYy5zdGF0X2Rlc2MuZWxlbXM7XG4gIHZhciBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqL1xuICB2YXIgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHZhciBub2RlOyAgICAgICAgICAvKiBuZXcgbm9kZSBiZWluZyBjcmVhdGVkICovXG5cbiAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpblxuICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS5cbiAgICogaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHMuaGVhcF9sZW4gPSAwO1xuICBzLmhlYXBfbWF4ID0gSEVBUF9TSVpFO1xuXG4gIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7XG4gICAgaWYgKHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IG1heF9jb2RlID0gbjtcbiAgICAgIHMuZGVwdGhbbl0gPSAwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gMDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLFxuICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmVcbiAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3RcbiAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS5cbiAgICovXG4gIHdoaWxlIChzLmhlYXBfbGVuIDwgMikge1xuICAgIG5vZGUgPSBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7XG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSAxO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAwO1xuICAgIHMub3B0X2xlbi0tO1xuXG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUgKiAyICsgMV0vKi5MZW4qLztcbiAgICB9XG4gICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovXG4gIH1cbiAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlO1xuXG4gIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSxcbiAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6XG4gICAqL1xuICBmb3IgKG4gPSAocy5oZWFwX2xlbiA+PiAxLyppbnQgLzIqLyk7IG4gPj0gMTsgbi0tKSB7IHBxZG93bmhlYXAocywgdHJlZSwgbik7IH1cblxuICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvXG4gICAqIGZyZXF1ZW50IG5vZGVzLlxuICAgKi9cbiAgbm9kZSA9IGVsZW1zOyAgICAgICAgICAgICAgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovXG4gIGRvIHtcbiAgICAvL3BxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovXG4gICAgLyoqKiBwcXJlbW92ZSAqKiovXG4gICAgbiA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBzLmhlYXBbcy5oZWFwX2xlbi0tXTtcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuICAgIC8qKiovXG5cbiAgICBtID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqL1xuXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBtO1xuXG4gICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi9cbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IHRyZWVbbiAqIDJdLyouRnJlcSovICsgdHJlZVttICogMl0vKi5GcmVxKi87XG4gICAgcy5kZXB0aFtub2RlXSA9IChzLmRlcHRoW25dID49IHMuZGVwdGhbbV0gPyBzLmRlcHRoW25dIDogcy5kZXB0aFttXSkgKyAxO1xuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkRhZCovID0gdHJlZVttICogMiArIDFdLyouRGFkKi8gPSBub2RlO1xuXG4gICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi9cbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBub2RlKys7XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcblxuICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpO1xuXG4gIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuXG4gIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3dcbiAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLlxuICAgKi9cbiAgZ2VuX2JpdGxlbihzLCBkZXNjKTtcblxuICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovXG4gIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgcy5ibF9jb3VudCk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzXG4gKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLlxuICovXG5mdW5jdGlvbiBzY2FuX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG4gIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0vKi5MZW4qLyA9IDB4ZmZmZjsgLyogZ3VhcmQgKi9cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8gKz0gY291bnQ7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuXG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7IHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLysrOyB9XG4gICAgICBzLmJsX3RyZWVbUkVQXzNfNiAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8zXzEwICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8xMV8xMzggKiAyXS8qLkZyZXEqLysrO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuXG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluXG4gKiBibF90cmVlLlxuICovXG5mdW5jdGlvbiBzZW5kX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBkbyB7IHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT09IDApO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTtcbiAgICAgICAgY291bnQtLTtcbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgXCIgM182P1wiKTtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMik7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMTEsIDcpO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpblxuICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX2JsX3RyZWUocykge1xuICB2YXIgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICBzY2FuX3RyZWUocywgcy5keW5fbHRyZWUsIHMubF9kZXNjLm1heF9jb2RlKTtcbiAgc2Nhbl90cmVlKHMsIHMuZHluX2R0cmVlLCBzLmRfZGVzYy5tYXhfY29kZSk7XG5cbiAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi9cbiAgYnVpbGRfdHJlZShzLCBzLmJsX2Rlc2MpO1xuICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0XG4gICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuXG4gICAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdFxuICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5c1xuICAgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pXG4gICAqL1xuICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7XG4gICAgaWYgKHMuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF0gKiAyICsgMV0vKi5MZW4qLyAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovXG4gIHMub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZFwiLFxuICAvLyAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpO1xuXG4gIHJldHVybiBtYXhfYmxpbmRleDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZVxuICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuXG4gKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfYWxsX3RyZWVzKHMsIGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi9cbntcbiAgdmFyIHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqL1xuXG4gIC8vQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgXCJub3QgZW5vdWdoIGNvZGVzXCIpO1xuICAvL0Fzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUyxcbiAgLy8gICAgICAgIFwidG9vIG1hbnkgY29kZXNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY291bnRzOiBcIikpO1xuICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCAgIDUpO1xuICBzZW5kX2JpdHMocywgYmxjb2RlcyAtIDQsICA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7XG4gICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb2RlICUyZCBcIiwgYmxfb3JkZXJbcmFua10pKTtcbiAgICBzZW5kX2JpdHMocywgcy5ibF90cmVlW2JsX29yZGVyW3JhbmtdICogMiArIDFdLyouTGVuKi8sIDMpO1xuICB9XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLyogbGl0ZXJhbCB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06XG4gKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6XG4gKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcImJsYWNrIGxpc3RcIiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLlxuICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJ3aGl0ZSBsaXN0XCIgKDkge1RBQn0sIDEwIHtMRn0sIDEzIHtDUn0sIDMyLi4yNTUpLlxuICogLSBCSU5BUlkgb3RoZXJ3aXNlLlxuICogLSBUaGUgZm9sbG93aW5nIHBhcnRpYWxseS1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgZm9ybSBhXG4gKiAgIFwiZ3JheSBsaXN0XCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobTpcbiAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LlxuICovXG5mdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHtcbiAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzXG4gICAqIHNldCBiaXRzIDAuLjYsIDE0Li4yNSwgYW5kIDI4Li4zMVxuICAgKiAweGYzZmZjMDdmID0gYmluYXJ5IDExMTEwMDExMTExMTExMTExMTAwMDAwMDAxMTExMTExXG4gICAqL1xuICB2YXIgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2Y7XG4gIHZhciBuO1xuXG4gIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoXCJibGFjay1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj49IDEpIHtcbiAgICBpZiAoKGJsYWNrX21hc2sgJiAxKSAmJiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSkge1xuICAgICAgcmV0dXJuIFpfQklOQVJZO1xuICAgIH1cbiAgfVxuXG4gIC8qIENoZWNrIGZvciB0ZXh0dWFsIChcIndoaXRlLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgaWYgKHMuZHluX2x0cmVlWzkgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fCBzLmR5bl9sdHJlZVsxMCAqIDJdLyouRnJlcSovICE9PSAwIHx8XG4gICAgICBzLmR5bl9sdHJlZVsxMyAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgcmV0dXJuIFpfVEVYVDtcbiAgfVxuICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTOyBuKyspIHtcbiAgICBpZiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICByZXR1cm4gWl9URVhUO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZXJlIGFyZSBubyBcImJsYWNrLWxpc3RlZFwiIG9yIFwid2hpdGUtbGlzdGVkXCIgYnl0ZXM6XG4gICAqIHRoaXMgc3RyZWFtIGVpdGhlciBpcyBlbXB0eSBvciBoYXMgdG9sZXJhdGVkIChcImdyYXktbGlzdGVkXCIpIGJ5dGVzIG9ubHkuXG4gICAqL1xuICByZXR1cm4gWl9CSU5BUlk7XG59XG5cblxudmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIF90cl9pbml0KHMpXG57XG5cbiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7XG4gICAgdHJfc3RhdGljX2luaXQoKTtcbiAgICBzdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbiAgfVxuXG4gIHMubF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7XG4gIHMuZF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7XG4gIHMuYmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmJsX3RyZWUsIHN0YXRpY19ibF9kZXNjKTtcblxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqL1xuICBpbml0X2Jsb2NrKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHN0b3JlZCBibG9ja1xuICovXG5mdW5jdGlvbiBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsgICAgLyogc2VuZCBibG9jayB0eXBlICovXG4gIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsgLyogd2l0aCBoZWFkZXIgKi9cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuXG4gKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gX3RyX2FsaWduKHMpIHtcbiAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUyA8PCAxLCAzKTtcbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTtcbiAgYmlfZmx1c2gocyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWNcbiAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS5cbiAqL1xuZnVuY3Rpb24gX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7ICAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovXG4gIHZhciBtYXhfYmxpbmRleCA9IDA7ICAgICAgICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqL1xuICBpZiAocy5sZXZlbCA+IDApIHtcblxuICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGJpbmFyeSBvciB0ZXh0ICovXG4gICAgaWYgKHMuc3RybS5kYXRhX3R5cGUgPT09IFpfVU5LTk9XTikge1xuICAgICAgcy5zdHJtLmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7XG4gICAgfVxuXG4gICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcbiAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2ZcbiAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLlxuICAgICAqL1xuXG4gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXhcbiAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7XG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovXG4gICAgb3B0X2xlbmIgPSAocy5vcHRfbGVuICsgMyArIDcpID4+PiAzO1xuICAgIHN0YXRpY19sZW5iID0gKHMuc3RhdGljX2xlbiArIDMgKyA3KSA+Pj4gMztcblxuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1IFwiLFxuICAgIC8vICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sXG4gICAgLy8gICAgICAgIHMtPmxhc3RfbGl0KSk7XG5cbiAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIHsgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsgfVxuXG4gIH0gZWxzZSB7XG4gICAgLy8gQXNzZXJ0KGJ1ZiAhPSAoY2hhciopMCwgXCJsb3N0IGJ1ZlwiKTtcbiAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovXG4gIH1cblxuICBpZiAoKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iKSAmJiAoYnVmICE9PSAtMSkpIHtcbiAgICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovXG5cbiAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLlxuICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2VcbiAgICAgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW5cbiAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG9cbiAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLlxuICAgICAqL1xuICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTtcblxuICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQgfHwgc3RhdGljX2xlbmIgPT09IG9wdF9sZW5iKSB7XG5cbiAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzLmR5bl9sdHJlZSwgcy5keW5fZHRyZWUpO1xuICB9XG4gIC8vIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCBcImJhZCBjb21wcmVzc2VkIHNpemVcIik7XG4gIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CXG4gICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLlxuICAgKi9cbiAgaW5pdF9ibG9jayhzKTtcblxuICBpZiAobGFzdCkge1xuICAgIGJpX3dpbmR1cChzKTtcbiAgfVxuICAvLyBUcmFjZXYoKHN0ZGVycixcIlxcbmNvbXBybGVuICVsdSglbHUpIFwiLCBzLT5jb21wcmVzc2VkX2xlbj4+MyxcbiAgLy8gICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNypsYXN0KSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmXG4gKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIF90cl90YWxseShzLCBkaXN0LCBsYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB1bnNpZ25lZCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbi8vICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqL1xue1xuICAvL3ZhciBvdXRfbGVuZ3RoLCBpbl9sZW5ndGgsIGRjb2RlO1xuXG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyXSAgICAgPSAoZGlzdCA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMiArIDFdID0gZGlzdCAmIDB4ZmY7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgcy5sYXN0X2xpdF0gPSBsYyAmIDB4ZmY7XG4gIHMubGFzdF9saXQrKztcblxuICBpZiAoZGlzdCA9PT0gMCkge1xuICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqL1xuICAgIHMuZHluX2x0cmVlW2xjICogMl0vKi5GcmVxKi8rKztcbiAgfSBlbHNlIHtcbiAgICBzLm1hdGNoZXMrKztcbiAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgLy9Bc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJlxuICAgIC8vICAgICAgICh1c2gpbGMgPD0gKHVzaCkoTUFYX01BVENILU1JTl9NQVRDSCkgJiZcbiAgICAvLyAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgIFwiX3RyX3RhbGx5OiBiYWQgbWF0Y2hcIik7XG5cbiAgICBzLmR5bl9sdHJlZVsoX2xlbmd0aF9jb2RlW2xjXSArIExJVEVSQUxTICsgMSkgKiAyXS8qLkZyZXEqLysrO1xuICAgIHMuZHluX2R0cmVlW2RfY29kZShkaXN0KSAqIDJdLyouRnJlcSovKys7XG4gIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcblxuLy8jaWZkZWYgVFJVTkNBVEVfQkxPQ0tcbi8vICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi9cbi8vICBpZiAoKHMubGFzdF9saXQgJiAweDFmZmYpID09PSAwICYmIHMubGV2ZWwgPiAyKSB7XG4vLyAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi9cbi8vICAgIG91dF9sZW5ndGggPSBzLmxhc3RfbGl0Kjg7XG4vLyAgICBpbl9sZW5ndGggPSBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydDtcbi8vXG4vLyAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7XG4vLyAgICAgIG91dF9sZW5ndGggKz0gcy5keW5fZHRyZWVbZGNvZGUqMl0vKi5GcmVxKi8gKiAoNSArIGV4dHJhX2RiaXRzW2Rjb2RlXSk7XG4vLyAgICB9XG4vLyAgICBvdXRfbGVuZ3RoID4+Pj0gMztcbi8vICAgIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgXCIsXG4vLyAgICAvLyAgICAgICBzLT5sYXN0X2xpdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLFxuLy8gICAgLy8gICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTtcbi8vICAgIGlmIChzLm1hdGNoZXMgPCAocy5sYXN0X2xpdD4+MSkvKmludCAvMiovICYmIG91dF9sZW5ndGggPCAoaW5fbGVuZ3RoPj4xKS8qaW50IC8yKi8pIHtcbi8vICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICB9XG4vLyAgfVxuLy8jZW5kaWZcblxuICByZXR1cm4gKHMubGFzdF9saXQgPT09IHMubGl0X2J1ZnNpemUgLSAxKTtcbiAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLXG4gICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvXG4gICAqIDY0Sy0xIGJ5dGVzLlxuICAgKi9cbn1cblxuZXhwb3J0cy5fdHJfaW5pdCAgPSBfdHJfaW5pdDtcbmV4cG9ydHMuX3RyX3N0b3JlZF9ibG9jayA9IF90cl9zdG9yZWRfYmxvY2s7XG5leHBvcnRzLl90cl9mbHVzaF9ibG9jayAgPSBfdHJfZmx1c2hfYmxvY2s7XG5leHBvcnRzLl90cl90YWxseSA9IF90cl90YWxseTtcbmV4cG9ydHMuX3RyX2FsaWduID0gX3RyX2FsaWduO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIFpTdHJlYW0oKSB7XG4gIC8qIG5leHQgaW5wdXQgYnl0ZSAqL1xuICB0aGlzLmlucHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfaW4gPSAwO1xuICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IGlucHV0ICovXG4gIHRoaXMuYXZhaWxfaW4gPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9pbiA9IDA7XG4gIC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqL1xuICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X291dCA9IDA7XG4gIC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG91dHB1dCAqL1xuICB0aGlzLmF2YWlsX291dCA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovXG4gIHRoaXMudG90YWxfb3V0ID0gMDtcbiAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovXG4gIHRoaXMubXNnID0gJycvKlpfTlVMTCovO1xuICAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi9cbiAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi9cbiAgdGhpcy5kYXRhX3R5cGUgPSAyLypaX1VOS05PV04qLztcbiAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi9cbiAgdGhpcy5hZGxlciA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gbGlnaHR3ZWlnaHQgQnVmZmVyIHNoaW0gZm9yIHBiZiBicm93c2VyIGJ1aWxkXG4vLyBiYXNlZCBvbiBjb2RlIGZyb20gZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyIChNSVQtbGljZW5zZWQpXG5cbm1vZHVsZS5leHBvcnRzID0gQnVmZmVyO1xuXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKTtcblxudmFyIEJ1ZmZlck1ldGhvZHM7XG5cbmZ1bmN0aW9uIEJ1ZmZlcihsZW5ndGgpIHtcbiAgICB2YXIgYXJyO1xuICAgIGlmIChsZW5ndGggJiYgbGVuZ3RoLmxlbmd0aCkge1xuICAgICAgICBhcnIgPSBsZW5ndGg7XG4gICAgICAgIGxlbmd0aCA9IGFyci5sZW5ndGg7XG4gICAgfVxuICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGggfHwgMCk7XG4gICAgaWYgKGFycikgYnVmLnNldChhcnIpO1xuXG4gICAgYnVmLnJlYWRVSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZFVJbnQzMkxFO1xuICAgIGJ1Zi53cml0ZVVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZVVJbnQzMkxFO1xuICAgIGJ1Zi5yZWFkSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZEludDMyTEU7XG4gICAgYnVmLndyaXRlSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVJbnQzMkxFO1xuICAgIGJ1Zi5yZWFkRmxvYXRMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZEZsb2F0TEU7XG4gICAgYnVmLndyaXRlRmxvYXRMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVGbG9hdExFO1xuICAgIGJ1Zi5yZWFkRG91YmxlTEUgPSBCdWZmZXJNZXRob2RzLnJlYWREb3VibGVMRTtcbiAgICBidWYud3JpdGVEb3VibGVMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVEb3VibGVMRTtcbiAgICBidWYudG9TdHJpbmcgPSBCdWZmZXJNZXRob2RzLnRvU3RyaW5nO1xuICAgIGJ1Zi53cml0ZSA9IEJ1ZmZlck1ldGhvZHMud3JpdGU7XG4gICAgYnVmLnNsaWNlID0gQnVmZmVyTWV0aG9kcy5zbGljZTtcbiAgICBidWYuY29weSA9IEJ1ZmZlck1ldGhvZHMuY29weTtcblxuICAgIGJ1Zi5faXNCdWZmZXIgPSB0cnVlO1xuICAgIHJldHVybiBidWY7XG59XG5cbnZhciBsYXN0U3RyLCBsYXN0U3RyRW5jb2RlZDtcblxuQnVmZmVyTWV0aG9kcyA9IHtcbiAgICByZWFkVUludDMyTEU6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICByZXR1cm4gKCh0aGlzW3Bvc10pIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDJdIDw8IDE2KSkgK1xuICAgICAgICAgICAgKHRoaXNbcG9zICsgM10gKiAweDEwMDAwMDApO1xuICAgIH0sXG5cbiAgICB3cml0ZVVJbnQzMkxFOiBmdW5jdGlvbih2YWwsIHBvcykge1xuICAgICAgICB0aGlzW3Bvc10gPSB2YWw7XG4gICAgICAgIHRoaXNbcG9zICsgMV0gPSAodmFsID4+PiA4KTtcbiAgICAgICAgdGhpc1twb3MgKyAyXSA9ICh2YWwgPj4+IDE2KTtcbiAgICAgICAgdGhpc1twb3MgKyAzXSA9ICh2YWwgPj4+IDI0KTtcbiAgICB9LFxuXG4gICAgcmVhZEludDMyTEU6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICByZXR1cm4gKCh0aGlzW3Bvc10pIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDJdIDw8IDE2KSkgK1xuICAgICAgICAgICAgKHRoaXNbcG9zICsgM10gPDwgMjQpO1xuICAgIH0sXG5cbiAgICByZWFkRmxvYXRMRTogIGZ1bmN0aW9uKHBvcykgeyByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIHBvcywgdHJ1ZSwgMjMsIDQpOyB9LFxuICAgIHJlYWREb3VibGVMRTogZnVuY3Rpb24ocG9zKSB7IHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgcG9zLCB0cnVlLCA1MiwgOCk7IH0sXG5cbiAgICB3cml0ZUZsb2F0TEU6ICBmdW5jdGlvbih2YWwsIHBvcykgeyByZXR1cm4gaWVlZTc1NC53cml0ZSh0aGlzLCB2YWwsIHBvcywgdHJ1ZSwgMjMsIDQpOyB9LFxuICAgIHdyaXRlRG91YmxlTEU6IGZ1bmN0aW9uKHZhbCwgcG9zKSB7IHJldHVybiBpZWVlNzU0LndyaXRlKHRoaXMsIHZhbCwgcG9zLCB0cnVlLCA1MiwgOCk7IH0sXG5cbiAgICB0b1N0cmluZzogZnVuY3Rpb24oZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdmFyIHN0ciA9ICcnLFxuICAgICAgICAgICAgdG1wID0gJyc7XG5cbiAgICAgICAgc3RhcnQgPSBzdGFydCB8fCAwO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbih0aGlzLmxlbmd0aCwgZW5kIHx8IHRoaXMubGVuZ3RoKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoID0gdGhpc1tpXTtcbiAgICAgICAgICAgIGlmIChjaCA8PSAweDdGKSB7XG4gICAgICAgICAgICAgICAgc3RyICs9IGRlY29kZVVSSUNvbXBvbmVudCh0bXApICsgU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICAgICAgICAgICAgdG1wID0gJyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRtcCArPSAnJScgKyBjaC50b1N0cmluZygxNik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdHIgKz0gZGVjb2RlVVJJQ29tcG9uZW50KHRtcCk7XG5cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9LFxuXG4gICAgd3JpdGU6IGZ1bmN0aW9uKHN0ciwgcG9zKSB7XG4gICAgICAgIHZhciBieXRlcyA9IHN0ciA9PT0gbGFzdFN0ciA/IGxhc3RTdHJFbmNvZGVkIDogZW5jb2RlU3RyaW5nKHN0cik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXNbcG9zICsgaV0gPSBieXRlc1tpXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzbGljZTogZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKTtcbiAgICB9LFxuXG4gICAgY29weTogZnVuY3Rpb24oYnVmLCBwb3MpIHtcbiAgICAgICAgcG9zID0gcG9zIHx8IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYnVmW3BvcyArIGldID0gdGhpc1tpXTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkJ1ZmZlck1ldGhvZHMud3JpdGVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZVVJbnQzMkxFO1xuXG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGZ1bmN0aW9uKHN0cikge1xuICAgIGxhc3RTdHIgPSBzdHI7XG4gICAgbGFzdFN0ckVuY29kZWQgPSBlbmNvZGVTdHJpbmcoc3RyKTtcbiAgICByZXR1cm4gbGFzdFN0ckVuY29kZWQubGVuZ3RoO1xufTtcblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24oYnVmKSB7XG4gICAgcmV0dXJuICEhKGJ1ZiAmJiBidWYuX2lzQnVmZmVyKTtcbn07XG5cbmZ1bmN0aW9uIGVuY29kZVN0cmluZyhzdHIpIHtcbiAgICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aCxcbiAgICAgICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBjLCBsZWFkOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpOyAvLyBjb2RlIHBvaW50XG5cbiAgICAgICAgaWYgKGMgPiAweEQ3RkYgJiYgYyA8IDB4RTAwMCkge1xuXG4gICAgICAgICAgICBpZiAobGVhZCkge1xuICAgICAgICAgICAgICAgIGlmIChjIDwgMHhEQzAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgICAgICAgICAgIGxlYWQgPSBjO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBsZWFkIC0gMHhEODAwIDw8IDEwIHwgYyAtIDB4REMwMCB8IDB4MTAwMDA7XG4gICAgICAgICAgICAgICAgICAgIGxlYWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA+IDB4REJGRiB8fCAoaSArIDEgPT09IGxlbmd0aCkpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgICAgICAgZWxzZSBsZWFkID0gYztcblxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAobGVhZCkge1xuICAgICAgICAgICAgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgIGxlYWQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSBieXRlcy5wdXNoKGMpO1xuICAgICAgICBlbHNlIGlmIChjIDwgMHg4MDApIGJ5dGVzLnB1c2goYyA+PiAweDYgfCAweEMwLCBjICYgMHgzRiB8IDB4ODApO1xuICAgICAgICBlbHNlIGlmIChjIDwgMHgxMDAwMCkgYnl0ZXMucHVzaChjID4+IDB4QyB8IDB4RTAsIGMgPj4gMHg2ICYgMHgzRiB8IDB4ODAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgICAgIGVsc2UgYnl0ZXMucHVzaChjID4+IDB4MTIgfCAweEYwLCBjID4+IDB4QyAmIDB4M0YgfCAweDgwLCBjID4+IDB4NiAmIDB4M0YgfCAweDgwLCBjICYgMHgzRiB8IDB4ODApO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGJmO1xuXG52YXIgQnVmZmVyID0gZ2xvYmFsLkJ1ZmZlciB8fCByZXF1aXJlKCcuL2J1ZmZlcicpO1xuXG5mdW5jdGlvbiBQYmYoYnVmKSB7XG4gICAgdGhpcy5idWYgPSAhQnVmZmVyLmlzQnVmZmVyKGJ1ZikgPyBuZXcgQnVmZmVyKGJ1ZiB8fCAwKSA6IGJ1ZjtcbiAgICB0aGlzLnBvcyA9IDA7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLmJ1Zi5sZW5ndGg7XG59XG5cblBiZi5WYXJpbnQgID0gMDsgLy8gdmFyaW50OiBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBzaW50MzIsIHNpbnQ2NCwgYm9vbCwgZW51bVxuUGJmLkZpeGVkNjQgPSAxOyAvLyA2NC1iaXQ6IGRvdWJsZSwgZml4ZWQ2NCwgc2ZpeGVkNjRcblBiZi5CeXRlcyAgID0gMjsgLy8gbGVuZ3RoLWRlbGltaXRlZDogc3RyaW5nLCBieXRlcywgZW1iZWRkZWQgbWVzc2FnZXMsIHBhY2tlZCByZXBlYXRlZCBmaWVsZHNcblBiZi5GaXhlZDMyID0gNTsgLy8gMzItYml0OiBmbG9hdCwgZml4ZWQzMiwgc2ZpeGVkMzJcblxudmFyIFNISUZUX0xFRlRfMzIgPSAoMSA8PCAxNikgKiAoMSA8PCAxNiksXG4gICAgU0hJRlRfUklHSFRfMzIgPSAxIC8gU0hJRlRfTEVGVF8zMixcbiAgICBQT1dfMl82MyA9IE1hdGgucG93KDIsIDYzKTtcblxuUGJmLnByb3RvdHlwZSA9IHtcblxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmJ1ZiA9IG51bGw7XG4gICAgfSxcblxuICAgIC8vID09PSBSRUFESU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICByZWFkRmllbGRzOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCwgZW5kKSB7XG4gICAgICAgIGVuZCA9IGVuZCB8fCB0aGlzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLnJlYWRWYXJpbnQoKSxcbiAgICAgICAgICAgICAgICB0YWcgPSB2YWwgPj4gMyxcbiAgICAgICAgICAgICAgICBzdGFydFBvcyA9IHRoaXMucG9zO1xuXG4gICAgICAgICAgICByZWFkRmllbGQodGFnLCByZXN1bHQsIHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgPT09IHN0YXJ0UG9zKSB0aGlzLnNraXAodmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICByZWFkTWVzc2FnZTogZnVuY3Rpb24ocmVhZEZpZWxkLCByZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZpZWxkcyhyZWFkRmllbGQsIHJlc3VsdCwgdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyk7XG4gICAgfSxcblxuICAgIHJlYWRGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkSW50MzJMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIC8vIDY0LWJpdCBpbnQgaGFuZGxpbmcgaXMgYmFzZWQgb24gZ2l0aHViLmNvbS9kcHcvbm9kZS1idWZmZXItbW9yZS1pbnRzIChNSVQtbGljZW5zZWQpXG5cbiAgICByZWFkRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpICsgdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKSArIHRoaXMuYnVmLnJlYWRJbnQzMkxFKHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkRmxvYXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZEZsb2F0TEUodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkRG91YmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWREb3VibGVMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYnVmID0gdGhpcy5idWYsXG4gICAgICAgICAgICB2YWwsIGIsIGIwLCBiMSwgYjIsIGIzO1xuXG4gICAgICAgIGIwID0gYnVmW3RoaXMucG9zKytdOyBpZiAoYjAgPCAweDgwKSByZXR1cm4gYjA7ICAgICAgICAgICAgICAgICBiMCA9IGIwICYgMHg3ZjtcbiAgICAgICAgYjEgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMSA8IDB4ODApIHJldHVybiBiMCB8IGIxIDw8IDc7ICAgICAgIGIxID0gKGIxICYgMHg3ZikgPDwgNztcbiAgICAgICAgYjIgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMiA8IDB4ODApIHJldHVybiBiMCB8IGIxIHwgYjIgPDwgMTQ7IGIyID0gKGIyICYgMHg3ZikgPDwgMTQ7XG4gICAgICAgIGIzID0gYnVmW3RoaXMucG9zKytdOyBpZiAoYjMgPCAweDgwKSByZXR1cm4gYjAgfCBiMSB8IGIyIHwgYjMgPDwgMjE7XG5cbiAgICAgICAgdmFsID0gYjAgfCBiMSB8IGIyIHwgKGIzICYgMHg3ZikgPDwgMjE7XG5cbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDEwMDAwMDAwOyAgICAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDgwMDAwMDAwMDsgICAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDQwMDAwMDAwMDAwOyAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDIwMDAwMDAwMDAwMDA7ICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDEwMDAwMDAwMDAwMDAwMDsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDgwMDAwMDAwMDAwMDAwMDA7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzJyk7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMucG9zLFxuICAgICAgICAgICAgdmFsID0gdGhpcy5yZWFkVmFyaW50KCk7XG5cbiAgICAgICAgaWYgKHZhbCA8IFBPV18yXzYzKSByZXR1cm4gdmFsO1xuXG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcyAtIDI7XG4gICAgICAgIHdoaWxlICh0aGlzLmJ1Zltwb3NdID09PSAweGZmKSBwb3MtLTtcbiAgICAgICAgaWYgKHBvcyA8IHN0YXJ0UG9zKSBwb3MgPSBzdGFydFBvcztcblxuICAgICAgICB2YWwgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvcyAtIHN0YXJ0UG9zICsgMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYiA9IH50aGlzLmJ1ZltzdGFydFBvcyArIGldICYgMHg3ZjtcbiAgICAgICAgICAgIHZhbCArPSBpIDwgNCA/IGIgPDwgaSAqIDcgOiBiICogTWF0aC5wb3coMiwgaSAqIDcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIC12YWwgLSAxO1xuICAgIH0sXG5cbiAgICByZWFkU1ZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBudW0gPSB0aGlzLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDIgPT09IDEgPyAobnVtICsgMSkgLyAtMiA6IG51bSAvIDI7IC8vIHppZ3phZyBlbmNvZGluZ1xuICAgIH0sXG5cbiAgICByZWFkQm9vbGVhbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKTtcbiAgICB9LFxuXG4gICAgcmVhZFN0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgc3RyID0gdGhpcy5idWYudG9TdHJpbmcoJ3V0ZjgnLCB0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfSxcblxuICAgIHJlYWRCeXRlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5idWYuc2xpY2UodGhpcy5wb3MsIGVuZCk7XG4gICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH0sXG5cbiAgICAvLyB2ZXJib3NlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOyBkb2Vzbid0IGFmZmVjdCBnemlwcGVkIHNpemVcblxuICAgIHJlYWRQYWNrZWRWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkVmFyaW50KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU1ZhcmludCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRmxvYXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRmxvYXQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRG91YmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG5cbiAgICBza2lwOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB2YWwgJiAweDc7XG4gICAgICAgIGlmICh0eXBlID09PSBQYmYuVmFyaW50KSB3aGlsZSAodGhpcy5idWZbdGhpcy5wb3MrK10gPiAweDdmKSB7fVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuQnl0ZXMpIHRoaXMucG9zID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcztcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkMzIpIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5GaXhlZDY0KSB0aGlzLnBvcyArPSA4O1xuICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcignVW5pbXBsZW1lbnRlZCB0eXBlOiAnICsgdHlwZSk7XG4gICAgfSxcblxuICAgIC8vID09PSBXUklUSU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICB3cml0ZVRhZzogZnVuY3Rpb24odGFnLCB0eXBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoKHRhZyA8PCAzKSB8IHR5cGUpO1xuICAgIH0sXG5cbiAgICByZWFsbG9jOiBmdW5jdGlvbihtaW4pIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDE2O1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGggPCB0aGlzLnBvcyArIG1pbikgbGVuZ3RoICo9IDI7XG5cbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKGxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLmJ1Zi5jb3B5KGJ1Zik7XG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnNsaWNlKDAsIHRoaXMubGVuZ3RoKTtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDMyOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZVVJbnQzMkxFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZVNGaXhlZDMyOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlVUludDMyTEUoTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkNjQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRSh2YWwgJiAtMSwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUoTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlVmFyaW50OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdmFsID0gK3ZhbDtcblxuICAgICAgICBpZiAodmFsIDw9IDB4N2YpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gdmFsO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodmFsIDw9IDB4M2ZmZikge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDIpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMCkgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiA3KSAmIDB4N2YpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodmFsIDw9IDB4MWZmZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMyk7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMTQpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHhmZmZmZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMTQpICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMjEpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgICAgIHdoaWxlICh2YWwgPj0gMHg4MCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICh2YWwgJiAweGZmKSB8IDB4ODA7XG4gICAgICAgICAgICAgICAgdmFsIC89IDB4ODA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMSk7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IHZhbCB8IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgLSBwb3MgPiAxMCkgdGhyb3cgbmV3IEVycm9yKCdHaXZlbiB2YXJpbnQgZG9lc25cXCd0IGZpdCBpbnRvIDEwIGJ5dGVzJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgd3JpdGVTVmFyaW50OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwgPCAwID8gLXZhbCAqIDIgLSAxIDogdmFsICogMik7XG4gICAgfSxcblxuICAgIHdyaXRlQm9vbGVhbjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoQm9vbGVhbih2YWwpKTtcbiAgICB9LFxuXG4gICAgd3JpdGVTdHJpbmc6IGZ1bmN0aW9uKHN0cikge1xuICAgICAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICAgICAgdmFyIGJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoc3RyKTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChieXRlcyk7XG4gICAgICAgIHRoaXMucmVhbGxvYyhieXRlcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlKHN0ciwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSBieXRlcztcbiAgICB9LFxuXG4gICAgd3JpdGVGbG9hdDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVGbG9hdExFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZURvdWJsZTogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVEb3VibGVMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVCeXRlczogZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICAgIHZhciBsZW4gPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucmVhbGxvYyhsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IGJ1ZmZlcltpXTtcbiAgICB9LFxuXG4gICAgd3JpdGVNZXNzYWdlOiBmdW5jdGlvbih0YWcsIGZuLCBvYmopIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG5cbiAgICAgICAgdGhpcy5wb3MrKzsgLy8gcmVzZXJ2ZSAxIGJ5dGUgZm9yIHNob3J0IG1lc3NhZ2UgbGVuZ3RoXG5cbiAgICAgICAgLy8gd3JpdGUgdGhlIG1lc3NhZ2UgZGlyZWN0bHkgdG8gdGhlIGJ1ZmZlciBhbmQgc2VlIGhvdyBtdWNoIHdhcyB3cml0dGVuXG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMucG9zO1xuICAgICAgICBmbihvYmosIHRoaXMpO1xuICAgICAgICB2YXIgbGVuID0gdGhpcy5wb3MgLSBzdGFydFBvcztcblxuICAgICAgICB2YXIgdmFyaW50TGVuID1cbiAgICAgICAgICAgIGxlbiA8PSAweDdmID8gMSA6XG4gICAgICAgICAgICBsZW4gPD0gMHgzZmZmID8gMiA6XG4gICAgICAgICAgICBsZW4gPD0gMHgxZmZmZmYgPyAzIDpcbiAgICAgICAgICAgIGxlbiA8PSAweGZmZmZmZmYgPyA0IDogTWF0aC5jZWlsKE1hdGgubG9nKGxlbikgLyAoTWF0aC5MTjIgKiA3KSk7XG5cbiAgICAgICAgLy8gaWYgMSBieXRlIGlzbid0IGVub3VnaCBmb3IgZW5jb2RpbmcgbWVzc2FnZSBsZW5ndGgsIHNoaWZ0IHRoZSBkYXRhIHRvIHRoZSByaWdodFxuICAgICAgICBpZiAodmFyaW50TGVuID4gMSkge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKHZhcmludExlbiAtIDEpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMucG9zIC0gMTsgaSA+PSBzdGFydFBvczsgaS0tKSB0aGlzLmJ1ZltpICsgdmFyaW50TGVuIC0gMV0gPSB0aGlzLmJ1ZltpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSBtZXNzYWdlIGxlbmd0aCBpbiB0aGUgcmVzZXJ2ZWQgcGxhY2UgYW5kIHJlc3RvcmUgdGhlIHBvc2l0aW9uXG4gICAgICAgIHRoaXMucG9zID0gc3RhcnRQb3MgLSAxO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICB9LFxuXG4gICAgd3JpdGVQYWNrZWRWYXJpbnQ6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFZhcmludCwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkU1ZhcmludDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTVmFyaW50LCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEJvb2xlYW46ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkQm9vbGVhbiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRGbG9hdDogICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZsb2F0LCBhcnIpOyAgICB9LFxuICAgIHdyaXRlUGFja2VkRG91YmxlOiAgIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWREb3VibGUsIGFycik7ICAgfSxcbiAgICB3cml0ZVBhY2tlZEZpeGVkMzI6ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRml4ZWQzMiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNGaXhlZDMyLCBhcnIpOyB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQ2NDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDY0LCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDY0OiBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkNjQsIGFycik7IH0sXG5cbiAgICB3cml0ZUJ5dGVzRmllbGQ6IGZ1bmN0aW9uKHRhZywgYnVmZmVyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlQnl0ZXMoYnVmZmVyKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkMzIodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkNjQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVNWYXJpbnQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU3RyaW5nRmllbGQ6IGZ1bmN0aW9uKHRhZywgc3RyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKHN0cik7XG4gICAgfSxcbiAgICB3cml0ZUZsb2F0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGbG9hdCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVEb3VibGVGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICAgICAgdGhpcy53cml0ZURvdWJsZSh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVCb29sZWFuRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnRGaWVsZCh0YWcsIEJvb2xlYW4odmFsKSk7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gd3JpdGVQYWNrZWRWYXJpbnQoYXJyLCBwYmYpICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlVmFyaW50KGFycltpXSk7ICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTVmFyaW50KGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU1ZhcmludChhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGbG9hdChhcnIsIHBiZikgICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRmxvYXQoYXJyW2ldKTsgICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWREb3VibGUoYXJyLCBwYmYpICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRG91YmxlKGFycltpXSk7ICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRCb29sZWFuKGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlQm9vbGVhbihhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDMyKGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRml4ZWQzMihhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQzMihhcnIsIHBiZikgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU0ZpeGVkMzIoYXJyW2ldKTsgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDY0KGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRml4ZWQ2NChhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQ2NChhcnIsIHBiZikgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU0ZpeGVkNjQoYXJyW2ldKTsgfVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50O1xuXG5mdW5jdGlvbiBQb2ludCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xufVxuXG5Qb2ludC5wcm90b3R5cGUgPSB7XG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IFBvaW50KHRoaXMueCwgdGhpcy55KTsgfSxcblxuICAgIGFkZDogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHApOyAgICAgfSxcbiAgICBzdWI6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3N1YihwKTsgICAgIH0sXG4gICAgbXVsdDogICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0KGspOyAgICB9LFxuICAgIGRpdjogICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2KGspOyAgICAgfSxcbiAgICByb3RhdGU6ICBmdW5jdGlvbihhKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZShhKTsgIH0sXG4gICAgbWF0TXVsdDogZnVuY3Rpb24obSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KG0pOyB9LFxuICAgIHVuaXQ6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCk7IH0sXG4gICAgcGVycDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3BlcnAoKTsgfSxcbiAgICByb3VuZDogICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKTsgfSxcblxuICAgIG1hZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55KTtcbiAgICB9LFxuXG4gICAgZXF1YWxzOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnggPT09IHAueCAmJlxuICAgICAgICAgICAgICAgdGhpcy55ID09PSBwLnk7XG4gICAgfSxcblxuICAgIGRpc3Q6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RTcXIocCkpO1xuICAgIH0sXG5cbiAgICBkaXN0U3FyOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHZhciBkeCA9IHAueCAtIHRoaXMueCxcbiAgICAgICAgICAgIGR5ID0gcC55IC0gdGhpcy55O1xuICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG4gICAgfSxcblxuICAgIGFuZ2xlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55LCB0aGlzLngpO1xuICAgIH0sXG5cbiAgICBhbmdsZVRvOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSAtIGIueSwgdGhpcy54IC0gYi54KTtcbiAgICB9LFxuXG4gICAgYW5nbGVXaXRoOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuZ2xlV2l0aFNlcChiLngsIGIueSk7XG4gICAgfSxcblxuICAgIC8vIEZpbmQgdGhlIGFuZ2xlIG9mIHRoZSB0d28gdmVjdG9ycywgc29sdmluZyB0aGUgZm9ybXVsYSBmb3IgdGhlIGNyb3NzIHByb2R1Y3QgYSB4IGIgPSB8YXx8YnxzaW4ozrgpIGZvciDOuC5cbiAgICBhbmdsZVdpdGhTZXA6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIoXG4gICAgICAgICAgICB0aGlzLnggKiB5IC0gdGhpcy55ICogeCxcbiAgICAgICAgICAgIHRoaXMueCAqIHggKyB0aGlzLnkgKiB5KTtcbiAgICB9LFxuXG4gICAgX21hdE11bHQ6IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgdmFyIHggPSBtWzBdICogdGhpcy54ICsgbVsxXSAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBtWzJdICogdGhpcy54ICsgbVszXSAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9hZGQ6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54ICs9IHAueDtcbiAgICAgICAgdGhpcy55ICs9IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9zdWI6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54IC09IHAueDtcbiAgICAgICAgdGhpcy55IC09IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9tdWx0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAqPSBrO1xuICAgICAgICB0aGlzLnkgKj0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kaXY6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54IC89IGs7XG4gICAgICAgIHRoaXMueSAvPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3VuaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9kaXYodGhpcy5tYWcoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcGVycDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xuICAgICAgICB0aGlzLnkgPSB0aGlzLng7XG4gICAgICAgIHRoaXMueCA9IC15O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdGF0ZTogZnVuY3Rpb24oYW5nbGUpIHtcbiAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIHggPSBjb3MgKiB0aGlzLnggLSBzaW4gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gc2luICogdGhpcy54ICsgY29zICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy54ID0gTWF0aC5yb3VuZCh0aGlzLngpO1xuICAgICAgICB0aGlzLnkgPSBNYXRoLnJvdW5kKHRoaXMueSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG5cbi8vIGNvbnN0cnVjdHMgUG9pbnQgZnJvbSBhbiBhcnJheSBpZiBuZWNlc3NhcnlcblBvaW50LmNvbnZlcnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIGlmIChhIGluc3RhbmNlb2YgUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoYVswXSwgYVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBhO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKCFwcm9jZXNzLnZlcnNpb24gfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjAuJykgPT09IDAgfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuJykgPT09IDAgJiYgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLjguJykgIT09IDApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBuZXh0VGljaztcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcHJvY2Vzcy5uZXh0VGljaztcbn1cblxuZnVuY3Rpb24gbmV4dFRpY2soZm4sIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiY2FsbGJhY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGFyZ3MsIGk7XG4gIHN3aXRjaCAobGVuKSB7XG4gIGNhc2UgMDpcbiAgY2FzZSAxOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZuKTtcbiAgY2FzZSAyOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja09uZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSk7XG4gICAgfSk7XG4gIGNhc2UgMzpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUd28oKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIpO1xuICAgIH0pO1xuICBjYXNlIDQ6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVGhyZWUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgIH0pO1xuICBkZWZhdWx0OlxuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBhcmdzLmxlbmd0aCkge1xuICAgICAgYXJnc1tpKytdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2soKSB7XG4gICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfXJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcblxudXRpbC5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxudmFyIGtleXMgPSBvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG5mb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcHJvY2Vzc05leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59IiwiLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB1bmRlZmluZWQ7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNraXBBZGQ7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgc2tpcEFkZCA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIGNodW5rLmxlbmd0aCA9PT0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhZGRUb0Zyb250KSBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIERvbid0IGFkZCB0byB0aGUgYnVmZmVyIGlmIHdlJ3ZlIGRlY29kZWQgdG8gYW4gZW1wdHkgc3RyaW5nIGNodW5rIGFuZFxuICAgICAgLy8gd2UncmUgbm90IGluIG9iamVjdCBtb2RlXG4gICAgICBpZiAoIXNraXBBZGQpIHtcbiAgICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5uZWVkUmVhZGFibGUgfHwgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgcmV0dXJuIDA7XG5cbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKG4gPT09IG51bGwgfHwgaXNOYU4obikpIHtcbiAgICAvLyBvbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyWzBdLmxlbmd0aDtlbHNlIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKSByZXR1cm4gMDtcblxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgdGFyZ2V0IGJ1ZmZlciBsZXZlbCxcbiAgLy8gdGhlbiByYWlzZSB0aGUgd2F0ZXIgbWFyay4gIEJ1bXAgdXAgdG8gdGhlIG5leHQgaGlnaGVzdFxuICAvLyBwb3dlciBvZiAyLCB0byBwcmV2ZW50IGluY3JlYXNpbmcgaXQgZXhjZXNzaXZlbHkgaW4gdGlueVxuICAvLyBhbW91bnRzLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcblxuICAvLyBkb24ndCBoYXZlIHRoYXQgbXVjaC4gIHJldHVybiBudWxsLCB1bmxlc3Mgd2UndmUgZW5kZWQuXG4gIGlmIChuID4gc3RhdGUubGVuZ3RoKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA+IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH1cblxuICBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICBpZiAoZG9SZWFkICYmICFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfVxuXG4gIHN0YXRlLmxlbmd0aCAtPSBuO1xuXG4gIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHByb2Nlc3NOZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwcm9jZXNzTmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0KSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXNbMF0gPT09IGRlc3QgJiYgc3JjLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA9PT0gMSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG4gIC8vIFRoaXMgaXMgYSBicnV0YWxseSB1Z2x5IGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXJcbiAgLy8gaXMgYXR0YWNoZWQgYmVmb3JlIGFueSB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy5cbiAgaWYgKCFkZXN0Ll9ldmVudHMgfHwgIWRlc3QuX2V2ZW50cy5lcnJvcikgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtlbHNlIGlmIChpc0FycmF5KGRlc3QuX2V2ZW50cy5lcnJvcikpIGRlc3QuX2V2ZW50cy5lcnJvci51bnNoaWZ0KG9uZXJyb3IpO2Vsc2UgZGVzdC5fZXZlbnRzLmVycm9yID0gW29uZXJyb3IsIGRlc3QuX2V2ZW50cy5lcnJvcl07XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgZGVzdHNbX2ldLmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgLy8gSWYgbGlzdGVuaW5nIHRvIGRhdGEsIGFuZCBpdCBoYXMgbm90IGV4cGxpY2l0bHkgYmVlbiBwYXVzZWQsXG4gIC8vIHRoZW4gY2FsbCByZXN1bWUgdG8gc3RhcnQgdGhlIGZsb3cgb2YgZGF0YSBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAoZXYgPT09ICdkYXRhJyAmJiBmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgdGhpcy5yZXN1bWUoKTtcbiAgfVxuXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyAmJiAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzc05leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICB9IHdoaWxlIChudWxsICE9PSBjaHVuayAmJiBzdGF0ZS5mbG93aW5nKTtcbiAgfVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbiAoZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICB2YXIgbGlzdCA9IHN0YXRlLmJ1ZmZlcjtcbiAgdmFyIGxlbmd0aCA9IHN0YXRlLmxlbmd0aDtcbiAgdmFyIHN0cmluZ01vZGUgPSAhIXN0YXRlLmRlY29kZXI7XG4gIHZhciBvYmplY3RNb2RlID0gISFzdGF0ZS5vYmplY3RNb2RlO1xuICB2YXIgcmV0O1xuXG4gIC8vIG5vdGhpbmcgaW4gdGhlIGxpc3QsIGRlZmluaXRlbHkgZW1wdHkuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0ID0gbnVsbDtlbHNlIGlmIChvYmplY3RNb2RlKSByZXQgPSBsaXN0LnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBsZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGFycmF5LlxuICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSBsaXN0LmpvaW4oJycpO2Vsc2UgaWYgKGxpc3QubGVuZ3RoID09PSAxKSByZXQgPSBsaXN0WzBdO2Vsc2UgcmV0ID0gQnVmZmVyLmNvbmNhdChsaXN0LCBsZW5ndGgpO1xuICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIGp1c3Qgc29tZSBvZiBpdC5cbiAgICBpZiAobiA8IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBqdXN0IHRha2UgYSBwYXJ0IG9mIHRoZSBmaXJzdCBsaXN0IGl0ZW0uXG4gICAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5ncy5cbiAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgcmV0ID0gYnVmLnNsaWNlKDAsIG4pO1xuICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShuKTtcbiAgICB9IGVsc2UgaWYgKG4gPT09IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBmaXJzdCBsaXN0IGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wbGV4IGNhc2UuXG4gICAgICAvLyB3ZSBoYXZlIGVub3VnaCB0byBjb3ZlciBpdCwgYnV0IGl0IHNwYW5zIHBhc3QgdGhlIGZpcnN0IGJ1ZmZlci5cbiAgICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSAnJztlbHNlIHJldCA9IG5ldyBCdWZmZXIobik7XG5cbiAgICAgIHZhciBjID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsICYmIGMgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICAgIHZhciBjcHkgPSBNYXRoLm1pbihuIC0gYywgYnVmLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHN0cmluZ01vZGUpIHJldCArPSBidWYuc2xpY2UoMCwgY3B5KTtlbHNlIGJ1Zi5jb3B5KHJldCwgYywgMCwgY3B5KTtcblxuICAgICAgICBpZiAoY3B5IDwgYnVmLmxlbmd0aCkgbGlzdFswXSA9IGJ1Zi5zbGljZShjcHkpO2Vsc2UgbGlzdC5zaGlmdCgpO1xuXG4gICAgICAgIGMgKz0gY3B5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoJ2VuZFJlYWRhYmxlIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCIvLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG5cbnZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhUcmFuc2Zvcm0sIER1cGxleCk7XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0aGlzLndyaXRlZW5jb2RpbmcgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MnKSk7XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICBzdHJlYW0uX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpO1xuXG4gIC8vIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaDtcbiAgfVxuXG4gIHRoaXMub25jZSgncHJlZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlcikge1xuICAgICAgZG9uZShzdHJlYW0sIGVyKTtcbiAgICB9KTtlbHNlIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICB2YXIgd3MgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHdzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAodHMudHJhbnNmb3JtaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmcnKTtcblxuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59IiwiLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHByb2Nlc3NOZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGNyZWF0ZSB0aGUgdHdvIG9iamVjdHMgbmVlZGVkIHRvIHN0b3JlIHRoZSBjb3JrZWQgcmVxdWVzdHNcbiAgLy8gdGhleSBhcmUgbm90IGEgbGlua2VkIGxpc3QsIGFzIG5vIG5ldyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlcmVcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiB3cml0YWJsZVN0YXRlR2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0aG91Z2ggdGhleSdyZSBub3RcbiAgLy8gaW5zdGFuY2VvZiBXcml0YWJsZSwgdGhleSdyZSBpbnN0YW5jZW9mIFJlYWRhYmxlLlxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV3JpdGFibGUpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW5ub3QgcGlwZS4gTm90IHJlYWRhYmxlLicpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIHZhciBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcbiAgaWYgKHN5bmMpIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO2Vsc2UgY2IoZXIpO1xuXG4gIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBhc3luY1dyaXRlKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQpIHtcbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3NOZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG5cbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIGVudHJ5ID0gX3RoaXMuZW50cnk7XG4gICAgX3RoaXMuZW50cnkgPSBudWxsO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICAgIGNiKGVycik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gX3RoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IF90aGlzO1xuICAgIH1cbiAgfTtcbn0iLCJ2YXIgU3RyZWFtID0gKGZ1bmN0aW9uICgpe1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdzdCcgKyAncmVhbScpOyAvLyBoYWNrIHRvIGZpeCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgaXNzdWUgd2hlbiB1c2VkIHdpdGggYnJvd3NlcmlmeVxuICB9IGNhdGNoKF8pe31cbn0oKSk7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5leHBvcnRzLlN0cmVhbSA9IFN0cmVhbSB8fCBleHBvcnRzO1xuZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG5leHBvcnRzLldyaXRhYmxlID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuZXhwb3J0cy5EdXBsZXggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nXG4gIHx8IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICBjYXNlICdoZXgnOiBjYXNlICd1dGY4JzogY2FzZSAndXRmLTgnOiBjYXNlICdhc2NpaSc6IGNhc2UgJ2JpbmFyeSc6IGNhc2UgJ2Jhc2U2NCc6IGNhc2UgJ3VjczInOiBjYXNlICd1Y3MtMic6IGNhc2UgJ3V0ZjE2bGUnOiBjYXNlICd1dGYtMTZsZSc6IGNhc2UgJ3Jhdyc6IHJldHVybiB0cnVlO1xuICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICAgfVxuXG5cbmZ1bmN0aW9uIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIH1cbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLiBDRVNVLTggaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZSBVVEYtOCBlbmNvZGluZy5cbi8vXG4vLyBAVE9ETyBIYW5kbGluZyBhbGwgZW5jb2RpbmdzIGluc2lkZSBhIHNpbmdsZSBvYmplY3QgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHRcbi8vIHRvIHJlYXNvbiBhYm91dCB0aGlzIGNvZGUsIHNvIGl0IHNob3VsZCBiZSBzcGxpdCB1cCBpbiB0aGUgZnV0dXJlLlxuLy8gQFRPRE8gVGhlcmUgc2hvdWxkIGJlIGEgdXRmOC1zdHJpY3QgZW5jb2RpbmcgdGhhdCByZWplY3RzIGludmFsaWQgVVRGLTggY29kZVxuLy8gcG9pbnRzIGFzIHVzZWQgYnkgQ0VTVS04LlxudmFyIFN0cmluZ0RlY29kZXIgPSBleHBvcnRzLlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5vdWdoIHNwYWNlIHRvIHN0b3JlIGFsbCBieXRlcyBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuIFVURi04IG5lZWRzIDRcbiAgLy8gYnl0ZXMsIGJ1dCBDRVNVLTggbWF5IHJlcXVpcmUgdXAgdG8gNiAoMyBieXRlcyBwZXIgc3Vycm9nYXRlKS5cbiAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IDA7XG4gIC8vIE51bWJlciBvZiBieXRlcyBleHBlY3RlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyTGVuZ3RoID0gMDtcbn07XG5cblxuLy8gd3JpdGUgZGVjb2RlcyB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0IGFzIEpTIHN0cmluZyB0aGF0IGlzXG4vLyBndWFyYW50ZWVkIHRvIG5vdCBjb250YWluIGFueSBwYXJ0aWFsIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gQW55IHBhcnRpYWxcbi8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgYnVmZmVyZWQgdXAsIGFuZCB3aWxsIGJlXG4vLyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgd3JpdGUgYWdhaW4gd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzLlxuLy9cbi8vIE5vdGU6IENvbnZlcnRpbmcgYSBCdWZmZXIgY29udGFpbmluZyBhbiBvcnBoYW4gc3Vycm9nYXRlIHRvIGEgU3RyaW5nXG4vLyBjdXJyZW50bHkgd29ya3MsIGJ1dCBjb252ZXJ0aW5nIGEgU3RyaW5nIHRvIGEgQnVmZmVyICh2aWEgYG5ldyBCdWZmZXJgLCBvclxuLy8gQnVmZmVyI3dyaXRlKSB3aWxsIHJlcGxhY2UgaW5jb21wbGV0ZSBzdXJyb2dhdGVzIHdpdGggdGhlIHVuaWNvZGVcbi8vIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4gU2VlIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMTIxMTczMDA5LyAuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgY2hhclN0ciA9ICcnO1xuICAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgIHZhciBhdmFpbGFibGUgPSAoYnVmZmVyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCkgP1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6XG4gICAgICAgIGJ1ZmZlci5sZW5ndGg7XG5cbiAgICAvLyBhZGQgdGhlIG5ldyBieXRlcyB0byB0aGUgY2hhciBidWZmZXJcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IGF2YWlsYWJsZTtcblxuICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgLy8gc3RpbGwgbm90IGVub3VnaCBjaGFycyBpbiB0aGlzIGJ1ZmZlcj8gd2FpdCBmb3IgbW9yZSAuLi5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXJcbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoYXZhaWxhYmxlLCBidWZmZXIubGVuZ3RoKTtcblxuICAgIC8vIGdldCB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHNwbGl0XG4gICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xuXG4gICAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoYXJTdHI7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIGFuZCBzZXQgY2hhckxlbmd0aCAvIGNoYXJSZWNlaXZlZFxuICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcik7XG5cbiAgdmFyIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG4gIGlmICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBidWZmZXIgdGhlIGluY29tcGxldGUgY2hhcmFjdGVyIGJ5dGVzIHdlIGdvdFxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkLCBlbmQpO1xuICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgfVxuXG4gIGNoYXJTdHIgKz0gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIGVuZCk7XG5cbiAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTtcbiAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGVuZCk7XG4gIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBzaXplO1xuICAgIHRoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgc2l6ZSwgMCwgc2l6ZSk7XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCAwLCBzaXplKTtcbiAgICByZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgfVxuXG4gIC8vIG9yIGp1c3QgZW1pdCB0aGUgY2hhclN0clxuICByZXR1cm4gY2hhclN0cjtcbn07XG5cbi8vIGRldGVjdEluY29tcGxldGVDaGFyIGRldGVybWluZXMgaWYgdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXIgYXRcbi8vIHRoZSBlbmQgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gSWYgc28sIGl0IHNldHMgdGhpcy5jaGFyTGVuZ3RoIHRvIHRoZSBieXRlXG4vLyBsZW5ndGggdGhhdCBjaGFyYWN0ZXIsIGFuZCBzZXRzIHRoaXMuY2hhclJlY2VpdmVkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXNcbi8vIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGFyYWN0ZXIuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gMykgPyAzIDogYnVmZmVyLmxlbmd0aDtcblxuICAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gIC8vIGluY29tcGxldGUgY2hhci5cbiAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07XG5cbiAgICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuXG4gICAgLy8gMTEwWFhYWFhcbiAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMFhYWFhcbiAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMTBYWFhcbiAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gaTtcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgcmVzID0gJyc7XG4gIGlmIChidWZmZXIgJiYgYnVmZmVyLmxlbmd0aClcbiAgICByZXMgPSB0aGlzLndyaXRlKGJ1ZmZlcik7XG5cbiAgaWYgKHRoaXMuY2hhclJlY2VpdmVkKSB7XG4gICAgdmFyIGNyID0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjtcbiAgICB2YXIgZW5jID0gdGhpcy5lbmNvZGluZztcbiAgICByZXMgKz0gYnVmLnNsaWNlKDAsIGNyKS50b1N0cmluZyhlbmMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIHBhc3NUaHJvdWdoV3JpdGUoYnVmZmVyKSB7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAzO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDMgOiAwO1xufVxuIiwiLyohXG4gKiBzdHJpcC1jb21tZW50cyA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvc3RyaXAtY29tbWVudHM+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IEpvbiBTY2hsaW5rZXJ0LCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpYyc7XG5cbnZhciByZUJsb2NrID0gJ1xcXFwvXFxcXConO1xudmFyIHJlQmxvY2tJZ25vcmUgPSAnXFxcXC9cXFxcKig/IVxcXFwqP1xcXFwhKSc7XG52YXIgcmVCbG9ja0VuZCA9ICcoLnxbXFxcXHJcXFxcbl18XFxcXG4pKj9cXFxcKlxcXFwvXFxcXG4/XFxcXG4/JztcbnZhciByZUxpbmUgPSAvKF58W15cXFNcXG5dKSg/OlxcL1xcLykoW1xcc1xcU10rPykkL2dtO1xudmFyIHJlTGluZUlnbm9yZSA9IC8oXnxbXlxcU1xcbl0pKD86XFwvXFwvW14hXSkoW1xcc1xcU10rPykkL2dtO1xuXG5cbi8qKlxuICogU3RyaXAgYWxsIGNvbW1lbnRzXG4gKlxuICogeyU9IGRvY3MoXCJzdHJpcFwiKSAlfVxuICpcbiAqIEBwYXJhbSAgIHtTdHJpbmd9IGBzdHJgICBmaWxlIGNvbnRlbnRzIG9yIHN0cmluZyB0byBzdHJpcC5cbiAqIEBwYXJhbSAgIHtPYmplY3R9IGBvcHRzYCAgb3B0aW9ucyBhcmUgcGFzc2VkIHRvIGAuYmxvY2tgLCBhbmQgYC5saW5lYFxuICogQHJldHVybiAge1N0cmluZ30gU3RyaW5nIHdpdGhvdXQgY29tbWVudHMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnZhciBzdHJpcCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3RyLCBvcHRzKSB7XG4gIHJldHVybiBzdHIgPyBzdHJpcC5ibG9jayhzdHJpcC5saW5lKHN0ciwgb3B0cyksIG9wdHMpIDogJyc7XG59O1xuXG5cbi8qKlxuICogU3RyaXAgb25seSBibG9jayBjb21tZW50cywgb3B0aW9uYWxseSBsZWF2aW5nIHByb3RlY3RlZCBjb21tZW50c1xuICogKGUuZy4gYC8qIWApIGludGFjdC5cbiAqXG4gKiB7JT0gZG9jcyhcImJsb2NrXCIpICV9XG4gKlxuICogQHBhcmFtICAge1N0cmluZ30gYHN0cmAgIGZpbGUgY29udGVudCBvciBzdHJpbmcgdG8gc3RyaXAgdG9cbiAqIEBwYXJhbSAgIHtPYmplY3R9IGBvcHRzYCAgaWYgYHNhZmU6dHJ1ZWAsIHN0cmlwIG9ubHkgY29tbWVudHMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBgLyohYCBvciBgLyoqIWBcbiAqIEByZXR1cm4gIHtTdHJpbmd9IFN0cmluZyB3aXRob3V0IGJsb2NrIGNvbW1lbnRzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5zdHJpcC5ibG9jayA9IGZ1bmN0aW9uKHN0ciwgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgdmFyIHJlID0gbmV3IFJlZ0V4cChyZUJsb2NrICsgcmVCbG9ja0VuZCwgJ2dtJyk7XG4gIGlmKG9wdHMuc2FmZSkge1xuICAgIHJlID0gbmV3IFJlZ0V4cChyZUJsb2NrSWdub3JlICsgcmVCbG9ja0VuZCwgJ2dtJyk7XG4gIH1cbiAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKHJlLCAnJykgOiAnJztcbn07XG5cblxuLyoqXG4gKiBTdHJpcCBvbmx5IGxpbmUgY29tbWVudHNcbiAqXG4gKiB7JT0gZG9jcyhcImxpbmVcIikgJX1cbiAqXG4gKiBAcGFyYW0gICB7U3RyaW5nfSBgc3RyYCAgZmlsZSBjb250ZW50IG9yIHN0cmluZyB0byBzdHJpcCB0b1xuICogQHBhcmFtICAge09iamVjdH0gYG9wdHNgICBpZiBgc2FmZTp0cnVlYCwgc3RyaXAgYWxsIHRoYXQgbm90IHN0YXJ0cyB3aXRoIGAvLyFgXG4gKiBAcmV0dXJuICB7U3RyaW5nfSBTdHJpbmcgd2l0aG91dCBsaW5lIGNvbW1lbnRzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5zdHJpcC5saW5lID0gZnVuY3Rpb24oc3RyLCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB2YXIgcmUgPSByZUxpbmU7XG4gIGlmKG9wdHMuc2FmZSkge1xuICAgIHJlID0gcmVMaW5lSWdub3JlO1xuICB9XG4gIHJldHVybiBzdHIgPyBzdHIucmVwbGFjZShyZSwgJycpIDogJyc7XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RvcG9qc29uL3RvcG9qc29uLWNsaWVudCBWZXJzaW9uIDIuMS4wLiBDb3B5cmlnaHQgMjAxNiBNaWtlIEJvc3RvY2suXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChmYWN0b3J5KChnbG9iYWwudG9wb2pzb24gPSBnbG9iYWwudG9wb2pzb24gfHwge30pKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbnZhciByZXZlcnNlID0gZnVuY3Rpb24oYXJyYXksIG4pIHtcbiAgdmFyIHQsIGogPSBhcnJheS5sZW5ndGgsIGkgPSBqIC0gbjtcbiAgd2hpbGUgKGkgPCAtLWopIHQgPSBhcnJheVtpXSwgYXJyYXlbaSsrXSA9IGFycmF5W2pdLCBhcnJheVtqXSA9IHQ7XG59O1xuXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4O1xufTtcblxudmFyIHRyYW5zZm9ybSA9IGZ1bmN0aW9uKHRvcG9sb2d5KSB7XG4gIGlmICgodHJhbnNmb3JtID0gdG9wb2xvZ3kudHJhbnNmb3JtKSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHk7XG4gIHZhciB0cmFuc2Zvcm0sXG4gICAgICB4MCxcbiAgICAgIHkwLFxuICAgICAga3ggPSB0cmFuc2Zvcm0uc2NhbGVbMF0sXG4gICAgICBreSA9IHRyYW5zZm9ybS5zY2FsZVsxXSxcbiAgICAgIGR4ID0gdHJhbnNmb3JtLnRyYW5zbGF0ZVswXSxcbiAgICAgIGR5ID0gdHJhbnNmb3JtLnRyYW5zbGF0ZVsxXTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHBvaW50LCBpKSB7XG4gICAgaWYgKCFpKSB4MCA9IHkwID0gMDtcbiAgICBwb2ludFswXSA9ICh4MCArPSBwb2ludFswXSkgKiBreCArIGR4O1xuICAgIHBvaW50WzFdID0gKHkwICs9IHBvaW50WzFdKSAqIGt5ICsgZHk7XG4gICAgcmV0dXJuIHBvaW50O1xuICB9O1xufTtcblxudmFyIGZlYXR1cmUgPSBmdW5jdGlvbih0b3BvbG9neSwgbykge1xuICByZXR1cm4gby50eXBlID09PSBcIkdlb21ldHJ5Q29sbGVjdGlvblwiXG4gICAgICA/IHt0eXBlOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsIGZlYXR1cmVzOiBvLmdlb21ldHJpZXMubWFwKGZ1bmN0aW9uKG8pIHsgcmV0dXJuIGZlYXR1cmUkMSh0b3BvbG9neSwgbyk7IH0pfVxuICAgICAgOiBmZWF0dXJlJDEodG9wb2xvZ3ksIG8pO1xufTtcblxuZnVuY3Rpb24gZmVhdHVyZSQxKHRvcG9sb2d5LCBvKSB7XG4gIHZhciBpZCA9IG8uaWQsXG4gICAgICBiYm94ID0gby5iYm94LFxuICAgICAgcHJvcGVydGllcyA9IG8ucHJvcGVydGllcyA9PSBudWxsID8ge30gOiBvLnByb3BlcnRpZXMsXG4gICAgICBnZW9tZXRyeSA9IG9iamVjdCh0b3BvbG9neSwgbyk7XG4gIHJldHVybiBpZCA9PSBudWxsICYmIGJib3ggPT0gbnVsbCA/IHt0eXBlOiBcIkZlYXR1cmVcIiwgcHJvcGVydGllczogcHJvcGVydGllcywgZ2VvbWV0cnk6IGdlb21ldHJ5fVxuICAgICAgOiBiYm94ID09IG51bGwgPyB7dHlwZTogXCJGZWF0dXJlXCIsIGlkOiBpZCwgcHJvcGVydGllczogcHJvcGVydGllcywgZ2VvbWV0cnk6IGdlb21ldHJ5fVxuICAgICAgOiB7dHlwZTogXCJGZWF0dXJlXCIsIGlkOiBpZCwgYmJveDogYmJveCwgcHJvcGVydGllczogcHJvcGVydGllcywgZ2VvbWV0cnk6IGdlb21ldHJ5fTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0KHRvcG9sb2d5LCBvKSB7XG4gIHZhciB0cmFuc2Zvcm1Qb2ludCA9IHRyYW5zZm9ybSh0b3BvbG9neSksXG4gICAgICBhcmNzID0gdG9wb2xvZ3kuYXJjcztcblxuICBmdW5jdGlvbiBhcmMoaSwgcG9pbnRzKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGgpIHBvaW50cy5wb3AoKTtcbiAgICBmb3IgKHZhciBhID0gYXJjc1tpIDwgMCA/IH5pIDogaV0sIGsgPSAwLCBuID0gYS5sZW5ndGg7IGsgPCBuOyArK2spIHtcbiAgICAgIHBvaW50cy5wdXNoKHRyYW5zZm9ybVBvaW50KGFba10uc2xpY2UoKSwgaykpO1xuICAgIH1cbiAgICBpZiAoaSA8IDApIHJldmVyc2UocG9pbnRzLCBuKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvaW50KHApIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtUG9pbnQocC5zbGljZSgpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpbmUoYXJjcykge1xuICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFyY3MubGVuZ3RoOyBpIDwgbjsgKytpKSBhcmMoYXJjc1tpXSwgcG9pbnRzKTtcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpIHBvaW50cy5wdXNoKHBvaW50c1swXS5zbGljZSgpKTtcbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG5cbiAgZnVuY3Rpb24gcmluZyhhcmNzKSB7XG4gICAgdmFyIHBvaW50cyA9IGxpbmUoYXJjcyk7XG4gICAgd2hpbGUgKHBvaW50cy5sZW5ndGggPCA0KSBwb2ludHMucHVzaChwb2ludHNbMF0uc2xpY2UoKSk7XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvbHlnb24oYXJjcykge1xuICAgIHJldHVybiBhcmNzLm1hcChyaW5nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlb21ldHJ5KG8pIHtcbiAgICB2YXIgdHlwZSA9IG8udHlwZSwgY29vcmRpbmF0ZXM7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiR2VvbWV0cnlDb2xsZWN0aW9uXCI6IHJldHVybiB7dHlwZTogdHlwZSwgZ2VvbWV0cmllczogby5nZW9tZXRyaWVzLm1hcChnZW9tZXRyeSl9O1xuICAgICAgY2FzZSBcIlBvaW50XCI6IGNvb3JkaW5hdGVzID0gcG9pbnQoby5jb29yZGluYXRlcyk7IGJyZWFrO1xuICAgICAgY2FzZSBcIk11bHRpUG9pbnRcIjogY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLm1hcChwb2ludCk7IGJyZWFrO1xuICAgICAgY2FzZSBcIkxpbmVTdHJpbmdcIjogY29vcmRpbmF0ZXMgPSBsaW5lKG8uYXJjcyk7IGJyZWFrO1xuICAgICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOiBjb29yZGluYXRlcyA9IG8uYXJjcy5tYXAobGluZSk7IGJyZWFrO1xuICAgICAgY2FzZSBcIlBvbHlnb25cIjogY29vcmRpbmF0ZXMgPSBwb2x5Z29uKG8uYXJjcyk7IGJyZWFrO1xuICAgICAgY2FzZSBcIk11bHRpUG9seWdvblwiOiBjb29yZGluYXRlcyA9IG8uYXJjcy5tYXAocG9seWdvbik7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7dHlwZTogdHlwZSwgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzfTtcbiAgfVxuXG4gIHJldHVybiBnZW9tZXRyeShvKTtcbn1cblxuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIGJib3h9IGZyb20gXCIuL3NyYy9iYm94XCI7XG5cbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBtZXNoLCBtZXNoQXJjc30gZnJvbSBcIi4vc3JjL21lc2hcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBtZXJnZSwgbWVyZ2VBcmNzfSBmcm9tIFwiLi9zcmMvbWVyZ2VcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBuZWlnaGJvcnN9IGZyb20gXCIuL3NyYy9uZWlnaGJvcnNcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBxdWFudGl6ZX0gZnJvbSBcIi4vc3JjL3F1YW50aXplXCI7XG4vLyBleHBvcnQge2RlZmF1bHQgYXMgdHJhbnNmb3JtfSBmcm9tIFwiLi9zcmMvdHJhbnNmb3JtXCI7XG4vLyBleHBvcnQge2RlZmF1bHQgYXMgdW50cmFuc2Zvcm19IGZyb20gXCIuL3NyYy91bnRyYW5zZm9ybVwiO1xuXG5leHBvcnRzLmZlYXR1cmUgPSBmZWF0dXJlO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuIiwiXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGVwcmVjYXRlO1xuXG4vKipcbiAqIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2Uubm9EZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudGhyb3dEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCB0aHJvdyBhbiBFcnJvciB3aGVuIGludm9rZWQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50cmFjZURlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIGludm9rZSBgY29uc29sZS50cmFjZSgpYCBpbnN0ZWFkIG9mIGBjb25zb2xlLmVycm9yKClgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdGhlIGZ1bmN0aW9uIHRvIGRlcHJlY2F0ZVxuICogQHBhcmFtIHtTdHJpbmd9IG1zZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQgdG8gdGhlIGNvbnNvbGUgd2hlbiBgZm5gIGlzIGludm9rZWRcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBuZXcgXCJkZXByZWNhdGVkXCIgdmVyc2lvbiBvZiBgZm5gXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZSAoZm4sIG1zZykge1xuICBpZiAoY29uZmlnKCdub0RlcHJlY2F0aW9uJykpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChjb25maWcoJ3Rocm93RGVwcmVjYXRpb24nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnKCd0cmFjZURlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBgbG9jYWxTdG9yYWdlYCBmb3IgYm9vbGVhbiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBgbmFtZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29uZmlnIChuYW1lKSB7XG4gIC8vIGFjY2Vzc2luZyBnbG9iYWwubG9jYWxTdG9yYWdlIGNhbiB0cmlnZ2VyIGEgRE9NRXhjZXB0aW9uIGluIHNhbmRib3hlZCBpZnJhbWVzXG4gIHRyeSB7XG4gICAgaWYgKCFnbG9iYWwubG9jYWxTdG9yYWdlKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHZhbCA9IGdsb2JhbC5sb2NhbFN0b3JhZ2VbbmFtZV07XG4gIGlmIChudWxsID09IHZhbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWxheWVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZShwYmYsIGVuZCkge1xuICAgIHRoaXMubGF5ZXJzID0gcGJmLnJlYWRGaWVsZHMocmVhZFRpbGUsIHt9LCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkVGlsZSh0YWcsIGxheWVycywgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICB2YXIgbGF5ZXIgPSBuZXcgVmVjdG9yVGlsZUxheWVyKHBiZiwgcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MpO1xuICAgICAgICBpZiAobGF5ZXIubGVuZ3RoKSBsYXllcnNbbGF5ZXIubmFtZV0gPSBsYXllcjtcbiAgICB9XG59XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlRmVhdHVyZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUZlYXR1cmUocGJmLCBlbmQsIGV4dGVudCwga2V5cywgdmFsdWVzKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0ge307XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQ7XG4gICAgdGhpcy50eXBlID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fZ2VvbWV0cnkgPSAtMTtcbiAgICB0aGlzLl9rZXlzID0ga2V5cztcbiAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkRmVhdHVyZSwgdGhpcywgZW5kKTtcbn1cblxuZnVuY3Rpb24gcmVhZEZlYXR1cmUodGFnLCBmZWF0dXJlLCBwYmYpIHtcbiAgICBpZiAodGFnID09IDEpIGZlYXR1cmUuX2lkID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMikgcmVhZFRhZyhwYmYsIGZlYXR1cmUpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAzKSBmZWF0dXJlLnR5cGUgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSA0KSBmZWF0dXJlLl9nZW9tZXRyeSA9IHBiZi5wb3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWcocGJmLCBmZWF0dXJlKSB7XG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIGtleSA9IGZlYXR1cmUuX2tleXNbcGJmLnJlYWRWYXJpbnQoKV0sXG4gICAgICAgICAgICB2YWx1ZSA9IGZlYXR1cmUuX3ZhbHVlc1twYmYucmVhZFZhcmludCgpXTtcbiAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG59XG5cblZlY3RvclRpbGVGZWF0dXJlLnR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgbGluZXMgPSBbXSxcbiAgICAgICAgbGluZTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgY21kTGVuID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcbiAgICAgICAgICAgIGxlbmd0aCA9IGNtZExlbiA+PiAzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVuZ3RoLS07XG5cbiAgICAgICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcbiAgICAgICAgICAgIHggKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICB5ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuXG4gICAgICAgICAgICBpZiAoY21kID09PSAxKSB7IC8vIG1vdmVUb1xuICAgICAgICAgICAgICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGluZS5wdXNoKG5ldyBQb2ludCh4LCB5KSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgPT09IDcpIHtcbiAgICAgICAgICAgIGxpbmUucHVzaChsaW5lWzBdLmNsb25lKCkpOyAvLyBjbG9zZVBvbHlnb25cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcblxuICAgIHJldHVybiBsaW5lcztcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5iYm94ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgeDEgPSBJbmZpbml0eSxcbiAgICAgICAgeDIgPSAtSW5maW5pdHksXG4gICAgICAgIHkxID0gSW5maW5pdHksXG4gICAgICAgIHkyID0gLUluZmluaXR5O1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICBpZiAoeCA8IHgxKSB4MSA9IHg7XG4gICAgICAgICAgICBpZiAoeCA+IHgyKSB4MiA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IHkxKSB5MSA9IHk7XG4gICAgICAgICAgICBpZiAoeSA+IHkyKSB5MiA9IHk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgIT09IDcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml07XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICAgIHZhciBzaXplID0gdGhpcy5leHRlbnQgKiBNYXRoLnBvdygyLCB6KSxcbiAgICAgICAgeDAgPSB0aGlzLmV4dGVudCAqIHgsXG4gICAgICAgIHkwID0gdGhpcy5leHRlbnQgKiB5LFxuICAgICAgICBjb29yZHMgPSB0aGlzLmxvYWRHZW9tZXRyeSgpLFxuICAgICAgICB0eXBlID0gVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbdGhpcy50eXBlXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gY29vcmRzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBwID0gbGluZVtqXSwgeTIgPSAxODAgLSAocC55ICsgeTApICogMzYwIC8gc2l6ZTtcbiAgICAgICAgICAgIGxpbmVbal0gPSBbXG4gICAgICAgICAgICAgICAgKHAueCArIHgwKSAqIDM2MCAvIHNpemUgLSAxODAsXG4gICAgICAgICAgICAgICAgMzYwIC8gTWF0aC5QSSAqIE1hdGguYXRhbihNYXRoLmV4cCh5MiAqIE1hdGguUEkgLyAxODApKSAtIDkwXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgJiYgY29vcmRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb29yZHMgPSBjb29yZHNbMF1bMF07XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXTtcbiAgICAgICAgdHlwZSA9ICdNdWx0aVBvaW50JztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJyAmJiBjb29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICB0eXBlID0gJ011bHRpTGluZVN0cmluZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3Jkc1xuICAgICAgICB9LFxuICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXNcbiAgICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlZmVhdHVyZS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVMYXllcjtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUxheWVyKHBiZiwgZW5kKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy52ZXJzaW9uID0gMTtcbiAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgIHRoaXMuZXh0ZW50ID0gNDA5NjtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICB0aGlzLl9mZWF0dXJlcyA9IFtdO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZExheWVyLCB0aGlzLCBlbmQpO1xuXG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLl9mZWF0dXJlcy5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRMYXllcih0YWcsIGxheWVyLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxNSkgbGF5ZXIudmVyc2lvbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAxKSBsYXllci5uYW1lID0gcGJmLnJlYWRTdHJpbmcoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGxheWVyLmV4dGVudCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBsYXllci5fZmVhdHVyZXMucHVzaChwYmYucG9zKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDMpIGxheWVyLl9rZXlzLnB1c2gocGJmLnJlYWRTdHJpbmcoKSk7XG4gICAgZWxzZSBpZiAodGFnID09PSA0KSBsYXllci5fdmFsdWVzLnB1c2gocmVhZFZhbHVlTWVzc2FnZShwYmYpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhbHVlTWVzc2FnZShwYmYpIHtcbiAgICB2YXIgdmFsdWUgPSBudWxsLFxuICAgICAgICBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciB0YWcgPSBwYmYucmVhZFZhcmludCgpID4+IDM7XG5cbiAgICAgICAgdmFsdWUgPSB0YWcgPT09IDEgPyBwYmYucmVhZFN0cmluZygpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMiA/IHBiZi5yZWFkRmxvYXQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDMgPyBwYmYucmVhZERvdWJsZSgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNCA/IHBiZi5yZWFkVmFyaW50NjQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDUgPyBwYmYucmVhZFZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNiA/IHBiZi5yZWFkU1ZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNyA/IHBiZi5yZWFkQm9vbGVhbigpIDogbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIHJldHVybiBmZWF0dXJlIGBpYCBmcm9tIHRoaXMgbGF5ZXIgYXMgYSBgVmVjdG9yVGlsZUZlYXR1cmVgXG5WZWN0b3JUaWxlTGF5ZXIucHJvdG90eXBlLmZlYXR1cmUgPSBmdW5jdGlvbihpKSB7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2ZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kcycpO1xuXG4gICAgdGhpcy5fcGJmLnBvcyA9IHRoaXMuX2ZlYXR1cmVzW2ldO1xuXG4gICAgdmFyIGVuZCA9IHRoaXMuX3BiZi5yZWFkVmFyaW50KCkgKyB0aGlzLl9wYmYucG9zO1xuICAgIHJldHVybiBuZXcgVmVjdG9yVGlsZUZlYXR1cmUodGhpcy5fcGJmLCBlbmQsIHRoaXMuZXh0ZW50LCB0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMpO1xufTtcbiIsIi8vIEdlb21ldHJ5IGJ1aWxkaW5nIGZ1bmN0aW9uc1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5leHBvcnQgY29uc3QgdGlsZV9ib3VuZHMgPSBbXG4gICAgeyB4OiAwLCB5OiAwfSxcbiAgICB7IHg6IEdlby50aWxlX3NjYWxlLCB5OiAtR2VvLnRpbGVfc2NhbGUgfSAvLyBUT0RPOiBjb3JyZWN0IGZvciBmbGlwcGVkIHktYXhpcz9cbl07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0X3V2cyA9IFswLCAwLCAxLCAxXTtcblxuLy8gVGVzdHMgaWYgYSBsaW5lIHNlZ21lbnQgKGZyb20gcG9pbnQgQSB0byBCKSBpcyBvdXRzaWRlIHRoZSB0aWxlIGJvdW5kc1xuLy8gKHdpdGhpbiBhIGNlcnRhaW4gdG9sZXJhbmNlIHRvIGFjY291bnQgZm9yIGdlb21ldHJ5IG5lYXJseSBvbiB0aWxlIGVkZ2VzKVxuZXhwb3J0IGZ1bmN0aW9uIG91dHNpZGVUaWxlIChfYSwgX2IsIHRvbGVyYW5jZSkge1xuICAgIGxldCB0aWxlX21pbiA9IHRpbGVfYm91bmRzWzBdO1xuICAgIGxldCB0aWxlX21heCA9IHRpbGVfYm91bmRzWzFdO1xuXG4gICAgLy8gVE9ETzogZml4IGZsaXBwZWQgWSBjb29yZHMgaGVyZSwgY29uZnVzaW5nIHdpdGggJ21heCcgcmVmZXJlbmNlXG4gICAgaWYgKChfYVswXSA8PSB0aWxlX21pbi54ICsgdG9sZXJhbmNlICYmIF9iWzBdIDw9IHRpbGVfbWluLnggKyB0b2xlcmFuY2UpIHx8XG4gICAgICAgIChfYVswXSA+PSB0aWxlX21heC54IC0gdG9sZXJhbmNlICYmIF9iWzBdID49IHRpbGVfbWF4LnggLSB0b2xlcmFuY2UpIHx8XG4gICAgICAgIChfYVsxXSA+PSB0aWxlX21pbi55IC0gdG9sZXJhbmNlICYmIF9iWzFdID49IHRpbGVfbWluLnkgLSB0b2xlcmFuY2UpIHx8XG4gICAgICAgIChfYVsxXSA8PSB0aWxlX21heC55ICsgdG9sZXJhbmNlICYmIF9iWzFdIDw9IHRpbGVfbWF4LnkgKyB0b2xlcmFuY2UpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29vcmRPdXRzaWRlVGlsZSAoY29vcmQsIHRvbGVyYW5jZSkge1xuICAgIHRvbGVyYW5jZSA9IHRvbGVyYW5jZSB8fCAwO1xuICAgIGxldCB0aWxlX21pbiA9IHRpbGVfYm91bmRzWzBdO1xuICAgIGxldCB0aWxlX21heCA9IHRpbGVfYm91bmRzWzFdO1xuXG4gICAgcmV0dXJuIGNvb3JkWzBdIDw9IHRpbGVfbWluLnggKyB0b2xlcmFuY2UgfHxcbiAgICAgICAgICAgY29vcmRbMF0gPj0gdGlsZV9tYXgueCAtIHRvbGVyYW5jZSB8fFxuICAgICAgICAgICBjb29yZFsxXSA+PSB0aWxlX21pbi55IC0gdG9sZXJhbmNlIHx8XG4gICAgICAgICAgIGNvb3JkWzFdIDw9IHRpbGVfbWF4LnkgKyB0b2xlcmFuY2U7XG59XG4iLCIvLyBQb2ludCBidWlsZGVyc1xuaW1wb3J0IHsgZGVmYXVsdF91dnMgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8vIEJ1aWxkIGEgYmlsbGJvYXJkIHNwcml0ZSBxdWFkIGNlbnRlcmVkIG9uIGEgcG9pbnQuIFNwcml0ZXMgYXJlIGludGVuZGVkIHRvIGJlIGRyYXduIGluIHNjcmVlbnNwYWNlLCBhbmQgaGF2ZVxuLy8gcHJvcGVydGllcyBmb3Igd2lkdGgsIGhlaWdodCwgYW5nbGUsIGFuZCBhIHNjYWxlIGZhY3RvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVycG9sYXRlIHRoZSBzY3JlZW5zcGFjZSBzaXplXG4vLyBvZiBhIHNwcml0ZSBiZXR3ZWVuIHR3byB6b29tIGxldmVscy5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFF1YWRzRm9yUG9pbnRzIChwb2ludHMsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgeyB0ZXhjb29yZF9pbmRleCwgcG9zaXRpb25faW5kZXgsIHNoYXBlX2luZGV4LCBvZmZzZXRfaW5kZXggfSxcbiAgICB7IHF1YWQsIHF1YWRfbm9ybWFsaXplLCBvZmZzZXQsIGFuZ2xlLCBzaGFwZV93LCB0ZXhjb29yZF9zY2FsZSwgdGV4Y29vcmRfbm9ybWFsaXplIH0pIHtcbiAgICBxdWFkX25vcm1hbGl6ZSA9IHF1YWRfbm9ybWFsaXplIHx8IDE7XG4gICAgbGV0IHcyID0gcXVhZFswXSAvIDIgKiBxdWFkX25vcm1hbGl6ZTtcbiAgICBsZXQgaDIgPSBxdWFkWzFdIC8gMiAqIHF1YWRfbm9ybWFsaXplO1xuICAgIGxldCBzY2FsaW5nID0gW1xuICAgICAgICBbLXcyLCAtaDJdLFxuICAgICAgICBbdzIsIC1oMl0sXG4gICAgICAgIFt3MiwgaDJdLFxuICAgICAgICBbLXcyLCBoMl1cbiAgICBdO1xuXG4gICAgbGV0IHZlcnRleF9lbGVtZW50cyA9IHZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcbiAgICBsZXQgZWxlbWVudF9vZmZzZXQgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICBsZXQgdGV4Y29vcmRzO1xuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgMTtcblxuICAgICAgICB2YXIgW21pbl91LCBtaW5fdiwgbWF4X3UsIG1heF92XSA9IHRleGNvb3JkX3NjYWxlIHx8IGRlZmF1bHRfdXZzO1xuICAgICAgICB0ZXhjb29yZHMgPSBbXG4gICAgICAgICAgICBbbWluX3UsIG1pbl92XSxcbiAgICAgICAgICAgIFttYXhfdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtYXhfdl0sXG4gICAgICAgICAgICBbbWluX3UsIG1heF92XVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGxldCBudW1fcG9pbnRzID0gcG9pbnRzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBwPTA7IHAgPCBudW1fcG9pbnRzOyBwKyspIHtcbiAgICAgICAgbGV0IHBvaW50ID0gcG9pbnRzW3BdO1xuXG4gICAgICAgIGZvciAobGV0IHBvcz0wOyBwb3MgPCA0OyBwb3MrKykge1xuICAgICAgICAgICAgLy8gQWRkIHRleGNvb3Jkc1xuICAgICAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMF0gPSB0ZXhjb29yZHNbcG9zXVswXSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAxXSA9IHRleGNvb3Jkc1twb3NdWzFdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbcG9zaXRpb25faW5kZXggKyAwXSA9IHBvaW50WzBdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3Bvc2l0aW9uX2luZGV4ICsgMV0gPSBwb2ludFsxXTtcblxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3NoYXBlX2luZGV4ICsgMF0gPSBzY2FsaW5nW3Bvc11bMF07XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAxXSA9IHNjYWxpbmdbcG9zXVsxXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDJdID0gYW5nbGU7XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAzXSA9IHNoYXBlX3c7XG5cbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtvZmZzZXRfaW5kZXggKyAwXSA9IG9mZnNldFswXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtvZmZzZXRfaW5kZXggKyAxXSA9IG9mZnNldFsxXTtcblxuICAgICAgICAgICAgdmVydGV4X2RhdGEuYWRkVmVydGV4KHZlcnRleF90ZW1wbGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDEpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDMpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuXG4gICAgICAgIGVsZW1lbnRfb2Zmc2V0ICs9IDQ7XG4gICAgfVxufVxuIiwiLy8gUG9seWdvbiBidWlsZGVyc1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuLi92ZWN0b3InO1xuaW1wb3J0IHsgZGVmYXVsdF91dnMsIG91dHNpZGVUaWxlIH0gZnJvbSAnLi9jb21tb24nO1xuXG5pbXBvcnQgZWFyY3V0IGZyb20gJ2VhcmN1dCc7XG5cbmNvbnN0IHVwX3ZlYzMgPSBbMCwgMCwgMV07XG5cbi8vIFRlc3NlbGF0ZSBhIGZsYXQgMkQgcG9seWdvblxuLy8geCAmIHkgY29vcmRpbmF0ZXMgd2lsbCBiZSBzZXQgYXMgZmlyc3QgdHdvIGVsZW1lbnRzIG9mIHByb3ZpZGVkIHZlcnRleF90ZW1wbGF0ZVxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9seWdvbnMgKFxuICAgIHBvbHlnb25zLFxuICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgeyB0ZXhjb29yZF9pbmRleCwgdGV4Y29vcmRfc2NhbGUsIHRleGNvb3JkX25vcm1hbGl6ZSB9KSB7XG5cbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gdmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuXG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCAxO1xuICAgICAgICB2YXIgW21pbl91LCBtaW5fdiwgbWF4X3UsIG1heF92XSA9IHRleGNvb3JkX3NjYWxlIHx8IGRlZmF1bHRfdXZzO1xuICAgIH1cblxuICAgIHZhciBudW1fcG9seWdvbnMgPSBwb2x5Z29ucy5sZW5ndGg7XG4gICAgZm9yICh2YXIgcD0wOyBwIDwgbnVtX3BvbHlnb25zOyBwKyspIHtcbiAgICAgICAgdmFyIGVsZW1lbnRfb2Zmc2V0ID0gdmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuXG4gICAgICAgIHZhciBwb2x5Z29uID0gcG9seWdvbnNbcF07XG5cbiAgICAgICAgLy8gRmluZCBwb2x5Z29uIGV4dGVudHMgdG8gY2FsY3VsYXRlIFVWcywgZml0IHRoZW0gdG8gdGhlIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3hcbiAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICB2YXIgW21pbl94LCBtaW5feSwgbWF4X3gsIG1heF95XSA9IEdlby5maW5kQm91bmRpbmdCb3gocG9seWdvbik7XG4gICAgICAgICAgICB2YXIgc3Bhbl94ID0gbWF4X3ggLSBtaW5feDtcbiAgICAgICAgICAgIHZhciBzcGFuX3kgPSBtYXhfeSAtIG1pbl95O1xuICAgICAgICAgICAgdmFyIHNjYWxlX3UgPSAobWF4X3UgLSBtaW5fdSkgLyBzcGFuX3g7XG4gICAgICAgICAgICB2YXIgc2NhbGVfdiA9IChtYXhfdiAtIG1pbl92KSAvIHNwYW5feTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHJpbmdfaW5kZXggPSAwOyByaW5nX2luZGV4IDwgcG9seWdvbi5sZW5ndGg7IHJpbmdfaW5kZXgrKyl7XG4gICAgICAgICAgICAvLyBBZGQgdmVydGV4IGRhdGFcbiAgICAgICAgICAgIHZhciBwb2x5Z29uX3JpbmcgPSBwb2x5Z29uW3JpbmdfaW5kZXhdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29uX3JpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdmVydGV4ID0gcG9seWdvbl9yaW5nW2ldO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVswXSA9IHZlcnRleFswXTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMV0gPSB2ZXJ0ZXhbMV07XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgVVZzXG4gICAgICAgICAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDBdID0gKCh2ZXJ0ZXhbMF0gLSBtaW5feCkgKiBzY2FsZV91ICsgbWluX3UpICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAxXSA9ICgodmVydGV4WzFdIC0gbWluX3kpICogc2NhbGVfdiArIG1pbl92KSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBlbGVtZW50IGluZGljZXNcbiAgICAgICAgdmFyIGluZGljZXMgPSB0cmlhbmd1bGF0ZVBvbHlnb24oZWFyY3V0LmZsYXR0ZW4ocG9seWdvbikpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyBpbmRpY2VzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gVGVzc2VsYXRlIGFuZCBleHRydWRlIGEgZmxhdCAyRCBwb2x5Z29uIGludG8gYSBzaW1wbGUgM0QgbW9kZWwgd2l0aCBmaXhlZCBoZWlnaHQgYW5kIGFkZCB0byBHTCB2ZXJ0ZXggYnVmZmVyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFeHRydWRlZFBvbHlnb25zIChcbiAgICBwb2x5Z29ucyxcbiAgICB6LCBoZWlnaHQsIG1pbl9oZWlnaHQsXG4gICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICBub3JtYWxfaW5kZXgsXG4gICAgbm9ybWFsX25vcm1hbGl6ZSxcbiAgICB7XG4gICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlLFxuICAgICAgICB0ZXhjb29yZF9pbmRleCxcbiAgICAgICAgdGV4Y29vcmRfc2NhbGUsXG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSxcbiAgICAgICAgd2luZGluZ1xuICAgIH0pIHtcblxuICAgIC8vIFRvcFxuICAgIHZhciBtaW5feiA9IHogKyAobWluX2hlaWdodCB8fCAwKTtcbiAgICB2YXIgbWF4X3ogPSB6ICsgaGVpZ2h0O1xuICAgIHZlcnRleF90ZW1wbGF0ZVsyXSA9IG1heF96O1xuICAgIGJ1aWxkUG9seWdvbnMocG9seWdvbnMsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsIHsgdGV4Y29vcmRfaW5kZXgsIHRleGNvb3JkX3NjYWxlLCB0ZXhjb29yZF9ub3JtYWxpemUgfSk7XG5cbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gdmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuICAgIHZhciBlbGVtZW50X29mZnNldCA9IHZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgIC8vIFdhbGxzXG4gICAgLy8gRml0IFVWcyB0byB3YWxsIHF1YWRcbiAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplID0gdGV4Y29vcmRfbm9ybWFsaXplIHx8IDE7XG4gICAgICAgIHZhciBbbWluX3UsIG1pbl92LCBtYXhfdSwgbWF4X3ZdID0gdGV4Y29vcmRfc2NhbGUgfHwgZGVmYXVsdF91dnM7XG4gICAgICAgIHZhciB0ZXhjb29yZHMgPSBbXG4gICAgICAgICAgICBbbWluX3UsIG1heF92XSxcbiAgICAgICAgICAgIFttaW5fdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1heF92XVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHZhciBudW1fcG9seWdvbnMgPSBwb2x5Z29ucy5sZW5ndGg7XG4gICAgZm9yICh2YXIgcD0wOyBwIDwgbnVtX3BvbHlnb25zOyBwKyspIHtcbiAgICAgICAgdmFyIHBvbHlnb24gPSBwb2x5Z29uc1twXTtcblxuICAgICAgICBmb3IgKHZhciBxPTA7IHEgPCBwb2x5Z29uLmxlbmd0aDsgcSsrKSB7XG4gICAgICAgICAgICB2YXIgY29udG91ciA9IHBvbHlnb25bcV07XG5cbiAgICAgICAgICAgIGZvciAodmFyIHc9MDsgdyA8IGNvbnRvdXIubGVuZ3RoIC0gMTsgdysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZV90aWxlX2VkZ2VzICYmIG91dHNpZGVUaWxlKGNvbnRvdXJbd10sIGNvbnRvdXJbdysxXSwgdGlsZV9lZGdlX3RvbGVyYW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGRvbid0IGV4dHJ1ZGUgdGlsZSBlZGdlc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFdhbGwgb3JkZXIgaXMgZGVwZW5kZW50IG9uIHdpbmRpbmcgb3JkZXIsIHNvIHRoYXQgbm9ybWFscyBmYWNlIG91dHdhcmRcbiAgICAgICAgICAgICAgICBsZXQgdzAsIHcxO1xuICAgICAgICAgICAgICAgIGlmICh3aW5kaW5nID09PSAnQ0NXJykge1xuICAgICAgICAgICAgICAgICAgICB3MCA9IHc7XG4gICAgICAgICAgICAgICAgICAgIHcxID0gdysxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdzAgPSB3KzE7XG4gICAgICAgICAgICAgICAgICAgIHcxID0gdztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBUd28gdHJpYW5nbGVzIGZvciB0aGUgcXVhZCBmb3JtZWQgYnkgZWFjaCB2ZXJ0ZXggcGFpciwgZ29pbmcgZnJvbSBib3R0b20gdG8gdG9wIGhlaWdodFxuICAgICAgICAgICAgICAgIHZhciB3YWxsX3ZlcnRpY2VzID0gW1xuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MV1bMF0sIGNvbnRvdXJbdzFdWzFdLCBtYXhfel0sXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cxXVswXSwgY29udG91clt3MV1bMV0sIG1pbl96XSxcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRvdXJbdzBdWzBdLCBjb250b3VyW3cwXVsxXSwgbWluX3pdLFxuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MF1bMF0sIGNvbnRvdXJbdzBdWzFdLCBtYXhfel1cbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2FsYyB0aGUgbm9ybWFsIG9mIHRoZSB3YWxsIGZyb20gdXAgdmVjdG9yIGFuZCBvbmUgc2VnbWVudCBvZiB0aGUgd2FsbCB0cmlhbmdsZXNcbiAgICAgICAgICAgICAgICBsZXQgd2FsbF92ZWMgPSBWZWN0b3Iubm9ybWFsaXplKFtjb250b3VyW3cxXVswXSAtIGNvbnRvdXJbdzBdWzBdLCBjb250b3VyW3cxXVsxXSAtIGNvbnRvdXJbdzBdWzFdLCAwXSk7XG4gICAgICAgICAgICAgICAgbGV0IG5vcm1hbCA9IFZlY3Rvci5jcm9zcyh1cF92ZWMzLCB3YWxsX3ZlYyk7XG5cbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdmVydGV4IHRlbXBsYXRlIHdpdGggY3VycmVudCBzdXJmYWNlIG5vcm1hbFxuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtub3JtYWxfaW5kZXggKyAwXSA9IG5vcm1hbFswXSAqIG5vcm1hbF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW25vcm1hbF9pbmRleCArIDFdID0gbm9ybWFsWzFdICogbm9ybWFsX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbbm9ybWFsX2luZGV4ICsgMl0gPSBub3JtYWxbMl0gKiBub3JtYWxfbm9ybWFsaXplO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgd3Y9MDsgd3YgPCB3YWxsX3ZlcnRpY2VzLmxlbmd0aDsgd3YrKykge1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMF0gPSB3YWxsX3ZlcnRpY2VzW3d2XVswXTtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzFdID0gd2FsbF92ZXJ0aWNlc1t3dl1bMV07XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVsyXSA9IHdhbGxfdmVydGljZXNbd3ZdWzJdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMF0gPSB0ZXhjb29yZHNbd3ZdWzBdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMV0gPSB0ZXhjb29yZHNbd3ZdWzFdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X2RhdGEuYWRkVmVydGV4KHZlcnRleF90ZW1wbGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAwKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDEpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAyKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDMpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50X29mZnNldCArPSA0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBUcmlhbmd1bGF0aW9uIHVzaW5nIGVhcmN1dFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9lYXJjdXRcbmV4cG9ydCBmdW5jdGlvbiB0cmlhbmd1bGF0ZVBvbHlnb24gKGRhdGEpIHtcbiAgICByZXR1cm4gZWFyY3V0KGRhdGEudmVydGljZXMsIGRhdGEuaG9sZXMsIGRhdGEuZGltZW5zaW9ucyk7XG59XG4iLCIvLyBHZW9tZXRyeSBidWlsZGluZyBmdW5jdGlvbnNcblxuaW1wb3J0IFZlY3RvciBmcm9tICcuLi92ZWN0b3InO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IHtvdXRzaWRlVGlsZSwgaXNDb29yZE91dHNpZGVUaWxlfSBmcm9tICcuL2NvbW1vbic7XG5cbmNvbnN0IHplcm9fdmVjMiA9IFswLCAwXTtcblxuLy8gQnVpbGQgdGVzc2VsbGF0ZWQgdHJpYW5nbGVzIGZvciBhIHBvbHlsaW5lXG5jb25zdCBDQVBfVFlQRSA9IHtcbiAgICBidXR0OiAwLFxuICAgIHNxdWFyZTogMSxcbiAgICByb3VuZDogMlxufTtcblxuY29uc3QgSk9JTl9UWVBFID0ge1xuICAgIG1pdGVyOiAwLFxuICAgIGJldmVsOiAxLFxuICAgIHJvdW5kOiAyXG59O1xuXG5jb25zdCBERUZBVUxUID0ge1xuICAgIE1JVEVSX0xJTUlUOiAzLFxuICAgIFRFWENPT1JEX05PUk1BTElaRTogMSxcbiAgICBURVhDT09SRF9SQVRJTzogMSxcbiAgICBNSU5fRkFOX1dJRFRIOiA1ICAgICAgICAvLyBXaWR0aCBvZiBsaW5lIGluIHRpbGUgdW5pdHMgdG8gcGxhY2UgMSB0cmlhbmdsZSBwZXIgZmFuXG59O1xuXG4vLyBTY2FsaW5nIGZhY3RvciB0byBhZGQgcHJlY2lzaW9uIHRvIGxpbmUgdGV4dHVyZSBWIGNvb3JkaW5hdGUgcGFja2VkIGFzIG5vcm1hbGl6ZWQgc2hvcnRcbmNvbnN0IHZfc2NhbGVfYWRqdXN0ID0gR2VvLnRpbGVfc2NhbGU7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvbHlsaW5lcyAobGluZXMsIHdpZHRoLCB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgIHtcbiAgICAgICAgY2xvc2VkX3BvbHlnb24sXG4gICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlLFxuICAgICAgICB0ZXhjb29yZF9pbmRleCxcbiAgICAgICAgdGV4Y29vcmRfc2NhbGUsXG4gICAgICAgIHRleGNvb3JkX3dpZHRoLFxuICAgICAgICB0ZXhjb29yZF9yYXRpbyxcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplLFxuICAgICAgICBzY2FsaW5nX2luZGV4LFxuICAgICAgICBzY2FsaW5nX25vcm1hbGl6ZSxcbiAgICAgICAgam9pbiwgY2FwLFxuICAgICAgICBtaXRlcl9saW1pdFxuICAgIH0pIHtcblxuICAgIHZhciBjYXBfdHlwZSA9IGNhcCA/IENBUF9UWVBFW2NhcF0gOiBDQVBfVFlQRS5idXR0O1xuICAgIHZhciBqb2luX3R5cGUgPSBqb2luID8gSk9JTl9UWVBFW2pvaW5dIDogSk9JTl9UWVBFLm1pdGVyO1xuXG4gICAgLy8gQ29uZmlndXJlIG1pdGVyIGxpbWl0XG4gICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgIG1pdGVyX2xpbWl0ID0gbWl0ZXJfbGltaXQgfHwgREVGQVVMVC5NSVRFUl9MSU1JVDsgLy8gZGVmYXVsdCBtaXRlciBsaW1pdFxuICAgICAgICB2YXIgbWl0ZXJfbGVuX3NxID0gbWl0ZXJfbGltaXQgKiBtaXRlcl9saW1pdDtcbiAgICB9XG5cbiAgICAvLyBUZXh0dXJlIFZhcmlhYmxlc1xuICAgIHZhciB2X3NjYWxlO1xuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgREVGQVVMVC5URVhDT09SRF9OT1JNQUxJWkU7XG4gICAgICAgIHRleGNvb3JkX3JhdGlvID0gdGV4Y29vcmRfcmF0aW8gfHwgREVGQVVMVC5URVhDT09SRF9SQVRJTztcbiAgICAgICAgdl9zY2FsZSA9IDEgLyAodGV4Y29vcmRfd2lkdGggKiB0ZXhjb29yZF9yYXRpbyAqIHZfc2NhbGVfYWRqdXN0KTsgLy8gc2NhbGVzIGxpbmUgdGV4dHVyZSBhcyBhIHJhdGlvIG9mIHRoZSBsaW5lJ3Mgd2lkdGhcbiAgICB9XG5cbiAgICAvLyBWYWx1ZXMgdGhhdCBhcmUgY29uc3RhbnQgZm9yIGVhY2ggbGluZSBhbmQgYXJlIHBhc3NlZCB0byBoZWxwZXIgZnVuY3Rpb25zXG4gICAgdmFyIGNvbnRleHQgPSB7XG4gICAgICAgIGNsb3NlZF9wb2x5Z29uLFxuICAgICAgICByZW1vdmVfdGlsZV9lZGdlcyxcbiAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZSxcbiAgICAgICAgbWl0ZXJfbGVuX3NxLFxuICAgICAgICBqb2luX3R5cGUsXG4gICAgICAgIGNhcF90eXBlLFxuICAgICAgICB2ZXJ0ZXhfZGF0YSxcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICBoYWxmX3dpZHRoOiB3aWR0aCAvIDIsXG4gICAgICAgIHNjYWxpbmdfaW5kZXgsXG4gICAgICAgIHNjYWxpbmdfbm9ybWFsaXplLFxuICAgICAgICB2X3NjYWxlLFxuICAgICAgICB0ZXhjb29yZF9pbmRleCxcbiAgICAgICAgdGV4Y29vcmRfd2lkdGgsXG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZVxuICAgIH07XG5cbiAgICAvLyBCdWZmZXIgZm9yIGV4dHJhIGxpbmVzIHRvIHByb2Nlc3NcbiAgICB2YXIgZXh0cmFfbGluZXMgPSBbXTtcblxuICAgIC8vIFByb2Nlc3MgbGluZXNcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGluZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGJ1aWxkUG9seWxpbmUobGluZXNbaW5kZXhdLCBjb250ZXh0LCBleHRyYV9saW5lcyk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBleHRyYSBsaW5lc1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHRyYV9saW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgYnVpbGRQb2x5bGluZShleHRyYV9saW5lc1tpbmRleF0sIGNvbnRleHQsIGV4dHJhX2xpbmVzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUG9seWxpbmUobGluZSwgY29udGV4dCwgZXh0cmFfbGluZXMpe1xuICAgIC8vIFNraXAgaWYgbGluZSBpcyBub3QgdmFsaWRcbiAgICBpZiAobGluZS5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIge2pvaW5fdHlwZSwgY2FwX3R5cGUsIGNsb3NlZF9wb2x5Z29uLCByZW1vdmVfdGlsZV9lZGdlcywgdGlsZV9lZGdlX3RvbGVyYW5jZSwgdl9zY2FsZSwgbWl0ZXJfbGVuX3NxfSA9IGNvbnRleHQ7XG5cbiAgICAvLyBMb29wIGJhY2t3YXJkcyB0aHJvdWdoIGxpbmUgdG8gYSB0aWxlIGJvdW5kYXJ5IGlmIGZvdW5kXG4gICAgaWYgKGNsb3NlZF9wb2x5Z29uICYmIGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgIHZhciBib3VuZGFyeUluZGV4ID0gZ2V0VGlsZUJvdW5kYXJ5SW5kZXgobGluZSk7XG4gICAgICAgIGlmIChib3VuZGFyeUluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgbmV3IGxpbmUgdGhhdCBpcyBhIGN5Y2xpYyBwZXJtdXRhdGlvbiBvZiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgIHZhciBwZXJtdXRlZExpbmUgPSBwZXJtdXRlTGluZShsaW5lLCBib3VuZGFyeUluZGV4KTtcbiAgICAgICAgICAgIGV4dHJhX2xpbmVzLnB1c2gocGVybXV0ZWRMaW5lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjb29yZEN1cnIsIGNvb3JkTmV4dCwgbm9ybVByZXYsIG5vcm1OZXh0O1xuICAgIHZhciB2ID0gMDsgLy8gVGV4dHVyZSB2LWNvb3JkaW5hdGVcblxuICAgIHZhciBpbmRleF9zdGFydCA9IDA7XG4gICAgdmFyIGluZGV4X2VuZCA9IGxpbmUubGVuZ3RoIC0gMTtcbiAgICB2YXIgaWdub3JlZF9pbmRpY2VzX2NvdW50ID0gMDtcblxuICAgIC8vIEZJUlNUIFBPSU5UXG4gICAgLy8gbG9vcCB0aHJvdWdoIGJlZ2lubmluZyBwb2ludHMgaWYgZHVwbGljYXRlc1xuICAgIGNvb3JkQ3VyciA9IGxpbmVbaW5kZXhfc3RhcnRdO1xuICAgIGNvb3JkTmV4dCA9IGxpbmVbaW5kZXhfc3RhcnQgKyAxXTtcbiAgICB3aGlsZSAoVmVjdG9yLmlzRXF1YWwoY29vcmRDdXJyLCBjb29yZE5leHQpKSB7XG4gICAgICAgIGluZGV4X3N0YXJ0Kys7XG4gICAgICAgIGNvb3JkQ3VyciA9IGNvb3JkTmV4dDtcbiAgICAgICAgY29vcmROZXh0ID0gbGluZVtpbmRleF9zdGFydCArIDFdO1xuICAgICAgICBpZ25vcmVkX2luZGljZXNfY291bnQrKztcbiAgICAgICAgaWYgKGluZGV4X3N0YXJ0ID09PSBsaW5lLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGxvb3AgdGhyb3VnaCBlbmRpbmcgcG9pbnRzIHRvIGNoZWNrIGZvciBkdXBsaWNhdGVzXG4gICAgd2hpbGUgKFZlY3Rvci5pc0VxdWFsKGxpbmVbaW5kZXhfZW5kXSwgbGluZVtpbmRleF9lbmQgLSAxXSkpIHtcbiAgICAgICAgaW5kZXhfZW5kLS07XG4gICAgICAgIGlnbm9yZWRfaW5kaWNlc19jb3VudCsrO1xuICAgICAgICBpZiAoaW5kZXhfZW5kID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5sZW5ndGggPCAyICsgaWdub3JlZF9pbmRpY2VzX2NvdW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBub3JtTmV4dCA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAoY29vcmRDdXJyLCBjb29yZE5leHQpKTtcblxuICAgIC8vIFNraXAgdGlsZSBib3VuZGFyeSBsaW5lcyBhbmQgYXBwZW5kIGEgbmV3IGxpbmUgaWYgbmVlZGVkXG4gICAgaWYgKHJlbW92ZV90aWxlX2VkZ2VzICYmIG91dHNpZGVUaWxlKGNvb3JkQ3VyciwgY29vcmROZXh0LCB0aWxlX2VkZ2VfdG9sZXJhbmNlKSkge1xuICAgICAgICB2YXIgbm9uQm91bmRhcnlTZWdtZW50ID0gZ2V0TmV4dE5vbkJvdW5kYXJ5U2VnbWVudChsaW5lLCBpbmRleF9zdGFydCwgdGlsZV9lZGdlX3RvbGVyYW5jZSk7XG4gICAgICAgIGlmIChub25Cb3VuZGFyeVNlZ21lbnQpIHtcbiAgICAgICAgICAgIGV4dHJhX2xpbmVzLnB1c2gobm9uQm91bmRhcnlTZWdtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlZF9wb2x5Z29uKXtcbiAgICAgICAgLy8gQmVnaW4gdGhlIHBvbHlnb24gd2l0aCBhIGpvaW4gKGNvbm5lY3RpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzKVxuICAgICAgICBub3JtUHJldiA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAobGluZVtpbmRleF9lbmQgLSAxXSwgY29vcmRDdXJyKSk7XG4gICAgICAgIHN0YXJ0UG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIElmIGxpbmUgYmVnaW5zIGF0IGVkZ2UsIGRvbid0IGFkZCBhIGNhcFxuICAgICAgICBpZiAoIWlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgICAgICBhZGRDYXAoY29vcmRDdXJyLCB2LCBub3JtTmV4dCwgY2FwX3R5cGUsIHRydWUsIGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKGNhcF90eXBlICE9PSBDQVBfVFlQRS5idXR0KSB7XG4gICAgICAgICAgICAgICAgdiArPSAwLjUgKiB2X3NjYWxlICogY29udGV4dC50ZXhjb29yZF93aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBmaXJzdCBwYWlyIG9mIHBvaW50cyBmb3IgdGhlIGxpbmUgc3RyaXBcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIElOVEVSTUVESUFSWSBQT0lOVFNcbiAgICB2ICs9IHZfc2NhbGUgKiBWZWN0b3IubGVuZ3RoKFZlY3Rvci5zdWIoY29vcmROZXh0LCBjb29yZEN1cnIpKTtcbiAgICBmb3IgKHZhciBpID0gaW5kZXhfc3RhcnQgKyAxOyBpIDwgaW5kZXhfZW5kOyBpKyspIHtcbiAgICAgICAgdmFyIGN1cnJJbmRleCA9IGk7XG4gICAgICAgIHZhciBuZXh0SW5kZXggPSBpICsgMTtcbiAgICAgICAgY29vcmRDdXJyID0gbGluZVtjdXJySW5kZXhdO1xuICAgICAgICBjb29yZE5leHQgPSBsaW5lW25leHRJbmRleF07XG5cbiAgICAgICAgLy8gU2tpcCByZWR1bmRhbnQgdmVydGljZXNcbiAgICAgICAgaWYgKFZlY3Rvci5pc0VxdWFsKGNvb3JkQ3VyciwgY29vcmROZXh0KSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGlsZSBib3VuZGFyaWVzXG4gICAgICAgIGlmIChyZW1vdmVfdGlsZV9lZGdlcyAmJiBvdXRzaWRlVGlsZShjb29yZEN1cnIsIGNvb3JkTmV4dCwgdGlsZV9lZGdlX3RvbGVyYW5jZSkpIHtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICB2YXIgbm9uQm91bmRhcnlMaW5lcyA9IGdldE5leHROb25Cb3VuZGFyeVNlZ21lbnQobGluZSwgY3VyckluZGV4ICsgMSwgdGlsZV9lZGdlX3RvbGVyYW5jZSk7XG4gICAgICAgICAgICBpZiAobm9uQm91bmRhcnlMaW5lcykge1xuICAgICAgICAgICAgICAgIGV4dHJhX2xpbmVzLnB1c2gobm9uQm91bmRhcnlMaW5lcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBub3JtUHJldiA9IG5vcm1OZXh0O1xuICAgICAgICBub3JtTmV4dCA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAoY29vcmRDdXJyLCBjb29yZE5leHQpKTtcblxuICAgICAgICAvLyBBZGQgam9pblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgICAgIGFkZE1pdGVyKHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBtaXRlcl9sZW5fc3EsIGZhbHNlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZEpvaW4oam9pbl90eXBlLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgZmFsc2UsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdiArPSB2X3NjYWxlICogVmVjdG9yLmxlbmd0aChWZWN0b3Iuc3ViKGNvb3JkTmV4dCwgY29vcmRDdXJyKSk7XG4gICAgfVxuXG4gICAgLy8gTEFTVCBQT0lOVFxuICAgIGNvb3JkQ3VyciA9IGNvb3JkTmV4dDtcbiAgICBub3JtUHJldiA9IG5vcm1OZXh0O1xuXG4gICAgaWYgKGNsb3NlZF9wb2x5Z29uKSB7XG4gICAgICAgIC8vIENsb3NlIHRoZSBwb2x5Z29uIHdpdGggYSBtaXRlciBqb2ludCBvciBidXR0IGNhcCBpZiBvbiBhIHRpbGUgYm91bmRhcnlcbiAgICAgICAgbm9ybU5leHQgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5wZXJwKGNvb3JkQ3VyciwgbGluZVsxXSkpO1xuICAgICAgICBlbmRQb2x5Z29uKGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBqb2luX3R5cGUsIHYsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gRmluaXNoIHRoZSBsaW5lIHN0cmlwXG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1QcmV2LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1QcmV2KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBJZiBsaW5lIGVuZHMgYXQgZWRnZSwgZG9uJ3QgYWRkIGEgY2FwXG4gICAgICAgIGlmICghaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgICAgIGFkZENhcChjb29yZEN1cnIsIHYsIG5vcm1QcmV2LCBjYXBfdHlwZSwgZmFsc2UsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRUaWxlQm91bmRhcnlJbmRleChsaW5lKXtcbiAgICBpZiAoaXNDb29yZE91dHNpZGVUaWxlKGxpbmVbMF0pKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGZvciAodmFyIGJhY2tJbmRleCA9IDA7IGJhY2tJbmRleCA8IGxpbmUubGVuZ3RoOyBiYWNrSW5kZXgrKykge1xuICAgICAgICB2YXIgY29vcmRDdXJyID0gbGluZVtsaW5lLmxlbmd0aCAtIDEgLSBiYWNrSW5kZXhdO1xuICAgICAgICBpZiAoaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgICAgIHJldHVybiBsaW5lLmxlbmd0aCAtIDEgLSBiYWNrSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbn1cblxuLy8gSXRlcmF0ZSB0aHJvdWdoIGxpbmUgZnJvbSBzdGFydEluZGV4IHRvIGZpbmQgYSBzZWdtZW50IG5vdCBvbiBhIHRpbGUgYm91bmRhcnksIGlmIGFueS5cbmZ1bmN0aW9uIGdldE5leHROb25Cb3VuZGFyeVNlZ21lbnQgKGxpbmUsIHN0YXJ0SW5kZXgsIHRvbGVyYW5jZSkge1xuICAgIHZhciBlbmRJbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgd2hpbGUgKGxpbmVbZW5kSW5kZXggKyAxXSAmJiBvdXRzaWRlVGlsZShsaW5lW2VuZEluZGV4XSwgbGluZVtlbmRJbmRleCArIDFdLCB0b2xlcmFuY2UpKSB7XG4gICAgICAgIGVuZEluZGV4Kys7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBsaW5lIHNlZ21lbnQgcmVtYWluaW5nIHRoYXQgaXMgd2l0aGluIHRoZSB0aWxlLCBwdXNoIGl0IHRvIHRoZSBsaW5lcyBhcnJheVxuICAgIHJldHVybiAobGluZS5sZW5ndGggLSBlbmRJbmRleCA+PSAyKSA/IGxpbmUuc2xpY2UoZW5kSW5kZXgpIDogZmFsc2U7XG59XG5cbi8vIEJlZ2luIGEgcG9seWdvbiB3aXRoIGEgam9pbiBjb25uZWN0aW5nIHRvIHRoZSBsYXN0IHNlZ21lbnQgKGlmIHZhbGlkIGpvaW4tdHlwZSBzcGVjaWZpZWQpXG5mdW5jdGlvbiBzdGFydFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgY29udGV4dCl7XG4gICAgLy8gSWYgcG9seWdvbiBzdGFydHMgb24gYSB0aWxlIGJvdW5kYXJ5LCBkb24ndCBhZGQgYSBqb2luXG4gICAgaWYgKGpvaW5fdHlwZSA9PT0gdW5kZWZpbmVkIHx8IGlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgMF0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1OZXh0KSwgWzAsIDBdLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIElmIHBvbHlnb24gc3RhcnRzIHdpdGhpbiBhIHRpbGUsIGFkZCBhIGpvaW5cbiAgICAgICAgdmFyIHYgPSAwO1xuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgICAgIGFkZE1pdGVyKHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBjb250ZXh0Lm1pdGVyX2xlbl9zcSwgdHJ1ZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRKb2luKGpvaW5fdHlwZSwgdiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIHRydWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBFbmQgYSBwb2x5Z29uIGFwcHJvcHJpYXRlbHlcbmZ1bmN0aW9uIGVuZFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgdiwgY29udGV4dCkge1xuICAgIC8vIElmIHBvbHlnb24gZW5kcyBvbiBhIHRpbGUgYm91bmRhcnksIGRvbid0IGFkZCBhIGpvaW5cbiAgICBpZiAoaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgcG9seWdvbiBlbmRzIHdpdGhpbiBhIHRpbGUsIGFkZCBNaXRlciBvciBubyBqb2ludCAoam9pbiBhZGRlZCBvbiBzdGFydFBvbHlnb24pXG4gICAgICAgIHZhciBtaXRlclZlYyA9IGNyZWF0ZU1pdGVyVmVjKG5vcm1QcmV2LCBub3JtTmV4dCk7XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyICYmIFZlY3Rvci5sZW5ndGhTcShtaXRlclZlYykgPiBjb250ZXh0Lm1pdGVyX2xlbl9zcSkge1xuICAgICAgICAgICAgam9pbl90eXBlID0gSk9JTl9UWVBFLmJldmVsOyAvLyBzd2l0Y2ggdG8gYmV2ZWxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KSB7XG4gICAgdmFyIG1pdGVyVmVjID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IuYWRkKG5vcm1QcmV2LCBub3JtTmV4dCkpO1xuICAgIHZhciBzY2FsZSA9IDIgLyAoMSArIE1hdGguYWJzKFZlY3Rvci5kb3Qobm9ybVByZXYsIG1pdGVyVmVjKSkpO1xuICAgIHJldHVybiBWZWN0b3IubXVsdChtaXRlclZlYywgc2NhbGUgKiBzY2FsZSk7XG59XG5cbi8vIEFkZCBhIG1pdGVyIHZlY3RvciBvciBhIGpvaW4gaWYgdGhlIG1pdGVyIGlzIHRvbyBzaGFycFxuZnVuY3Rpb24gYWRkTWl0ZXIgKHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBtaXRlcl9sZW5fc3EsIGlzQmVnaW5uaW5nLCBjb250ZXh0KSB7XG4gICAgdmFyIG1pdGVyVmVjID0gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KTtcblxuICAgIC8vICBNaXRlciBsaW1pdDogaWYgbWl0ZXIgam9pbiBpcyB0b28gc2hhcnAsIGNvbnZlcnQgdG8gYmV2ZWwgaW5zdGVhZFxuICAgIGlmIChWZWN0b3IubGVuZ3RoU3EobWl0ZXJWZWMpID4gbWl0ZXJfbGVuX3NxKSB7XG4gICAgICAgIGFkZEpvaW4oSk9JTl9UWVBFLm1pdGVyLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgaXNCZWdpbm5pbmcsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICBpZiAoIWlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBBZGQgYSBiZXZlbCBvciByb3VuZCBqb2luXG5mdW5jdGlvbiBhZGRKb2luKGpvaW5fdHlwZSwgdiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGlzQmVnaW5uaW5nLCBjb250ZXh0KSB7XG4gICAgdmFyIG1pdGVyVmVjID0gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KTtcbiAgICB2YXIgaXNDbG9ja3dpc2UgPSAobm9ybU5leHRbMF0gKiBub3JtUHJldlsxXSAtIG5vcm1OZXh0WzFdICogbm9ybVByZXZbMF0gPiAwKTtcblxuICAgIGlmIChpc0Nsb2Nrd2lzZSl7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG1pdGVyVmVjLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1QcmV2KSwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoIWlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLmJldmVsKSB7XG4gICAgICAgICAgICBhZGRCZXZlbChjb29yZEN1cnIsXG4gICAgICAgICAgICAgICAgVmVjdG9yLm5lZyhub3JtUHJldiksIG1pdGVyVmVjLCBWZWN0b3IubmVnKG5vcm1OZXh0KSxcbiAgICAgICAgICAgICAgICBbMCwgdl0sIFsxLCB2XSwgWzAsIHZdLFxuICAgICAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUucm91bmQpIHtcbiAgICAgICAgICAgIGFkZEZhbihjb29yZEN1cnIsXG4gICAgICAgICAgICAgICAgVmVjdG9yLm5lZyhub3JtUHJldiksIG1pdGVyVmVjLCBWZWN0b3IubmVnKG5vcm1OZXh0KSxcbiAgICAgICAgICAgICAgICBbMCwgdl0sIFsxLCB2XSwgWzAsIHZdLFxuICAgICAgICAgICAgICAgIGZhbHNlLCBjb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICghaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUuYmV2ZWwpIHtcbiAgICAgICAgICAgIGFkZEJldmVsKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBub3JtUHJldiwgVmVjdG9yLm5lZyhtaXRlclZlYyksIG5vcm1OZXh0LFxuICAgICAgICAgICAgICAgIFsxLCB2XSwgWzAsIHZdLCBbMSwgdl0sXG4gICAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5yb3VuZCkge1xuICAgICAgICAgICAgYWRkRmFuKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBub3JtUHJldiwgVmVjdG9yLm5lZyhtaXRlclZlYyksIG5vcm1OZXh0LFxuICAgICAgICAgICAgICAgIFsxLCB2XSwgWzAsIHZdLCBbMSwgdl0sXG4gICAgICAgICAgICAgICAgZmFsc2UsIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtTmV4dCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG4gICAgfVxufVxuXG4vLyBBZGQgaW5kaWNlcyB0byB2ZXJ0ZXhfZWxlbWVudHNcbmZ1bmN0aW9uIGluZGV4UGFpcnMobnVtX3BhaXJzLCBjb250ZXh0KXtcbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG4gICAgdmFyIG51bV92ZXJ0aWNlcyA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuICAgIHZhciBvZmZzZXQgPSBudW1fdmVydGljZXMgLSAyICogbnVtX3BhaXJzIC0gMjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX3BhaXJzOyBpKyspe1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDEpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDMpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkVmVydGV4KGNvb3JkaW5hdGUsIG5vcm1hbCwgdXYsIGNvbnRleHQpIHtcbiAgICB2YXIgdmVydGV4X3RlbXBsYXRlID0gY29udGV4dC52ZXJ0ZXhfdGVtcGxhdGU7XG4gICAgdmFyIHZlcnRleF9kYXRhID0gY29udGV4dC52ZXJ0ZXhfZGF0YTtcblxuICAgIGJ1aWxkVmVydGV4VGVtcGxhdGUodmVydGV4X3RlbXBsYXRlLCBjb29yZGluYXRlLCB1diwgbm9ybWFsLCBjb250ZXh0KTtcbiAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRWZXJ0ZXhUZW1wbGF0ZSAodmVydGV4X3RlbXBsYXRlLCB2ZXJ0ZXgsIHRleHR1cmVfY29vcmQsIHNjYWxlLCBjb250ZXh0KSB7XG4gICAgLy8gc2V0IHZlcnRleCBwb3NpdGlvblxuICAgIHZlcnRleF90ZW1wbGF0ZVswXSA9IHZlcnRleFswXTtcbiAgICB2ZXJ0ZXhfdGVtcGxhdGVbMV0gPSB2ZXJ0ZXhbMV07XG5cbiAgICAvLyBzZXQgVVZzXG4gICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggJiYgdGV4dHVyZV9jb29yZCkge1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC50ZXhjb29yZF9pbmRleCArIDBdID0gdGV4dHVyZV9jb29yZFswXSAqIGNvbnRleHQudGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC50ZXhjb29yZF9pbmRleCArIDFdID0gdGV4dHVyZV9jb29yZFsxXSAqIGNvbnRleHQudGV4Y29vcmRfbm9ybWFsaXplO1xuICAgIH1cblxuICAgIC8vIHNldCBTY2FsaW5nIHZlcnRleCAoWCwgWSBub3JtYWwgZGlyZWN0aW9uICsgWiBoYWxmX3dpZHRoIGFzIGF0dHJpYnV0ZSlcbiAgICBpZiAoY29udGV4dC5zY2FsaW5nX2luZGV4KSB7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnNjYWxpbmdfaW5kZXggKyAwXSA9IHNjYWxlWzBdICogY29udGV4dC5zY2FsaW5nX25vcm1hbGl6ZTtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQuc2NhbGluZ19pbmRleCArIDFdID0gc2NhbGVbMV0gKiBjb250ZXh0LnNjYWxpbmdfbm9ybWFsaXplO1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC5zY2FsaW5nX2luZGV4ICsgMl0gPSBjb250ZXh0LmhhbGZfd2lkdGg7XG4gICAgfVxufVxuXG4vLyAgVGVzc2FsYXRlIGEgRkFOIGdlb21ldHJ5IGJldHdlZW4gcG9pbnRzIEEgICAgICAgQlxuLy8gIHVzaW5nIHRoZWlyIG5vcm1hbHMgZnJvbSBhIGNlbnRlciAgICAgICAgXFwgLiAuIC9cbi8vICBhbmQgaW50ZXJwb2xhdGluZyB0aGVpciBVVnMgICAgICAgICAgICAgICBcXCBwIC9cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwuL1xuZnVuY3Rpb24gYWRkRmFuIChjb29yZCwgbkEsIG5DLCBuQiwgdXZBLCB1dkMsIHV2QiwgaXNDYXAsIGNvbnRleHQpIHtcbiAgICB2YXIgY3Jvc3MgPSBuQVswXSAqIG5CWzFdIC0gbkFbMV0gKiBuQlswXTtcbiAgICB2YXIgZG90ID0gVmVjdG9yLmRvdChuQSwgbkIpO1xuXG4gICAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMihjcm9zcywgZG90KTtcbiAgICB3aGlsZSAoYW5nbGUgPj0gTWF0aC5QSSkge1xuICAgICAgICBhbmdsZSAtPSAyKk1hdGguUEk7XG4gICAgfVxuXG4gICAgdmFyIG51bVRyaWFuZ2xlcyA9IHRyaWFuZ2xlc1BlckFyYyhhbmdsZSwgY29udGV4dC5oYWxmX3dpZHRoKTtcbiAgICBpZiAobnVtVHJpYW5nbGVzIDwgMSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHBpdm90SW5kZXggPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG5cbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5DLCB1dkMsIGNvbnRleHQpO1xuICAgIGFkZFZlcnRleChjb29yZCwgbkEsIHV2QSwgY29udGV4dCk7XG5cbiAgICB2YXIgYmxhZGUgPSBuQTtcblxuICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHV2Q3VycjtcbiAgICAgICAgaWYgKGlzQ2FwKXtcbiAgICAgICAgICAgIHV2Q3VyciA9IFtdO1xuICAgICAgICAgICAgdmFyIGFmZmluZV91dkN1cnIgPSBWZWN0b3Iuc3ViKHV2QSwgdXZDKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHV2Q3VyciA9IFZlY3Rvci5zZXQodXZBKTtcbiAgICAgICAgICAgIHZhciB1dl9kZWx0YSA9IFZlY3Rvci5kaXYoVmVjdG9yLnN1Yih1dkIsIHV2QSksIG51bVRyaWFuZ2xlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYW5nbGVfc3RlcCA9IGFuZ2xlIC8gbnVtVHJpYW5nbGVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVHJpYW5nbGVzOyBpKyspIHtcbiAgICAgICAgYmxhZGUgPSBWZWN0b3Iucm90KGJsYWRlLCBhbmdsZV9zdGVwKTtcblxuICAgICAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoaXNDYXApe1xuICAgICAgICAgICAgICAgIC8vIFVWIHRleHR1cmVzIGdvIFwidGhyb3VnaFwiIHRoZSBjYXBcbiAgICAgICAgICAgICAgICBhZmZpbmVfdXZDdXJyID0gVmVjdG9yLnJvdChhZmZpbmVfdXZDdXJyLCBhbmdsZV9zdGVwKTtcbiAgICAgICAgICAgICAgICB1dkN1cnJbMF0gPSBhZmZpbmVfdXZDdXJyWzBdICsgdXZDWzBdO1xuICAgICAgICAgICAgICAgIHV2Q3VyclsxXSA9IGFmZmluZV91dkN1cnJbMV0gKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlICsgdXZDWzFdOyAvLyBzY2FsZSB0aGUgdi1jb29yZGluYXRlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVViB0ZXh0dXJlcyBnbyBcImFyb3VuZFwiIHRoZSBqb2luXG4gICAgICAgICAgICAgICAgdXZDdXJyID0gVmVjdG9yLmFkZCh1dkN1cnIsIHV2X2RlbHRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFZlcnRleChjb29yZCwgYmxhZGUsIHV2Q3VyciwgY29udGV4dCk7XG5cbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIGkgKyAoKGNyb3NzID4gMCkgPyAyIDogMSkpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4KTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIGkgKyAoKGNyb3NzID4gMCkgPyAxIDogMikpO1xuICAgIH1cbn1cblxuLy8gIGFkZEJldmVsICAgIEEgLS0tLS0gQlxuLy8gICAgICAgICAgICAgLyBcXCAgICAgLyBcXFxuLy8gICAgICAgICAgIC8gICAvXFwgICAvXFwgIFxcXG4vLyAgICAgICAgICAgICAgLyAgXFwgLyAgXFwgIFxcXG4vLyAgICAgICAgICAgICAgICAvIEMgXFxcbmZ1bmN0aW9uIGFkZEJldmVsIChjb29yZCwgbkEsIG5DLCBuQiwgdUEsIHVDLCB1QiwgY29udGV4dCkge1xuICAgIHZhciBwaXZvdEluZGV4ID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5DLCB1QywgY29udGV4dCk7XG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQSwgdUEsIGNvbnRleHQpO1xuICAgIGFkZFZlcnRleChjb29yZCwgbkIsIHVCLCBjb250ZXh0KTtcblxuICAgIHZhciBvcmllbnRhdGlvbiA9IG5BWzBdICogbkJbMV0gLSBuQVsxXSAqIG5CWzBdID4gMDtcblxuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcblxuICAgIGlmIChvcmllbnRhdGlvbikge1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAwKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAxKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMik7XG4gICAgfVxufVxuXG4vLyAgRnVuY3Rpb24gdG8gYWRkIHRoZSB2ZXJ0ZXggbmVlZCBmb3IgbGluZSBjYXBzLFxuLy8gIGJlY2F1c2UgcmUtdXNlIHRoZSBidWZmZXJzIG5lZWRzIHRvIGJlIGF0IHRoZSBlbmRcbmZ1bmN0aW9uIGFkZENhcCAoY29vcmQsIHYsIG5vcm1hbCwgdHlwZSwgaXNCZWdpbm5pbmcsIGNvbnRleHQpIHtcbiAgICB2YXIgbmVnX25vcm1hbCA9IFZlY3Rvci5uZWcobm9ybWFsKTtcblxuICAgIHN3aXRjaCAodHlwZSl7XG4gICAgICAgIGNhc2UgQ0FQX1RZUEUuc3F1YXJlOlxuICAgICAgICAgICAgdmFyIHRhbmdlbnQ7XG4gICAgICAgICAgICBpZiAoaXNCZWdpbm5pbmcpe1xuICAgICAgICAgICAgICAgIHRhbmdlbnQgPSBbbm9ybWFsWzFdLCAtbm9ybWFsWzBdXTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgVmVjdG9yLmFkZChub3JtYWwsIHRhbmdlbnQpLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgVmVjdG9yLmFkZChuZWdfbm9ybWFsLCB0YW5nZW50KSwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBsZW5ndGggb2Ygc3F1YXJlIGNhcCB0byB0ZXh0dXJlIGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGU7XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5vcm1hbCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5lZ19ub3JtYWwsIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YW5nZW50ID0gWy1ub3JtYWxbMV0sIG5vcm1hbFswXV07XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5vcm1hbCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5lZ19ub3JtYWwsIFswLCB2XSwgY29udGV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgbGVuZ3RoIG9mIHNxdWFyZSBjYXAgdG8gdGV4dHVyZSBjb29yZGluYXRlXG4gICAgICAgICAgICAgICAgdiArPSAwLjUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlO1xuXG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5vcm1hbCwgdGFuZ2VudCksIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5lZ19ub3JtYWwsIHRhbmdlbnQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ0FQX1RZUEUucm91bmQ6XG4gICAgICAgICAgICB2YXIgbkEsIG5CLCB1dkEsIHV2QiwgdXZDO1xuICAgICAgICAgICAgaWYgKGlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgbkEgPSBub3JtYWw7XG4gICAgICAgICAgICAgICAgbkIgPSBuZWdfbm9ybWFsO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgIHYgKz0gMC41ICogY29udGV4dC50ZXhjb29yZF93aWR0aCAqIGNvbnRleHQudl9zY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgdXZBID0gWzEsIHZdO1xuICAgICAgICAgICAgICAgICAgICB1dkIgPSBbMCwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QyA9IFswLjUsIHZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5BID0gbmVnX25vcm1hbDtcbiAgICAgICAgICAgICAgICBuQiA9IG5vcm1hbDtcblxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgICB1dkEgPSBbMCwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QiA9IFsxLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZDID0gWzAuNSwgdl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhZGRGYW4oY29vcmQsXG4gICAgICAgICAgICAgICAgbkEsIHplcm9fdmVjMiwgbkIsXG4gICAgICAgICAgICAgICAgdXZBLCB1dkMsIHV2QixcbiAgICAgICAgICAgICAgICB0cnVlLCBjb250ZXh0XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDQVBfVFlQRS5idXR0OlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgIH1cbn1cblxuLy8gQ2FsY3VsYXRlIG51bWJlciBvZiB0cmlhbmdsZXMgZm9yIGEgZmFuIGdpdmVuIGFuIGFuZ2xlIGFuZCBsaW5lIHdpZHRoXG5mdW5jdGlvbiB0cmlhbmdsZXNQZXJBcmMgKGFuZ2xlLCB3aWR0aCkge1xuICAgIGlmIChhbmdsZSA8IDApIHtcbiAgICAgICAgYW5nbGUgPSAtYW5nbGU7XG4gICAgfVxuXG4gICAgdmFyIG51bVRyaWFuZ2xlcyA9ICh3aWR0aCA+IDIgKiBERUZBVUxULk1JTl9GQU5fV0lEVEgpID8gTWF0aC5sb2cyKHdpZHRoIC8gREVGQVVMVC5NSU5fRkFOX1dJRFRIKSA6IDE7XG4gICAgcmV0dXJuIE1hdGguY2VpbChhbmdsZSAvIE1hdGguUEkgKiBudW1UcmlhbmdsZXMpO1xufVxuXG4vLyBDeWNsaWNhbGx5IHBlcm11dGUgY2xvc2VkIGxpbmUgc3RhcnRpbmcgYXQgYW4gaW5kZXhcbmZ1bmN0aW9uIHBlcm11dGVMaW5lKGxpbmUsIHN0YXJ0SW5kZXgpe1xuICAgIHZhciBuZXdMaW5lID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIGluZGV4ID0gKGkgKyBzdGFydEluZGV4KSAlIGxpbmUubGVuZ3RoO1xuICAgICAgICAvLyBza2lwIHRoZSBmaXJzdCAocmVwZWF0ZWQpIGluZGV4XG4gICAgICAgIGlmIChpbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgbmV3TGluZS5wdXNoKGxpbmVbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZXdMaW5lLnB1c2gobmV3TGluZVswXSk7XG4gICAgcmV0dXJuIG5ld0xpbmU7XG59IiwiaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQge21hdDQsIG1hdDMsIHZlYzN9IGZyb20gJy4vdXRpbHMvZ2wtbWF0cml4JztcblxuLy8gQWJzdHJhY3QgYmFzZSBjbGFzc1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FtZXJhIHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZpZXcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbjtcbiAgICAgICAgdGhpcy56b29tID0gb3B0aW9ucy56b29tO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGNhbWVyYSBieSB0eXBlIG5hbWUsIGZhY3Rvcnktc3R5bGVcbiAgICBzdGF0aWMgY3JlYXRlKG5hbWUsIHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzd2l0Y2ggKGNvbmZpZy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdpc29tZXRyaWMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXNvbWV0cmljQ2FtZXJhKG5hbWUsIHZpZXcsIGNvbmZpZyk7XG4gICAgICAgICAgICBjYXNlICdmbGF0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsYXRDYW1lcmEobmFtZSwgdmlldywgY29uZmlnKTtcbiAgICAgICAgICAgIGNhc2UgJ3BlcnNwZWN0aXZlJzpcbiAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYShuYW1lLCB2aWV3LCBjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1ldGhvZCBjYWxsZWQgb25jZSBwZXIgZnJhbWVcbiAgICB1cGRhdGUoKSB7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uY2UgcGVyIGZyYW1lIHBlciBwcm9ncmFtIChlLmcuIGZvciBtYWluIHJlbmRlciBwYXNzLCB0aGVuIGZvciBlYWNoIGFkZGl0aW9uYWwgcGFzcyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24sIGV0Yy4pXG4gICAgc2V0dXBQcm9ncmFtKHByb2dyYW0pIHtcbiAgICB9XG5cbiAgICAvLyBTeW5jIGNhbWVyYSBwb3NpdGlvbi96b29tIHRvIHNjZW5lIHZpZXdcbiAgICB1cGRhdGVWaWV3ICgpIHtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gfHwgdGhpcy56b29tKSB7XG4gICAgICAgICAgICB2YXIgdmlldyA9IHt9O1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICB2aWV3ID0geyBsbmc6IHRoaXMucG9zaXRpb25bMF0sIGxhdDogdGhpcy5wb3NpdGlvblsxXSwgem9vbTogdGhpcy5wb3NpdGlvblsyXSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuem9vbSkge1xuICAgICAgICAgICAgICAgIHZpZXcuem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmlldy5zZXRWaWV3KHZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IG1vZGVsLXZpZXcgYW5kIG5vcm1hbCBtYXRyaWNlc1xuICAgIHNldHVwTWF0cmljZXMgKG1hdHJpY2VzLCBwcm9ncmFtKSB7XG4gICAgICAgIC8vIE1vZGVsIHZpZXcgbWF0cml4IC0gdHJhbnNmb3JtIHRpbGUgc3BhY2UgaW50byB2aWV3IHNwYWNlIChtZXRlcnMsIHJlbGF0aXZlIHRvIGNhbWVyYSlcbiAgICAgICAgbWF0NC5tdWx0aXBseShtYXRyaWNlcy5tb2RlbF92aWV3MzIsIHRoaXMudmlld19tYXRyaXgsIG1hdHJpY2VzLm1vZGVsKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9tb2RlbFZpZXcnLCBtYXRyaWNlcy5tb2RlbF92aWV3MzIpO1xuXG4gICAgICAgIC8vIE5vcm1hbCBtYXRyaWNlcyAtIHRyYW5zZm9ybXMgc3VyZmFjZSBub3JtYWxzIGludG8gdmlldyBzcGFjZVxuICAgICAgICBtYXQzLm5vcm1hbEZyb21NYXQ0KG1hdHJpY2VzLm5vcm1hbDMyLCBtYXRyaWNlcy5tb2RlbF92aWV3MzIpO1xuICAgICAgICBtYXQzLmludmVydChtYXRyaWNlcy5pbnZlcnNlX25vcm1hbDMyLCBtYXRyaWNlcy5ub3JtYWwzMik7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4M2Z2JywgJ3Vfbm9ybWFsTWF0cml4JywgbWF0cmljZXMubm9ybWFsMzIpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDNmdicsICd1X2ludmVyc2VOb3JtYWxNYXRyaXgnLCBtYXRyaWNlcy5pbnZlcnNlX25vcm1hbDMyKTtcbiAgICB9XG5cbn1cblxuLyoqXG4gICAgUGVyc3BlY3RpdmUgbWF0cml4IHByb2plY3Rpb25cblxuICAgIFRoaXMgaXMgYSBzcGVjaWFsaXplZCBwZXJzcGVjdGl2ZSBjYW1lcmEgdGhhdCwgZ2l2ZW4gYSBkZXNpcmVkIGNhbWVyYSBmb2NhbCBsZW5ndGggKHdoaWNoIGNhbiBhbHNvIHZhcnkgYnkgem9vbSBsZXZlbCksXG4gICAgY29uc3RyYWlucyB0aGUgY2FtZXJhIGhlaWdodCBhYm92ZSB0aGUgZ3JvdW5kIHBsYW5lIHN1Y2ggdGhhdCB0aGUgZGlzcGxheWVkIGdyb3VuZCBhcmVhIG9mIHRoZSBtYXAgbWF0Y2hlcyB0aGF0IG9mXG4gICAgYSB0cmFkaXRpb25hbCB3ZWIgbWVyY2F0b3IgbWFwLiBUaGlzIG1lYW5zIHlvdSBjYW4gc2V0IHRoZSBjYW1lcmEgbG9jYXRpb24gYnkgW2xhdCwgbG5nLCB6b29tXSBhcyB5b3Ugd291bGQgYSB0eXBpY2FsXG4gICAgd2ViIG1lcmNhdG9yIG1hcCwgdGhlbiBhZGp1c3QgdGhlIGZvY2FsIGxlbmd0aCBhcyBuZWVkZWQuXG5cbiAgICBWYW5pc2hpbmcgcG9pbnQgY2FuIGFsc28gYmUgYWRqdXN0ZWQgdG8gYWNoaWV2ZSBkaWZmZXJlbnQgXCJ2aWV3aW5nIGFuZ2xlc1wiLCBlLmcuIGluc3RlYWQgb2YgbG9va2luZyBzdHJhaWdodCBkb3duIGludG9cbiAgICB0aGUgY2VudGVyIG9mIHRoZSB2aWV3cG9ydCwgdGhlIGNhbWVyYSBhcHBlYXJzIHRvIGJlIHRpbHRlZCBhdCBhbiBhbmdsZS4gRm9yIGV4YW1wbGU6XG5cbiAgICBbMCwgMF0gPSBsb29raW5nIHRvd2FyZHMgY2VudGVyIG9mIHZpZXdwb3J0XG4gICAgWy0yNTAsIC0yNTBdID0gbG9va2luZyAyNTAgcGl4ZWxzIGZyb20gdGhlIHZpZXdwb3J0IGNlbnRlciB0byB0aGUgbG93ZXItbGVmdCBjb3JuZXJcbiAgICBbNDAwLCAwXSA9IGxvb2tpbmcgNDAwIHBpeGVscyB0byB0aGUgcmlnaHQgb2YgdGhlIHZpZXdwb3J0IGNlbnRlclxuKi9cbmNsYXNzIFBlcnNwZWN0aXZlQ2FtZXJhIGV4dGVuZHMgQ2FtZXJhIHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZpZXcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihuYW1lLCB2aWV3LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3BlcnNwZWN0aXZlJztcblxuICAgICAgICAvLyBhIHNpbmdsZSBzY2FsYXIsIG9yIHBhaXJzIG9mIHN0b3BzIG1hcHBpbmcgem9vbSBsZXZlbHMsIGUuZy4gW3pvb20sIGZvY2FsIGxlbmd0aF1cbiAgICAgICAgdGhpcy5mb2NhbF9sZW5ndGggPSBvcHRpb25zLmZvY2FsX2xlbmd0aDtcbiAgICAgICAgdGhpcy5mb3YgPSBvcHRpb25zLmZvdjtcbiAgICAgICAgaWYgKCF0aGlzLmZvY2FsX2xlbmd0aCAmJiAhdGhpcy5mb3YpIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgZm9jYWwgbGVuZ3RoIHJhbmdlcyBieSB6b29tXG4gICAgICAgICAgICB0aGlzLmZvY2FsX2xlbmd0aCA9IFtbMTYsIDJdLCBbMTcsIDIuNV0sIFsxOCwgM10sIFsxOSwgNF0sIFsyMCwgNl1dO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnQgPSBvcHRpb25zLnZhbmlzaGluZ19wb2ludCB8fCBbMCwgMF07IC8vIFt4LCB5XVxuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludCA9IHRoaXMudmFuaXNoaW5nX3BvaW50Lm1hcChwYXJzZUZsb2F0KTsgLy8gd2UgaW1wbGljaXRseSBvbmx5IHN1cHBvcnQgcHggdW5pdHMgaGVyZVxuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3ID0gW107XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZXdfbWF0cml4ID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcblxuICAgICAgICAvLyAnY2FtZXJhJyBpcyB0aGUgbmFtZSBvZiB0aGUgc2hhZGVyIGJsb2NrLCBlLmcuIGRldGVybWluZXMgd2hlcmUgaW4gdGhlIHNoYWRlciB0aGlzIGNvZGUgaXMgaW5qZWN0ZWRcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZXBsYWNlQmxvY2soJ2NhbWVyYScsIGBcbiAgICAgICAgICAgIHVuaWZvcm0gbWF0NCB1X3Byb2plY3Rpb247XG4gICAgICAgICAgICB1bmlmb3JtIHZlYzMgdV9leWU7XG4gICAgICAgICAgICB1bmlmb3JtIHZlYzIgdV92YW5pc2hpbmdfcG9pbnQ7XG5cbiAgICAgICAgICAgIHZvaWQgY2FtZXJhUHJvamVjdGlvbiAoaW5vdXQgdmVjNCBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdV9wcm9qZWN0aW9uICogcG9zaXRpb247XG4gICAgICAgICAgICB9YFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIENvbnN0cmFpbnMgdGhlIGNhbWVyYSBzbyB0aGF0IHRoZSB2aWV3YWJsZSBhcmVhIG1hdGNoZXMgZ2l2ZW4gdGhlIHZpZXdwb3J0IGhlaWdodFxuICAgIC8vIChpbiB3b3JsZCBzcGFjZSwgZS5nLiBtZXRlcnMpLCBnaXZlbiBlaXRoZXIgYSBjYW1lcmEgZm9jYWwgbGVuZ3RoIG9yIGZpZWxkLW9mLXZpZXdcbiAgICAvLyAoZm9jYWwgbGVuZ3RoIGlzIHVzZWQgaWYgYm90aCBhcmUgcGFzc2VkKS5cbiAgICBjb25zdHJhaW5DYW1lcmEoeyB2aWV3X2hlaWdodCwgaGVpZ2h0LCBmb2NhbF9sZW5ndGgsIGZvdiB9KSB7XG4gICAgICAgIC8vIFNvbHZlIGZvciBjYW1lcmEgaGVpZ2h0XG4gICAgICAgIGlmICghaGVpZ2h0KSB7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIGZvY2FsIGxlbmd0aCwgY2FsY3VsYXRlIEZPVlxuICAgICAgICAgICAgaWYgKGZvY2FsX2xlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvdiA9IE1hdGguYXRhbigxIC8gZm9jYWxfbGVuZ3RoKSAqIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBoYXZlIEZPViwgY2FsY3VsYXRlIGZvY2FsIGxlbmd0aFxuICAgICAgICAgICAgZWxzZSBpZiAoZm92KSB7XG4gICAgICAgICAgICAgICAgZm92ID0gZm92ICogTWF0aC5QSSAvIDE4MDsgLy8gY29udmVydCBGT1YgZGVncmVlcyB0byByYWRpYW5zXG4gICAgICAgICAgICAgICAgZm9jYWxfbGVuZ3RoID0gMSAvIE1hdGgudGFuKGZvdiAvIDIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXN0YW5jZSB0aGF0IGNhbWVyYSBzaG91bGQgYmUgZnJvbSBncm91bmQgc3VjaCB0aGF0IGl0IGZpdHMgdGhlIGZpZWxkIG9mIHZpZXcgZXhwZWN0ZWRcbiAgICAgICAgICAgIC8vIGZvciBhIGNvbnZlbnRpb25hbCB3ZWIgbWVyY2F0b3IgbWFwIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwgYW5kIGNhbWVyYSBmb2NhbCBsZW5ndGhcbiAgICAgICAgICAgIGhlaWdodCA9IHZpZXdfaGVpZ2h0IC8gMiAqIGZvY2FsX2xlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb2x2ZSBmb3IgY2FtZXJhIGZvY2FsIGxlbmd0aCAvIGZpZWxkLW9mLXZpZXdcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb2NhbF9sZW5ndGggPSAyICogaGVpZ2h0IC8gdmlld19oZWlnaHQ7XG4gICAgICAgICAgICBmb3YgPSBNYXRoLmF0YW4oMSAvIGZvY2FsX2xlbmd0aCkgKiAyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgdmlld19oZWlnaHQsIGhlaWdodCwgZm9jYWxfbGVuZ3RoLCBmb3YgfTtcbiAgICB9XG5cbiAgICB1cGRhdGVNYXRyaWNlcygpIHtcbiAgICAgICAgLy8gVE9ETzogb25seSByZS1jYWxjdWxhdGUgdGhlc2UgdmFycyB3aGVuIG5lY2Vzc2FyeVxuXG4gICAgICAgIC8vIEhlaWdodCBvZiB0aGUgdmlld3BvcnQgaW4gbWV0ZXJzIGF0IGN1cnJlbnQgem9vbVxuICAgICAgICB2YXIgdmlld3BvcnRfaGVpZ2h0ID0gdGhpcy52aWV3LnNpemUuY3NzLmhlaWdodCAqIHRoaXMudmlldy5tZXRlcnNfcGVyX3BpeGVsO1xuXG4gICAgICAgIC8vIENvbXB1dGUgY2FtZXJhIHByb3BlcnRpZXMgdG8gZml0IGRlc2lyZWQgdmlld1xuICAgICAgICB2YXIgeyBoZWlnaHQsIGZvdiB9ID0gdGhpcy5jb25zdHJhaW5DYW1lcmEoe1xuICAgICAgICAgICAgdmlld19oZWlnaHQ6IHZpZXdwb3J0X2hlaWdodCxcbiAgICAgICAgICAgIGZvY2FsX2xlbmd0aDogVXRpbHMuaW50ZXJwb2xhdGUodGhpcy52aWV3Lnpvb20sIHRoaXMuZm9jYWxfbGVuZ3RoKSxcbiAgICAgICAgICAgIGZvdjogVXRpbHMuaW50ZXJwb2xhdGUodGhpcy52aWV3Lnpvb20sIHRoaXMuZm92KVxuICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVmlldyBtYXRyaXhcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gW3RoaXMudmlldy5jZW50ZXIubWV0ZXJzLngsIHRoaXMudmlldy5jZW50ZXIubWV0ZXJzLnksIGhlaWdodF07XG4gICAgICAgIHRoaXMucG9zaXRpb25fbWV0ZXJzID0gcG9zaXRpb247XG5cbiAgICAgICAgLy8gbWF0NC5sb29rQXQodGhpcy52aWV3X21hdHJpeCxcbiAgICAgICAgLy8gICAgIHZlYzMuZnJvbVZhbHVlcyguLi5wb3NpdGlvbiksXG4gICAgICAgIC8vICAgICB2ZWMzLmZyb21WYWx1ZXMocG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdLCBoZWlnaHQgLSAxKSxcbiAgICAgICAgLy8gICAgIHZlYzMuZnJvbVZhbHVlcygwLCAxLCAwKSk7XG4gICAgICAgIC8vIEV4Y2x1ZGUgY2FtZXJhIGhlaWdodCBmcm9tIHZpZXcgbWF0cml4XG4gICAgICAgIG1hdDQubG9va0F0KHRoaXMudmlld19tYXRyaXgsXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMocG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdLCAwKSxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcyhwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIC0xKSxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcygwLCAxLCAwKSk7XG5cbiAgICAgICAgLy8gUHJvamVjdGlvbiBtYXRyaXhcbiAgICAgICAgbWF0NC5wZXJzcGVjdGl2ZSh0aGlzLnByb2plY3Rpb25fbWF0cml4LCBmb3YsIHRoaXMudmlldy5hc3BlY3QsIDEsIGhlaWdodCAqIDIpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgdmFuaXNoaW5nIHBvaW50IGZyb20gcGl4ZWxzIHRvIHZpZXdwb3J0IHNwYWNlXG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMF0gPSB0aGlzLnZhbmlzaGluZ19wb2ludFswXSAvIHRoaXMudmlldy5zaXplLmNzcy53aWR0aDtcbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1sxXSA9IHRoaXMudmFuaXNoaW5nX3BvaW50WzFdIC8gdGhpcy52aWV3LnNpemUuY3NzLmhlaWdodDtcblxuICAgICAgICAvLyBBZGp1c3QgcHJvamVjdGlvbiBtYXRyaXggdG8gaW5jbHVkZSB2YW5pc2hpbmcgcG9pbnQgc2tld1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzhdID0gLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMF0gKiAyOyAvLyB6IGNvbHVtbiBvZiB4IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB4XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXhbOV0gPSAtdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1sxXSAqIDI7IC8vIHogY29sdW1uIG9mIHkgcm93LCBlLmcuIGFtb3VudCB6IHNrZXdzIHlcblxuICAgICAgICAvLyBUcmFuc2xhdGUgZ2VvbWV0cnkgaW50byB0aGUgZGlzdGFuY2Ugc28gdGhhdCBjYW1lcmEgaXMgYXBwcm9wcmlhdGUgaGVpZ2h0IGFib3ZlIGdyb3VuZFxuICAgICAgICAvLyBBZGRpdGlvbmFsbHksIGFkanVzdCB4eSB0byBjb21wZW5zYXRlIGZvciBhbnkgdmFuaXNoaW5nIHBvaW50IHNrZXcsIGUuZy4gbW92ZSBnZW9tZXRyeSBzbyB0aGF0IHRoZSBkaXNwbGF5ZWQgZ1xuICAgICAgICAvLyBwbGFuZSBvZiB0aGUgbWFwIG1hdGNoZXMgdGhhdCBleHBlY3RlZCBieSBhIHRyYWRpdGlvbmFsIHdlYiBtZXJjYXRvciBtYXAgYXQgdGhpcyBbbGF0LCBsbmcsIHpvb21dLlxuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0aGlzLnByb2plY3Rpb25fbWF0cml4LCB0aGlzLnByb2plY3Rpb25fbWF0cml4LFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0X2hlaWdodC8yICogdGhpcy52aWV3LmFzcGVjdCAqICgtdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1swXSAqIDIpLFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0X2hlaWdodC8yICogKC10aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzFdICogMiksXG4gICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEluY2x1ZGUgY2FtZXJhIGhlaWdodCBpbiBwcm9qZWN0aW9uIG1hdHJpeFxuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0aGlzLnByb2plY3Rpb25fbWF0cml4LCB0aGlzLnByb2plY3Rpb25fbWF0cml4LCB2ZWMzLmZyb21WYWx1ZXMoMCwgMCwgLWhlaWdodCkpO1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0ocHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDRmdicsICd1X3Byb2plY3Rpb24nLCB0aGlzLnByb2plY3Rpb25fbWF0cml4KTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCczZicsICd1X2V5ZScsIFswLCAwLCB0aGlzLnBvc2l0aW9uX21ldGVyc1syXV0pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzJmdicsICd1X3ZhbmlzaGluZ19wb2ludCcsIHRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXcpO1xuICAgIH1cblxufVxuXG4vLyBJc29tZXRyaWMtc3R5bGUgcHJvamVjdGlvblxuLy8gTm90ZTogdGhpcyBpcyBhY3R1YWxseSBhbiBcImF4b25vbWV0cmljXCIgcHJvamVjdGlvbiwgYnV0IEknbSB1c2luZyB0aGUgY29sbG9xdWlhbCB0ZXJtIGlzb21ldHJpYyBiZWNhdXNlIGl0IGlzIG1vcmUgcmVjb2duaXphYmxlLlxuLy8gQW4gaXNvbWV0cmljIHByb2plY3Rpb24gaXMgYSBzcGVjaWZpYyBzdWJzZXQgb2YgYXhvbm9tZXRyaWMgcHJvamVjdGlvbnMuXG4vLyAnYXhpcycgZGV0ZXJtaW5lcyB0aGUgeHkgc2tldyBhcHBsaWVkIHRvIGEgdmVydGV4IGJhc2VkIG9uIGl0cyB6IGNvb3JkaW5hdGUsIGUuZy4gWzAsIDFdIGF4aXMgY2F1c2VzIGJ1aWxkaW5ncyB0byBiZSBkcmF3blxuLy8gc3RyYWlnaHQgdXB3YXJkcyBvbiBzY3JlZW4gYXQgdGhlaXIgdHJ1ZSBoZWlnaHQsIFswLCAuNV0gd291bGQgZHJhdyB0aGVtIHVwIGF0IGhhbGYtaGVpZ2h0LCBbMSwgMF0gd291bGQgYmUgc2lkZXdheXMsIGV0Yy5cbmNsYXNzIElzb21ldHJpY0NhbWVyYSBleHRlbmRzIENhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdmlldywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdpc29tZXRyaWMnO1xuICAgICAgICB0aGlzLmF4aXMgPSBvcHRpb25zLmF4aXMgfHwgeyB4OiAwLCB5OiAxIH07XG4gICAgICAgIGlmICh0aGlzLmF4aXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aGlzLmF4aXMgPSB7IHg6IHRoaXMuYXhpc1swXSwgeTogdGhpcy5heGlzWzFdIH07IC8vIGFsbG93IGF4aXMgdG8gYWxzbyBiZSBwYXNzZWQgYXMgMi1lbGVtIGFycmF5XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvc2l0aW9uX21ldGVycyA9IG51bGw7XG4gICAgICAgIHRoaXMudmlld3BvcnRfaGVpZ2h0ID0gbnVsbDtcblxuICAgICAgICB0aGlzLnZpZXdfbWF0cml4ID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcblxuICAgICAgICAvLyAnY2FtZXJhJyBpcyB0aGUgbmFtZSBvZiB0aGUgc2hhZGVyIGJsb2NrLCBlLmcuIGRldGVybWluZXMgd2hlcmUgaW4gdGhlIHNoYWRlciB0aGlzIGNvZGUgaXMgaW5qZWN0ZWRcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZXBsYWNlQmxvY2soJ2NhbWVyYScsIGBcbiAgICAgICAgICAgIHVuaWZvcm0gbWF0NCB1X3Byb2plY3Rpb247XG4gICAgICAgICAgICB1bmlmb3JtIHZlYzMgdV9leWU7XG4gICAgICAgICAgICB1bmlmb3JtIHZlYzIgdV92YW5pc2hpbmdfcG9pbnQ7XG5cbiAgICAgICAgICAgIHZvaWQgY2FtZXJhUHJvamVjdGlvbiAoaW5vdXQgdmVjNCBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdV9wcm9qZWN0aW9uICogcG9zaXRpb247XG4gICAgICAgICAgICAgICAgLy8gcG9zaXRpb24ueHkgKz0gcG9zaXRpb24ueiAqIHVfaXNvbWV0cmljX2F4aXM7XG5cbiAgICAgICAgICAgICAgICAvLyBSZXZlcnNlIHogZm9yIGRlcHRoIGJ1ZmZlciBzbyB1cCBpcyBuZWdhdGl2ZSxcbiAgICAgICAgICAgICAgICAvLyBhbmQgc2NhbGUgZG93biB2YWx1ZXMgc28gb2JqZWN0cyBoaWdoZXIgdGhhbiBvbmUgc2NyZWVuIGhlaWdodCB3aWxsIG5vdCBnZXQgY2xpcHBlZFxuICAgICAgICAgICAgICAgIC8vIHB1bGwgZm9yd2FyZCBzbGlnaHRseSB0byBhdm9pZCBnb2luZyBwYXN0IGZhciBjbGlwcGluZyBwbGFuZVxuICAgICAgICAgICAgICAgIHBvc2l0aW9uLnogPSAtcG9zaXRpb24ueiAvIDEwMC4gKyAxLiAtIDAuMDAxO1xuICAgICAgICAgICAgfWBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuXG4gICAgICAgIHRoaXMudmlld3BvcnRfaGVpZ2h0ID0gdGhpcy52aWV3LnNpemUuY3NzLmhlaWdodCAqIHRoaXMudmlldy5tZXRlcnNfcGVyX3BpeGVsO1xuICAgICAgICB2YXIgcG9zaXRpb24gPSBbdGhpcy52aWV3LmNlbnRlci5tZXRlcnMueCwgdGhpcy52aWV3LmNlbnRlci5tZXRlcnMueSwgdGhpcy52aWV3cG9ydF9oZWlnaHRdO1xuICAgICAgICB0aGlzLnBvc2l0aW9uX21ldGVycyA9IHBvc2l0aW9uO1xuXG4gICAgICAgIC8vIFZpZXdcbiAgICAgICAgbWF0NC5pZGVudGl0eSh0aGlzLnZpZXdfbWF0cml4KTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy52aWV3X21hdHJpeCwgdGhpcy52aWV3X21hdHJpeCwgdmVjMy5mcm9tVmFsdWVzKC1wb3NpdGlvblswXSwgLXBvc2l0aW9uWzFdLCAwKSk7XG5cbiAgICAgICAgLy8gUHJvamVjdGlvblxuICAgICAgICBtYXQ0LmlkZW50aXR5KHRoaXMucHJvamVjdGlvbl9tYXRyaXgpO1xuXG4gICAgICAgIC8vIGFwcGx5IGlzb21ldHJpYyBza2V3XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXhbOF0gPSB0aGlzLmF4aXMueCAvIHRoaXMudmlldy5hc3BlY3Q7IC8vIHogY29sdW1uIG9mIHggcm93LCBlLmcuIGFtb3VudCB6IHNrZXdzIHhcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeFs5XSA9IHRoaXMuYXhpcy55OyAgICAgICAgICAgICAgICAgICAgLy8geiBjb2x1bW4gb2YgeCByb3csIGUuZy4gYW1vdW50IHogc2tld3MgeVxuXG4gICAgICAgIC8vIGNvbnZlcnQgbWV0ZXJzIHRvIHZpZXdwb3J0XG4gICAgICAgIG1hdDQuc2NhbGUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcyhcbiAgICAgICAgICAgICAgICAyIC8gdGhpcy52aWV3LnNpemUubWV0ZXJzLngsXG4gICAgICAgICAgICAgICAgMiAvIHRoaXMudmlldy5zaXplLm1ldGVycy55LFxuICAgICAgICAgICAgICAgIDIgLyB0aGlzLnZpZXcuc2l6ZS5tZXRlcnMueVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfcHJvamVjdGlvbicsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgpO1xuXG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnM2Z2JywgJ3VfZXllJywgWzAsIDAsIHRoaXMudmlld3BvcnRfaGVpZ2h0XSk7XG4gICAgICAgIC8vIHByb2dyYW0udW5pZm9ybSgnM2YnLCAndV9leWUnLCB0aGlzLnZpZXdwb3J0X2hlaWdodCAqIHRoaXMuYXhpcy54LCB0aGlzLnZpZXdwb3J0X2hlaWdodCAqIHRoaXMuYXhpcy55LCB0aGlzLnZpZXdwb3J0X2hlaWdodCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMmZ2JywgJ3VfdmFuaXNoaW5nX3BvaW50JywgWzAsIDBdKTtcbiAgICB9XG5cbn1cblxuLy8gRmxhdCBwcm9qZWN0aW9uIChlLmcuIGp1c3QgdG9wLWRvd24sIG5vIHBlcnNwZWN0aXZlKSAtIGEgZGVnZW5lcmF0ZSBpc29tZXRyaWMgY2FtZXJhXG5jbGFzcyBGbGF0Q2FtZXJhIGV4dGVuZHMgSXNvbWV0cmljQ2FtZXJhIHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZpZXcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihuYW1lLCB2aWV3LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2ZsYXQnO1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgLy8gQXhpcyBpcyBmaXhlZCB0byAoMCwgMCkgZm9yIGZsYXQgY2FtZXJhXG4gICAgICAgIHRoaXMuYXhpcy54ID0gMDtcbiAgICAgICAgdGhpcy5heGlzLnkgPSAwO1xuXG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgIH1cblxufVxuIiwiLy8gTWlzY2VsbGFuZW91cyBnZW8gZnVuY3Rpb25zXG5cbnZhciBHZW87XG5leHBvcnQgZGVmYXVsdCBHZW8gPSB7fTtcblxuLy8gUHJvamVjdGlvbiBjb25zdGFudHNcbkdlby5kZWZhdWx0X3NvdXJjZV9tYXhfem9vbSA9IDE4O1xuR2VvLmRlZmF1bHRfdmlld19tYXhfem9vbSA9IDIwO1xuR2VvLnRpbGVfc2l6ZSA9IDI1Njtcbkdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzID0gMjAwMzc1MDguMzQyNzg5MjQ0O1xuR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzID0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMgKiAyO1xuR2VvLm1pbl96b29tX21ldGVyc19wZXJfcGl4ZWwgPSBHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBHZW8udGlsZV9zaXplOyAvLyBtaW4gem9vbSBkcmF3cyB3b3JsZCBhcyAyIHRpbGVzIHdpZGVcblxubGV0IG1ldGVyc19wZXJfcGl4ZWwgPSBbXTtcbkdlby5tZXRlcnNQZXJQaXhlbCA9IGZ1bmN0aW9uICh6KSB7XG4gICAgbWV0ZXJzX3Blcl9waXhlbFt6XSA9IG1ldGVyc19wZXJfcGl4ZWxbel0gfHwgR2VvLm1pbl96b29tX21ldGVyc19wZXJfcGl4ZWwgLyBNYXRoLnBvdygyLCB6KTtcbiAgICByZXR1cm4gbWV0ZXJzX3Blcl9waXhlbFt6XTtcbn07XG5cbmxldCBtZXRlcnNfcGVyX3RpbGUgPSBbXTtcbkdlby5tZXRlcnNQZXJUaWxlID0gZnVuY3Rpb24gKHopIHtcbiAgICBtZXRlcnNfcGVyX3RpbGVbel0gPSBtZXRlcnNfcGVyX3RpbGVbel0gfHwgR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgeik7XG4gICAgcmV0dXJuIG1ldGVyc19wZXJfdGlsZVt6XTtcbn07XG5cbi8vIENvbnZlcnNpb24gZnVuY3Rpb25zIGJhc2VkIG9uIGFuIGRlZmluZWQgdGlsZSBzY2FsZVxuR2VvLnRpbGVfc2NhbGUgPSA0MDk2OyAvLyBjb29yZGluYXRlcyBhcmUgbG9jYWxseSBzY2FsZWQgdG8gdGhlIHJhbmdlIFswLCB0aWxlX3NjYWxlXVxuR2VvLnVuaXRzX3Blcl9waXhlbCA9IEdlby50aWxlX3NjYWxlIC8gR2VvLnRpbGVfc2l6ZTtcbkdlby5oZWlnaHRfc2NhbGUgPSAxNjsgIC8vIHByb3ZpZGVzIHN1Yi1tZXRlciBwcmVjaXNpb24gZm9yIGhlaWdodCB2YWx1ZXMgKDE2dGhzIG9mIGEgbWV0ZXJzKVxuXG5sZXQgdW5pdHNfcGVyX21ldGVyID0gW107XG5HZW8udW5pdHNQZXJNZXRlciA9IGZ1bmN0aW9uICh6KSB7XG4gICAgdW5pdHNfcGVyX21ldGVyW3pdID0gdW5pdHNfcGVyX21ldGVyW3pdIHx8IEdlby50aWxlX3NjYWxlIC8gKEdlby50aWxlX3NpemUgKiBHZW8ubWV0ZXJzUGVyUGl4ZWwoeikpO1xuICAgIHJldHVybiB1bml0c19wZXJfbWV0ZXJbel07XG59O1xuXG4vLyBDb252ZXJ0IHRpbGUgbG9jYXRpb24gdG8gbWVyY2F0b3IgbWV0ZXJzIC0gbXVsdGlwbHkgYnkgcGl4ZWxzIHBlciB0aWxlLCB0aGVuIGJ5IG1ldGVycyBwZXIgcGl4ZWwsIGFkanVzdCBmb3IgbWFwIG9yaWdpblxuR2VvLm1ldGVyc0ZvclRpbGUgPSBmdW5jdGlvbiAodGlsZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHRpbGUueCAqIEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHRpbGUueikgLSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycyxcbiAgICAgICAgeTogLSh0aWxlLnkgKiBHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB0aWxlLnopIC0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMpXG4gICAgfTtcbn07XG5cbi8qKlxuICAgR2l2ZW4gYSBwb2ludCBpbiBtZXJjYXRvciBtZXRlcnMgYW5kIGEgem9vbSBsZXZlbCwgcmV0dXJuIHRoZSB0aWxlIFgvWS9aIHRoYXQgdGhlIHBvaW50IGxpZXMgaW5cbiovXG5HZW8udGlsZUZvck1ldGVycyA9IGZ1bmN0aW9uIChbeCwgeV0sIHpvb20pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBNYXRoLmZsb29yKCh4ICsgR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMpIC8gKEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHpvb20pKSksXG4gICAgICAgIHk6IE1hdGguZmxvb3IoKC15ICsgR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMpIC8gKEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHpvb20pKSksXG4gICAgICAgIHo6IHpvb21cbiAgICB9O1xufTtcblxuLy8gV3JhcCBhIHRpbGUgdG8gcG9zaXRpdmUgI3MgZm9yIHpvb21cbi8vIE9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgYXhlcyB0byB3cmFwXG5HZW8ud3JhcFRpbGUgPSBmdW5jdGlvbih7IHgsIHksIHogfSwgbWFzayA9IHsgeDogdHJ1ZSwgeTogZmFsc2UgfSkge1xuICAgIHZhciBtID0gKDEgPDwgeikgLSAxO1xuICAgIGlmIChtYXNrLngpIHtcbiAgICAgICAgeCA9IHggJiBtO1xuICAgIH1cbiAgICBpZiAobWFzay55KSB7XG4gICAgICAgIHkgPSB5ICYgbTtcbiAgICB9XG4gICAgcmV0dXJuIHsgeCwgeSwgeiB9O1xufTtcblxuLyoqXG4gICBDb252ZXJ0IG1lcmNhdG9yIG1ldGVycyB0byBsYXQtbG5nXG4qL1xuR2VvLm1ldGVyc1RvTGF0TG5nID0gZnVuY3Rpb24gKFt4LCB5XSkge1xuXG4gICAgeCAvPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycztcbiAgICB5IC89IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzO1xuXG4gICAgeSA9ICgyICogTWF0aC5hdGFuKE1hdGguZXhwKHkgKiBNYXRoLlBJKSkgLSAoTWF0aC5QSSAvIDIpKSAvIE1hdGguUEk7XG5cbiAgICB4ICo9IDE4MDtcbiAgICB5ICo9IDE4MDtcblxuICAgIHJldHVybiBbeCwgeV07XG59O1xuXG4vKipcbiAgQ29udmVydCBsYXQtbG5nIHRvIG1lcmNhdG9yIG1ldGVyc1xuKi9cbkdlby5sYXRMbmdUb01ldGVycyA9IGZ1bmN0aW9uKFt4LCB5XSkge1xuXG4gICAgLy8gTGF0aXR1ZGVcbiAgICB5ID0gTWF0aC5sb2coTWF0aC50YW4oeSpNYXRoLlBJLzM2MCArIE1hdGguUEkvNCkpIC8gTWF0aC5QSTtcbiAgICB5ICo9IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzO1xuXG4gICAgLy8gTG9uZ2l0dWRlXG4gICAgeCAqPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycyAvIDE4MDtcblxuICAgIHJldHVybiBbeCwgeV07XG59O1xuXG5HZW8ud3JhcExuZyA9IGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA+IDE4MCB8fCB4IDwgLTE4MCkge1xuICAgICAgICB4ID0gKCh4ICsgMTgwKSAlIDM2MCArIDM2MCkgJSAzNjAgLSAxODA7XG4gICAgfVxuICAgIHJldHVybiB4O1xufTtcblxuLy8gUnVuIGFuIGluLXBsYWNlIHRyYW5zZm9ybSBmdW5jdGlvbiBvbiBlYWNoIGNvb29yZGluYXRlIGluIGEgR2VvSlNPTiBnZW9tZXRyeVxuR2VvLnRyYW5zZm9ybUdlb21ldHJ5ID0gZnVuY3Rpb24gKGdlb21ldHJ5LCB0cmFuc2Zvcm0pIHtcbiAgICBpZiAoZ2VvbWV0cnkgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47IC8vIHNraXAgaWYgbWlzc2luZyBnZW9tZXRyeSAodmFsaWQgR2VvSlNPTilcbiAgICB9XG5cbiAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICB0cmFuc2Zvcm0oZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTGluZVN0cmluZycgfHwgZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2goY29vcmRpbmF0ZXMgPT4gY29vcmRpbmF0ZXMuZm9yRWFjaCh0cmFuc2Zvcm0pKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMuZm9yRWFjaChwb2x5Z29uID0+IHtcbiAgICAgICAgICAgIHBvbHlnb24uZm9yRWFjaChjb29yZGluYXRlcyA9PiBjb29yZGluYXRlcy5mb3JFYWNoKHRyYW5zZm9ybSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gVE9ETzogc3VwcG9ydCBHZW9tZXRyeUNvbGxlY3Rpb25cbn07XG5cbkdlby5ib3hJbnRlcnNlY3QgPSBmdW5jdGlvbiAoYjEsIGIyKSB7XG4gICAgcmV0dXJuICEoXG4gICAgICAgIGIyLnN3LnggPiBiMS5uZS54IHx8XG4gICAgICAgIGIyLm5lLnggPCBiMS5zdy54IHx8XG4gICAgICAgIGIyLnN3LnkgPiBiMS5uZS55IHx8XG4gICAgICAgIGIyLm5lLnkgPCBiMS5zdy55XG4gICAgKTtcbn07XG5cbi8vIEZpbmRzIHRoZSBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94IGZvciBhIHBvbHlnb25cbkdlby5maW5kQm91bmRpbmdCb3ggPSBmdW5jdGlvbiAocG9seWdvbikge1xuICAgIHZhciBtaW5feCA9IEluZmluaXR5LFxuICAgICAgICBtYXhfeCA9IC1JbmZpbml0eSxcbiAgICAgICAgbWluX3kgPSBJbmZpbml0eSxcbiAgICAgICAgbWF4X3kgPSAtSW5maW5pdHk7XG5cbiAgICAvLyBPbmx5IG5lZWQgdG8gZXhhbWluZSBvdXRlciByaW5nIChwb2x5Z29uWzBdKVxuICAgIHZhciBudW1fY29vcmRzID0gcG9seWdvblswXS5sZW5ndGg7XG4gICAgZm9yICh2YXIgYz0wOyBjIDwgbnVtX2Nvb3JkczsgYysrKSB7XG4gICAgICAgIHZhciBjb29yZCA9IHBvbHlnb25bMF1bY107XG5cbiAgICAgICAgaWYgKGNvb3JkWzBdIDwgbWluX3gpIHtcbiAgICAgICAgICAgIG1pbl94ID0gY29vcmRbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvb3JkWzFdIDwgbWluX3kpIHtcbiAgICAgICAgICAgIG1pbl95ID0gY29vcmRbMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvb3JkWzBdID4gbWF4X3gpIHtcbiAgICAgICAgICAgIG1heF94ID0gY29vcmRbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvb3JkWzFdID4gbWF4X3kpIHtcbiAgICAgICAgICAgIG1heF95ID0gY29vcmRbMV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW21pbl94LCBtaW5feSwgbWF4X3gsIG1heF95XTtcbn07XG5cbi8vIENvbnZlcnQgZ2VvbWV0cnkgdHlwZSB0byBvbmUgb2Y6ICdwb2ludCcsICdsaW5lJywgJ3BvbHlnb24nXG5HZW8uZ2VvbWV0cnlUeXBlID0gZnVuY3Rpb24odHlwZSkge1xuICAgIGlmICh0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgcmV0dXJuICdwb2x5Z29uJztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAnbGluZSc7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICByZXR1cm4gJ3BvaW50JztcbiAgICB9XG59O1xuXG5HZW8uY2VudHJvaWQgPSBmdW5jdGlvbiAocG9seWdvbikge1xuICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTGVhZmxldC9MZWFmbGV0L2Jsb2IvYzEwZjQwNWExMTIxNDJiMTk3ODU5NjdjZTBlMTQyMTMyYTYwOTVhZC9zcmMvbGF5ZXIvdmVjdG9yL1BvbHlnb24uanMjTDU3XG4gICAgbGV0IHggPSAwLCB5ID0gMCwgYXJlYSA9IDA7XG4gICAgbGV0IHJpbmcgPSBwb2x5Z29uWzBdOyAvLyBvbmx5IHVzZSBmaXJzdCByaW5nIGZvciBub3dcbiAgICBsZXQgbGVuID0gcmluZy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IGxlbiAtIDE7IGkgPCBsZW47IGogPSBpLCBpKyspIHtcbiAgICAgICAgbGV0IHAwID0gcmluZ1tpXTtcbiAgICAgICAgbGV0IHAxID0gcmluZ1tqXTtcbiAgICAgICAgbGV0IGYgPSBwMFsxXSAqIHAxWzBdIC0gcDFbMV0gKiBwMFswXTtcblxuICAgICAgICB4ICs9IChwMFswXSArIHAxWzBdKSAqIGY7XG4gICAgICAgIHkgKz0gKHAwWzFdICsgcDFbMV0pICogZjtcbiAgICAgICAgYXJlYSArPSBmICogMztcbiAgICB9XG5cbiAgICByZXR1cm4gW3ggLyBhcmVhLCB5IC8gYXJlYV07XG59O1xuXG5HZW8ubXVsdGlDZW50cm9pZCA9IGZ1bmN0aW9uIChwb2x5Z29ucykge1xuICAgIGxldCBuID0gcG9seWdvbnMubGVuZ3RoO1xuICAgIGxldCBjZW50cm9pZCA9IFswLCAwXTtcblxuICAgIGZvciAobGV0IHA9MDsgcCA8IHBvbHlnb25zLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgIGxldCBjID0gR2VvLmNlbnRyb2lkKHBvbHlnb25zW3BdKTtcbiAgICAgICAgY2VudHJvaWRbMF0gKz0gY1swXTtcbiAgICAgICAgY2VudHJvaWRbMV0gKz0gY1sxXTtcbiAgICB9XG5cbiAgICBjZW50cm9pZFswXSAvPSBuO1xuICAgIGNlbnRyb2lkWzFdIC89IG47XG5cbiAgICByZXR1cm4gY2VudHJvaWQ7XG59O1xuXG5HZW8uc2lnbmVkUG9seWdvblJpbmdBcmVhU3VtID0gZnVuY3Rpb24gKHJpbmcpIHtcbiAgICBsZXQgYXJlYSA9IDA7XG4gICAgbGV0IG4gPSByaW5nLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykge1xuICAgICAgICBsZXQgcDAgPSByaW5nW2ldO1xuICAgICAgICBsZXQgcDEgPSByaW5nW2krMV07XG5cbiAgICAgICAgYXJlYSArPSBwMFswXSAqIHAxWzFdIC0gcDFbMF0gKiBwMFsxXTtcbiAgICB9XG5cbiAgICBhcmVhICs9IHJpbmdbbiAtIDFdWzBdICogcmluZ1swXVsxXSAtIHJpbmdbMF1bMF0gKiByaW5nW24gLSAxXVsxXTtcbiAgICByZXR1cm4gYXJlYTtcbn07XG5cbkdlby5wb2x5Z29uUmluZ0FyZWEgPSBmdW5jdGlvbiAocmluZykge1xuICAgIHJldHVybiBNYXRoLmFicyhHZW8uc2lnbmVkUG9seWdvblJpbmdBcmVhU3VtKHJpbmcpKSAvIDI7XG59O1xuXG4vLyBUT0RPOiBzdWJ0cmFjdCBpbm5lciByaW5nc1xuR2VvLnBvbHlnb25BcmVhID0gZnVuY3Rpb24gKHBvbHlnb24pIHtcbiAgICByZXR1cm4gR2VvLnBvbHlnb25SaW5nQXJlYShwb2x5Z29uWzBdKTtcbn07XG5cbkdlby5tdWx0aVBvbHlnb25BcmVhID0gZnVuY3Rpb24gKHBvbHlnb25zKSB7XG4gICAgbGV0IGFyZWEgPSAwO1xuXG4gICAgZm9yIChsZXQgcD0wOyBwIDwgcG9seWdvbnMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgYXJlYSArPSBHZW8ucG9seWdvbkFyZWEocG9seWdvbnNbcF0pO1xuICAgIH1cblxuICAgIHJldHVybiBhcmVhO1xufTtcblxuR2VvLnJpbmdXaW5kaW5nID0gZnVuY3Rpb24gKHJpbmcpIHtcbiAgICBsZXQgYXJlYSA9IEdlby5zaWduZWRQb2x5Z29uUmluZ0FyZWFTdW0ocmluZyk7XG4gICAgaWYgKGFyZWEgPiAwKSB7XG4gICAgICAgIHJldHVybiAnQ1cnO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmVhIDwgMCkge1xuICAgICAgICByZXR1cm4gJ0NDVyc7XG4gICAgfVxuICAgIC8vIHJldHVybiB1bmRlZmluZWQgb24gemVybyBhcmVhIHBvbHlnb25cbn07XG4iLCIvLyBXZWJHTCBjb25zdGFudHMgLSBuZWVkIHRvIGltcG9ydCB0aGVzZSBzZXBhcmF0ZWx5IHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgaW4gdGhlIHdlYiB3b3JrZXJcblxudmFyIGdsO1xuZXhwb3J0IGRlZmF1bHQgZ2wgPSB7fTtcblxuLyogRGF0YVR5cGUgKi9cbmdsLkJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMDtcbmdsLlVOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICA9IDB4MTQwMTtcbmdsLlNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMjtcbmdsLlVOU0lHTkVEX1NIT1JUICAgICAgICAgICAgICAgICA9IDB4MTQwMztcbmdsLklOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwNDtcbmdsLlVOU0lHTkVEX0lOVCAgICAgICAgICAgICAgICAgICA9IDB4MTQwNTtcbmdsLkZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwNjtcbiIsIi8vIFdlYkdMIGNvbnRleHQgd3JhcHBlclxuXG52YXIgQ29udGV4dDtcbmV4cG9ydCBkZWZhdWx0IENvbnRleHQgPSB7fTtcblxuLy8gU2V0dXAgYSBXZWJHTCBjb250ZXh0XG4vLyBJZiBubyBjYW52YXMgZWxlbWVudCBpcyBwcm92aWRlZCwgb25lIGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBib2R5XG5Db250ZXh0LmdldENvbnRleHQgPSBmdW5jdGlvbiBnZXRDb250ZXh0IChjYW52YXMsIG9wdGlvbnMpXG57XG4gICAgdmFyIGZ1bGxzY3JlZW4gPSBmYWxzZTtcbiAgICBpZiAoY2FudmFzID09IG51bGwpIHtcbiAgICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIGNhbnZhcy5zdHlsZS50b3AgPSAwO1xuICAgICAgICBjYW52YXMuc3R5bGUubGVmdCA9IDA7XG4gICAgICAgIGNhbnZhcy5zdHlsZS56SW5kZXggPSAtMTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgICAgICBmdWxsc2NyZWVuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBvcHRpb25zKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgb3B0aW9ucyk7XG4gICAgaWYgKCFnbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBjcmVhdGUgV2ViR0wgY29udGV4dC5cIik7XG4gICAgfVxuXG4gICAgaWYgKCFmdWxsc2NyZWVuKSB7XG4gICAgICAgIENvbnRleHQucmVzaXplKGdsLCBwYXJzZUZsb2F0KGNhbnZhcy5zdHlsZS53aWR0aCksIHBhcnNlRmxvYXQoY2FudmFzLnN0eWxlLmhlaWdodCksIG9wdGlvbnMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIENvbnRleHQucmVzaXplKGdsLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0LCBvcHRpb25zLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBDb250ZXh0LnJlc2l6ZShnbCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCwgb3B0aW9ucy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2w7XG59O1xuXG5Db250ZXh0LnJlc2l6ZSA9IGZ1bmN0aW9uIChnbCwgd2lkdGgsIGhlaWdodCwgZGV2aWNlX3BpeGVsX3JhdGlvKVxue1xuICAgIGRldmljZV9waXhlbF9yYXRpbyA9IGRldmljZV9waXhlbF9yYXRpbyB8fCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICAgIGdsLmNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICBnbC5jYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICBnbC5jYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoICogZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICBnbC5jYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQgKiBkZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgZ2wudmlld3BvcnQoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KTtcbn07XG4iLCIvLyBXZWJHTCBleHRlbnNpb24gd3JhcHBlclxuLy8gU3RvcmVzIGV4dGVuc2lvbnMgYnkgbmFtZSBhbmQgR0wgY29udGV4dFxuXG4vLyBsaXN0IG9mIGV4dGVuc2lvbiBhcnJheXMsIGZvciBlYWNoIGVudHJ5LCAxc3QgZWxlbWVudCBHTCBjb250ZXh0LCAybmQgbWFwIG9mIGV4dGVuc2lvbnMgYnkgbmFtZVxubGV0IGV4dGVuc2lvbnMgPSBbXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uIChnbCwgbmFtZSkge1xuICAgIGxldCBleHRzID0gZXh0ZW5zaW9ucy5maWx0ZXIoZSA9PiBlWzBdID09PSBnbClbMF07XG4gICAgZXh0cyA9IGV4dHMgJiYgZXh0c1sxXTtcblxuICAgIGlmICghZXh0cykge1xuICAgICAgICBleHRlbnNpb25zLnB1c2goW2dsLCB7fV0pO1xuICAgICAgICBleHRzID0gZXh0ZW5zaW9uc1tleHRlbnNpb25zLmxlbmd0aC0xXVsxXTtcbiAgICB9XG5cbiAgICBpZiAoIWV4dHNbbmFtZV0pIHtcbiAgICAgICAgZXh0c1tuYW1lXSA9IGdsLmdldEV4dGVuc2lvbihuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4dHNbbmFtZV07XG59XG4iLCJ2YXIgR0xTTCA9IHt9O1xuZXhwb3J0IGRlZmF1bHQgR0xTTDtcblxuLyoqXG4gICAgUGFyc2UgdW5pZm9ybXMgZnJvbSBhIEpTIG9iamVjdCwgaW5mZXJzIHR5cGVzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB0aGVcbiAgICBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gc2V0IHVuaWZvcm0gdmFsdWVzIG9uIGEgR0wgcHJvZ3JhbS4gRWFjaCBvYmplY3QgaW4gdGhlIHJldHVybmVkXG4gICAgYXJyYXkgaGFzIHRoZSBmb3JtOlxuICAgIHsgdHlwZSwgbWV0aG9kLCBuYW1lLCB2YWx1ZSB9XG5cbiAgICB0eXBlOiB0aGUgR0wgdW5pZm9ybSB0eXBlLCBzdWNoIGFzICd2ZWMzJywgJ2Zsb2F0JywgZXRjLlxuICAgIG1ldGhvZDogdGhlIEdMIHVuaWZvcm0gc2V0dGVyIG1ldGhvZCB0byB1c2UsIHN1Y2ggYXMgJzFmJywgJzNmdicsIGV0Yy5cbiAgICBuYW1lOiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEdMIHVuaWZvcm0gbG9jYXRpb24sIGUuZy4gJ2FycmF5WzBdLmZpZWxkJywgZXRjLlxuICAgIHZhbHVlOiB0aGUgdmFsdWUgdG8gYmUgcGFzc2VkIHRvIHRoZSBHTCB1bmlmb3JtIHNldHRlciBmb3IgdGhhdCB0eXBlLCBlLmcuIFsxLCAyLCAzXSBmb3IgYSB2ZWMzXG5cbiAgICBUZXh0dXJlcyBoYXZlIHNwZWNpYWwgYmVoYXZpb3I6IHVuaWZvcm1zIHdpdGggc3RyaW5nIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyB0ZXh0dXJlcywgYW5kXG4gICAgdGhlIHN0cmluZyBpcyB1c2VkIGFzIGEgdW5pcXVlIHRleHR1cmUgJ2tleScgdG8gYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIGNhbGxlciAod2hpY2ggaXMgcmVzcG9uc2libGVcbiAgICBmb3IgYWN0dWFsbHkgc2V0dGluZyB0aGUgdW5pZm9ybXMpLiBGb3IgZXhhbXBsZSwgdGhpcyBjb3VsZCBiZSB1c2VkIGFzIGEga2V5IGludG8gYSBkaWN0aW9uYXJ5IG9mXG4gICAga25vd24gdGV4dHVyZSBuYW1lcywgb3IgaXQgY291bGQgc2ltcGx5IGJlIHVzZWQgYXMgYSBVUkwgdG8gZHluYW1pY2FsbHkgbG9hZCB0aGUgdGV4dHVyZSBmcm9tLlxuKi9cbkdMU0wucGFyc2VVbmlmb3JtcyA9IGZ1bmN0aW9uICh1bmlmb3Jtcykge1xuICAgIHZhciBwYXJzZWQgPSBbXTtcblxuICAgIGZvciAodmFyIG5hbWUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgdmFyIGtleSA9IG5hbWU7IC8vIHNhdmUgdGhlIG9yaWdpbmFsIG5hbWVcbiAgICAgICAgdmFyIHVuaWZvcm0gPSB1bmlmb3Jtc1tuYW1lXTtcbiAgICAgICAgdmFyIHU7XG5cbiAgICAgICAgLy8gU2luZ2xlIGZsb2F0XG4gICAgICAgIGlmICh0eXBlb2YgdW5pZm9ybSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJzFmJyxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXk6IHZlY3RvciwgYXJyYXkgb2YgZmxvYXRzLCBhcnJheSBvZiB0ZXh0dXJlc1xuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHVuaWZvcm0pKSB7XG4gICAgICAgICAgICAvLyBOdW1lcmljIHZhbHVlc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1bmlmb3JtWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIC8vIGZsb2F0IHZlY3RvcnMgKHZlYzIsIHZlYzMsIHZlYzQpXG4gICAgICAgICAgICAgICAgaWYgKHVuaWZvcm0ubGVuZ3RoID49IDIgJiYgdW5pZm9ybS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmVjJyArIHVuaWZvcm0ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiB1bmlmb3JtLmxlbmd0aCArICdmdicsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZmxvYXQgYXJyYXlcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh1bmlmb3JtLmxlbmd0aCA+IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Zsb2F0W10nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnMWZ2JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUgKyAnWzBdJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGFzc3VtZSBtYXRyaXggZm9yICh0eXBlb2YgPT0gRmxvYXQzMkFycmF5ICYmIGxlbmd0aCA9PSAxNik/XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBcnJheSBvZiB0ZXh0dXJlc1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm1bMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZm9yICh1PTA7IHUgPCB1bmlmb3JtLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzYW1wbGVyMkQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnMWknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSArICdbJyArIHUgKyAnXScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybVt1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogdSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zOiB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFycmF5IG9mIGFycmF5cyAtIGJ1dCBvbmx5IGFycmF5cyBvZiB2ZWN0b3JzIGFyZSBhbGxvd2VkIGluIHRoaXMgY2FzZVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh1bmlmb3JtWzBdKSAmJiB0eXBlb2YgdW5pZm9ybVswXVswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAvLyBmbG9hdCB2ZWN0b3JzICh2ZWMyLCB2ZWMzLCB2ZWM0KVxuICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtWzBdLmxlbmd0aCA+PSAyICYmIHVuaWZvcm1bMF0ubGVuZ3RoIDw9IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgICAgICBmb3IgKHU9MDsgdSA8IHVuaWZvcm0ubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmVjJyArIHVuaWZvcm1bMF0ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogdW5pZm9ybVt1XS5sZW5ndGggKyAnZnYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUgKyAnWycgKyB1ICsgJ10nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtW3VdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogdSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtczogdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPOiBlbHNlIHdhcm5pbmdcbiAgICAgICAgfVxuICAgICAgICAvLyBCb29sZWFuXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB1bmlmb3JtID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWknLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUZXh0dXJlXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB1bmlmb3JtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzYW1wbGVyMkQnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJzFpJyxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xufTtcblxuLyoqXG4gICAgR2VuZXJhdGUgYSBHTFNMIHZhcmlhYmxlIGRlZmluaXRpb24gZnJvbSBhIEpTIG9iamVjdFxuKi9cbkdMU0wuZGVmaW5lVmFyaWFibGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgdHlwZSwgYXJyYXk7XG5cbiAgICAvLyBTaW5nbGUgZmxvYXRcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB0eXBlID0gJ2Zsb2F0JztcbiAgICB9XG4gICAgLy8gTXVsdGlwbGUgZmxvYXRzIC0gdmVjdG9yIG9yIGFycmF5XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gTnVtZXJpYyB2YWx1ZXNcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZVswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIC8vIGZsb2F0IHZlY3RvcnMgKHZlYzIsIHZlYzMsIHZlYzQpXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IDIgJiYgdmFsdWUubGVuZ3RoIDw9IDQpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gJ3ZlYycgKyB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmbG9hdCBhcnJheVxuICAgICAgICAgICAgZWxzZSB7IC8vaWYgKHZhbHVlLmxlbmd0aCA+IDQpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gJ2Zsb2F0JztcbiAgICAgICAgICAgICAgICBhcnJheSA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE86IGFzc3VtZSBtYXRyaXggZm9yICh0eXBlb2YgPT0gRmxvYXQzMkFycmF5ICYmIGxlbmd0aCA9PSAxNik/XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2YgdGV4dHVyZXNcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHlwZSA9ICdzYW1wbGVyMkQnO1xuICAgICAgICAgICAgYXJyYXkgPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQm9vbGVhblxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHR5cGUgPSAnYm9vbCc7XG4gICAgfVxuICAgIC8vIFRleHR1cmVcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHR5cGUgPSAnc2FtcGxlcjJEJztcbiAgICB9XG5cbiAgICAvLyBDb25zdHJ1Y3QgdmFyaWFibGUgZGVmaW5pdGlvblxuICAgIHZhciB2YXJpYWJsZSA9ICcnO1xuICAgIHZhcmlhYmxlICs9IGAke3R5cGV9ICR7bmFtZX1gO1xuICAgIGlmIChhcnJheSkge1xuICAgICAgICB2YXJpYWJsZSArPSBgWyR7YXJyYXl9XWA7XG4gICAgfVxuICAgIHZhcmlhYmxlICs9ICc7XFxuJztcblxuICAgIHJldHVybiB2YXJpYWJsZTtcbn07XG5cbi8qKlxuICAgIEdlbmVyYXRlIGEgR0xTTCB1bmlmb3JtIGRlZmluaXRpb24gZnJvbSBhIEpTIG9iamVjdFxuKi9cbkdMU0wuZGVmaW5lVW5pZm9ybSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHJldHVybiAndW5pZm9ybSAnICsgR0xTTC5kZWZpbmVWYXJpYWJsZShuYW1lLCB2YWx1ZSk7XG59O1xuXG4vKipcbiAgICBDaGVjayBmb3IgYSB1bmlmb3JtIGRlZmluaXRpb24gb2YgJ25hbWUnIGluIHRoZSBwcm92aWRlZCBHTFNMIHNvdXJjZVxuICAgIFNpbXBsZSByZWdleCBjaGVjayBmb3IgJ3VuaWZvcm0nIGtleXdvcmQgYW5kIHZhciBuYW1lLCBkb2VzIG5vdCBhdHRlbXB0IHRvIHBhcnNlL2V4dHJhY3QgR0xTTFxuICAgIE5PVEU6IGFzc3VtZXMgY29tbWVudHMgaGF2ZSBiZWVuIHN0cmlwcGVkIGZyb20gc291cmNlXG4qL1xuR0xTTC5pc1VuaWZvcm1EZWZpbmVkID0gZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSkge1xuICAgIC8vIE1hdGNoLCBpbiBvcmRlcjpcbiAgICAvLyAtIHRoZSBrZXl3b3JkICd1bmlmb3JtJ1xuICAgIC8vIC0gYXQgbGVhc3Qgb25lIGNoYXJhY3RlciB0aGF0IGlzIGFueXRoaW5nIGV4Y2VwdCBhIHNlbWljb2xvbiwgO1xuICAgIC8vIC0gb3B0aW9uYWxseSwgYW55dGhpbmcgZW5jbG9zZWQgaW4gY3VybHkgYnJhY2VzLCB7IC4uLiB9IChhbiBpbmxpbmUgc3RydWN0dXJlIGRlZmluaXRpb24gY2FuIGdvIGhlcmUpXG4gICAgLy8gLSBvcHRpb25hbGx5LCBhbnkgIyBvZiBjaGFyYWN0ZXJzIHRoYXQgaXMgbm90IGEgc2VtaWNvbG9uLCA7XG4gICAgLy8gLSB0aGUgbmFtZSBvZiB0aGUgdW5pZm9ybVxuXG4gICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgndW5pZm9ybVteO10rKD86e1tcXFxcc1xcXFxTXSp9KT9bXjtdKlxcXFxiJyArIG5hbWUgKyAnXFxcXGInLCAnZycpO1xuICAgIGlmIChzb3VyY2UubWF0Y2gocmUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAgICBDaGVjayB0aGF0IGEgc3ltYm9sIGlzIHJlZmVyZW5jZWQgaW4gdGhlIEdMU0wgc291cmNlXG4gICAgTk9URTogYXNzdW1lcyBjb21tZW50cyBoYXZlIGJlZW4gc3RyaXBwZWQgZnJvbSBzb3VyY2VcbiovXG5HTFNMLmlzU3ltYm9sUmVmZXJlbmNlZCA9IGZ1bmN0aW9uIChuYW1lLCBzb3VyY2UpIHtcbiAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdcXFxcYicgKyBuYW1lICsgJ1xcXFxiJywgJ2cnKTtcbiAgICBpZiAoc291cmNlLnNlYXJjaChyZSkgPj0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gICAgRXhwYW5kIGEgc2luZ2xlIHZhbHVlIG9yIDItZWxlbWVudCBhcnJheSBpbnRvIGEgMy1lbGVtZW50IGFycmF5LCB3aXRoIHRoZSBsYXN0ICggeiApXG4gICAgY29vcmRpbmF0ZSBkZWZhdWx0aW5nIHRvIDEgKHdpdGggb3B0aW9uIHRvIHNwZWNpZnkpLiBBbHNvIHJ1bnMgcGFyc2VGbG9hdCB0byB0cnkgdG8gbWFpbnRhaW5cbiAgICBkYXRhIGludGVncml0eS4gUmV0dXJucyBudWxsIGlmIGlucHV0IGNvdWxkbid0IGJlIHBhcnNlZC5cbiovXG5HTFNMLmV4cGFuZFZlYzMgPSBmdW5jdGlvbiAodiwgeiA9IDEpIHtcbiAgICBsZXQgeDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICBpZiAodi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHggPSBbLi4udiwgel0ubWFwKHBhcnNlRmxvYXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHggPSBbdiwgdiwgdl0ubWFwKHBhcnNlRmxvYXQpO1xuICAgIH1cblxuICAgIGlmICh4ICYmIHguZXZlcnkobiA9PiB0eXBlb2YgbiA9PT0gJ251bWJlcicgJiYgIWlzTmFOKG4pKSkge1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG59O1xuXG4vKipcbiAgICBFeHBhbmQgYSBzaW5nbGUgdmFsdWUgb3IgMy1lbGVtZW50IGFycmF5IGludG8gYSA0LWVsZW1lbnQgYXJyYXksIHdpdGggdGhlIGxhc3QgKGUuZy4gdyBvciBhKVxuICAgIGNvb3JkaW5hdGUgZGVmYXVsdGluZyB0byAxICh3aXRoIG9wdGlvbiB0byBzcGVjaWZ5KS4gQWxzbyBydW5zIHBhcnNlRmxvYXQgdG8gdHJ5IHRvIG1haW50YWluXG4gICAgZGF0YSBpbnRlZ3JpdHkuIFJldHVybnMgbnVsbCBpZiBpbnB1dCBjb3VsZG4ndCBiZSBwYXJzZWQuXG4qL1xuR0xTTC5leHBhbmRWZWM0ID0gZnVuY3Rpb24gKHYsIHcgPSAxKSB7XG4gICAgbGV0IHg7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgaWYgKHYubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB4ID0gWy4uLnYsIHddLm1hcChwYXJzZUZsb2F0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB4ID0gW3YsIHYsIHYsIHddLm1hcChwYXJzZUZsb2F0KTtcbiAgICB9XG5cbiAgICBpZiAoeCAmJiB4LmV2ZXJ5KG4gPT4gdHlwZW9mIG4gPT09ICdudW1iZXInICYmICFpc05hTihuKSkpIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxufTtcblxuXG4iLCJcbmV4cG9ydCBjbGFzcyBSZW5kZXJTdGF0ZSB7XG5cdGNvbnN0cnVjdG9yICh2YWx1ZSwgc2V0dXApIHtcbiAgICAgICAgc2V0dXAodmFsdWUpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc2V0dXAgPSBzZXR1cDtcbiAgICB9XG5cbiAgICBzZXQgKHZhbHVlKSB7XG4gICAgXHQvLyBpZiB0aGUgc3RhdGVzIGFyZSBkaWZmZXJlbnQsIGNhbGwgdGhlIEdMIGNvbnRleHQgZm9yIGEgc3RhdGUgY2hhbmdlXG4gICAgXHRpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkge1xuICAgIFx0XHR0aGlzLnNldHVwKHZhbHVlKTtcbiAgICBcdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIFx0fVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyU3RhdGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yIChnbCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRzID0ge307XG5cbiAgICAgICAgLy8gQ3VsbGluZ1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmN1bGxpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmN1bGxpbmdfZmFjZSA9IGdsLkJBQ0s7XG5cbiAgICAgICAgLy8gQmxlbmRpbmdcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyYyA9IGdsLk9ORV9NSU5VU19TUkNfQUxQSEE7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfZHN0ID0gZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19zcmNfYWxwaGEgPSBnbC5PTkU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfZHN0X2FscGhhID0gZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcblxuICAgICAgICAvLyBEZXB0aCB0ZXN0L3dyaXRlXG4gICAgICAgIHRoaXMuZGVmYXVsdHMuZGVwdGhfd3JpdGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmRlcHRoX3Rlc3QgPSB0cnVlO1xuICAgICAgICBnbC5kZXB0aEZ1bmMoZ2wuTEVTUyk7IC8vIGRlcHRoIGZ1bmN0aW9uIG9ubHkgbmVlZHMgdG8gYmUgc2V0IG9uY2VcblxuICAgIFx0Ly8gQ3VsbGluZ1xuICAgICAgICB0aGlzLmN1bGxpbmcgPSBuZXcgUmVuZGVyU3RhdGUoXG4gICAgICAgICAgICB7IGN1bGw6IHRoaXMuZGVmYXVsdHMuY3VsbGluZywgZmFjZTogdGhpcy5kZWZhdWx0cy5jdWxsaW5nX2ZhY2UgfSxcbiAgICBcdFx0KHZhbHVlKSA9PiB7XG4gICAgXHRcdFx0aWYgKHZhbHVlLmN1bGwpIHtcbiAgICBcdFx0XHRcdGdsLmVuYWJsZShnbC5DVUxMX0ZBQ0UpO1xuICAgICAgICAgICAgXHRcdGdsLmN1bGxGYWNlKHZhbHVlLmZhY2UpO1xuICAgIFx0XHRcdH0gZWxzZSB7XG4gICAgXHRcdFx0XHRnbC5kaXNhYmxlKGdsLkNVTExfRkFDRSk7XG4gICAgXHRcdFx0fVxuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgXHQvLyBCbGVuZGluZyBtb2RlXG4gICAgICAgIHRoaXMuYmxlbmRpbmcgPSBuZXcgUmVuZGVyU3RhdGUoe1xuICAgICAgICAgICAgICAgIGJsZW5kOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nLFxuICAgICAgICAgICAgICAgIHNyYzogdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19zcmMsXG4gICAgICAgICAgICAgICAgZHN0OiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX2RzdCxcbiAgICAgICAgICAgICAgICBzcmNfYWxwaGE6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfc3JjX2FscGhhLFxuICAgICAgICAgICAgICAgIGRzdF9hbHBoYTogdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3RfYWxwaGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAodmFsdWUpID0+IHtcbiAgICBcdFx0XHRpZiAodmFsdWUuYmxlbmQpIHtcbiAgICAgICAgICAgIFx0XHRnbC5lbmFibGUoZ2wuQkxFTkQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zcmNfYWxwaGEgJiYgdmFsdWUuZHN0X2FscGhhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmNTZXBhcmF0ZSh2YWx1ZS5zcmMsIHZhbHVlLmRzdCwgdmFsdWUuc3JjX2FscGhhLCB2YWx1ZS5kc3RfYWxwaGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2wuYmxlbmRGdW5jKHZhbHVlLnNyYywgdmFsdWUuZHN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgIFx0XHRcdH0gZWxzZSB7XG4gICAgXHRcdFx0XHRnbC5kaXNhYmxlKGdsLkJMRU5EKTtcbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdCk7XG5cbiAgICBcdC8vIERlcHRoIHdyaXRlXG4gICAgICAgIHRoaXMuZGVwdGhfd3JpdGUgPSBuZXcgUmVuZGVyU3RhdGUoXG4gICAgICAgICAgICB7IGRlcHRoX3dyaXRlOiB0aGlzLmRlZmF1bHRzLmRlcHRoX3dyaXRlIH0sXG4gICAgXHRcdCh2YWx1ZSkgPT4ge1xuICAgICAgICBcdFx0Z2wuZGVwdGhNYXNrKHZhbHVlLmRlcHRoX3dyaXRlKTtcbiAgICBcdFx0fVxuICAgIFx0KTtcblxuICAgIFx0Ly8gRGVwdGggdGVzdFxuICAgICAgICB0aGlzLmRlcHRoX3Rlc3QgPSBuZXcgUmVuZGVyU3RhdGUoXG4gICAgICAgICAgICB7IGRlcHRoX3Rlc3Q6IHRoaXMuZGVmYXVsdHMuZGVwdGhfdGVzdCB9LFxuICAgICAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgXHRcdFx0aWYgKHZhbHVlLmRlcHRoX3Rlc3QpIHtcbiAgICAgICAgICAgIFx0XHRnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgXHRcdFx0fSBlbHNlIHtcbiAgICAgICAgICAgIFx0XHRnbC5kaXNhYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgIFx0XHRcdH1cbiAgICBcdFx0fVxuICAgIFx0KTtcblxuICAgIH1cblxufVxuIiwiLy8gR0wgcHJvZ3JhbSB3cmFwcGVyIHRvIGNhY2hlIHVuaWZvcm0gbG9jYXRpb25zL3ZhbHVlcywgZG8gY29tcGlsZS10aW1lIHByZS1wcm9jZXNzaW5nXG4vLyAoaW5qZWN0aW5nICNkZWZpbmVzIGFuZCAjcHJhZ21hIGJsb2NrcyBpbnRvIHNoYWRlcnMpLCBldGMuXG5cbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBHTFNMIGZyb20gJy4vZ2xzbCc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL3RleHR1cmUnO1xuaW1wb3J0IGdldEV4dGVuc2lvbiBmcm9tICcuL2V4dGVuc2lvbnMnO1xuXG5pbXBvcnQgc3RyaXAgZnJvbSAnc3RyaXAtY29tbWVudHMnO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBwYXJzZVNoYWRlckVycm9ycyB9IGZyb20gJ2dsLXNoYWRlci1lcnJvcnMnO1xuXG4vLyBSZWdleCBwYXR0ZXJuc1xuY29uc3QgcmVfcHJhZ21hID0gL15cXHMqI3ByYWdtYS4qJC9nbTsgICAvLyBmb3IgcmVtb3ZpbmcgdW51c2VkIHByYWdtYXMgYWZ0ZXIgc2hhZGVyIGJsb2NrIGluamVjdGlvblxuY29uc3QgcmVfY29udGludWVfbGluZSA9IC9cXFxcXFxzKlxcbi9tZzsgICAvLyBmb3IgcmVtb3ZpbmcgYmFja3NsYXNoIGxpbmUgY29udGludWF0aW9uc1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGFkZXJQcm9ncmFtIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCB2ZXJ0ZXhfc291cmNlLCBmcmFnbWVudF9zb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuXG4gICAgICAgIC8vIGtleS92YWx1ZXMgaW5zZXJ0ZWQgYXMgI2RlZmluZXMgaW50byBzaGFkZXJzIGF0IGNvbXBpbGUtdGltZVxuICAgICAgICB0aGlzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmRlZmluZXN8fHt9KTtcblxuICAgICAgICAvLyBrZXkvdmFsdWVzIGZvciBibG9ja3MgdGhhdCBjYW4gYmUgaW5qZWN0ZWQgaW50byBzaGFkZXJzIGF0IGNvbXBpbGUtdGltZVxuICAgICAgICB0aGlzLmJsb2NrcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuYmxvY2tzfHx7fSk7XG4gICAgICAgIHRoaXMuYmxvY2tfc2NvcGVzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5ibG9ja19zY29wZXN8fHt9KTtcblxuICAgICAgICAvLyBsaXN0IG9mIGV4dGVuc2lvbnMgdG8gYWN0aXZhdGVcbiAgICAgICAgdGhpcy5leHRlbnNpb25zID0gb3B0aW9ucy5leHRlbnNpb25zIHx8IFtdO1xuXG4gICAgICAgIC8vIEpTLW9iamVjdCB1bmlmb3JtcyB0aGF0IGFyZSBleHBlY3RlZCBieSB0aGlzIHByb2dyYW1cbiAgICAgICAgLy8gSWYgdGhleSBhcmUgbm90IGZvdW5kIGluIHRoZSBleGlzdGluZyBzaGFkZXIgc291cmNlLCB0aGVpciB0eXBlcyB3aWxsIGJlIGluZmVycmVkIGFuZCBkZWZpbml0aW9uc1xuICAgICAgICAvLyBmb3IgZWFjaCB3aWxsIGJlIGluamVjdGVkLlxuICAgICAgICB0aGlzLmRlcGVuZGVudF91bmlmb3JtcyA9IG9wdGlvbnMudW5pZm9ybXM7XG5cbiAgICAgICAgdGhpcy51bmlmb3JtcyA9IHt9OyAvLyBwcm9ncmFtIGxvY2F0aW9ucyBvZiB1bmlmb3JtcywgbGF6aWx5IGFkZGVkIGFzIGVhY2ggdW5pZm9ybSBpcyBzZXRcbiAgICAgICAgdGhpcy5hdHRyaWJzID0ge307IC8vIHByb2dyYW0gbG9jYXRpb25zIG9mIHZlcnRleCBhdHRyaWJ1dGVzLCBsYXppbHkgYWRkZWQgYXMgZWFjaCBhdHRyaWJ1dGUgaXMgYWNjZXNzZWRcblxuICAgICAgICB0aGlzLnZlcnRleF9zb3VyY2UgPSB2ZXJ0ZXhfc291cmNlO1xuICAgICAgICB0aGlzLmZyYWdtZW50X3NvdXJjZSA9IGZyYWdtZW50X3NvdXJjZTtcblxuICAgICAgICB0aGlzLmlkID0gU2hhZGVyUHJvZ3JhbS5pZCsrO1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7IC8vIGNhbiBwcm92aWRlIGEgcHJvZ3JhbSBuYW1lICh1c2VmdWwgZm9yIGRlYnVnZ2luZylcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0obnVsbCk7XG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLnVuaWZvcm1zID0ge307XG4gICAgICAgIHRoaXMuYXR0cmlicyA9IHt9O1xuICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2dyYW0gd3JhcHBlciB3aXRoIHNpbXBsZSBzdGF0ZSBjYWNoZVxuICAgIHVzZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoU2hhZGVyUHJvZ3JhbS5jdXJyZW50ICE9PSB0aGlzKSB7XG4gICAgICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKTtcbiAgICAgICAgfVxuICAgICAgICBTaGFkZXJQcm9ncmFtLmN1cnJlbnQgPSB0aGlzO1xuICAgIH1cblxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGluZykge1xuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBTaGFkZXJQcm9ncmFtLmNvbXBpbGUoKTogc2tpcHBpbmcgZm9yICR7dGhpcy5pZH0gKCR7dGhpcy5uYW1lfSkgYmVjYXVzZSBhbHJlYWR5IGNvbXBpbGluZ2ApKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbXBpbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgLy8gQ29weSBzb3VyY2VzIGZyb20gcHJlLW1vZGlmaWVkIHRlbXBsYXRlXG4gICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHRoaXMudmVydGV4X3NvdXJjZTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmZyYWdtZW50X3NvdXJjZTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgZXh0ZW5zaW9uIGF2YWlsYWJpbGl0eVxuICAgICAgICBsZXQgZXh0ZW5zaW9ucyA9IHRoaXMuY2hlY2tFeHRlbnNpb25zKCk7XG5cbiAgICAgICAgLy8gTWFrZSBsaXN0IG9mIGRlZmluZXMgdG8gYmUgaW5qZWN0ZWQgbGF0ZXJcbiAgICAgICAgdmFyIGRlZmluZXMgPSB0aGlzLmJ1aWxkRGVmaW5lTGlzdCgpO1xuXG4gICAgICAgIC8vIEluamVjdCB1c2VyLWRlZmluZWQgYmxvY2tzIChhcmJpdHJhcnkgY29kZSBwb2ludHMgbWF0Y2hpbmcgbmFtZWQgI3ByYWdtYXMpXG4gICAgICAgIC8vIFJlcGxhY2UgYWNjb3JkaW5nIHRvIHRoaXMgcGF0dGVybjpcbiAgICAgICAgLy8gI3ByYWdtYSB0YW5ncmFtOiBba2V5XVxuICAgICAgICAvLyBlLmcuICNwcmFnbWEgdGFuZ3JhbTogZ2xvYmFsXG5cbiAgICAgICAgLy8gR2F0aGVyIGFsbCBibG9jayBjb2RlIHNuaXBwZXRzXG4gICAgICAgIHZhciBibG9ja3MgPSB0aGlzLmJ1aWxkU2hhZGVyQmxvY2tMaXN0KCk7XG4gICAgICAgIHZhciByZWdleHA7XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIGJsb2Nrcykge1xuICAgICAgICAgICAgdmFyIGJsb2NrID0gYmxvY2tzW2tleV07XG4gICAgICAgICAgICBpZiAoIWJsb2NrIHx8IChBcnJheS5pc0FycmF5KGJsb2NrKSAmJiBibG9jay5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpcnN0IGZpbmQgY29kZSByZXBsYWNlIHBvaW50cyBpbiBzaGFkZXJzXG4gICAgICAgICAgICByZWdleHAgPSBuZXcgUmVnRXhwKCdeXFxcXHMqI3ByYWdtYVxcXFxzK3RhbmdyYW06XFxcXHMrJyArIGtleSArICdcXFxccyokJywgJ20nKTtcbiAgICAgICAgICAgIHZhciBpbmplY3RfdmVydGV4ID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLm1hdGNoKHJlZ2V4cCk7XG4gICAgICAgICAgICB2YXIgaW5qZWN0X2ZyYWdtZW50ID0gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UubWF0Y2gocmVnZXhwKTtcblxuICAgICAgICAgICAgLy8gQXZvaWQgbmV0d29yayByZXF1ZXN0IGlmIG5vdGhpbmcgdG8gcmVwbGFjZVxuICAgICAgICAgICAgaWYgKGluamVjdF92ZXJ0ZXggPT0gbnVsbCAmJiBpbmplY3RfZnJhZ21lbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb21iaW5lIGFsbCBibG9ja3MgaW50byBvbmUgc3RyaW5nXG4gICAgICAgICAgICB2YXIgc291cmNlID0gJyc7XG4gICAgICAgICAgICBibG9jay5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTWFyayBzdGFydCBhbmQgZW5kIG9mIGVhY2ggYmxvY2sgd2l0aCBtZXRhZGF0YSAod2hpY2ggY2FuIGJlIGV4dHJhY3RlZCBmcm9tXG4gICAgICAgICAgICAgICAgLy8gZmluYWwgc291cmNlIGZvciBlcnJvciBoYW5kbGluZywgZGVidWdnaW5nLCBldGMuKVxuICAgICAgICAgICAgICAgIGxldCBtYXJrID0gYCR7dmFsLnNjb3BlfSwgJHt2YWwua2V5fSwgJHt2YWwubnVtfWA7XG4gICAgICAgICAgICAgICAgc291cmNlICs9IGBcXG4vLyB0YW5ncmFtLWJsb2NrLXN0YXJ0OiAke21hcmt9XFxuYDtcbiAgICAgICAgICAgICAgICBzb3VyY2UgKz0gdmFsLnNvdXJjZTtcbiAgICAgICAgICAgICAgICBzb3VyY2UgKz0gYFxcbi8vIHRhbmdyYW0tYmxvY2stZW5kOiAke21hcmt9XFxuYDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBJbmplY3RcbiAgICAgICAgICAgIGlmIChpbmplY3RfdmVydGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UucmVwbGFjZShyZWdleHAsIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5qZWN0X2ZyYWdtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLnJlcGxhY2UocmVnZXhwLCBzb3VyY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgYSAjZGVmaW5lIGZvciB0aGlzIGluamVjdGlvbiBwb2ludFxuICAgICAgICAgICAgZGVmaW5lc1snVEFOR1JBTV9CTE9DS18nICsga2V5LnJlcGxhY2UoL1tcXHMtXSsvZywgJ18nKS50b1VwcGVyQ2FzZSgpXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhbi11cCBhbnkgI3ByYWdtYXMgdGhhdCB3ZXJlbid0IHJlcGxhY2VkICh0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzKVxuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UucmVwbGFjZShyZV9wcmFnbWEsICcnKTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZS5yZXBsYWNlKHJlX3ByYWdtYSwgJycpO1xuXG4gICAgICAgIC8vIERldGVjdCB1bmlmb3JtIGRlZmluaXRpb25zLCBpbmplY3QgYW55IG1pc3Npbmcgb25lc1xuICAgICAgICB0aGlzLmVuc3VyZVVuaWZvcm1zKHRoaXMuZGVwZW5kZW50X3VuaWZvcm1zKTtcblxuICAgICAgICAvLyBCdWlsZCAmIGluamVjdCBleHRlbnNpb25zICYgZGVmaW5lc1xuICAgICAgICAvLyBUaGlzIGlzIGRvbmUgKmFmdGVyKiBjb2RlIGluamVjdGlvbiBzbyB0aGF0IHdlIGNhbiBhZGQgZGVmaW5lcyBmb3Igd2hpY2ggY29kZSBwb2ludHMgd2VyZSBpbmplY3RlZFxuICAgICAgICBsZXQgcHJlY2lzaW9uID0gJyc7XG4gICAgICAgIGxldCBoaWdoID0gdGhpcy5nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQodGhpcy5nbC5GUkFHTUVOVF9TSEFERVIsIHRoaXMuZ2wuSElHSF9GTE9BVCk7XG4gICAgICAgIGlmIChoaWdoICYmIGhpZ2gucHJlY2lzaW9uID4gMCkge1xuICAgICAgICAgICAgcHJlY2lzaW9uID0gJ3ByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJlY2lzaW9uID0gJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbic7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX1ZFUlRFWF9TSEFERVInXSA9IHRydWU7XG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fRlJBR01FTlRfU0hBREVSJ10gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID1cbiAgICAgICAgICAgIHByZWNpc2lvbiArXG4gICAgICAgICAgICBTaGFkZXJQcm9ncmFtLmJ1aWxkRGVmaW5lU3RyaW5nKGRlZmluZXMpICtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZTtcblxuICAgICAgICAvLyBQcmVjaXNpb24gcXVhbGlmaWVyIG9ubHkgdmFsaWQgaW4gZnJhZ21lbnQgc2hhZGVyXG4gICAgICAgIC8vIE5COiAnI2V4dGVuc2lvbicgc3RhdGVtZW50cyBhZGRlZCB0byBmcmFnbWVudCBzaGFkZXIgb25seSwgYXMgSUUxMSB0aHJvd3MgZXJyb3Igd2hlbiB0aGV5IGFwcGVhciBpblxuICAgICAgICAvLyB2ZXJ0ZXggc2hhZGVyIChldmVuIHdoZW4gZ3VhcmRlZCBieSAjaWZkZWYpLCBhbmQgbm8gV2ViR0wgZXh0ZW5zaW9ucyByZXF1aXJlICcjZXh0ZW5zaW9uJyBpbiB2ZXJ0ZXggc2hhZGVyc1xuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX1ZFUlRFWF9TSEFERVInXSA9IGZhbHNlO1xuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX0ZSQUdNRU5UX1NIQURFUiddID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPVxuICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbS5idWlsZEV4dGVuc2lvblN0cmluZyhleHRlbnNpb25zKSArXG4gICAgICAgICAgICBwcmVjaXNpb24gK1xuICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbS5idWlsZERlZmluZVN0cmluZyhkZWZpbmVzKSArXG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZTtcblxuICAgICAgICAvLyBSZXBsYWNlIG11bHRpLWxpbmUgYmFja3NsYXNoZXNcbiAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLnJlcGxhY2UocmVfY29udGludWVfbGluZSwgJycpO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLnJlcGxhY2UocmVfY29udGludWVfbGluZSwgJycpO1xuXG4gICAgICAgIC8vIENvbXBpbGUgJiBzZXQgdW5pZm9ybXMgdG8gY2FjaGVkIHZhbHVlc1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gU2hhZGVyUHJvZ3JhbS51cGRhdGVQcm9ncmFtKHRoaXMuZ2wsIHRoaXMucHJvZ3JhbSwgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLCB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuXG4gICAgICAgICAgICAvLyBzaGFkZXIgZXJyb3IgaW5mb1xuICAgICAgICAgICAgaWYgKGVycm9yLnR5cGUgPT09ICd2ZXJ0ZXgnIHx8IGVycm9yLnR5cGUgPT09ICdmcmFnbWVudCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRlcl9lcnJvcnMgPSBlcnJvci5lcnJvcnM7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkZXJfZXJyb3JzLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGUudHlwZSA9IGVycm9yLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGUuYmxvY2sgPSB0aGlzLmJsb2NrKGVycm9yLnR5cGUsIGUubGluZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93KG5ldyBFcnJvcihgU2hhZGVyUHJvZ3JhbS5jb21waWxlKCk6IHByb2dyYW0gJHt0aGlzLmlkfSAoJHt0aGlzLm5hbWV9KSBlcnJvcjpgLCBlcnJvcikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51c2UoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVW5pZm9ybXMoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoQXR0cmlidXRlcygpO1xuICAgIH1cblxuICAgIC8vIE1ha2UgbGlzdCBvZiBkZWZpbmVzIChnbG9iYWwsIHRoZW4gcHJvZ3JhbS1zcGVjaWZpYylcbiAgICBidWlsZERlZmluZUxpc3QoKSB7XG4gICAgICAgIHZhciBkLCBkZWZpbmVzID0ge307XG4gICAgICAgIGZvciAoZCBpbiBTaGFkZXJQcm9ncmFtLmRlZmluZXMpIHtcbiAgICAgICAgICAgIGRlZmluZXNbZF0gPSBTaGFkZXJQcm9ncmFtLmRlZmluZXNbZF07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChkIGluIHRoaXMuZGVmaW5lcykge1xuICAgICAgICAgICAgZGVmaW5lc1tkXSA9IHRoaXMuZGVmaW5lc1tkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lcztcbiAgICB9XG5cbiAgICAvLyBNYWtlIGxpc3Qgb2Ygc2hhZGVyIGJsb2NrcyAoZ2xvYmFsLCB0aGVuIHByb2dyYW0tc3BlY2lmaWMpXG4gICAgYnVpbGRTaGFkZXJCbG9ja0xpc3QoKSB7XG4gICAgICAgIGxldCBrZXksIGJsb2NrcyA9IHt9O1xuXG4gICAgICAgIC8vIEdsb2JhbCBibG9ja3NcbiAgICAgICAgZm9yIChrZXkgaW4gU2hhZGVyUHJvZ3JhbS5ibG9ja3MpIHtcbiAgICAgICAgICAgIGJsb2Nrc1trZXldID0gW107XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgYmxvY2tzW2tleV0ucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4uU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XS5tYXAoKHNvdXJjZSwgbnVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBrZXksIHNvdXJjZSwgbnVtLCBzY29wZTogJ1NoYWRlclByb2dyYW0nIH07XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldID0gW3sga2V5LCBzb3VyY2U6IFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0sIG51bTogMCwgc2NvcGU6ICdTaGFkZXJQcm9ncmFtJyB9XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb2dyYW0tc3BlY2lmaWMgYmxvY2tzXG4gICAgICAgIGZvciAoa2V5IGluIHRoaXMuYmxvY2tzKSB7XG4gICAgICAgICAgICBibG9ja3Nba2V5XSA9IGJsb2Nrc1trZXldIHx8IFtdO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmJsb2Nrc1trZXldKSkge1xuICAgICAgICAgICAgICAgIGxldCBzY29wZXMgPSAodGhpcy5ibG9ja19zY29wZXMgJiYgdGhpcy5ibG9ja19zY29wZXNba2V5XSkgfHwgW107XG4gICAgICAgICAgICAgICAgbGV0IGN1cl9zY29wZSA9IG51bGwsIG51bSA9IDA7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiPTA7IGIgPCB0aGlzLmJsb2Nrc1trZXldLmxlbmd0aDsgYisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvdW50IGJsb2NrcyByZWxhdGl2ZSB0byBjdXJyZW50IHNjb3BlXG4gICAgICAgICAgICAgICAgICAgIGlmIChzY29wZXNbYl0gIT09IGN1cl9zY29wZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3Njb3BlID0gc2NvcGVzW2JdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLmJsb2Nrc1trZXldW2JdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGU6IGN1cl9zY29wZSB8fCB0aGlzLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbnVtKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkcmVzcyBkaXNjcmVwYW5jeSBpbiBhcnJheSB2cy4gc2luZ2xlLXZhbHVlIGJsb2Nrc1xuICAgICAgICAgICAgICAgIC8vIHN0eWxlcyBhc3N1bWUgYXJyYXkgd2hlbiB0cmFja2luZyBibG9jayBzY29wZXNcbiAgICAgICAgICAgICAgICBibG9ja3Nba2V5XS5wdXNoKHsga2V5LCBzb3VyY2U6IHRoaXMuYmxvY2tzW2tleV0sIG51bTogMCwgc2NvcGU6IHRoaXMubmFtZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmxvY2tzO1xuICAgIH1cblxuICAgIC8vIERldGVjdCB1bmlmb3JtIGRlZmluaXRpb25zLCBpbmplY3QgYW55IG1pc3Npbmcgb25lc1xuICAgIGVuc3VyZVVuaWZvcm1zKHVuaWZvcm1zKSB7XG4gICAgICAgIGlmICghdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2cyA9IHN0cmlwKHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSk7XG4gICAgICAgIHZhciBmcyA9IHN0cmlwKHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlKTtcbiAgICAgICAgdmFyIGluamVjdCwgdnNfaW5qZWN0aW9ucyA9IFtdLCBmc19pbmplY3Rpb25zID0gW107XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIG1pc3NpbmcgdW5pZm9ybSBkZWZpbml0aW9uc1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHVuaWZvcm1zKSB7XG4gICAgICAgICAgICBpbmplY3QgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBDaGVjayB2ZXJ0ZXggc2hhZGVyXG4gICAgICAgICAgICBpZiAoIUdMU0wuaXNVbmlmb3JtRGVmaW5lZChuYW1lLCB2cykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWluamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBpbmplY3QgPSBHTFNMLmRlZmluZVVuaWZvcm0obmFtZSwgdW5pZm9ybXNbbmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFByb2dyYW0gJHt0aGlzLm5hbWV9OiAke25hbWV9IG5vdCBkZWZpbmVkIGluIHZlcnRleCBzaGFkZXIsIGluamVjdGluZzogJyR7aW5qZWN0fSdgKTtcbiAgICAgICAgICAgICAgICB2c19pbmplY3Rpb25zLnB1c2goaW5qZWN0KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2sgZnJhZ21lbnQgc2hhZGVyXG4gICAgICAgICAgICBpZiAoIUdMU0wuaXNVbmlmb3JtRGVmaW5lZChuYW1lLCBmcykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWluamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBpbmplY3QgPSBHTFNMLmRlZmluZVVuaWZvcm0obmFtZSwgdW5pZm9ybXNbbmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFByb2dyYW0gJHt0aGlzLm5hbWV9OiAke25hbWV9IG5vdCBkZWZpbmVkIGluIGZyYWdtZW50IHNoYWRlciwgaW5qZWN0aW5nOiAnJHtpbmplY3R9J2ApO1xuICAgICAgICAgICAgICAgIGZzX2luamVjdGlvbnMucHVzaChpbmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5qZWN0IG1pc3NpbmcgdW5pZm9ybXNcbiAgICAgICAgLy8gTk9URTogdGhlc2UgYXJlIGluamVjdGVkIGF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgc2hhZGVycywgZXZlbiBiZWZvcmUgYW55ICNkZWZpbmVzIG9yICNwcmFnbWFzIGFyZSBhZGRlZFxuICAgICAgICAvLyB0aGlzIGNvdWxkIGNhdXNlIHNvbWUgaXNzdWVzIHdpdGggY2VydGFpbiAjcHJhZ21hcywgb3Igb3RoZXIgZnVuY3Rpb25zIHRoYXQgbWlnaHQgZXhwZWN0ICNkZWZpbmVzXG4gICAgICAgIGlmICh2c19pbmplY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHZzX2luamVjdGlvbnMuam9pbignXFxuJykgKyB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnNfaW5qZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IGZzX2luamVjdGlvbnMuam9pbignXFxuJykgKyB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCB1bmlmb3JtcyBmcm9tIGEgSlMgb2JqZWN0LCB3aXRoIGluZmVycmVkIHR5cGVzXG4gICAgc2V0VW5pZm9ybXModW5pZm9ybXMsIHJlc2V0X3RleHR1cmVfdW5pdCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBvbmx5IHVwZGF0ZSB1bmlmb3JtcyB3aGVuIGNoYW5nZWRcblxuICAgICAgICAvLyBUZXh0dXJlIHVuaXRzIG11c3QgYmUgdHJhY2tlZCBhbmQgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgdGV4dHVyZSBzYW1wbGVyIHVuaWZvcm0gaXMgc2V0LlxuICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgdGV4dHVyZSB1bml0IGlzIHJlc2V0IHRvIDAgZWFjaCB0aW1lIHNldFVuaWZvcm1zIGlzIGNhbGxlZCwgYnV0IHRoZXkgY2FuXG4gICAgICAgIC8vIGFsc28gYmUgcHJlc2VydmVkLCBmb3IgZXhhbXBsZSBpbiBjYXNlcyB3aGVyZSBtdWx0aXBsZSBjYWxscyB0byBzZXRVbmlmb3JtcyBhcmUgZXhwZWN0ZWRcbiAgICAgICAgLy8gKGUuZy4gcHJvZ3JhbS1zcGVjaWZpYyB1bmlmb3JtcyBmb2xsb3dlZCBieSBtZXNoLXNwZWNpZmljIG9uZXMpLlxuICAgICAgICBpZiAocmVzZXRfdGV4dHVyZV91bml0KSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmVfdW5pdCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSB1bmlmb3JtIHR5cGVzIGFuZCB2YWx1ZXMgZnJvbSB0aGUgSlMgb2JqZWN0XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEdMU0wucGFyc2VVbmlmb3Jtcyh1bmlmb3Jtcyk7XG5cbiAgICAgICAgLy8gU2V0IGVhY2ggdW5pZm9ybVxuICAgICAgICBmb3IgKGxldCB1PTA7IHUgPCBwYXJzZWQubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaWZvcm0gPSBwYXJzZWRbdV07XG4gICAgICAgICAgICBpZiAodW5pZm9ybS50eXBlID09PSAnc2FtcGxlcjJEJykge1xuICAgICAgICAgICAgICAgIC8vIEZvciB0ZXh0dXJlcywgd2UgbmVlZCB0byB0cmFjayB0ZXh0dXJlIHVuaXRzLCBzbyB3ZSBoYXZlIGEgc3BlY2lhbCBzZXR0ZXJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRleHR1cmVVbmlmb3JtKHVuaWZvcm0ubmFtZSwgdW5pZm9ybS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuaWZvcm0odW5pZm9ybS5tZXRob2QsIHVuaWZvcm0ubmFtZSwgdW5pZm9ybS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWNoZSBzb21lIG9yIGFsbCB1bmlmb3JtIHZhbHVlcyBzbyB0aGV5IGNhbiBiZSByZXN0b3JlZFxuICAgIHNhdmVVbmlmb3JtcyhzdWJzZXQpIHtcbiAgICAgICAgbGV0IHVuaWZvcm1zID0gc3Vic2V0IHx8IHRoaXMudW5pZm9ybXM7XG4gICAgICAgIGZvciAobGV0IHUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1t1XTtcbiAgICAgICAgICAgIGlmICh1bmlmb3JtKSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybS5zYXZlZF92YWx1ZSA9IHVuaWZvcm0udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zYXZlZF90ZXh0dXJlX3VuaXQgPSB0aGlzLnRleHR1cmVfdW5pdCB8fCAwO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgc29tZSBvciBhbGwgdW5pZm9ybXMgdG8gc2F2ZWQgdmFsdWVzXG4gICAgcmVzdG9yZVVuaWZvcm1zKHN1YnNldCkge1xuICAgICAgICBsZXQgdW5pZm9ybXMgPSBzdWJzZXQgfHwgdGhpcy51bmlmb3JtcztcbiAgICAgICAgZm9yIChsZXQgdSBpbiB1bmlmb3Jtcykge1xuICAgICAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW3VdO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm0gJiYgdW5pZm9ybS5zYXZlZF92YWx1ZSkge1xuICAgICAgICAgICAgICAgIHVuaWZvcm0udmFsdWUgPSB1bmlmb3JtLnNhdmVkX3ZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVW5pZm9ybSh1bmlmb3JtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRleHR1cmVfdW5pdCA9IHRoaXMuc2F2ZWRfdGV4dHVyZV91bml0IHx8IDA7XG4gICAgfVxuXG4gICAgLy8gU2V0IGEgdGV4dHVyZSB1bmlmb3JtLCBmaW5kcyB0ZXh0dXJlIGJ5IG5hbWUgb3IgY3JlYXRlcyBhIG5ldyBvbmVcbiAgICBzZXRUZXh0dXJlVW5pZm9ybSh1bmlmb3JtX25hbWUsIHRleHR1cmVfbmFtZSkge1xuICAgICAgICB2YXIgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdGV4dHVyZV9uYW1lXTtcbiAgICAgICAgaWYgKHRleHR1cmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYENhbm5vdCBmaW5kIHRleHR1cmUgJyR7dGV4dHVyZV9uYW1lfSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRleHR1cmUuYmluZCh0aGlzLnRleHR1cmVfdW5pdCk7XG4gICAgICAgIHRoaXMudW5pZm9ybSgnMWknLCB1bmlmb3JtX25hbWUsIHRoaXMudGV4dHVyZV91bml0KTtcbiAgICAgICAgdGhpcy50ZXh0dXJlX3VuaXQrKzsgLy8gVE9ETzogdHJhY2sgbWF4IHRleHR1cmUgdW5pdHMgYW5kIGxvZy90aHJvdyBlcnJvcnNcbiAgICB9XG5cbiAgICAvLyBleDogcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAncG9zaXRpb24nLCBbeCwgeSwgel0pO1xuICAgIC8vIFRPRE86IG9ubHkgdXBkYXRlIHVuaWZvcm1zIHdoZW4gY2hhbmdlZFxuICAgIHVuaWZvcm0obWV0aG9kLCBuYW1lLCB2YWx1ZSkgeyAvLyAndmFsdWUnIGlzIGEgbWV0aG9kLWFwcHJvcHJpYXRlIGFyZ3VtZW50cyBsaXN0XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51bmlmb3Jtc1tuYW1lXSA9IHRoaXMudW5pZm9ybXNbbmFtZV0gfHwge307XG4gICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1tuYW1lXTtcbiAgICAgICAgdW5pZm9ybS5uYW1lID0gbmFtZTtcbiAgICAgICAgaWYgKHVuaWZvcm0ubG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdW5pZm9ybS5sb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5pZm9ybS5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHVuaWZvcm0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVVbmlmb3JtKHVuaWZvcm0pO1xuICAgIH1cblxuICAgIC8vIFNldCBhIHNpbmdsZSB1bmlmb3JtXG4gICAgdXBkYXRlVW5pZm9ybSh1bmlmb3JtKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF1bmlmb3JtIHx8IHVuaWZvcm0ubG9jYXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51c2UoKTtcbiAgICAgICAgdGhpcy5jb21taXRVbmlmb3JtKHVuaWZvcm0pO1xuICAgIH1cblxuICAgIC8vIENvbW1pdHMgdGhlIHVuaWZvcm0gdG8gdGhlIEdQVVxuICAgIGNvbW1pdFVuaWZvcm0odW5pZm9ybSl7XG4gICAgICAgIGxldCBsb2NhdGlvbiA9IHVuaWZvcm0ubG9jYXRpb247XG4gICAgICAgIGxldCB2YWx1ZSA9IHVuaWZvcm0udmFsdWU7XG5cbiAgICAgICAgc3dpdGNoICh1bmlmb3JtLm1ldGhvZCkge1xuICAgICAgICAgICAgY2FzZSAnMWknOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFpKGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxZic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzJmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0yZihsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzNmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0zZihsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICc0Zic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtNGYobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSwgdmFsdWVbMl0sIHZhbHVlWzNdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzFpdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWl2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczaXYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTNpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzJmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMmZ2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTNmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnNGZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm00ZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ01hdHJpeDNmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBmYWxzZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnTWF0cml4NGZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXg0ZnYobG9jYXRpb24sIGZhbHNlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWZyZXNoIHVuaWZvcm0gbG9jYXRpb25zIGFuZCBzZXQgdG8gbGFzdCBjYWNoZWQgdmFsdWVzXG4gICAgcmVmcmVzaFVuaWZvcm1zKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHUgaW4gdGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW3VdO1xuICAgICAgICAgICAgdW5pZm9ybS5sb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgdSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVuaWZvcm0odW5pZm9ybSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWZyZXNoQXR0cmlidXRlcygpIHtcbiAgICAgICAgLy8gdmFyIGxlbiA9IHRoaXMuZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnByb2dyYW0sIHRoaXMuZ2wuQUNUSVZFX0FUVFJJQlVURVMpO1xuICAgICAgICAvLyBmb3IgKHZhciBpPTA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAvLyAgICAgdmFyIGEgPSB0aGlzLmdsLmdldEFjdGl2ZUF0dHJpYih0aGlzLnByb2dyYW0sIGkpO1xuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuYXR0cmlicyA9IHt9O1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgbG9jYXRpb24gb2YgYSB2ZXJ0ZXggYXR0cmlidXRlXG4gICAgYXR0cmlidXRlKG5hbWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXR0cmliID0gKHRoaXMuYXR0cmlic1tuYW1lXSA9IHRoaXMuYXR0cmlic1tuYW1lXSB8fCB7fSk7XG4gICAgICAgIGlmIChhdHRyaWIubG9jYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF0dHJpYjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYi5uYW1lID0gbmFtZTtcbiAgICAgICAgYXR0cmliLmxvY2F0aW9uID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sIG5hbWUpO1xuXG4gICAgICAgIC8vIHZhciBpbmZvID0gdGhpcy5nbC5nZXRBY3RpdmVBdHRyaWIodGhpcy5wcm9ncmFtLCBhdHRyaWIubG9jYXRpb24pO1xuICAgICAgICAvLyBhdHRyaWIudHlwZSA9IGluZm8udHlwZTtcbiAgICAgICAgLy8gYXR0cmliLnNpemUgPSBpbmZvLnNpemU7XG5cbiAgICAgICAgcmV0dXJuIGF0dHJpYjtcbiAgICB9XG5cbiAgICAvLyBHZXQgc2hhZGVyIHNvdXJjZSBhcyBzdHJpbmdcbiAgICBzb3VyY2UodHlwZSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3ZlcnRleCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2ZyYWdtZW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IHNoYWRlciBzb3VyY2UgYXMgYXJyYXkgb2YgbGluZSBzdHJpbmdzXG4gICAgbGluZXModHlwZSkge1xuICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zb3VyY2UodHlwZSk7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3BsaXQoJ1xcbicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBHZXQgYSBzcGVjaWZpYyBsaW5lIGZyb20gc2hhZGVyIHNvdXJjZVxuICAgIGxpbmUodHlwZSwgbnVtKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLmxpbmVzKHR5cGUpO1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlW251bV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgaW5mbyBvbiB3aGljaCBzaGFkZXIgYmxvY2sgKGlmIGFueSkgYSBwYXJ0aWN1bGFyIGxpbmUgbnVtYmVyIGluIGEgc2hhZGVyIGlzIGluXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGluZm8gaWYgYSBibG9jayBpcyBmb3VuZDogeyBuYW1lLCBsaW5lLCBzb3VyY2UgfVxuICAgIC8vICBzY29wZTogd2hlcmUgdGhlIHNoYWRlciBibG9jayBvcmlnaW5hdGVkLCBlaXRoZXIgYSBzdHlsZSBuYW1lLCBvciBnbG9iYWwgc3VjaCBhcyBTaGFkZXJQcm9ncmFtXG4gICAgLy8gIG5hbWU6IHNoYWRlciBibG9jayBuYW1lIChlLmcuICdjb2xvcicsICdwb3NpdGlvbicsICdnbG9iYWwnKVxuICAgIC8vICBudW06IHRoZSBibG9jayBudW1iZXIgKndpdGhpbiogbG9jYWwgc2NvcGUgKGUuZy4gaWYgYSBzdHlsZSBoYXMgbXVsdGlwbGUgJ2NvbG9yJyBibG9ja3MpXG4gICAgLy8gIGxpbmU6IGxpbmUgbnVtYmVyICp3aXRoaW4qIHRoZSBzaGFkZXIgYmxvY2sgKG5vdCB0aGUgd2hvbGUgc2hhZGVyIHByb2dyYW0pLCB1c2VmdWwgZm9yIGVycm9yIGhpZ2hsaWdodGluZ1xuICAgIC8vICBzb3VyY2U6IHRoZSBjb2RlIGZvciB0aGUgbGluZVxuICAgIC8vIE5PVEU6IHRoaXMgZG9lcyBhIGJydXRlZm9yY2UgbG9vcCBvdmVyIHRoZSBzaGFkZXIgc291cmNlIGFuZCBsb29rcyBmb3Igc2hhZGVyIGJsb2NrIHN0YXJ0L2VuZCBtYXJrZXJzXG4gICAgLy8gV2UgY291bGQgdHJhY2sgbGluZSByYW5nZXMgZm9yIHNoYWRlciBibG9ja3MgYXMgdGhleSBhcmUgaW5zZXJ0ZWQsIGJ1dCBhcyB0aGlzIGNvZGUgaXMgb25seSB1c2VkIGZvclxuICAgIC8vIGVycm9yIGhhbmRsaW5nIG9uIGNvbXBpbGF0aW9uIGZhaWx1cmUsIGl0IHdhcyBzaW1wbGVyIHRvIGtlZXAgaXQgc2VwYXJhdGUgdGhhbiB0byBidXJkZW4gdGhlIGNvcmVcbiAgICAvLyBjb21waWxhdGlvbiBwYXRoLlxuICAgIGJsb2NrKHR5cGUsIG51bSkge1xuICAgICAgICBsZXQgbGluZXMgPSB0aGlzLmxpbmVzKHR5cGUpO1xuICAgICAgICBsZXQgYmxvY2s7XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG51bSAmJiBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbaV07XG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSBsaW5lLm1hdGNoKC9cXC9cXC8gdGFuZ3JhbS1ibG9jay1zdGFydDogKFtBLVphLXowLTlfLV0rKSwgKFtBLVphLXowLTlfLV0rKSwgKFxcZCspLyk7XG4gICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgY3VycmVudCBibG9ja1xuICAgICAgICAgICAgICAgIGJsb2NrID0ge1xuICAgICAgICAgICAgICAgICAgICBzY29wZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hdGNoWzJdLFxuICAgICAgICAgICAgICAgICAgICBudW06IG1hdGNoWzNdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hdGNoID0gbGluZS5tYXRjaCgvXFwvXFwvIHRhbmdyYW0tYmxvY2stZW5kOiAoW0EtWmEtejAtOV8tXSspLCAoW0EtWmEtejAtOV8tXSspLCAoXFxkKykvKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBibG9jayA9IG51bGw7IC8vIGNsZWFyIGN1cnJlbnQgYmxvY2tcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBsaW5lICMgYW5kIGNvbnRlbnRcbiAgICAgICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgICAgIC8vIGluaXQgdG8gLTEgc28gdGhhdCBsaW5lIDAgaXMgZmlyc3QgYWN0dWFsIGxpbmUgb2YgYmxvY2sgY29kZSwgYWZ0ZXIgY29tbWVudCBtYXJrZXJcbiAgICAgICAgICAgICAgICBibG9jay5saW5lID0gKGJsb2NrLmxpbmUgPT0gbnVsbCkgPyAtMSA6IGJsb2NrLmxpbmUgKyAxO1xuICAgICAgICAgICAgICAgIGJsb2NrLnNvdXJjZSA9IGxpbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJsb2NrO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgbGlzdCBvZiBhdmFpbGFibGUgZXh0ZW5zaW9ucyBmcm9tIHRob3NlIHJlcXVlc3RlZFxuICAgIC8vIFNldHMgaW50ZXJuYWwgI2RlZmluZXMgaW5kaWNhdGluZyBhdmFpbGFiaWxpdHkgb2YgZWFjaCByZXF1ZXN0ZWQgZXh0ZW5zaW9uXG4gICAgY2hlY2tFeHRlbnNpb25zKCkge1xuICAgICAgICBsZXQgZXh0cyA9IFtdO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbnMuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBleHQgPSBnZXRFeHRlbnNpb24odGhpcy5nbCwgbmFtZSk7XG4gICAgICAgICAgICBsZXQgZGVmID0gYFRBTkdSQU1fRVhURU5TSU9OXyR7bmFtZX1gO1xuXG4gICAgICAgICAgICB0aGlzLmRlZmluZXNbZGVmXSA9IChleHQgIT0gbnVsbCk7XG5cbiAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICBleHRzLnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYENvdWxkIG5vdCBlbmFibGUgZXh0ZW5zaW9uICcke25hbWV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGV4dHM7XG4gICAgfVxuXG59XG5cblxuLy8gU3RhdGljIG1ldGhvZHMgYW5kIHN0YXRlXG5TaGFkZXJQcm9ncmFtLmlkID0gMDsgICAgICAgICAgICAgICAgICAgLy8gYXNzaWduIGVhY2ggcHJvZ3JhbSBhIHVuaXF1ZSBpZFxuU2hhZGVyUHJvZ3JhbS5jdXJyZW50ID0gbnVsbDsgICAgICAgICAgIC8vIGN1cnJlbnRseSBib3VuZCBwcm9ncmFtXG5cbi8vIEdsb2JhbCBjb25maWcgYXBwbGllZCB0byBhbGwgcHJvZ3JhbXMgKGR1cGxpY2F0ZSBwcm9wZXJ0aWVzIGZvciBhIHNwZWNpZmljIHByb2dyYW0gd2lsbCB0YWtlIHByZWNlZGVuY2UpXG5TaGFkZXJQcm9ncmFtLmRlZmluZXMgPSB7fTtcblNoYWRlclByb2dyYW0uYmxvY2tzID0ge307XG5cbi8vIFJlc2V0IHByb2dyYW0gYW5kIHNoYWRlciBjYWNoZXNcblNoYWRlclByb2dyYW0ucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgU2hhZGVyUHJvZ3JhbS5wcm9ncmFtc19ieV9zb3VyY2UgPSB7fTsgIC8vIEdMIHByb2dyYW0gb2JqZWN0cyBieSBleGFjdCB2ZXJ0ZXggKyBmcmFnbWVudCBzaGFkZXIgc291cmNlXG4gICAgU2hhZGVyUHJvZ3JhbS5zaGFkZXJzX2J5X3NvdXJjZSA9IHt9OyAgIC8vIEdMIHNoYWRlciBvYmplY3RzIGJ5IGV4YWN0IHNvdXJjZVxufTtcblNoYWRlclByb2dyYW0ucmVzZXQoKTtcblxuLy8gVHVybiBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzIGludG8gc2luZ2xlIHN0cmluZyBvZiAjZGVmaW5lIHN0YXRlbWVudHNcblNoYWRlclByb2dyYW0uYnVpbGREZWZpbmVTdHJpbmcgPSBmdW5jdGlvbiAoZGVmaW5lcykge1xuICAgIHZhciBkZWZpbmVfc3RyID0gXCJcIjtcbiAgICBmb3IgKHZhciBkIGluIGRlZmluZXMpIHtcbiAgICAgICAgaWYgKGRlZmluZXNbZF0gPT0gbnVsbCB8fCBkZWZpbmVzW2RdID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlZmluZXNbZF0gPT09ICdib29sZWFuJyAmJiBkZWZpbmVzW2RdID09PSB0cnVlKSB7IC8vIGJvb2xlYW5zIGFyZSBzaW1wbGUgZGVmaW5lcyB3aXRoIG5vIHZhbHVlXG4gICAgICAgICAgICBkZWZpbmVfc3RyICs9IFwiI2RlZmluZSBcIiArIGQgKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmVzW2RdID09PSAnbnVtYmVyJyAmJiBNYXRoLmZsb29yKGRlZmluZXNbZF0pID09PSBkZWZpbmVzW2RdKSB7IC8vIGludCB0byBmbG9hdCBjb252ZXJzaW9uIHRvIHNhdGlzZnkgR0xTTCBmbG9hdHNcbiAgICAgICAgICAgIGRlZmluZV9zdHIgKz0gXCIjZGVmaW5lIFwiICsgZCArIFwiIFwiICsgZGVmaW5lc1tkXS50b0ZpeGVkKDEpICsgXCJcXG5cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gYW55IG90aGVyIGZsb2F0IG9yIHN0cmluZyB2YWx1ZVxuICAgICAgICAgICAgZGVmaW5lX3N0ciArPSBcIiNkZWZpbmUgXCIgKyBkICsgXCIgXCIgKyBkZWZpbmVzW2RdICsgXCJcXG5cIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVmaW5lX3N0cjtcbn07XG5cbi8vIFR1cm4gYSBsaXN0IG9mIGV4dGVuc2lvbiBuYW1lcyBpbnRvIHNpbmdsZSBzdHJpbmcgb2YgI2V4dGVuc2lvbiBzdGF0ZW1lbnRzXG5TaGFkZXJQcm9ncmFtLmJ1aWxkRXh0ZW5zaW9uU3RyaW5nID0gZnVuY3Rpb24gKGV4dGVuc2lvbnMpIHtcbiAgICBleHRlbnNpb25zID0gZXh0ZW5zaW9ucyB8fCBbXTtcbiAgICBsZXQgc3RyID0gXCJcIjtcbiAgICBleHRlbnNpb25zLmZvckVhY2goZXh0ID0+IHtcbiAgICAgICAgc3RyICs9IGAjaWZkZWYgR0xfJHtleHR9XFxuI2V4dGVuc2lvbiBHTF8ke2V4dH0gOiBlbmFibGVcXG4jZW5kaWZcXG5gO1xuICAgIH0pO1xuICAgIHJldHVybiBzdHI7XG59O1xuXG5TaGFkZXJQcm9ncmFtLmFkZEJsb2NrID0gZnVuY3Rpb24gKGtleSwgLi4uYmxvY2tzKSB7XG4gICAgU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSA9IFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0gfHwgW107XG4gICAgU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XS5wdXNoKC4uLmJsb2Nrcyk7XG59O1xuXG4vLyBSZW1vdmUgYWxsIGdsb2JhbCBzaGFkZXIgYmxvY2tzIGZvciBhIGdpdmVuIGtleVxuU2hhZGVyUHJvZ3JhbS5yZW1vdmVCbG9jayA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldID0gW107XG59O1xuXG5TaGFkZXJQcm9ncmFtLnJlcGxhY2VCbG9jayA9IGZ1bmN0aW9uIChrZXksIC4uLmJsb2Nrcykge1xuICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soa2V5KTtcbiAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKGtleSwgLi4uYmxvY2tzKTtcbn07XG5cbi8vIENvbXBpbGUgJiBsaW5rIGEgV2ViR0wgcHJvZ3JhbSBmcm9tIHByb3ZpZGVkIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZXNcbi8vIHVwZGF0ZSBhIHByb2dyYW0gaWYgb25lIGlzIHBhc3NlZCBpbi4gQ3JlYXRlIG9uZSBpZiBub3QuIEFsZXJ0IGFuZCBkb24ndCB1cGRhdGUgYW55dGhpbmcgaWYgdGhlIHNoYWRlcnMgZG9uJ3QgY29tcGlsZS5cblNoYWRlclByb2dyYW0udXBkYXRlUHJvZ3JhbSA9IGZ1bmN0aW9uIChnbCwgcHJvZ3JhbSwgdmVydGV4X3NoYWRlcl9zb3VyY2UsIGZyYWdtZW50X3NoYWRlcl9zb3VyY2UpIHtcbiAgICAvLyBQcm9ncmFtIHdpdGggdGhpcyBleGFjdCB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlciBzb3VyY2VzIGFscmVhZHkgY2FjaGVkP1xuICAgIGxldCBrZXkgPSB2ZXJ0ZXhfc2hhZGVyX3NvdXJjZSArICc6OicgKyBmcmFnbWVudF9zaGFkZXJfc291cmNlO1xuICAgIGlmIChTaGFkZXJQcm9ncmFtLnByb2dyYW1zX2J5X3NvdXJjZVtrZXldKSB7XG4gICAgICAgIGxvZygndHJhY2UnLCAnUmV1c2luZyBpZGVudGljYWwgc291cmNlIEdMIHByb2dyYW0gb2JqZWN0Jyk7XG4gICAgICAgIHJldHVybiBTaGFkZXJQcm9ncmFtLnByb2dyYW1zX2J5X3NvdXJjZVtrZXldO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIHZhciB2ZXJ0ZXhfc2hhZGVyID0gU2hhZGVyUHJvZ3JhbS5jcmVhdGVTaGFkZXIoZ2wsIHZlcnRleF9zaGFkZXJfc291cmNlLCBnbC5WRVJURVhfU0hBREVSKTtcbiAgICAgICAgdmFyIGZyYWdtZW50X3NoYWRlciA9IFNoYWRlclByb2dyYW0uY3JlYXRlU2hhZGVyKGdsLCBmcmFnbWVudF9zaGFkZXJfc291cmNlLCBnbC5GUkFHTUVOVF9TSEFERVIpO1xuICAgIH1cbiAgICBjYXRjaChlcnIpIHtcbiAgICAgICAgbG9nKCdlcnJvcicsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIGdsLnVzZVByb2dyYW0obnVsbCk7XG4gICAgaWYgKHByb2dyYW0gIT0gbnVsbCkge1xuICAgICAgICB2YXIgb2xkX3NoYWRlcnMgPSBnbC5nZXRBdHRhY2hlZFNoYWRlcnMocHJvZ3JhbSk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBvbGRfc2hhZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZ2wuZGV0YWNoU2hhZGVyKHByb2dyYW0sIG9sZF9zaGFkZXJzW2ldKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG4gICAgfVxuXG4gICAgaWYgKHZlcnRleF9zaGFkZXIgPT0gbnVsbCB8fCBmcmFnbWVudF9zaGFkZXIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcHJvZ3JhbTtcbiAgICB9XG5cbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4X3NoYWRlcik7XG4gICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50X3NoYWRlcik7XG5cbiAgICBnbC5saW5rUHJvZ3JhbShwcm9ncmFtKTtcblxuICAgIGdsLmRldGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhfc2hhZGVyKTtcbiAgICBnbC5kZXRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRfc2hhZGVyKTtcblxuICAgIGlmICghZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgV2ViR0wgcHJvZ3JhbSBlcnJvcjpcbiAgICAgICAgICAgIFZBTElEQVRFX1NUQVRVUzogJHtnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLlZBTElEQVRFX1NUQVRVUyl9XG4gICAgICAgICAgICBFUlJPUjogJHtnbC5nZXRFcnJvcigpfVxuICAgICAgICAgICAgLS0tIFZlcnRleCBTaGFkZXIgLS0tXG4gICAgICAgICAgICAke3ZlcnRleF9zaGFkZXJfc291cmNlfVxuICAgICAgICAgICAgLS0tIEZyYWdtZW50IFNoYWRlciAtLS1cbiAgICAgICAgICAgICR7ZnJhZ21lbnRfc2hhZGVyX3NvdXJjZX1gKTtcblxuICAgICAgICBsZXQgZXJyb3IgPSB7IHR5cGU6ICdwcm9ncmFtJywgbWVzc2FnZSB9O1xuICAgICAgICBsb2coJ2Vycm9yJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIFNoYWRlclByb2dyYW0ucHJvZ3JhbXNfYnlfc291cmNlW2tleV0gPSBwcm9ncmFtOyAvLyBjYWNoZSBieSBleGFjdCBzb3VyY2VcbiAgICByZXR1cm4gcHJvZ3JhbTtcbn07XG5cbi8vIENvbXBpbGUgYSB2ZXJ0ZXggb3IgZnJhZ21lbnQgc2hhZGVyIGZyb20gcHJvdmlkZWQgc291cmNlXG5TaGFkZXJQcm9ncmFtLmNyZWF0ZVNoYWRlciA9IGZ1bmN0aW9uIChnbCwgc291cmNlLCBzdHlwZSkge1xuICAgIC8vIFByb2dyYW0gd2l0aCBpZGVudGljYWwgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIgc291cmNlcyBhbHJlYWR5IGNhY2hlZD9cbiAgICBsZXQga2V5ID0gc291cmNlO1xuICAgIGlmIChTaGFkZXJQcm9ncmFtLnNoYWRlcnNfYnlfc291cmNlW2tleV0pIHtcbiAgICAgICAgbG9nKCd0cmFjZScsICdSZXVzaW5nIGlkZW50aWNhbCBzb3VyY2UgR0wgc2hhZGVyIG9iamVjdCcpO1xuICAgICAgICByZXR1cm4gU2hhZGVyUHJvZ3JhbS5zaGFkZXJzX2J5X3NvdXJjZVtrZXldO1xuICAgIH1cblxuICAgIGxldCBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoc3R5cGUpO1xuXG4gICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlKTtcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XG5cbiAgICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgICAgICBsZXQgdHlwZSA9IChzdHlwZSA9PT0gZ2wuVkVSVEVYX1NIQURFUiA/ICd2ZXJ0ZXgnIDogJ2ZyYWdtZW50Jyk7XG4gICAgICAgIGxldCBtZXNzYWdlID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpO1xuICAgICAgICBsZXQgZXJyb3JzID0gcGFyc2VTaGFkZXJFcnJvcnMobWVzc2FnZSk7XG4gICAgICAgIHRocm93IHsgdHlwZSwgbWVzc2FnZSwgZXJyb3JzIH07XG4gICAgfVxuXG4gICAgU2hhZGVyUHJvZ3JhbS5zaGFkZXJzX2J5X3NvdXJjZVtrZXldID0gc2hhZGVyOyAvLyBjYWNoZSBieSBleGFjdCBzb3VyY2VcbiAgICByZXR1cm4gc2hhZGVyO1xufTtcbiIsIi8vIFRleHR1cmUgbWFuYWdlbWVudFxuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBzdWJzY3JpYmVNaXhpbiBmcm9tICcuLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuLi91dGlscy93b3JrZXJfYnJva2VyJztcblxuLy8gR0wgdGV4dHVyZSB3cmFwcGVyIG9iamVjdCBmb3Iga2VlcGluZyB0cmFjayBvZiBhIGdsb2JhbCBzZXQgb2YgdGV4dHVyZXMsIGtleWVkIGJ5IGEgdW5pcXVlIHVzZXItZGVmaW5lZCBuYW1lXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXh0dXJlIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCBuYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmluZCgpO1xuXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMucmV0YWluX2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb25maWdfdHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7ICAgIC8vIGEgUHJvbWlzZSBvYmplY3QgdG8gdHJhY2sgdGhlIGxvYWRpbmcgc3RhdGUgb2YgdGhpcyB0ZXh0dXJlXG4gICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7ICAgIC8vIHN1Y2Nlc3NmdWxseSBsb2FkZWQgYXMgZXhwZWN0ZWRcbiAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSBvcHRpb25zLmZpbHRlcmluZztcbiAgICAgICAgdGhpcy5zcHJpdGVzID0gb3B0aW9ucy5zcHJpdGVzO1xuICAgICAgICB0aGlzLnRleGNvb3JkcyA9IHt9OyAgICAvLyBzcHJpdGUgVVZzIChbMCwgMV0gcmFuZ2UpXG4gICAgICAgIHRoaXMuc2l6ZXMgPSB7fTsgICAgICAgIC8vIHNwcml0ZSBzaXplcyAocGl4ZWwgc2l6ZSlcblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGEgMS1waXhlbCBibGFjayB0ZXh0dXJlIHNvIHdlIGNhbiBzYWZlbHkgcmVuZGVyIHdoaWxlIHdlIHdhaXQgZm9yIGFuIGltYWdlIHRvIGxvYWRcbiAgICAgICAgLy8gU2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NzIyMjQ3L3dlYmdsLXdhaXQtZm9yLXRleHR1cmUtdG8tbG9hZFxuICAgICAgICB0aGlzLnNldERhdGEoMSwgMSwgbmV3IFVpbnQ4QXJyYXkoWzAsIDAsIDAsIDI1NV0pLCB7IGZpbHRlcmluZzogJ25lYXJlc3QnIH0pO1xuXG4gICAgICAgIC8vIERlc3Ryb3kgcHJldmlvdXMgdGV4dHVyZSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0pIHtcbiAgICAgICAgICAgIC8vIFByZXNlcnZlIHByZXZpb3VzIHJldGFpbiBjb3VudFxuICAgICAgICAgICAgdGhpcy5yZXRhaW5fY291bnQgPSBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0ucmV0YWluX2NvdW50O1xuICAgICAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLm5hbWVdLnJldGFpbl9jb3VudCA9IDA7IC8vIGFsbG93IHRvIGJlIGZyZWVkXG4gICAgICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0uZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FjaGUgdGV4dHVyZSBpbnN0YW5jZSBhbmQgZGVmaW5pdGlvblxuICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0gPSB0aGlzO1xuICAgICAgICBUZXh0dXJlLnRleHR1cmVfY29uZmlnc1t0aGlzLm5hbWVdID0gT2JqZWN0LmFzc2lnbih7IG5hbWUgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5sb2FkKG9wdGlvbnMpO1xuICAgICAgICBsb2coJ3RyYWNlJywgYGNyZWF0aW5nIFRleHR1cmUgJHt0aGlzLm5hbWV9YCk7XG4gICAgfVxuXG4gICAgLy8gRGVzdHJveSBhIHNpbmdsZSB0ZXh0dXJlIGluc3RhbmNlXG4gICAgZGVzdHJveSh7IGZvcmNlIH0gPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5fY291bnQgPiAwICYmICFmb3JjZSkge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiBkZXN0cm95aW5nIHRleHR1cmUgd2l0aCByZXRhaW4gY291bnQgb2YgJyR7dGhpcy5yZXRhaW5fY291bnR9J2ApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nbC5kZWxldGVUZXh0dXJlKHRoaXMudGV4dHVyZSk7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IG51bGw7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRhdGE7XG4gICAgICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgICAgIGRlbGV0ZSBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV07XG4gICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgbG9nKCd0cmFjZScsIGBkZXN0cm95aW5nIFRleHR1cmUgJHt0aGlzLm5hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0YWluICgpIHtcbiAgICAgICAgdGhpcy5yZXRhaW5fY291bnQrKztcbiAgICB9XG5cbiAgICByZWxlYXNlICgpIHtcbiAgICAgICAgaWYgKHRoaXMucmV0YWluX2NvdW50IDw9IDApIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBgVGV4dHVyZSAnJHt0aGlzLm5hbWV9JzogcmVsZWFzaW5nIHRleHR1cmUgd2l0aCByZXRhaW4gY291bnQgb2YgJyR7dGhpcy5yZXRhaW5fY291bnR9J2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXRhaW5fY291bnQtLTtcbiAgICAgICAgaWYgKHRoaXMucmV0YWluX2NvdW50IDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZCh1bml0ID0gMCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChUZXh0dXJlLmFjdGl2ZVVuaXQgIT09IHVuaXQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuYWN0aXZlVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkUwICsgdW5pdCk7XG4gICAgICAgICAgICBUZXh0dXJlLmFjdGl2ZVVuaXQgPSB1bml0O1xuICAgICAgICAgICAgVGV4dHVyZS5ib3VuZFRleHR1cmUgPSBudWxsOyAvLyB0ZXh0dXJlIG11c3QgYmUgcmUtYm91bmQgd2hlbiB1bml0IGNoYW5nZXNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChUZXh0dXJlLmJvdW5kVGV4dHVyZSAhPT0gdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICAgICAgICAgIFRleHR1cmUuYm91bmRUZXh0dXJlID0gdGhpcy50ZXh0dXJlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZChvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZyB8fCBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMudXJsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5jb25maWdfdHlwZSA9ICd1cmwnO1xuICAgICAgICAgICAgdGhpcy5zZXRVcmwob3B0aW9ucy51cmwsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWdfdHlwZSA9ICdlbGVtZW50JztcbiAgICAgICAgICAgIHRoaXMuc2V0RWxlbWVudChvcHRpb25zLmVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLndpZHRoICYmIG9wdGlvbnMuaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gJ2RhdGEnO1xuICAgICAgICAgICAgdGhpcy5zZXREYXRhKG9wdGlvbnMud2lkdGgsIG9wdGlvbnMuaGVpZ2h0LCBvcHRpb25zLmRhdGEsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID1cbiAgICAgICAgICAgICh0aGlzLmxvYWRpbmcgJiYgdGhpcy5sb2FkaW5nLnRoZW4oKCkgPT4geyB0aGlzLmNhbGN1bGF0ZVNwcml0ZXMoKTsgcmV0dXJuIHRoaXM7IH0pKSB8fFxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGV4dHVyZSBmcm9tIGFuIHVybFxuICAgIHNldFVybCh1cmwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXJsID0gdXJsOyAvLyBzYXZlIFVSTCByZWZlcmVuY2UgKHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiBlbGVtZW50IGlzIGxvYWRlZCBiZWxvdylcbiAgICAgICAgdGhpcy5zb3VyY2UgPSB0aGlzLnVybDtcbiAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9ICd1cmwnO1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RWxlbWVudChpbWFnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiBmYWlsZWQgdG8gbG9hZCB1cmw6ICcke3RoaXMuc291cmNlfSdgLCBlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd3YXJuaW5nJywgeyBtZXNzYWdlOiBgRmFpbGVkIHRvIGxvYWQgdGV4dHVyZSBmcm9tICR7dGhpcy5zb3VyY2V9YCwgZXJyb3I6IGUsIHRleHR1cmU6IG9wdGlvbnMgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9IGUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFdhcm4gYW5kIHJlc29sdmUgb24gZXJyb3JcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiBmYWlsZWQgdG8gbG9hZCB1cmw6ICcke3RoaXMuc291cmNlfSdgLCBlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3dhcm5pbmcnLCB7IG1lc3NhZ2U6IGBGYWlsZWQgdG8gbG9hZCB0ZXh0dXJlIGZyb20gJHt0aGlzLnNvdXJjZX1gLCBlcnJvcjogZSwgdGV4dHVyZTogb3B0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gU2FmYXJpIGhhcyBhIGJ1ZyBsb2FkaW5nIGRhdGEtVVJMIGltYWdlcyB3aXRoIENPUlMgZW5hYmxlZCwgc28gaXQgbXVzdCBiZSBkaXNhYmxlZCBpbiB0aGF0IGNhc2VcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjM5NzhcbiAgICAgICAgICAgIGlmICghKFV0aWxzLmlzU2FmYXJpKCkgJiYgdGhpcy5zb3VyY2Uuc2xpY2UoMCwgNSkgPT09ICdkYXRhOicpKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gdGhpcy5zb3VyY2U7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGV4dHVyZSB0byBhIHJhdyBpbWFnZSBidWZmZXJcbiAgICBzZXREYXRhKHdpZHRoLCBoZWlnaHQsIGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgIHRoaXMuc291cmNlID0gZGF0YTtcbiAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9ICdkYXRhJztcblxuICAgICAgICAvLyBDb252ZXJ0IHJlZ3VsYXIgYXJyYXkgdG8gdHlwZWQgYXJyYXlcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zb3VyY2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnNldEZpbHRlcmluZyhvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBTZXRzIHRoZSB0ZXh0dXJlIHRvIHRyYWNrIGEgZWxlbWVudCAoY2FudmFzL2ltYWdlKVxuICAgIHNldEVsZW1lbnQoZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgICBsZXQgZWwgPSBlbGVtZW50O1xuXG4gICAgICAgIC8vIGEgc3RyaW5nIGVsZW1lbnQgaXMgaW50ZXJwZXRlZCBhcyBhIENTUyBzZWxlY3RvclxuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHxcbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8XG4gICAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBlbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9ICdlbGVtZW50JztcblxuICAgICAgICAgICAgdGhpcy51cGRhdGUob3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLnNldEZpbHRlcmluZyhvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbXNnID0gYHRoZSAnZWxlbWVudCcgcGFyYW1ldGVyIChcXGBlbGVtZW50OiAke0pTT04uc3RyaW5naWZ5KGVsKX1cXGApIG11c3QgYmUgYSBDU1MgYDtcbiAgICAgICAgICAgIG1zZyArPSBgc2VsZWN0b3Igc3RyaW5nLCBvciBhIDxjYW52YXM+LCA8aW1hZ2U+IG9yIDx2aWRlbz4gb2JqZWN0YDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiAke21zZ31gLCBvcHRpb25zKTtcbiAgICAgICAgICAgIFRleHR1cmUudHJpZ2dlcignd2FybmluZycsIHsgbWVzc2FnZTogYEZhaWxlZCB0byBsb2FkIHRleHR1cmUgYmVjYXVzZSAke21zZ31gLCB0ZXh0dXJlOiBvcHRpb25zIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gVXBsb2FkcyBjdXJyZW50IGltYWdlIG9yIGJ1ZmZlciB0byB0aGUgR1BVIChjYW4gYmUgdXNlZCB0byB1cGRhdGUgYW5pbWF0ZWQgdGV4dHVyZXMgb24gdGhlIGZseSlcbiAgICB1cGRhdGUob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5iaW5kKCk7XG4gICAgICAgIHRoaXMuZ2wucGl4ZWxTdG9yZWkodGhpcy5nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCAob3B0aW9ucy5VTlBBQ0tfRkxJUF9ZX1dFQkdMID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSkpO1xuICAgICAgICB0aGlzLmdsLnBpeGVsU3RvcmVpKHRoaXMuZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCBvcHRpb25zLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCB8fCBmYWxzZSk7XG5cbiAgICAgICAgLy8gSW1hZ2Ugb3IgQ2FudmFzIGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuc291cmNlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgdGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50IHx8XG4gICAgICAgICAgICAodGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ICYmIHRoaXMuc291cmNlLmNvbXBsZXRlKSkge1xuXG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5zb3VyY2Uud2lkdGg7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuc291cmNlLmhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuZ2wudGV4SW1hZ2UyRCh0aGlzLmdsLlRFWFRVUkVfMkQsIDAsIHRoaXMuZ2wuUkdCQSwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSYXcgaW1hZ2UgYnVmZmVyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc291cmNlX3R5cGUgPT09ICdkYXRhJykge1xuICAgICAgICAgICAgdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFRleHR1cmUudHJpZ2dlcigndXBkYXRlJywgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lcyBhcHByb3ByaWF0ZSBmaWx0ZXJpbmcgbW9kZVxuICAgIHNldEZpbHRlcmluZyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLmZpbHRlcmluZyA9IG9wdGlvbnMuZmlsdGVyaW5nIHx8ICdsaW5lYXInO1xuXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIHRoaXMuYmluZCgpO1xuXG4gICAgICAgIC8vIEZvciBwb3dlci1vZi0yIHRleHR1cmVzLCB0aGUgZm9sbG93aW5nIHByZXNldHMgYXJlIGF2YWlsYWJsZTpcbiAgICAgICAgLy8gbWlwbWFwOiBsaW5lYXIgYmxlbmQgZnJvbSBuZWFyZXN0IG1pcFxuICAgICAgICAvLyBsaW5lYXI6IGxpbmVhciBibGVuZCBmcm9tIG9yaWdpbmFsIGltYWdlIChubyBtaXBzKVxuICAgICAgICAvLyBuZWFyZXN0OiBuZWFyZXN0IHBpeGVsIGZyb20gb3JpZ2luYWwgaW1hZ2UgKG5vIG1pcHMsICdibG9ja3knIGxvb2spXG4gICAgICAgIGlmIChVdGlscy5pc1Bvd2VyT2YyKHRoaXMud2lkdGgpICYmIFV0aWxzLmlzUG93ZXJPZjIodGhpcy5oZWlnaHQpKSB7XG4gICAgICAgICAgICB0aGlzLnBvd2VyX29mXzIgPSB0cnVlO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgb3B0aW9ucy5URVhUVVJFX1dSQVBfUyB8fCAob3B0aW9ucy5yZXBlYXQgJiYgZ2wuUkVQRUFUKSB8fCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIG9wdGlvbnMuVEVYVFVSRV9XUkFQX1QgfHwgKG9wdGlvbnMucmVwZWF0ICYmIGdsLlJFUEVBVCkgfHwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbHRlcmluZyA9PT0gJ21pcG1hcCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICdtaXBtYXAnO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVJfTUlQTUFQX0xJTkVBUik7IC8vIFRPRE86IHVzZSB0cmlsaW5lYXIgZmlsdGVyaW5nIGJ5IGRlZnVhbHQgaW5zdGVhZD9cbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbGluZWFyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ2xpbmVhcic7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmZpbHRlcmluZyA9PT0gJ25lYXJlc3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbmVhcmVzdCc7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlYkdMIGhhcyBzdHJpY3QgcmVxdWlyZW1lbnRzIG9uIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzOlxuICAgICAgICAgICAgLy8gTm8gbWlwbWFwcyBhbmQgbXVzdCBjbGFtcCB0byBlZGdlXG4gICAgICAgICAgICB0aGlzLnBvd2VyX29mXzIgPSBmYWxzZTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbHRlcmluZyA9PT0gJ25lYXJlc3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbmVhcmVzdCc7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyBkZWZhdWx0IHRvIGxpbmVhciBmb3Igbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXNcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICdsaW5lYXInO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd1cGRhdGUnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBQcmUtY2FsYyBzcHJpdGUgcmVnaW9ucyBmb3IgYSB0ZXh0dXJlIHNwcml0ZSBpbiBVViBbMCwgMV0gc3BhY2VcbiAgICBjYWxjdWxhdGVTcHJpdGVzKCkge1xuICAgICAgICBpZiAodGhpcy5zcHJpdGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzIGluIHRoaXMuc3ByaXRlcykge1xuICAgICAgICAgICAgICAgIGxldCBzcHJpdGUgPSB0aGlzLnNwcml0ZXNbc107XG5cbiAgICAgICAgICAgICAgICAvLyBNYXAgWzAsIDBdIHRvIFsxLCAxXSBjb29yZHMgdG8gdGhlIGFwcHJvcHJpYXRlIHNwcml0ZSBzdWItYXJlYSBvZiB0aGUgdGV4dHVyZVxuICAgICAgICAgICAgICAgIHRoaXMudGV4Y29vcmRzW3NdID0gVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUoXG4gICAgICAgICAgICAgICAgICAgIFtzcHJpdGVbMF0sIHNwcml0ZVsxXV0sXG4gICAgICAgICAgICAgICAgICAgIFtzcHJpdGVbMl0sIHNwcml0ZVszXV0sXG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLndpZHRoLCB0aGlzLmhlaWdodF1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gUGl4ZWwgc2l6ZSBvZiBzcHJpdGVcbiAgICAgICAgICAgICAgICB0aGlzLnNpemVzW3NdID0gW3Nwcml0ZVsyXSwgc3ByaXRlWzNdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5cbi8vIFN0YXRpYy9jbGFzcyBtZXRob2RzIGFuZCBzdGF0ZVxuXG5UZXh0dXJlLmNyZWF0ZSA9IGZ1bmN0aW9uIChnbCwgbmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgVGV4dHVyZShnbCwgbmFtZSwgb3B0aW9ucyk7XG59O1xuXG5UZXh0dXJlLnJldGFpbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRleHR1cmUudGV4dHVyZXNbbmFtZV0pIHtcbiAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1tuYW1lXS5yZXRhaW4oKTtcbiAgICB9XG59O1xuXG5UZXh0dXJlLnJlbGVhc2UgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmIChUZXh0dXJlLnRleHR1cmVzW25hbWVdKSB7XG4gICAgICAgIFRleHR1cmUudGV4dHVyZXNbbmFtZV0ucmVsZWFzZSgpO1xuICAgIH1cbn07XG5cbi8vIERlc3Ryb3kgYWxsIHRleHR1cmUgaW5zdGFuY2VzIGZvciBhIGdpdmVuIEdMIGNvbnRleHRcblRleHR1cmUuZGVzdHJveSA9IGZ1bmN0aW9uIChnbCkge1xuICAgIHZhciB0ZXh0dXJlcyA9IE9iamVjdC5rZXlzKFRleHR1cmUudGV4dHVyZXMpO1xuICAgIHRleHR1cmVzLmZvckVhY2godCA9PiB7XG4gICAgICAgIHZhciB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1t0XTtcbiAgICAgICAgaWYgKHRleHR1cmUuZ2wgPT09IGdsKSB7XG4gICAgICAgICAgICB0ZXh0dXJlLmRlc3Ryb3koeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuLy8gR2V0IHNwcml0ZSBwaXhlbCBzaXplIGFuZCBVVnNcblRleHR1cmUuZ2V0U3ByaXRlSW5mbyA9IGZ1bmN0aW9uICh0ZXhuYW1lLCBzcHJpdGUpIHtcbiAgICBsZXQgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdGV4bmFtZV07XG4gICAgcmV0dXJuIHRleHR1cmUgJiYgeyBzaXplOiB0ZXh0dXJlLnNpemVzW3Nwcml0ZV0sIHRleGNvb3JkczogdGV4dHVyZS50ZXhjb29yZHNbc3ByaXRlXSB9O1xufTtcblxuLy8gUmUtc2NhbGUgVVZzIGZyb20gWzAsIDFdIHJhbmdlIHRvIGEgc21hbGxlciBhcmVhIHdpdGhpbiB0aGUgaW1hZ2VcblRleHR1cmUuZ2V0VGV4Y29vcmRzRm9yU3ByaXRlID0gZnVuY3Rpb24gKGFyZWFfb3JpZ2luLCBhcmVhX3NpemUsIHRleF9zaXplKSB7XG4gICAgdmFyIGFyZWFfb3JpZ2luX3kgPSB0ZXhfc2l6ZVsxXSAtIGFyZWFfb3JpZ2luWzFdIC0gYXJlYV9zaXplWzFdO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgYXJlYV9vcmlnaW5bMF0gLyB0ZXhfc2l6ZVswXSxcbiAgICAgICAgYXJlYV9vcmlnaW5feSAvIHRleF9zaXplWzFdLFxuICAgICAgICAoYXJlYV9zaXplWzBdICsgYXJlYV9vcmlnaW5bMF0pIC8gdGV4X3NpemVbMF0sXG4gICAgICAgIChhcmVhX3NpemVbMV0gKyBhcmVhX29yaWdpbl95KSAvIHRleF9zaXplWzFdXG4gICAgXTtcbn07XG5cbi8vIENyZWF0ZSBhIHNldCBvZiB0ZXh0dXJlcyBrZXllZCBpbiBhbiBvYmplY3Rcbi8vIE9wdGlvbmFsbHkgbG9hZCBlYWNoIGlmIGl0IGhhcyBhIFVSTCBzcGVjaWZpZWRcblRleHR1cmUuY3JlYXRlRnJvbU9iamVjdCA9IGZ1bmN0aW9uIChnbCwgdGV4dHVyZXMpIHtcbiAgICBsZXQgbG9hZGluZyA9IFtdO1xuICAgIGlmICh0ZXh0dXJlcykge1xuICAgICAgICBmb3IgKGxldCB0ZXhuYW1lIGluIHRleHR1cmVzKSB7XG4gICAgICAgICAgICBsZXQgY29uZmlnID0gdGV4dHVyZXNbdGV4bmFtZV07XG5cbiAgICAgICAgICAgIC8vIElmIHRleHR1cmUgYWxyZWFkeSBleGlzdHMgYW5kIGRlZmluaXRpb24gaGFzbid0IGNoYW5nZWQsIG5vIG5lZWQgdG8gcmUtY3JlYXRlXG4gICAgICAgICAgICAvLyBOb3RlOiB0byBhdm9pZCBmbGlja2VyIHdoZW4gb3RoZXIgdGV4dHVyZXMvc2NlbmUgaXRlbXMgY2hhbmdlXG4gICAgICAgICAgICBpZiAoIVRleHR1cmUuY2hhbmdlZCh0ZXhuYW1lLCBjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS5jcmVhdGUoZ2wsIHRleG5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICBsb2FkaW5nLnB1c2godGV4dHVyZS5sb2FkaW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwobG9hZGluZyk7XG59O1xuXG4vLyBDcmVhdGUgYSAnZGVmYXVsdCcgdGV4dHVyZSAoMXgxIHBpeGVsKSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXJcbi8vIChmb3IgZXhhbXBsZSB0byBwcmV2ZW50IEdMIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgdW5ib3VuZCB0ZXh0dXJlcylcblRleHR1cmUuZGVmYXVsdCA9ICdfX2RlZmF1bHQnO1xuVGV4dHVyZS5jcmVhdGVEZWZhdWx0ID0gZnVuY3Rpb24gKGdsKSB7XG4gICAgcmV0dXJuIFRleHR1cmUuY3JlYXRlKGdsLCBUZXh0dXJlLmRlZmF1bHQpO1xufTtcblxuLy8gSW5kaWNhdGUgaWYgYSB0ZXh0dXJlIGRlZmluaXRpb24gd291bGQgYmUgYSBjaGFuZ2UgZnJvbSB0aGUgY3VycmVudCBjYWNoZVxuVGV4dHVyZS5jaGFuZ2VkID0gZnVuY3Rpb24gKG5hbWUsIGNvbmZpZykge1xuICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1tuYW1lXTtcbiAgICBpZiAodGV4dHVyZSkgeyAvLyBjYWNoZWQgdGV4dHVyZVxuICAgICAgICAvLyBjYW52YXMvaW1hZ2UtYmFzZWQgdGV4dHVyZXMgYXJlIGNvbnNpZGVyZWQgZHluYW1pYyBhbmQgYWx3YXlzIHJlZnJlc2hcbiAgICAgICAgaWYgKHRleHR1cmUuY29uZmlnX3R5cGUgPT09ICdlbGVtZW50JyB8fCBjb25maWcuZWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbXBhcmUgZGVmaW5pdGlvbnNcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KFRleHR1cmUudGV4dHVyZV9jb25maWdzW25hbWVdKSA9PT1cbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5hc3NpZ24oeyBuYW1lIH0sIGNvbmZpZykpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBHZXQgbWV0YWRhdGEgZm9yIGEgdGV4dHVyZSBieSBuYW1lXG4vLyBSZXR1cm5zIHZpYSBwcm9taXNlLCBpbiBjYXNlIHRleHR1cmUgaXMgc3RpbGwgbG9hZGluZ1xuLy8gQ2FuIGJlIGNhbGxlZCBvbiBtYWluIHRocmVhZCBmcm9tIHdvcmtlciwgdG8gc3luYyB0ZXh0dXJlIGluZm8gdG8gd29ya2VyXG5UZXh0dXJlLmdldEluZm8gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIC8vIEdldCBpbmZvIGZvciBhbGwgdGV4dHVyZXMgYnkgZGVmYXVsdFxuICAgIGlmICghbmFtZSkge1xuICAgICAgICBuYW1lID0gT2JqZWN0LmtleXMoVGV4dHVyZS50ZXh0dXJlcyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IG11bHRpcGxlIHRleHR1cmVzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG5hbWUubWFwKG4gPT4gVGV4dHVyZS5nZXRJbmZvKG4pKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHNpbmdsZSB0ZXh0dXJlXG4gICAgdmFyIHRleCA9IFRleHR1cmUudGV4dHVyZXNbbmFtZV07XG4gICAgaWYgKHRleCkge1xuICAgICAgICAvLyBXYWl0IGZvciB0aGlzIHRleHR1cmUgdG8gZmluaXNoIGxvYWRpbmcsIG9yIHJldHVybiBpbW1lZGlhdGVseVxuICAgICAgICB2YXIgbG9hZGluZyA9IHRleC5sb2FkaW5nIHx8IFByb21pc2UucmVzb2x2ZSh0ZXgpO1xuICAgICAgICByZXR1cm4gbG9hZGluZy50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFJldHVybiBhIHN1YnNldCBvZiB0ZXh0dXJlIGluZm9cbiAgICAgICAgICAgIC8vIChjb21wYXRpYmxlIHcvc3RydWN0dXJlZCBjbG9uaW5nLCBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBhIHdvcmtlcilcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGV4Lm5hbWUsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRleC53aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRleC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgc3ByaXRlczogdGV4LnNwcml0ZXMsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRzOiB0ZXgudGV4Y29vcmRzLFxuICAgICAgICAgICAgICAgIHNpemVzOiB0ZXguc2l6ZXMsXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiB0ZXguZmlsdGVyaW5nLFxuICAgICAgICAgICAgICAgIHBvd2VyX29mXzI6IHRleC5wb3dlcl9vZl8yLFxuICAgICAgICAgICAgICAgIHZhbGlkOiB0ZXgudmFsaWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gTm8gdGV4dHVyZSBmb3VuZFxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbn07XG5cbi8vIFN5bmMgdGV4dHVyZSBpbmZvIHRvIHdvcmtlclxuLy8gQ2FsbGVkIGZyb20gd29ya2VyLCBnZXRzIGluZm8gb24gb25lIG9yIG1vcmUgdGV4dHVyZXMgaW5mbyBmcm9tIG1haW4gdGhyZWFkIHZpYSByZW1vdGUgY2FsbCwgdGhlbiBzdG9yZXMgaXRcbi8vIGxvY2FsbHkgaW4gd29ya2VyLiAndGV4dHVyZXMnIGNhbiBiZSBhbiBhcnJheSBvZiB0ZXh0dXJlIG5hbWVzIHRvIHN5bmMsIG9yIGlmIG51bGwsIGFsbCB0ZXh0dXJlcyBhcmUgc3luY2VkLlxuVGV4dHVyZS5zeW5jVGV4dHVyZXNUb1dvcmtlciA9IGZ1bmN0aW9uIChuYW1lcykge1xuICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ1RleHR1cmUuZ2V0SW5mbycsIG5hbWVzKS5cbiAgICAgICAgdGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICB0ZXh0dXJlcy5mb3JFYWNoKHRleCA9PiB7XG4gICAgICAgICAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1t0ZXgubmFtZV0gPSB0ZXg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnRleHR1cmVzO1xuICAgICAgICB9KTtcbn07XG5cbi8vIFJlcG9ydCBtYXggdGV4dHVyZSBzaXplIGZvciBhIEdMIGNvbnRleHRcblRleHR1cmUuZ2V0TWF4VGV4dHVyZVNpemUgPSBmdW5jdGlvbiAoZ2wpIHtcbiAgICByZXR1cm4gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX1NJWkUpO1xufTtcblxuLy8gR2xvYmFsIHNldCBvZiB0ZXh0dXJlcywgYnkgbmFtZVxuVGV4dHVyZS50ZXh0dXJlcyA9IHt9O1xuVGV4dHVyZS50ZXh0dXJlX2NvbmZpZ3MgPSB7fTtcblRleHR1cmUuYm91bmRUZXh0dXJlID0gbnVsbDtcblRleHR1cmUuYWN0aXZlVW5pdCA9IG51bGw7XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ1RleHR1cmUnLCBUZXh0dXJlKTtcbnN1YnNjcmliZU1peGluKFRleHR1cmUpO1xuIiwiLy8gQ3JlYXRlcyBhIFZlcnRleCBBcnJheSBPYmplY3QgaWYgdGhlIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUsIG9yIGZhbGxzIGJhY2sgb24gc3RhbmRhcmQgYXR0cmlidXRlIGNhbGxzXG5cbmltcG9ydCBnZXRFeHRlbnNpb24gZnJvbSAnLi9leHRlbnNpb25zJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuZXhwb3J0IGRlZmF1bHQge1xuXG4gICAgZGlzYWJsZWQ6IGZhbHNlLCAvLyBzZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIFZBT3MgZXZlbiBpZiBleHRlbnNpb24gaXMgYXZhaWxhYmxlXG4gICAgYm91bmRfdmFvOiBbXSwgICAvLyBjdXJyZW50bHkgYm91bmQgVkFPLCBieSBHTCBjb250ZXh0XG5cbiAgICBpbml0IChnbCkge1xuICAgICAgICBsZXQgZXh0O1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgZXh0ID0gZ2V0RXh0ZW5zaW9uKGdsLCAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nKCdpbmZvJywgJ1ZlcnRleCBBcnJheSBPYmplY3QgZXh0ZW5zaW9uIGF2YWlsYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZGlzYWJsZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGxvZygnd2FybicsICdWZXJ0ZXggQXJyYXkgT2JqZWN0IGV4dGVuc2lvbiBOT1QgYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCAnVmVydGV4IEFycmF5IE9iamVjdCBleHRlbnNpb24gZm9yY2UgZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjcmVhdGUgKGdsLCBzZXR1cCwgdGVhcmRvd24pIHtcbiAgICAgICAgbGV0IHZhbyA9IHt9O1xuICAgICAgICB2YW8uc2V0dXAgPSBzZXR1cDtcbiAgICAgICAgdmFvLnRlYXJkb3duID0gdGVhcmRvd247XG5cbiAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbihnbCwgJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG4gICAgICAgIGlmIChleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFvLl92YW8gPSBleHQuY3JlYXRlVmVydGV4QXJyYXlPRVMoKTtcbiAgICAgICAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVModmFvLl92YW8pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFvLnNldHVwKHRydWUpO1xuXG4gICAgICAgIHJldHVybiB2YW87XG4gICAgfSxcblxuICAgIGdldEN1cnJlbnRCaW5kaW5nIChnbCkge1xuICAgICAgICBsZXQgYm91bmQgPSB0aGlzLmJvdW5kX3Zhby5maWx0ZXIoZSA9PiBlWzBdID09PSBnbClbMF07XG4gICAgICAgIHJldHVybiBib3VuZCAmJiBib3VuZFsxXTtcbiAgICB9LFxuXG4gICAgc2V0Q3VycmVudEJpbmRpbmcgKGdsLCB2YW8pIHtcbiAgICAgICAgbGV0IGJvdW5kX3ZhbyA9IHRoaXMuYm91bmRfdmFvO1xuICAgICAgICBsZXQgYmluZGluZyA9IGJvdW5kX3Zhby5maWx0ZXIoZSA9PiBlWzBdID09PSBnbClbMF07XG4gICAgICAgIGlmIChiaW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIGJvdW5kX3Zhby5wdXNoKFtnbCwgdmFvXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBiaW5kaW5nWzFdID0gdmFvO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGJpbmQgKGdsLCB2YW8pIHtcbiAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbihnbCwgJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG4gICAgICAgIGlmICh2YW8gIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGV4dCAhPSBudWxsICYmIHZhby5fdmFvICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBleHQuYmluZFZlcnRleEFycmF5T0VTKHZhby5fdmFvKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnJlbnRCaW5kaW5nKGdsLCB2YW8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFvLnNldHVwKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBib3VuZF92YW8gPSB0aGlzLmdldEN1cnJlbnRCaW5kaW5nKGdsKTtcbiAgICAgICAgICAgIGlmIChleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVMobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChib3VuZF92YW8gIT0gbnVsbCAmJiB0eXBlb2YgYm91bmRfdmFvLnRlYXJkb3duID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgYm91bmRfdmFvLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldEN1cnJlbnRCaW5kaW5nKGdsLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkZXN0cm95IChnbCwgdmFvKSB7XG4gICAgICAgIGxldCBleHQgPSBnZXRFeHRlbnNpb24oZ2wsICdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuICAgICAgICBpZiAoZXh0ICE9IG51bGwgJiYgdmFvICE9IG51bGwgJiYgdmFvLl92YW8gIT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0LmRlbGV0ZVZlcnRleEFycmF5T0VTKHZhby5fdmFvKTtcbiAgICAgICAgICAgIHZhby5fdmFvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBkZXN0cm95IGlzIGEgbm8tb3AgaWYgVkFPIGV4dGVuc2lvbiBpc24ndCBhdmFpbGFibGVcbiAgICB9XG5cbn07XG4iLCIvLyBNYW5hZ2UgcmVuZGVyaW5nIGZvciBwcmltaXRpdmVzXG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWZXJ0ZXhBcnJheU9iamVjdCBmcm9tICcuL3Zhbyc7XG5cbi8vIEEgc2luZ2xlIG1lc2gvVkJPLCBkZXNjcmliZWQgYnkgYSB2ZXJ0ZXggbGF5b3V0LCB0aGF0IGNhbiBiZSBkcmF3biB3aXRoIG9uZSBvciBtb3JlIHByb2dyYW1zXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWQk9NZXNoICB7XG5cbiAgICBjb25zdHJ1Y3RvcihnbCwgdmVydGV4X2RhdGEsIGVsZW1lbnRfZGF0YSwgdmVydGV4X2xheW91dCwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMudmVydGV4X2RhdGEgPSB2ZXJ0ZXhfZGF0YTsgLy8gdHlwZWQgYXJyYXlcbiAgICAgICAgdGhpcy5lbGVtZW50X2RhdGEgPSBlbGVtZW50X2RhdGE7IC8vIHR5cGVkIGFycmF5XG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IHZlcnRleF9sYXlvdXQ7XG4gICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuZHJhd19tb2RlID0gb3B0aW9ucy5kcmF3X21vZGUgfHwgdGhpcy5nbC5UUklBTkdMRVM7XG4gICAgICAgIHRoaXMuZGF0YV91c2FnZSA9IG9wdGlvbnMuZGF0YV91c2FnZSB8fCB0aGlzLmdsLlNUQVRJQ19EUkFXO1xuICAgICAgICB0aGlzLnZlcnRpY2VzX3Blcl9nZW9tZXRyeSA9IDM7IC8vIFRPRE86IHN1cHBvcnQgbGluZXMsIHN0cmlwLCBmYW4sIGV0Yy5cbiAgICAgICAgdGhpcy51bmlmb3JtcyA9IG9wdGlvbnMudW5pZm9ybXM7XG4gICAgICAgIHRoaXMucmV0YWluID0gb3B0aW9ucy5yZXRhaW4gfHwgZmFsc2U7IC8vIHdoZXRoZXIgdG8gcmV0YWluIG1lc2ggZGF0YSBpbiBDUFUgYWZ0ZXIgdXBsb2FkaW5nIHRvIEdQVVxuICAgICAgICB0aGlzLmNyZWF0ZWRfYXQgPSArbmV3IERhdGUoKTtcbiAgICAgICAgdGhpcy5mYWRlX2luX3RpbWUgPSBvcHRpb25zLmZhZGVfaW5fdGltZSB8fCAwOyAvLyBvcHRpb25hbCB0aW1lIHRvIGZhZGUgaW4gbWVzaFxuXG4gICAgICAgIHRoaXMudmVydGV4X2NvdW50ID0gdGhpcy52ZXJ0ZXhfZGF0YS5ieXRlTGVuZ3RoIC8gdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZTtcbiAgICAgICAgdGhpcy52YW9zID0ge307IC8vIG1hcCBvZiBWZXJ0ZXhBcnJheU9iamVjdHMsIGtleWVkIGJ5IHByb2dyYW1cblxuICAgICAgICB0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5ID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRfZGF0YSl7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudF9jb3VudCA9IHRoaXMuZWxlbWVudF9kYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZ2VvbWV0cnlfY291bnQgPSB0aGlzLmVsZW1lbnRfY291bnQgLyB0aGlzLnZlcnRpY2VzX3Blcl9nZW9tZXRyeTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudF90eXBlID0gKHRoaXMuZWxlbWVudF9kYXRhLmNvbnN0cnVjdG9yID09PSBVaW50MTZBcnJheSkgPyB0aGlzLmdsLlVOU0lHTkVEX1NIT1JUOiB0aGlzLmdsLlVOU0lHTkVEX0lOVDtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudF9idWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuZWxlbWVudF9idWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuZWxlbWVudF9kYXRhLCB0aGlzLmRhdGFfdXNhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZW9tZXRyeV9jb3VudCA9IHRoaXMudmVydGV4X2NvdW50IC8gdGhpcy52ZXJ0aWNlc19wZXJfZ2VvbWV0cnk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMudmVydGV4X2J1ZmZlcik7XG4gICAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0ZXhfZGF0YSwgdGhpcy5kYXRhX3VzYWdlKTtcblxuICAgICAgICBpZiAoIXRoaXMucmV0YWluKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy52ZXJ0ZXhfZGF0YTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmVsZW1lbnRfZGF0YTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIsIGJ5IGRlZmF1bHQgd2l0aCBjdXJyZW50bHkgYm91bmQgcHJvZ3JhbSwgb3Igb3RoZXJ3aXNlIHdpdGggb3B0aW9uYWxseSBwcm92aWRlZCBvbmVcbiAgICAvLyBSZXR1cm5zIHRydWUgaWYgbWVzaCByZXF1ZXN0cyBhIHJlbmRlciBvbiBuZXh0IGZyYW1lIChlLmcuIGZvciBmYWRlIGFuaW1hdGlvbnMpXG4gICAgcmVuZGVyKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtIHx8IFNoYWRlclByb2dyYW0uY3VycmVudDtcbiAgICAgICAgcHJvZ3JhbS51c2UoKTtcblxuICAgICAgICBpZiAodGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgcHJvZ3JhbS5zYXZlVW5pZm9ybXModGhpcy51bmlmb3Jtcyk7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1zKHRoaXMudW5pZm9ybXMsIGZhbHNlKTsgLy8gZG9uJ3QgcmVzZXQgdGV4dHVyZSB1bml0XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmlzaWJsZV90aW1lID0gKCtuZXcgRGF0ZSgpIC0gdGhpcy5jcmVhdGVkX2F0KSAvIDEwMDA7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV92aXNpYmxlX3RpbWUnLCB2aXNpYmxlX3RpbWUpO1xuXG4gICAgICAgIHRoaXMuYmluZChwcm9ncmFtKTtcblxuICAgICAgICBpZiAodGhpcy50b2dnbGVfZWxlbWVudF9hcnJheSl7XG4gICAgICAgICAgICB0aGlzLmdsLmRyYXdFbGVtZW50cyh0aGlzLmRyYXdfbW9kZSwgdGhpcy5lbGVtZW50X2NvdW50LCB0aGlzLmVsZW1lbnRfdHlwZSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdsLmRyYXdBcnJheXModGhpcy5kcmF3X21vZGUsIDAsIHRoaXMudmVydGV4X2NvdW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmJpbmQodGhpcy5nbCwgbnVsbCk7XG5cbiAgICAgICAgaWYgKHRoaXMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHByb2dyYW0ucmVzdG9yZVVuaWZvcm1zKHRoaXMudW5pZm9ybXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVxdWVzdCBuZXh0IHJlbmRlciBpZiBtZXNoIGlzIGZhZGluZyBpblxuICAgICAgICByZXR1cm4gKHZpc2libGVfdGltZSA8IHRoaXMuZmFkZV9pbl90aW1lKTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIGJ1ZmZlcnMgYW5kIHZlcnRleCBhdHRyaWJ1dGVzIHRvIHByZXBhcmUgZm9yIHJlbmRlcmluZ1xuICAgIGJpbmQocHJvZ3JhbSkge1xuICAgICAgICAvLyBCaW5kIFZBTyBmb3IgdGhpcyBwcm9nYW0sIG9yIGNyZWF0ZSBvbmVcbiAgICAgICAgbGV0IHZhbyA9IHRoaXMudmFvc1twcm9ncmFtLmlkXTtcbiAgICAgICAgaWYgKHZhbykge1xuICAgICAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuYmluZCh0aGlzLmdsLCB2YW8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YW9zW3Byb2dyYW0uaWRdID0gVmVydGV4QXJyYXlPYmplY3QuY3JlYXRlKHRoaXMuZ2wsIChmb3JjZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50b2dnbGVfZWxlbWVudF9hcnJheSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudmVydGV4X2xheW91dC5lbmFibGUodGhpcy5nbCwgcHJvZ3JhbSwgZm9yY2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgdiBpbiB0aGlzLnZhb3MpIHtcbiAgICAgICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmRlc3Ryb3kodGhpcy5nbCwgdGhpcy52YW9zW3ZdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZygndHJhY2UnLCAnVkJPTWVzaC5kZXN0cm95OiBkZWxldGUgYnVmZmVyJyArICh0aGlzLnZlcnRleF9kYXRhID8gYCBvZiBzaXplICR7dGhpcy52ZXJ0ZXhfZGF0YS5ieXRlTGVuZ3RofWAgOiAnJykpO1xuXG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlQnVmZmVyKHRoaXMudmVydGV4X2J1ZmZlcik7XG4gICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudF9idWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZGVsZXRlQnVmZmVyKHRoaXMuZWxlbWVudF9idWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2J1ZmZlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy52ZXJ0ZXhfZGF0YTtcbiAgICAgICAgZGVsZXRlIHRoaXMuZWxlbWVudF9kYXRhO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IGdsIGZyb20gJy4vY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBWZXJ0ZXhFbGVtZW50cyBmcm9tICcuL3ZlcnRleF9lbGVtZW50cyc7XG5cbi8vIE1hcHMgR0wgdHlwZXMgdG8gSlMgYXJyYXkgdHlwZXNcbmxldCBhcnJheV90eXBlcyA9IHtcbiAgICBbZ2wuRkxPQVRdOiBGbG9hdDMyQXJyYXksXG4gICAgW2dsLkJZVEVdOiBJbnQ4QXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX0JZVEVdOiBVaW50OEFycmF5LFxuICAgIFtnbC5JTlRdOiBJbnQzMkFycmF5LFxuICAgIFtnbC5VTlNJR05FRF9JTlRdOiBVaW50MzJBcnJheSxcbiAgICBbZ2wuU0hPUlRdOiBJbnQxNkFycmF5LFxuICAgIFtnbC5VTlNJR05FRF9TSE9SVF06IFVpbnQxNkFycmF5XG59O1xuXG4vLyBBbiBpbnRlcm1lZGlhcnkgb2JqZWN0IHRoYXQgaG9sZHMgdmVydGV4IGRhdGEgaW4gdHlwZWQgYXJyYXlzLCBhY2NvcmRpbmcgdG8gYSBnaXZlbiB2ZXJ0ZXggbGF5b3V0XG4vLyBVc2VkIHRvIGNvbnN0cnVjdCBhIG1lc2gvVkJPIGZvciByZW5kZXJpbmdcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlcnRleERhdGEge1xuXG4gICAgY29uc3RydWN0b3IgKHZlcnRleF9sYXlvdXQsIHsgcHJlYWxsb2MgPSA1MDAgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IHZlcnRleF9sYXlvdXQ7XG4gICAgICAgIHRoaXMudmVydGV4X2VsZW1lbnRzID0gbmV3IFZlcnRleEVsZW1lbnRzKCk7XG5cbiAgICAgICAgaWYgKFZlcnRleERhdGEuYXJyYXlfcG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSBWZXJ0ZXhEYXRhLmFycmF5X3Bvb2wucG9wKCk7XG4gICAgICAgICAgICB0aGlzLmJ5dGVfbGVuZ3RoID0gdGhpcy52ZXJ0ZXhfYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnNpemUgPSBNYXRoLmZsb29yKHRoaXMuYnl0ZV9sZW5ndGggLyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlKTtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgVmVydGV4RGF0YTogcmV1c2VkIGJ1ZmZlciBvZiBieXRlcyAke3RoaXMuYnl0ZV9sZW5ndGh9LCAke3RoaXMuc2l6ZX0gdmVydGljZXNgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IHByZWFsbG9jOyAvLyAjIG9mIHZlcnRpY2VzIHRvIGFsbG9jYXRlXG4gICAgICAgICAgICB0aGlzLmJ5dGVfbGVuZ3RoID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZSAqIHRoaXMuc2l6ZTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRoaXMuYnl0ZV9sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDsgICAgICAgICAgICAgLy8gYnl0ZSBvZmZzZXQgaW50byBjdXJyZW50bHkgYWxsb2NhdGVkIGJ1ZmZlclxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBjPTA7IGMgPCB0aGlzLnZlcnRleF9sYXlvdXQuY29tcG9uZW50cy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goWy4uLnRoaXMudmVydGV4X2xheW91dC5jb21wb25lbnRzW2NdXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52ZXJ0ZXhfY291bnQgPSAwO1xuICAgICAgICB0aGlzLnJlYWxsb2NfY291bnQgPSAwO1xuICAgICAgICB0aGlzLnNldEJ1ZmZlclZpZXdzKCk7XG4gICAgfVxuXG4gICAgLy8gKFJlLSlhbGxvY2F0ZSB0eXBlZCB2aWV3cyBpbnRvIHRoZSBtYWluIGJ1ZmZlciAtIG9ubHkgY3JlYXRlIHRoZSB0eXBlcyB3ZSBuZWVkIGZvciB0aGlzIGxheW91dFxuICAgIHNldEJ1ZmZlclZpZXdzICgpIHtcbiAgICAgICAgdGhpcy52aWV3cyA9IHt9O1xuICAgICAgICB0aGlzLnZpZXdzW2dsLlVOU0lHTkVEX0JZVEVdID0gdGhpcy52ZXJ0ZXhfYnVmZmVyO1xuICAgICAgICBmb3IgKGxldCBhPTA7IGEgPCB0aGlzLnZlcnRleF9sYXlvdXQuYXR0cmlicy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgY29uc3QgYXR0cmliID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LmF0dHJpYnNbYV07XG5cbiAgICAgICAgICAgIC8vIE5lZWQgdmlldyBmb3IgdGhpcyB0eXBlP1xuICAgICAgICAgICAgaWYgKHRoaXMudmlld3NbYXR0cmliLnR5cGVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyYXlfdHlwZSA9IGFycmF5X3R5cGVzW2F0dHJpYi50eXBlXTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW2F0dHJpYi50eXBlXSA9IG5ldyBhcnJheV90eXBlKHRoaXMudmVydGV4X2J1ZmZlci5idWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCBidWZmZXIgcG9pbnRlcnNcbiAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgdGhpcy5jb21wb25lbnRzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNbY107XG4gICAgICAgICAgICBjb21wb25lbnRbMV0gPSB0aGlzLnZpZXdzW2NvbXBvbmVudFswXV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbGxvY2F0ZWQgYnVmZmVyIHNpemUsIGV4cGFuZC9yZWFsbG9jIGJ1ZmZlciBpZiBuZWVkZWRcbiAgICBjaGVja0J1ZmZlclNpemUgKCkge1xuICAgICAgICBpZiAoKHRoaXMub2Zmc2V0ICsgdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZSkgPiB0aGlzLmJ5dGVfbGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNpemUgPSBNYXRoLmZsb29yKHRoaXMuc2l6ZSAqIDEuNSk7XG4gICAgICAgICAgICB0aGlzLnNpemUgLT0gdGhpcy5zaXplICUgNDtcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlICogdGhpcy5zaXplO1xuICAgICAgICAgICAgdmFyIG5ld192aWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ieXRlX2xlbmd0aCk7XG4gICAgICAgICAgICBuZXdfdmlldy5zZXQodGhpcy52ZXJ0ZXhfYnVmZmVyKTsgLy8gY29weSBleGlzdGluZyBkYXRhIHRvIG5ldyBidWZmZXJcbiAgICAgICAgICAgIFZlcnRleERhdGEuYXJyYXlfcG9vbC5wdXNoKHRoaXMudmVydGV4X2J1ZmZlcik7IC8vIHNhdmUgcHJldmlvdXMgYnVmZmVyIGZvciB1c2UgYnkgbmV4dCB0aWxlXG4gICAgICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSBuZXdfdmlldztcbiAgICAgICAgICAgIHRoaXMuc2V0QnVmZmVyVmlld3MoKTtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvY19jb3VudCsrO1xuICAgICAgICAgICAgLy8gbG9nKCdpbmZvJywgYFZlcnRleERhdGE6IGV4cGFuZGVkIHZlcnRleCBibG9jayB0byAke3RoaXMuc2l6ZX0gdmVydGljZXNgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBhIHZlcnRleCwgY29waWVkIGZyb20gYSBwbGFpbiBKUyBhcnJheSBvZiBlbGVtZW50cyBtYXRjaGluZyB0aGUgb3JkZXIgb2YgdGhlIHZlcnRleCBsYXlvdXQuXG4gICAgLy8gTm90ZTogdXNlcyBwcmUtY2FsY3VsYXRlZCBpbmZvIGFib3V0IGVhY2ggYXR0cmlidXRlLCBpbmNsdWRpbmcgcG9pbnRlciB0byBhcHByb3ByaWF0ZSB0eXBlZCBhcnJheVxuICAgIC8vIHZpZXcgYW5kIG9mZnNldCBpbnRvIGl0LiBUaGlzIHdhcyB0aGUgZmFzdGVzdCBtZXRob2QgcHJvZmlsZWQgc28gZmFyIGZvciBmaWxsaW5nIGEgbWl4ZWQtdHlwZVxuICAgIC8vIHZlcnRleCBsYXlvdXQgKHRob3VnaCBzdGlsbCBzbG93ZXIgdGhhbiB0aGUgcHJldmlvdXMgbWV0aG9kIHRoYXQgb25seSBzdXBwb3J0ZWQgRmxvYXQzMkFycmF5IGF0dHJpYnV0ZXMpLlxuICAgIGFkZFZlcnRleCAodmVydGV4KSB7XG4gICAgICAgIHRoaXMuY2hlY2tCdWZmZXJTaXplKCk7XG4gICAgICAgIHZhciBpPTA7XG5cbiAgICAgICAgdmFyIGNsZW4gPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBjPTA7IGMgPCBjbGVuOyBjKyspIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNbY107XG4gICAgICAgICAgICBjb21wb25lbnRbMV1bKHRoaXMub2Zmc2V0ID4+IGNvbXBvbmVudFsyXSkgKyBjb21wb25lbnRbM11dID0gdmVydGV4W2krK107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9mZnNldCArPSB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlO1xuICAgICAgICB0aGlzLnZlcnRleF9jb3VudCsrO1xuICAgIH1cblxuICAgIC8vIEZpbmFsaXplIHZlcnRleCBidWZmZXIgZm9yIHVzZSBpbiBjb25zdHJ1Y3RpbmcgYSBtZXNoXG4gICAgZW5kICgpIHtcbiAgICAgICAgLy8gQ2xpcCB0aGUgYnVmZmVyIHRvIHNpemUgdXNlZCBmb3IgdGhpcyBWQk9cbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gdGhpcy52ZXJ0ZXhfYnVmZmVyLnN1YmFycmF5KDAsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5lbGVtZW50X2J1ZmZlciA9IHRoaXMudmVydGV4X2VsZW1lbnRzLmVuZCgpO1xuXG4gICAgICAgIGxvZygndHJhY2UnLCBgVmVydGV4RGF0YTogJHt0aGlzLnNpemV9IHZlcnRpY2VzIHRvdGFsLCByZWFsbG9jIGNvdW50ICR7dGhpcy5yZWFsbG9jX2NvdW50fWApO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxufVxuXG5WZXJ0ZXhEYXRhLmFycmF5X3Bvb2wgPSBbXTsgLy8gcG9vbCBvZiBjdXJyZW50bHkgYXZhaWxhYmxlIChwcmV2aW91c2x5IHVzZWQpIGJ1ZmZlcnMgKHVpbnQ4KVxuIiwiaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuLi91dGlscy93b3JrZXJfYnJva2VyJztcblxubGV0IE1BWF9WQUxVRSA9IE1hdGgucG93KDIsIDE2KSAtIDE7XG5sZXQgVWludDMyX2ZsYWcgPSBmYWxzZTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4RWxlbWVudHMge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5hcnJheSA9IFtdO1xuICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSBmYWxzZTtcbiAgICB9XG4gICAgcHVzaCAodmFsdWUpIHtcbiAgICAgICAgLy8gSWYgdmFsdWVzIGhhdmUgb3ZlcmZsb3duIGFuZCBubyBVaW50MzIgb3B0aW9uIGlzIGF2YWlsYWJsZSwgZG8gbm90IHB1c2ggdmFsdWVzXG4gICAgICAgIGlmICh0aGlzLmhhc19vdmVyZmxvd24gJiYgIVVpbnQzMl9mbGFnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIG92ZXJmbG93IGlmIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBVaW50MTYgbWF4XG4gICAgICAgIGlmICh2YWx1ZSA+IE1BWF9WQUxVRSkge1xuICAgICAgICAgICAgdGhpcy5oYXNfb3ZlcmZsb3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghVWludDMyX2ZsYWcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFycmF5LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbmQgKCkge1xuICAgICAgICBpZiAodGhpcy5hcnJheS5sZW5ndGgpe1xuICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlcih0aGlzLmFycmF5LCB0aGlzLmhhc19vdmVyZmxvd24pO1xuICAgICAgICAgICAgdGhpcy5hcnJheSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5oYXNfb3ZlcmZsb3duID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5WZXJ0ZXhFbGVtZW50cy5zZXRVaW50MzJGbGFnID0gZnVuY3Rpb24oZmxhZykge1xuICAgIFVpbnQzMl9mbGFnID0gZmxhZztcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlcihhcnJheSwgb3ZlcmZsb3duKSB7XG4gICAgdmFyIHR5cGVkQXJyYXkgPSAob3ZlcmZsb3duICYmIFVpbnQzMl9mbGFnKSA/IFVpbnQzMkFycmF5IDogVWludDE2QXJyYXk7XG4gICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5KGFycmF5KTtcbn1cblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnVmVydGV4RWxlbWVudHMnLCBWZXJ0ZXhFbGVtZW50cyk7XG4iLCJpbXBvcnQgZ2wgZnJvbSAnLi9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IFZlcnRleERhdGEgZnJvbSAnLi92ZXJ0ZXhfZGF0YSc7XG5cbi8vIERlc2NyaWJlcyBhIHZlcnRleCBsYXlvdXQgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIG1hbnkgZGlmZmVyZW50IEdMIHByb2dyYW1zLlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4TGF5b3V0IHtcbiAgICAvLyBBdHRyaWJzIGFyZSBhbiBhcnJheSwgaW4gbGF5b3V0IG9yZGVyLCBvZjogbmFtZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZFxuICAgIC8vIGV4OiB7IG5hbWU6ICdwb3NpdGlvbicsIHNpemU6IDMsIHR5cGU6IGdsLkZMT0FULCBub3JtYWxpemVkOiBmYWxzZSB9XG4gICAgY29uc3RydWN0b3IgKGF0dHJpYnMpIHtcbiAgICAgICAgdGhpcy5hdHRyaWJzID0gYXR0cmliczsgLy8gYXJyYXkgb2YgYXR0cmlidXRlcywgc3BlY2lmaWVkIGFzIHN0YW5kYXJkIEdMIGF0dHJpYiBvcHRpb25zXG4gICAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdOyAgIC8vIGxpc3Qgb2YgdHlwZSBhbmQgb2Zmc2V0IGluZm8gYWJvdXQgZWFjaCBhdHRyaWJ1dGUgY29tcG9uZW50XG4gICAgICAgIHRoaXMuaW5kZXggPSB7fTsgICAgICAgIC8vIGxpbmVhciBidWZmZXIgaW5kZXggb2YgZWFjaCBhdHRyaWJ1dGUgY29tcG9uZW50LCBlLmcuIHRoaXMuaW5kZXgucG9zaXRpb24ueFxuXG4gICAgICAgIC8vIENhbGMgdmVydGV4IHN0cmlkZVxuICAgICAgICB0aGlzLnN0cmlkZSA9IDA7XG5cbiAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgZm9yIChsZXQgYT0wOyBhIDwgdGhpcy5hdHRyaWJzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBsZXQgYXR0cmliID0gdGhpcy5hdHRyaWJzW2FdO1xuICAgICAgICAgICAgYXR0cmliLm9mZnNldCA9IHRoaXMuc3RyaWRlO1xuICAgICAgICAgICAgYXR0cmliLmJ5dGVfc2l6ZSA9IGF0dHJpYi5zaXplO1xuICAgICAgICAgICAgdmFyIHNoaWZ0ID0gMDtcblxuICAgICAgICAgICAgc3dpdGNoIChhdHRyaWIudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgZ2wuRkxPQVQ6XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5JTlQ6XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5VTlNJR05FRF9JTlQ6XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYi5ieXRlX3NpemUgKj0gNDtcbiAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGdsLlNIT1JUOlxuICAgICAgICAgICAgICAgIGNhc2UgZ2wuVU5TSUdORURfU0hPUlQ6XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYi5ieXRlX3NpemUgKj0gMjtcbiAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yY2UgNC1ieXRlIGFsaWdubWVudCBvbiBhdHRyaWJ1dGVzXG4gICAgICAgICAgICB0aGlzLnN0cmlkZSArPSBhdHRyaWIuYnl0ZV9zaXplO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RyaWRlICYgMykgeyAvLyBwYWQgdG8gbXVsdGlwbGUgb2YgNCBieXRlc1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyaWRlICs9IDQgLSAodGhpcy5zdHJpZGUgJiAzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIGluZm8gdG8gbGlzdCBvZiBhdHRyaWJ1dGUgY29tcG9uZW50c1xuICAgICAgICAgICAgLy8gVXNlZCB0byBidWlsZCB0aGUgdmVydGV4IGRhdGEsIHByb3ZpZGVzIHBvaW50ZXJzIGFuZCBvZmZzZXRzIGludG8gZWFjaCB0eXBlZCBhcnJheSB2aWV3XG4gICAgICAgICAgICAvLyBFYWNoIGNvbXBvbmVudCBpcyBhbiBhcnJheSBvZjpcbiAgICAgICAgICAgIC8vIFtHTCBhdHRyaWIgdHlwZSwgcG9pbnRlciB0byB0eXBlZCBhcnJheSB2aWV3LCBiaXRzIHRvIHNoaWZ0IHJpZ2h0IHRvIGRldGVybWluZSBidWZmZXIgb2Zmc2V0LCBhZGRpdGlvbmFsIGJ1ZmZlciBvZmZzZXQgZm9yIHRoZSBjb21wb25lbnRdXG4gICAgICAgICAgICB2YXIgb2Zmc2V0X3R5cGVkID0gYXR0cmliLm9mZnNldCA+PiBzaGlmdDtcbiAgICAgICAgICAgIGlmIChhdHRyaWIuc2l6ZSA+IDEpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBhdHRyaWIuc2l6ZTsgcysrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKFthdHRyaWIudHlwZSwgbnVsbCwgc2hpZnQsIG9mZnNldF90eXBlZCsrXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goW2F0dHJpYi50eXBlLCBudWxsLCBzaGlmdCwgb2Zmc2V0X3R5cGVkXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByb3ZpZGUgYW4gaW5kZXggaW50byB0aGUgdmVydGV4IGRhdGEgYnVmZmVyIGZvciBlYWNoIGF0dHJpYnV0ZSBjb21wb25lbnRcbiAgICAgICAgICAgIHRoaXMuaW5kZXhbYXR0cmliLm5hbWVdID0gY291bnQ7XG4gICAgICAgICAgICBjb3VudCArPSBhdHRyaWIuc2l6ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldHVwIGEgdmVydGV4IGxheW91dCBmb3IgYSBzcGVjaWZpYyBHTCBwcm9ncmFtXG4gICAgLy8gQXNzdW1lcyB0aGF0IHRoZSBkZXNpcmVkIHZlcnRleCBidWZmZXIgKFZCTykgaXMgYWxyZWFkeSBib3VuZFxuICAgIC8vIElmIGEgZ2l2ZW4gcHJvZ3JhbSBkb2Vzbid0IGluY2x1ZGUgYWxsIGF0dHJpYnV0ZXMsIGl0IGNhbiBzdGlsbCB1c2UgdGhlIHZlcnRleCBsYXlvdXRcbiAgICAvLyB0byByZWFkIHRob3NlIGF0dHJpYnMgdGhhdCBpdCBkb2VzIHJlY29nbml6ZSwgdXNpbmcgdGhlIGF0dHJpYiBvZmZzZXRzIHRvIHNraXAgb3RoZXJzLlxuICAgIGVuYWJsZSAoZ2wsIHByb2dyYW0sIGZvcmNlKVxuICAgIHtcbiAgICAgICAgdmFyIGF0dHJpYiwgbG9jYXRpb247XG5cbiAgICAgICAgLy8gRW5hYmxlIGFsbCBhdHRyaWJ1dGVzIGZvciB0aGlzIGxheW91dFxuICAgICAgICBmb3IgKHZhciBhPTA7IGEgPCB0aGlzLmF0dHJpYnMubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgIGF0dHJpYiA9IHRoaXMuYXR0cmlic1thXTtcbiAgICAgICAgICAgIGxvY2F0aW9uID0gcHJvZ3JhbS5hdHRyaWJ1dGUoYXR0cmliLm5hbWUpLmxvY2F0aW9uO1xuXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzW2xvY2F0aW9uXSB8fCBmb3JjZSkge1xuICAgICAgICAgICAgICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIobG9jYXRpb24sIGF0dHJpYi5zaXplLCBhdHRyaWIudHlwZSwgYXR0cmliLm5vcm1hbGl6ZWQsIHRoaXMuc3RyaWRlLCBhdHRyaWIub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzW2xvY2F0aW9uXSA9IHByb2dyYW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaXNhYmxlIGFueSBwcmV2aW91c2x5IGJvdW5kIGF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgZm9yIHRoaXMgbGF5b3V0XG4gICAgICAgIGZvciAobG9jYXRpb24gaW4gVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlicykge1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlVW51c2VkQXR0cmlidXRlKGdsLCBsb2NhdGlvbiwgcHJvZ3JhbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlIGFuIGF0dHJpYnV0ZSBpZiBpdCB3YXMgbm90IGVuYWJsZWQgZm9yIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbVxuICAgIC8vIE5PVEU6IHRoaXMgd2FzIG1vdmVkIG91dCBvZiB0aGUgaW5uZXIgbG9vcCBpbiBlbmFibGUoKSB0byBhc3Npc3Qgdy9WTSBvcHRpbWl6YXRpb25cbiAgICBkaXNhYmxlVW51c2VkQXR0cmlidXRlIChnbCwgbG9jYXRpb24sIHByb2dyYW0pIHtcbiAgICAgICAgaWYgKFZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dICE9PSBwcm9ncmFtKSB7XG4gICAgICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobG9jYXRpb24pO1xuICAgICAgICAgICAgZGVsZXRlIFZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlVmVydGV4RGF0YSAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmVydGV4RGF0YSh0aGlzKTtcbiAgICB9XG5cbn1cblxuLy8gVHJhY2sgY3VycmVudGx5IGVuYWJsZWQgYXR0cmlicywgYnkgdGhlIHByb2dyYW0gdGhleSBhcmUgYm91bmQgdG9cbi8vIFN0YXRpYyBjbGFzcyBwcm9wZXJ0eSB0byByZWZsZWN0IGdsb2JhbCBHTCBzdGF0ZVxuVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlicyA9IHt9O1xuIiwiaW1wb3J0IFJlcGVhdEdyb3VwIGZyb20gJy4vcmVwZWF0X2dyb3VwJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxudmFyIENvbGxpc2lvbjtcblxuZXhwb3J0IGRlZmF1bHQgQ29sbGlzaW9uID0ge1xuXG4gICAgdGlsZXM6IHt9LFxuXG4gICAgc3RhcnRUaWxlICh0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV0gPSB7XG4gICAgICAgICAgICBiYm94ZXM6IHsgICAgICAgICAgIC8vIGN1cnJlbnQgc2V0IG9mIHBsYWNlZCBib3VuZGluZyBib3hlc1xuICAgICAgICAgICAgICAgIGFhYmI6IFtdLFxuICAgICAgICAgICAgICAgIG9iYjogW11cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvYmplY3RzOiB7fSwgICAgICAgIC8vIG9iamVjdHMgdG8gY29sbGlkZSwgZ3JvdXBlZCBieSBwcmlvcml0eSwgdGhlbiBieSBzdHlsZVxuICAgICAgICAgICAga2VlcDoge30sICAgICAgICAgICAvLyBvYmplY3RzIHRoYXQgd2VyZSBrZXB0IGFmdGVyIGNvbGxpc2lvbiwgZ3JvdXBlZCBieSBzdHlsZVxuICAgICAgICAgICAgc3R5bGVzOiB7fSAgICAgICAgICAvLyBzdHlsZXMgY29udHJpYnV0aW5nIGNvbGxpc2lvbiBvYmplY3RzXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlZCB3aGVuIGFsbCByZWdpc3RlcmVkIHN0eWxlcyBoYXZlIGFkZGVkIG9iamVjdHNcbiAgICAgICAgc3RhdGUuY29tcGxldGUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHN0YXRlLnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlc2V0VGlsZSAodGlsZSkge1xuICAgICAgICBkZWxldGUgdGhpcy50aWxlc1t0aWxlXTtcbiAgICB9LFxuXG4gICAgLy8gQWRkIGEgc3R5bGUgdG8gdGhlIHBlbmRpbmcgc2V0LCBjb2xsaXNpb24gd2lsbCBibG9jayBvbiBhbGwgc3R5bGVzIHN1Ym1pdHRpbmcgdG8gY29sbGlzaW9uIHNldFxuICAgIGFkZFN0eWxlIChzdHlsZSwgdGlsZSkge1xuICAgICAgICB0aGlzLnRpbGVzW3RpbGVdLnN0eWxlc1tzdHlsZV0gPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgY29sbGlzaW9uIG9iamVjdHMgZm9yIGEgc3R5bGVcbiAgICBjb2xsaWRlIChvYmplY3RzLCBzdHlsZSwgdGlsZSkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0NvbGxpc2lvbi5jb2xsaWRlKCkgY2FsbGVkIHdpdGggbnVsbCB0aWxlJywgdGlsZSwgdGhpcy50aWxlcywgc3R5bGUsIG9iamVjdHMpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHcm91cCBieSBwcmlvcml0eSBhbmQgc3R5bGVcbiAgICAgICAgbGV0IHRpbGVfb2JqZWN0cyA9IHN0YXRlLm9iamVjdHM7XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvYmogPSBvYmplY3RzW2ldO1xuICAgICAgICAgICAgbGV0IHByaW9yaXR5ID0gb2JqLmxhYmVsLmxheW91dC5wcmlvcml0eTtcbiAgICAgICAgICAgIHRpbGVfb2JqZWN0c1twcmlvcml0eV0gPSB0aWxlX29iamVjdHNbcHJpb3JpdHldIHx8IHt9O1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XVtzdHlsZV0gPSB0aWxlX29iamVjdHNbcHJpb3JpdHldW3N0eWxlXSB8fCBbXTtcbiAgICAgICAgICAgIHRpbGVfb2JqZWN0c1twcmlvcml0eV1bc3R5bGVdLnB1c2gob2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIHBlbmRpbmcgc3R5bGUgc2V0LCBpZiBubyBtb3JlIHN0eWxlcywgZG8gY29sbGlzaW9uICYgZmluaXNoIHRpbGVcbiAgICAgICAgZGVsZXRlIHN0YXRlLnN0eWxlc1tzdHlsZV07XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbmRUaWxlKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FpdCBmb3Igb2JqZWN0cyB0byBiZSBhZGRlZCBmcm9tIGFsbCBzdHlsZXNcbiAgICAgICAgcmV0dXJuIHN0YXRlLmNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmtlZXBbc3R5bGVdIHx8IFtdO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gVGVzdCBsYWJlbHMgZm9yIGNvbGxpc2lvbnMsIGhpZ2hlciB0byBsb3dlciBwcmlvcml0eVxuICAgIC8vIFdoZW4gdHdvIGNvbGxpZGUsIGRpc2NhcmQgdGhlIGxvd2VyLXByaW9yaXR5IGxhYmVsXG4gICAgZW5kVGlsZSAodGlsZSkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgICAgICBsZXQga2VlcCA9IHN0YXRlLmtlZXA7XG5cbiAgICAgICAgUmVwZWF0R3JvdXAuY2xlYXIodGlsZSk7XG5cbiAgICAgICAgLy8gUHJvY2VzcyBsYWJlbHMgYnkgcHJpb3JpdHksIHRoZW4gYnkgc3R5bGVcbiAgICAgICAgbGV0IHByaW9yaXRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5vYmplY3RzKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGZvciAobGV0IHA9MDsgcCA8IHByaW9yaXRpZXMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgIGxldCBzdHlsZV9vYmplY3RzID0gc3RhdGUub2JqZWN0c1twcmlvcml0aWVzW3BdXTtcbiAgICAgICAgICAgIGlmICghc3R5bGVfb2JqZWN0cykgeyAvLyBubyBsYWJlbHMgYXQgdGhpcyBwcmlvcml0eSwgc2tpcCB0byBuZXh0XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIHN0eWxlXG4gICAgICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiBzdHlsZV9vYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9iamVjdHMgPSBzdHlsZV9vYmplY3RzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBrZWVwW3N0eWxlXSA9IGtlZXBbc3R5bGVdIHx8IFtdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3QgPSBvYmplY3RzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5CZVBsYWNlZChvYmplY3QsIHRpbGUsIG9iamVjdC5saW5rZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIG9iamVjdCBpZiBpdCBpc24ndCBkZXBlbmRlbnQgb24gYSBwYXJlbnQgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC5saW5rZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwW3N0eWxlXS5wdXNoKG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZShvYmplY3QsIHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb2JqZWN0IGlzIGRlcGVuZGVudCBvbiBhIHBhcmVudCwgb25seSBrZWVwIGlmIGJvdGggY2FuIGJlIHBsYWNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jYW5CZVBsYWNlZChvYmplY3QubGlua2VkLCB0aWxlLCBvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcFtzdHlsZV0ucHVzaChvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2Uob2JqZWN0LCB0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlKG9iamVjdC5saW5rZWQsIHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICB9LFxuXG4gICAgLy8gUnVuIGNvbGxpc2lvbiBhbmQgcmVwZWF0IGNoZWNrIHRvIHNlZSBpZiBsYWJlbCBjYW4gY3VycmVudGx5IGJlIHBsYWNlZFxuICAgIGNhbkJlUGxhY2VkIChvYmplY3QsIHRpbGUsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGxldCBsYWJlbCA9IG9iamVjdC5sYWJlbDtcbiAgICAgICAgbGV0IGxheW91dCA9IG9iamVjdC5sYWJlbC5sYXlvdXQ7XG5cbiAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IHByb2Nlc3NlZCAoZS5nLiBieSBwYXJlbnQgb2JqZWN0KVxuICAgICAgICBpZiAobGFiZWwucGxhY2VkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsYWJlbC5wbGFjZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUZXN0IHRoZSBsYWJlbCBmb3IgaW50ZXJzZWN0aW9ucyB3aXRoIG90aGVyIGxhYmVscyBpbiB0aGUgdGlsZVxuICAgICAgICBsZXQgYmJveGVzID0gdGhpcy50aWxlc1t0aWxlXS5iYm94ZXM7XG4gICAgICAgIGlmICghbGF5b3V0LmNvbGxpZGUgfHwgIWxhYmVsLmRpc2NhcmQoYmJveGVzLCBleGNsdWRlICYmIGV4Y2x1ZGUubGFiZWwpKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBmb3IgcmVwZWF0c1xuICAgICAgICAgICAgbGV0IHJlcGVhdCA9IFJlcGVhdEdyb3VwLmNoZWNrKGxhYmVsLCBsYXlvdXQsIHRpbGUpO1xuICAgICAgICAgICAgaWYgKHJlcGVhdCkge1xuICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCBgZGlzY2FyZCBsYWJlbCAnJHtsYWJlbC50ZXh0fScsIChvbmVfcGVyX2dyb3VwOiAke3JlcGVhdC5vbmVfcGVyX2dyb3VwfSksIGRpc3QgJHtNYXRoLnNxcnQocmVwZWF0LmRpc3Rfc3EpL2xheW91dC51bml0c19wZXJfcGl4ZWx9IDwgJHtNYXRoLnNxcnQocmVwZWF0LnJlcGVhdF9kaXN0X3NxKS9sYXlvdXQudW5pdHNfcGVyX3BpeGVsfWApO1xuICAgICAgICAgICAgICAgIGxhYmVsLnBsYWNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGF5b3V0LmNvbGxpZGUpIHtcbiAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCBgZGlzY2FyZCBsYWJlbCAnJHtsYWJlbC50ZXh0fScgZHVlIHRvIGNvbGxpc2lvbmApO1xuICAgICAgICAgICAgbGFiZWwucGxhY2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhYmVsLnBsYWNlZDtcbiAgICB9LFxuXG4gICAgLy8gUGxhY2UgbGFiZWxcbiAgICBwbGFjZSAoeyBsYWJlbCB9LCB0aWxlKSB7XG4gICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBwcm9jZXNzZWQgKGUuZy4gYnkgcGFyZW50IG9iamVjdClcbiAgICAgICAgaWYgKGxhYmVsLnBsYWNlZCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWdpc3RlciBhcyBwbGFjZWQgZm9yIGZ1dHVyZSBjb2xsaXNpb24gYW5kIHJlcGVhdCBjdWxsaW5nXG4gICAgICAgIFJlcGVhdEdyb3VwLmFkZChsYWJlbCwgbGFiZWwubGF5b3V0LCB0aWxlKTtcbiAgICAgICAgbGFiZWwuYWRkKHRoaXMudGlsZXNbdGlsZV0uYmJveGVzKTtcbiAgICB9XG5cbn07XG4iLCJcbi8vIERvIEFBQkIgYGFgIGFuZCBgYmAgaW50ZXJzZWN0P1xuZXhwb3J0IGZ1bmN0aW9uIGJveEludGVyc2VjdHNCb3ggKGEsIGIpIHtcbiAgICBpZiAoYVsyXSA8IGJbMF0gfHwgLy8gYSBpcyBsZWZ0IG9mIGJcbiAgICAgICAgYVswXSA+IGJbMl0gfHwgLy8gYSBpcyByaWdodCBvZiBiXG4gICAgICAgIGFbM10gPCBiWzFdIHx8IC8vIGEgaXMgYWJvdmUgYlxuICAgICAgICBhWzFdID4gYlszXSkgeyAvLyBhIGlzIGJlbG93IGJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTsgLy8gYm94ZXMgb3ZlcmxhcFxufVxuXG4vLyBEb2VzIEFBQkIgYGFgIGludGVyc2VjdCBhbnkgb2YgdGhlIEFBQkJzIGluIGFycmF5IGBib3hlc2A/XG4vLyBJbnZva2VzIGBjYWxsYmFja2Agd2l0aCBpbmRleCBvZiBpbnRlcnNlY3RpbmcgYm94XG4vLyBTdG9wcyBpbnRlcnNlY3RpbmcgaWYgYGNhbGxiYWNrYCByZXR1cm5zIG5vbi1udWxsIHZhbHVlIChjb250aW51ZXMgb3RoZXJ3aXNlKVxuZXhwb3J0IGZ1bmN0aW9uIGJveEludGVyc2VjdHNMaXN0IChhLCBib3hlcywgY2FsbGJhY2spIHtcbiAgICBmb3IgKGxldCBpPTA7IGkgPCBib3hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYm94SW50ZXJzZWN0c0JveChhLCBib3hlc1tpXSkpIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjayhpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgUG9pbnRBbmNob3IgZnJvbSAnLi9wb2ludF9hbmNob3InO1xuaW1wb3J0IHtib3hJbnRlcnNlY3RzTGlzdH0gZnJvbSAnLi9pbnRlcnNlY3QnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBPQkIgZnJvbSAnLi4vdXRpbHMvb2JiJztcbi8vIGltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGFiZWwge1xuXG4gICAgY29uc3RydWN0b3IgKHNpemUsIGxheW91dCA9IHt9KSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbmNob3IgPSBBcnJheS5pc0FycmF5KHRoaXMubGF5b3V0LmFuY2hvcikgPyB0aGlzLmxheW91dC5hbmNob3JbMF0gOiB0aGlzLmxheW91dC5hbmNob3I7IC8vIGluaXRpYWwgYW5jaG9yXG4gICAgICAgIHRoaXMucGxhY2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBsYXlvdXQub2Zmc2V0O1xuICAgICAgICB0aGlzLmFhYmIgPSBudWxsO1xuICAgICAgICB0aGlzLm9iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgdGhpcy50aHJvd19hd2F5ID0gZmFsc2U7ICAgIC8vIGlmIGxhYmVsIGRvZXMgbm90IGZpdCAoZXhjZWVkcyB0aWxlIGJvdW5kYXJ5LCBldGMpIHRoaXMgYm9vbGVhbiB3aWxsIGJlIHRydWVcbiAgICB9XG5cbiAgICB1cGRhdGUgKCkge1xuICAgICAgICB0aGlzLmFsaWduID0gdGhpcy5sYXlvdXQuYWxpZ24gfHwgUG9pbnRBbmNob3IuYWxpZ25Gb3JBbmNob3IodGhpcy5hbmNob3IpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGZvciBvdmVybGFwcyB3aXRoIG90aGVyIGxhYmVscyBpbiB0aGUgdGlsZVxuICAgIG9jY2x1ZGVkIChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGxldCBpbnRlcnNlY3QgPSBmYWxzZTtcbiAgICAgICAgbGV0IGFhYmJzID0gYmJveGVzLmFhYmI7XG4gICAgICAgIGxldCBvYmJzID0gYmJveGVzLm9iYjtcblxuICAgICAgICAvLyBCcm9hZCBwaGFzZVxuICAgICAgICBpZiAoYWFiYnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYm94SW50ZXJzZWN0c0xpc3QodGhpcy5hYWJiLCBhYWJicywgKGopID0+IHtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogYnJvYWQgcGhhc2UgY29sbGlkZScsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLmFhYmIsIGFhYmJzW2pdKTtcblxuICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgY29sbGlkaW5nIHdpdGggZXhjbHVkZWQgbGFiZWxcbiAgICAgICAgICAgICAgICBpZiAoZXhjbHVkZSAmJiBhYWJic1tqXSA9PT0gZXhjbHVkZS5hYWJiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBza2lwcGluZyBkdWUgdG8gZXhwbGljaXQgZXhjbHVzaW9uJywgdGhpcywgZXhjbHVkZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTa2lwIG5hcnJvdyBwaGFzZSBjb2xsaXNpb24gaWYgbm8gcm90YXRpb25cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vYmIuYW5nbGUgPT09IDAgJiYgb2Jic1tqXS5hbmdsZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogc2tpcCBuYXJyb3cgcGhhc2UgY29sbGlkZSBiZWNhdXNlIG5laXRoZXIgaXMgcm90YXRlZCcsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLm9iYiwgb2Jic1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGludGVyc2VjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5hcnJvdyBwaGFzZVxuICAgICAgICAgICAgICAgIGlmIChPQkIuaW50ZXJzZWN0KHRoaXMub2JiLCBvYmJzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogbmFycm93IHBoYXNlIGNvbGxpZGUnLCB0aGlzLmxheW91dC5pZCwgdGhpcywgdGhpcy5vYmIsIG9iYnNbal0pO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW50ZXJzZWN0O1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGlzIGxhYmVsJ3MgYm91bmRpbmcgYm94IHRvIHRoZSBwcm92aWRlZCBzZXRcbiAgICBhZGQgKGJib3hlcykge1xuICAgICAgICB0aGlzLnBsYWNlZCA9IHRydWU7XG4gICAgICAgIGJib3hlcy5hYWJiLnB1c2godGhpcy5hYWJiKTtcbiAgICAgICAgYmJveGVzLm9iYi5wdXNoKHRoaXMub2JiKTtcbiAgICB9XG5cbiAgICAvLyBjaGVja3Mgd2hldGhlciB0aGUgbGFiZWwgaXMgd2l0aGluIHRoZSB0aWxlIGJvdW5kYXJpZXNcbiAgICBpblRpbGVCb3VuZHMgKCkge1xuICAgICAgICBsZXQgbWluID0gWyB0aGlzLmFhYmJbMF0sIHRoaXMuYWFiYlsxXSBdO1xuICAgICAgICBsZXQgbWF4ID0gWyB0aGlzLmFhYmJbMl0sIHRoaXMuYWFiYlszXSBdO1xuXG4gICAgICAgIGlmICghVXRpbHMucG9pbnRJblRpbGUobWluKSB8fCAhVXRpbHMucG9pbnRJblRpbGUobWF4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gV2hldGhlciB0aGUgbGFiZWwgc2hvdWxkIGJlIGRpc2NhcmRlZFxuICAgIC8vIERlcGVuZHMgb24gd2hldGhlciBsYWJlbCBtdXN0IGZpdCBpbiB0aGUgdGlsZSBib3VuZHMsIGFuZCBpZiBzbywgY2FuIGl0IGJlIG1vdmVkIHRvIGZpdCB0aGVyZVxuICAgIGRpc2NhcmQoYmJveGVzLCBleGNsdWRlID0gbnVsbCkge1xuICAgICAgICBpZiAodGhpcy50aHJvd19hd2F5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vY2NsdWRlZChiYm94ZXMsIGV4Y2x1ZGUpO1xuICAgIH1cbn1cblxuTGFiZWwuZXBzaWxvbiA9IDAuOTk5OTsgLy8gdG9sZXJhbmNlIGFyb3VuZCBjb2xsaXNpb24gYm94ZXMsIHByZXZlbnQgcGVyZmVjdGx5IGFkamFjZW50IG9iamVjdHMgZnJvbSBjb2xsaWRpbmdcbiIsImltcG9ydCBMYWJlbCBmcm9tICcuL2xhYmVsJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi4vdmVjdG9yJztcbmltcG9ydCBPQkIgZnJvbSAnLi4vdXRpbHMvb2JiJztcblxuY29uc3QgUExBQ0VNRU5UID0ge1xuICAgIE1JRF9QT0lOVDogMCxcbiAgICBDT1JORVI6IDFcbn07XG5cbmNvbnN0IE1BWF9BTkdMRSA9IE1hdGguUEkgLyAyOyAgICAgIC8vIG1heGltdW0gYW5nbGUgZm9yIGFydGljdWxhdGVkIGxhYmVsc1xuY29uc3QgTElORV9FWENFRURfU1RSQUlHSFQgPSAwLjc7ICAgLy8gbWluaW1hbCByYXRpbyBmb3Igc3RyYWlnaHQgbGFiZWxzIChsYWJlbCBsZW5ndGgpIC8gKGxpbmUgbGVuZ3RoKVxuY29uc3QgTElORV9FWENFRURfS0lOS0VEID0gMC42OyAgICAgLy8gbWluaW1hbCByYXRpbyBmb3Iga2lua2VkIGxhYmVsc1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbExpbmUge1xuXG4gICAgY29uc3RydWN0b3IgKHNpemUsIGxpbmVzLCBsYXlvdXQpIHtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIHRoaXMubGluZXMgPSBsaW5lcztcbiAgICAgICAgdGhpcy5zcGFjZV93aWR0aCA9IGxheW91dC5zcGFjZV93aWR0aDsgLy8gd2lkdGggb2Ygc3BhY2UgZm9yIHRoZSBmb250IHVzZWRcbiAgICAgICAgdGhpcy5udW1fc2VnbWVudHMgPSBzaXplLmxlbmd0aDsgLy8gbnVtYmVyIG9mIGxhYmVsIHNlZ21lbnRzXG4gICAgICAgIHRoaXMudG90YWxfbGVuZ3RoID0gc2l6ZS5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgbmV4dCl7IHJldHVybiBwcmV2ICsgbmV4dFswXTsgfSwgMCkgKyAoc2l6ZS5sZW5ndGggLSAxKSAqIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgIHRoaXMudG90YWxfaGVpZ2h0ID0gc2l6ZVswXVsxXTtcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAobGF5b3V0LnBsYWNlbWVudCA9PT0gdW5kZWZpbmVkKSA/IFBMQUNFTUVOVC5NSURfUE9JTlQgOiBsYXlvdXQucGxhY2VtZW50O1xuXG4gICAgICAgIHRoaXMua2lua19pbmRleCA9IDA7IC8vIGluZGV4IGF0IHdoaWNoIGFuIGFydGljdWxhdGVkIGxhYmVsIHdpbGwga2luayAoZS5nLiwgMSBtZWFucyBhIGtpbmsgX2FmdGVyXyB0aGUgZmlyc3Qgc2VnbWVudClcbiAgICAgICAgdGhpcy5zcHJlYWRfZmFjdG9yID0gMC41OyAvLyBzcGFjZXMgb3V0IGFkamFjZW50IHdvcmRzIHRvIHByZXZlbnQgb3ZlcmxhcFxuICAgICAgICB0aGlzLmZpdG5lc3MgPSAwOyAvLyBtZWFzdXJlIG9mIHF1YWxpdHkgb2YgZml0XG5cbiAgICAgICAgLy8gQXJyYXlzIGZvciBMYWJlbCBwcm9wZXJ0aWVzLiBUT0RPOiBjcmVhdGUgYXJyYXkgb2YgTGFiZWwgdHlwZXMsIHdoZXJlIExhYmVsTGluZSBhY3RzIGFzIGEgXCJncm91cGVkIGxhYmVsXCJcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFtdO1xuICAgICAgICB0aGlzLmFuZ2xlID0gW107XG4gICAgICAgIHRoaXMub2Zmc2V0cyA9IFtdO1xuICAgICAgICB0aGlzLm9iYnMgPSBbXTtcbiAgICAgICAgdGhpcy5hYWJicyA9IFtdO1xuXG4gICAgICAgIC8vIG9wdGlvbmFsbHkgbGltaXQgdGhlIGxpbmUgc2VnbWVudHMgdGhhdCB0aGUgbGFiZWwgbWF5IGJlIHBsYWNlZCBpbiwgYnkgc3BlY2lmeWluZyBhIHNlZ21lbnQgaW5kZXggcmFuZ2VcbiAgICAgICAgLy8gdXNlZCBhcyBhIGNvYXJzZSBzdWJkaXZpZGUgZm9yIHBsYWNpbmcgbXVsdGlwbGUgbGFiZWxzIHBlciBsaW5lIGdlb21ldHJ5XG4gICAgICAgIHRoaXMuc2VnbWVudF9pbmRleCA9IGxheW91dC5zZWdtZW50X2luZGV4IHx8IGxheW91dC5zZWdtZW50X3N0YXJ0IHx8IDA7XG4gICAgICAgIHRoaXMuc2VnbWVudF9tYXggPSBsYXlvdXQuc2VnbWVudF9lbmQgfHwgdGhpcy5saW5lcy5sZW5ndGg7XG5cbiAgICAgICAgLy8gRmlyc3QgZml0dGluZyBzZWdtZW50XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5nZXROZXh0Rml0dGluZ1NlZ21lbnQodGhpcy5nZXRDdXJyZW50U2VnbWVudCgpKTtcbiAgICAgICAgdGhpcy50aHJvd19hd2F5ID0gKCFzZWdtZW50KTtcbiAgICB9XG5cbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGxpbmUgZ2VvbWV0cnkgY3JlYXRpbmcgdGhlIG5leHQgdmFsaWQgbGFiZWwuXG4gICAgc3RhdGljIG5leHRMYWJlbChsYWJlbCkge1xuICAgICAgICAvLyBpbmNyZW1lbnQgc2VnbWVudFxuICAgICAgICBsZXQgaGFzTmV4dCA9IGxhYmVsLmdldE5leHRTZWdtZW50KCk7XG4gICAgICAgIGlmICghaGFzTmV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xvbmUgb3B0aW9uc1xuICAgICAgICBsZXQgbGF5b3V0ID0gT2JqZWN0LmNyZWF0ZShsYWJlbC5sYXlvdXQpO1xuICAgICAgICBsYXlvdXQuc2VnbWVudF9pbmRleCA9IGxhYmVsLnNlZ21lbnRfaW5kZXg7XG4gICAgICAgIGxheW91dC5wbGFjZW1lbnQgPSBsYWJlbC5wbGFjZW1lbnQ7XG5cbiAgICAgICAgLy8gY3JlYXRlIG5ldyBsYWJlbFxuICAgICAgICBsZXQgbmV4dExhYmVsID0gbmV3IExhYmVsTGluZShsYWJlbC5zaXplLCBsYWJlbC5saW5lcywgbGF5b3V0KTtcblxuICAgICAgICByZXR1cm4gKG5leHRMYWJlbC50aHJvd19hd2F5KSA/IGZhbHNlIDogbmV4dExhYmVsO1xuICAgIH1cblxuICAgIC8vIFN0cmF0ZWd5IGZvciByZXR1cm5pbmcgdGhlIG5leHQgc2VnbWVudC4gQXNzdW1lcyBhbiBcIm9yZGVyaW5nXCIgb2YgcG9zc2libGUgc2VnbWVudHNcbiAgICAvLyB0YWtpbmcgaW50byBhY2NvdW50IGJvdGggc3RyYWlnaHQgYW5kIGFydGljdWxhdGVkIHNlZ21lbnRzLiBSZXR1cm5zIGZhbHNlIGlmIGFsbCBwb3NzaWJpbGl0aWVzXG4gICAgLy8gaGF2ZSBiZWVuIGV4aGF1c3RlZFxuICAgIGdldE5leHRTZWdtZW50KCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSBQTEFDRU1FTlQuTUlEX1BPSU5UO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZ21lbnRfaW5kZXggPj0gdGhpcy5saW5lcy5sZW5ndGggLSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaXplLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSBQTEFDRU1FTlQuQ09STkVSO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRfaW5kZXgrKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRTZWdtZW50KCk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyB0aGUgbGluZSBzZWdtZW50cyBuZWNlc3NhcnkgZm9yIG90aGVyIGNhbGN1bGF0aW9ucyBhdCB0aGUgY3VycmVudCBsaW5lIHNlZ21lbnQgaW5kZXguXG4gICAgLy8gVGhpcyBpcyB0aGUgY3VycmVudCBhbmQgbmV4dCBzZWdtZW50IGZvciBhIHN0cmFpZ2h0IGxpbmUsIGFuZCB0aGUgcHJldmlvdXMsIGN1cnJlbnQgYW5kIG5leHRcbiAgICAvLyBmb3IgYW4gYXJ0aWN1bGF0ZWQgc2VnbWVudC5cbiAgICBnZXRDdXJyZW50U2VnbWVudCgpIHtcbiAgICAgICAgbGV0IHAxLCBwMiwgc2VnbWVudDtcbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIHAxID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXggLSAxXTtcbiAgICAgICAgICAgICAgICBwMiA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4XTtcbiAgICAgICAgICAgICAgICBsZXQgcDMgPSB0aGlzLmxpbmVzW3RoaXMuc2VnbWVudF9pbmRleCArIDFdO1xuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBbIHAxLCBwMiwgcDMgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICBwMSA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4XTtcbiAgICAgICAgICAgICAgICBwMiA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4ICsgMV07XG4gICAgICAgICAgICAgICAgc2VnbWVudCA9IFsgcDEsIHAyIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VnbWVudDtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIG5leHQgc2VnbWVudCB0aGF0IGlzIHZhbGlkICh3aXRoaW4gdGlsZSwgaW5zaWRlIGFuZ2xlIHJlcXVpcmVtZW50cyBhbmQgd2l0aGluIGxpbmUgZ2VvbWV0cnkpLlxuICAgIGdldE5leHRGaXR0aW5nU2VnbWVudChzZWdtZW50KSB7XG4gICAgICAgIHNlZ21lbnQgPSBzZWdtZW50IHx8IHRoaXMuZ2V0TmV4dFNlZ21lbnQoKTtcbiAgICAgICAgaWYgKCFzZWdtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kb2VzU2VnbWVudEZpdChzZWdtZW50KSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmluVGlsZUJvdW5kcygpICYmIHRoaXMuaW5BbmdsZUJvdW5kcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlZ21lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXROZXh0Rml0dGluZ1NlZ21lbnQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGN1cnJlbnQgc2VnbWVudCBpcyB2YWxpZFxuICAgIGRvZXNTZWdtZW50Rml0KHNlZ21lbnQpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpdEtpbmtlZFNlZ21lbnQoc2VnbWVudCk7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZml0U3RyYWlnaHRTZWdtZW50KHNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBraW5rZWQgc2VnbWVudCBpcyB2YWxpZFxuICAgIC8vIEN5Y2xlcyB0aHJvdWdoIHZhcmlvdXMgd2F5cyBvZiBraW5raW5nIHRoZSBsYWJlbHMgYXJvdW5kIHRoZSBzZWdtZW50J3MgcGl2b3QsXG4gICAgLy8gZmluZGluZyB0aGUgYmVzdCBmaXQsIGFuZCBkZXRlcm1pbmVzIHRoZSBraW5rX2luZGV4LlxuICAgIGZpdEtpbmtlZFNlZ21lbnQoc2VnbWVudCkge1xuICAgICAgICBsZXQgdXBwID0gdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsO1xuXG4gICAgICAgIGxldCBwMHAxID0gVmVjdG9yLnN1YihzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICAgICAgbGV0IHAxcDIgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMV0sIHNlZ21lbnRbMl0pO1xuXG4gICAgICAgIC8vIERvbid0IGZpdCBpZiBzZWdtZW50IGRvZXNuJ3QgcGFzcyB0aGUgdmVydGljYWwgbGluZSB0ZXN0LCByZXN1bHRpbmcgaW4gdXBzaWRlLWRvd24gbGFiZWxzXG4gICAgICAgIGlmIChwMHAxWzBdICogcDFwMlswXSA8IDAgJiYgcDBwMVsxXSAqIHAxcDJbMV0gPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGluZV9sZW5ndGgxID0gVmVjdG9yLmxlbmd0aChwMHAxKSAvIHVwcDtcbiAgICAgICAgbGV0IGxpbmVfbGVuZ3RoMiA9IFZlY3Rvci5sZW5ndGgocDFwMikgLyB1cHA7XG5cbiAgICAgICAgLy8gYnJlYWsgdXAgbXVsdGlwbGUgc2VnbWVudHMgaW50byB0d28gY2h1bmtzIChOLTEgb3B0aW9ucylcbiAgICAgICAgbGV0IGxhYmVsX2xlbmd0aDEgPSB0aGlzLnRvdGFsX2xlbmd0aDtcbiAgICAgICAgbGV0IGxhYmVsX2xlbmd0aDIgPSAwO1xuICAgICAgICBsZXQgd2lkdGgsIGZpdG5lc3MgPSAwO1xuICAgICAgICBsZXQga2lua19pbmRleCA9IHRoaXMubnVtX3NlZ21lbnRzIC0gMTtcbiAgICAgICAgbGV0IGZpdG5lc3NlcyA9IFtdO1xuXG4gICAgICAgIHdoaWxlIChraW5rX2luZGV4ID4gMCkge1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLnNpemVba2lua19pbmRleF1bMF0gKyB0aGlzLnNwYWNlX3dpZHRoO1xuXG4gICAgICAgICAgICBsYWJlbF9sZW5ndGgxIC09IHdpZHRoO1xuICAgICAgICAgICAgbGFiZWxfbGVuZ3RoMiArPSB3aWR0aDtcblxuICAgICAgICAgICAgZml0bmVzcyA9IE1hdGgubWF4KGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoMSwgbGFiZWxfbGVuZ3RoMSksIGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoMiwgbGFiZWxfbGVuZ3RoMikpO1xuICAgICAgICAgICAgZml0bmVzc2VzLnVuc2hpZnQoZml0bmVzcyk7XG5cbiAgICAgICAgICAgIGtpbmtfaW5kZXgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXhfZml0bmVzcyA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGZpdG5lc3Nlcyk7XG5cbiAgICAgICAgaWYgKG1heF9maXRuZXNzIDwgTElORV9FWENFRURfS0lOS0VEKSB7XG4gICAgICAgICAgICB0aGlzLmtpbmtfaW5kZXggPSBmaXRuZXNzZXMuaW5kZXhPZihtYXhfZml0bmVzcykgKyAxO1xuICAgICAgICAgICAgdGhpcy5maXRuZXNzID0gbWF4X2ZpdG5lc3M7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMua2lua19pbmRleCA9IDA7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHN0cmFpZ2h0IHNlZ21lbnQgaXMgdmFsaWRcbiAgICAvLyBBIHN0cmFpZ2h0IHNlZ21lbnQgaXMgcGxhY2VkIGF0IHRoZSBtaWRwb2ludCBhbmQgaXMgdmFsaWQgaWYgdGhlIGxhYmVsJ3MgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBhXG4gICAgLy8gZmFjdG9yIChMSU5FX0VYQ0VFRF9TVFJBSUdIVCkgb2YgdGhlIGxpbmUgc2VnbWVudCdzIGxlbmd0aFxuICAgIGZpdFN0cmFpZ2h0U2VnbWVudChzZWdtZW50KSB7XG4gICAgICAgIGxldCB1cHAgPSB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWw7XG4gICAgICAgIGxldCBsaW5lX2xlbmd0aCA9IFZlY3Rvci5sZW5ndGgoVmVjdG9yLnN1YihzZWdtZW50WzBdLCBzZWdtZW50WzFdKSkgLyB1cHA7XG4gICAgICAgIGxldCBmaXRuZXNzID0gY2FsY0ZpdG5lc3MobGluZV9sZW5ndGgsIHRoaXMudG90YWxfbGVuZ3RoKTtcblxuICAgICAgICBpZiAoZml0bmVzcyA8IExJTkVfRVhDRUVEX1NUUkFJR0hUKXtcbiAgICAgICAgICAgIHRoaXMuZml0bmVzcyA9IGZpdG5lc3M7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uY2UgYSBmaXR0aW5nIHNlZ21lbnQgaXMgZm91bmQsIGRldGVybWluZSBpdHMgYW5nbGVzLCBwb3NpdGlvbnMgYW5kIGJvdW5kaW5nIGJveGVzXG4gICAgdXBkYXRlKCkge1xuICAgICAgICB0aGlzLmFuZ2xlID0gdGhpcy5nZXRDdXJyZW50QW5nbGUoKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHRoaXMuZ2V0Q3VycmVudFBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQkJveGVzKCk7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudEFuZ2xlKCkge1xuICAgICAgICBsZXQgc2VnbWVudCA9IHRoaXMuZ2V0Q3VycmVudFNlZ21lbnQoKTtcbiAgICAgICAgbGV0IGFuZ2xlcyA9IFtdO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBsZXQgdGhldGExID0gZ2V0QW5nbGVGcm9tU2VnbWVudChzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICAgICAgICAgICAgICBsZXQgdGhldGEyID0gZ2V0QW5nbGVGcm9tU2VnbWVudChzZWdtZW50WzFdLCBzZWdtZW50WzJdKTtcblxuICAgICAgICAgICAgICAgIGxldCBwMHAxID0gVmVjdG9yLnN1YihzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICAgICAgICAgICAgICBsZXQgcDFwMiA9IFZlY3Rvci5zdWIoc2VnbWVudFsxXSwgc2VnbWVudFsyXSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgb3JpZW50YXRpb24gPSAocDBwMVswXSA+PSAwICYmIHAxcDJbMF0gPj0gMCkgPyAxIDogLTE7XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCB0aGlzLmtpbmtfaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSAob3JpZW50YXRpb24gPiAwKSA/IHRoZXRhMiA6IHRoZXRhMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gKG9yaWVudGF0aW9uID4gMCkgPyB0aGV0YTEgOiB0aGV0YTI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYW5nbGVzLnB1c2goYW5nbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICBsZXQgdGhldGEgPSBnZXRBbmdsZUZyb21TZWdtZW50KHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1fc2VnbWVudHM7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlcy5wdXNoKHRoZXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYW5nbGVzO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgbGFiZWxcbiAgICBnZXRDdXJyZW50UG9zaXRpb24oKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5nZXRDdXJyZW50U2VnbWVudCgpO1xuICAgICAgICBsZXQgcG9zaXRpb247XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gc2VnbWVudFsxXS5zbGljZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gW1xuICAgICAgICAgICAgICAgICAgICAwLjUgKiAoc2VnbWVudFswXVswXSArIHNlZ21lbnRbMV1bMF0pLFxuICAgICAgICAgICAgICAgICAgICAwLjUgKiAoc2VnbWVudFswXVsxXSArIHNlZ21lbnRbMV1bMV0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgYXJ0aWN1bGF0ZWQgbGFiZWxzIHRvIGJlIHdpdGhpbiBhbiBhbmdsZSByYW5nZSBbLU1BWF9BTkdMRSwgK01BWF9BTkdMRV1cbiAgICBpbkFuZ2xlQm91bmRzKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMCA9IHRoaXMuYW5nbGVbMF07XG4gICAgICAgICAgICAgICAgaWYgKGFuZ2xlMCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGUwICs9IDIgKiBNYXRoLlBJO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhbmdsZTEgPSB0aGlzLmFuZ2xlWzFdO1xuICAgICAgICAgICAgICAgIGlmIChhbmdsZTEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlMSArPSAyICogTWF0aC5QSTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdGhldGEgPSBNYXRoLmFicyhhbmdsZTEgLSBhbmdsZTApO1xuICAgICAgICAgICAgICAgIHRoZXRhID0gTWF0aC5taW4oMiAqIE1hdGguUEkgLSB0aGV0YSwgdGhldGEpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoZXRhIDw9IE1BWF9BTkdMRTtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBib3VuZGluZyBib3hlc1xuICAgIHVwZGF0ZUJCb3hlcygpIHtcbiAgICAgICAgbGV0IHVwcCA9IHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcbiAgICAgICAgbGV0IGhlaWdodCA9ICh0aGlzLnRvdGFsX2hlaWdodCArIHRoaXMubGF5b3V0LmJ1ZmZlclsxXSAqIDIpICogdXBwICogTGFiZWwuZXBzaWxvbjtcblxuICAgICAgICAvLyByZXNldCBib3VuZGluZyBib3hlc1xuICAgICAgICB0aGlzLm9iYnMgPSBbXTtcbiAgICAgICAgdGhpcy5hYWJicyA9IFtdO1xuXG4gICAgICAgIC8vIGZ1ZGdlIHdpZHRoIHZhbHVlIGFzIHRleHQgbWF5IG92ZXJmbG93IGJvdW5kaW5nIGJveCBpZiBpdCBoYXMgaXRhbGljLCBib2xkLCBldGMgc3R5bGVcbiAgICAgICAgbGV0IGl0YWxpY3NfYnVmZmVyID0gKHRoaXMubGF5b3V0Lml0YWxpYykgPyA1ICogdXBwIDogMDtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMCA9IHRoaXMuYW5nbGVbdGhpcy5raW5rX2luZGV4IC0gMV07IC8vIGFuZ2xlIGJlZm9yZSBraW5rXG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMSA9IHRoaXMuYW5nbGVbdGhpcy5raW5rX2luZGV4XTsgLy8gYW5nbGUgYWZ0ZXIga2lua1xuICAgICAgICAgICAgICAgIGxldCB0aGV0YSA9IE1hdGguYWJzKGFuZ2xlMSAtIGFuZ2xlMCk7IC8vIGFuZ2xlIGRlbHRhXG5cbiAgICAgICAgICAgICAgICAvLyBBIHNwcmVhZCBmYWN0b3Igb2YgMCBwaXZvdHMgdGhlIGJveGVzIG9uIHRoZWlyIGhvcml6b250YWwgY2VudGVyLCBsb29raW5nIGxpa2U6IFwiWFwiXG4gICAgICAgICAgICAgICAgLy8gYSBzcHJlYWQgZmFjdG9yIG9mIDEgb2Zmc2V0cyB0aGUgYm94ZXMgc28gdGhhdCB0aGVpciBjb3JuZXJzIHRvdWNoLCBsb29raW5nIGxpa2U6IFwiXFwvXCIgb3IgXCIvXFxcIlxuICAgICAgICAgICAgICAgIGxldCBkeCA9IHRoaXMuc3ByZWFkX2ZhY3RvciAqIE1hdGguYWJzKHRoaXMudG90YWxfaGVpZ2h0ICogTWF0aC50YW4oMC41ICogdGhldGEpKTtcbiAgICAgICAgICAgICAgICBsZXQgbnVkZ2UgPSAwLjUgKiAoLWR4IC0gdGhpcy5zcGFjZV93aWR0aCk7XG5cbiAgICAgICAgICAgICAgICAvLyBQbGFjZSBsYWJlbHMgYmFja3dhcmRzIGZyb20ga2luayBpbmRleFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmtpbmtfaW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGhfcHggPSB0aGlzLnNpemVbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IHRoaXMuYW5nbGVbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gKHdpZHRoX3B4ICsgMiAqIHRoaXMubGF5b3V0LmJ1ZmZlclswXSkgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuXG4gICAgICAgICAgICAgICAgICAgIG51ZGdlIC09IDAuNSAqIHdpZHRoX3B4O1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSBWZWN0b3Iucm90KFtudWRnZSAqIHVwcCwgMF0sIC1hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IFZlY3Rvci5hZGQodGhpcy5wb3NpdGlvbiwgb2Zmc2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JiID0gZ2V0T0JCKHBvc2l0aW9uLCB3aWR0aCArIGl0YWxpY3NfYnVmZmVyLCBoZWlnaHQsIGFuZ2xlLCB0aGlzLm9mZnNldCwgdXBwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFhYmIgPSBvYmIuZ2V0RXh0ZW50KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmJzLnB1c2gob2JiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hYWJicy5wdXNoKGFhYmIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFswXSArIG51ZGdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzFdXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgLT0gMC41ICogd2lkdGhfcHggKyB0aGlzLnNwYWNlX3dpZHRoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFBsYWNlIGxhYmVscyBmb3J3YXJkcyBmcm9tIGtpbmsgaW5kZXhcbiAgICAgICAgICAgICAgICBudWRnZSA9IDAuNSAqIChkeCArIHRoaXMuc3BhY2Vfd2lkdGgpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMua2lua19pbmRleDsgaSA8IHRoaXMubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGhfcHggPSB0aGlzLnNpemVbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IHRoaXMuYW5nbGVbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gKHdpZHRoX3B4ICsgMiAqIHRoaXMubGF5b3V0LmJ1ZmZlclswXSkgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuXG4gICAgICAgICAgICAgICAgICAgIG51ZGdlICs9IDAuNSAqIHdpZHRoX3B4O1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSBWZWN0b3Iucm90KFtudWRnZSAqIHVwcCwgMF0sIC1hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IFZlY3Rvci5hZGQodGhpcy5wb3NpdGlvbiwgb2Zmc2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JiID0gZ2V0T0JCKHBvc2l0aW9uLCB3aWR0aCArIGl0YWxpY3NfYnVmZmVyLCBoZWlnaHQsIGFuZ2xlLCB0aGlzLm9mZnNldCwgdXBwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFhYmIgPSBvYmIuZ2V0RXh0ZW50KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmJzLnB1c2gob2JiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hYWJicy5wdXNoKGFhYmIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFswXSArIG51ZGdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzFdXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgKz0gMC41ICogd2lkdGhfcHggKyB0aGlzLnNwYWNlX3dpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICBsZXQgc2hpZnQgPSAtMC41ICogdGhpcy50b3RhbF9sZW5ndGg7IC8vIHNoaWZ0IGZvciBjZW50ZXJpbmcgdGhlIGxhYmVsc1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoX3B4ID0gdGhpcy5zaXplW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSAod2lkdGhfcHggKyAyICogdGhpcy5sYXlvdXQuYnVmZmVyWzBdKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IHRoaXMuYW5nbGVbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gMC41ICogd2lkdGhfcHg7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IFZlY3Rvci5yb3QoW3NoaWZ0ICogdXBwLCAwXSwgLWFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gVmVjdG9yLmFkZCh0aGlzLnBvc2l0aW9uLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmIgPSBnZXRPQkIocG9zaXRpb24sIHdpZHRoICsgaXRhbGljc19idWZmZXIsIGhlaWdodCwgYW5nbGUsIHRoaXMub2Zmc2V0LCB1cHApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWFiYiA9IG9iYi5nZXRFeHRlbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iYnMucHVzaChvYmIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFhYmJzLnB1c2goYWFiYik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2ldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzBdICsgc2hpZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMV1cbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBzaGlmdCArPSAwLjUgKiB3aWR0aF9weCArIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVja3MgZWFjaCBzZWdtZW50IHRvIHNlZSBpZiBpdCBpcyB3aXRoaW4gdGhlIHRpbGUuIElmIGFueSBzZWdtZW50IGZhaWxzIHRoaXMgdGVzdCwgdGhleSBhbGwgZmFpbC5cbiAgICAvLyBUT0RPOiBsYWJlbCBncm91cFxuICAgIGluVGlsZUJvdW5kcygpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFhYmJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYWFiYiA9IHRoaXMuYWFiYnNbaV07XG4gICAgICAgICAgICBsZXQgb2JqID0geyBhYWJiIH07XG4gICAgICAgICAgICBsZXQgaW5fYm91bmRzID0gTGFiZWwucHJvdG90eXBlLmluVGlsZUJvdW5kcy5jYWxsKG9iaik7XG4gICAgICAgICAgICBpZiAoIWluX2JvdW5kcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBBZGRzIGVhY2ggc2VnbWVudCB0byB0aGUgY29sbGlzaW9uIHBhc3MgYXMgaXRzIG93biBib3VuZGluZyBib3hcbiAgICAvLyBUT0RPOiBsYWJlbCBncm91cFxuICAgIGFkZChiYm94ZXMpIHtcbiAgICAgICAgdGhpcy5wbGFjZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYWFiYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBhYWJiID0gdGhpcy5hYWJic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmIgPSB0aGlzLm9iYnNbaV07XG4gICAgICAgICAgICBsZXQgb2JqID0geyBhYWJiLCBvYmIgfTtcbiAgICAgICAgICAgIExhYmVsLnByb3RvdHlwZS5hZGQuY2FsbChvYmosIGJib3hlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVja3MgZWFjaCBzZWdtZW50IHRvIHNlZSBpZiBpdCBzaG91bGQgYmUgZGlzY2FyZGVkICh2aWEgY29sbGlzaW9uKS4gSWYgYW55IHNlZ21lbnQgZmFpbHMgdGhpcyB0ZXN0LCB0aGV5IGFsbCBmYWlsLlxuICAgIC8vIFRPRE86IGxhYmVsIGdyb3VwXG4gICAgZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLnRocm93X2F3YXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9iYnMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgbGV0IGFhYmIgPSB0aGlzLmFhYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iYiA9IHRoaXMub2Jic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmogPSB7IGFhYmIsIG9iYiB9O1xuXG4gICAgICAgICAgICBsZXQgc2hvdWxkRGlzY2FyZCA9IExhYmVsLnByb3RvdHlwZS5vY2NsdWRlZC5jYWxsKG9iaiwgYmJveGVzLCBleGNsdWRlKTtcbiAgICAgICAgICAgIGlmIChzaG91bGREaXNjYXJkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLy8gUHJpdmF0ZSBtZXRob2QgdG8gY2FsY3VsYXRlIG9yaWVudGVkIGJvdW5kaW5nIGJveFxuZnVuY3Rpb24gZ2V0T0JCKHBvc2l0aW9uLCB3aWR0aCwgaGVpZ2h0LCBhbmdsZSwgb2Zmc2V0LCB1cHApIHtcbiAgICBsZXQgcDAsIHAxO1xuICAgIC8vIGFwcGx5IG9mZnNldCwgeCBwb3NpdGl2ZSwgeSBwb2ludGluZyBkb3duXG4gICAgaWYgKG9mZnNldCAmJiAob2Zmc2V0WzBdICE9PSAwIHx8IG9mZnNldFsxXSAhPT0gMCkpIHtcbiAgICAgICAgb2Zmc2V0ID0gVmVjdG9yLnJvdChvZmZzZXQsIGFuZ2xlKTtcbiAgICAgICAgcDAgPSBwb3NpdGlvblswXSArIChvZmZzZXRbMF0gKiB1cHApO1xuICAgICAgICBwMSA9IHBvc2l0aW9uWzFdIC0gKG9mZnNldFsxXSAqIHVwcCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwMCA9IHBvc2l0aW9uWzBdO1xuICAgICAgICBwMSA9IHBvc2l0aW9uWzFdO1xuICAgIH1cblxuICAgIC8vIHRoZSBhbmdsZSBvZiB0aGUgb2JiIGlzIG5lZ2F0aXZlIHNpbmNlIGl0J3MgdGhlIHRpbGUgc3lzdGVtIHkgYXhpcyBpcyBwb2ludGluZyBkb3duXG4gICAgcmV0dXJuIG5ldyBPQkIocDAsIHAxLCAtYW5nbGUsIHdpZHRoLCBoZWlnaHQpO1xufVxuXG4vLyBQcml2YXRlIG1ldGhvZCB0byBjYWxjdWxhdGUgdGhlIGFuZ2xlIG9mIGEgc2VnbWVudC5cbi8vIFRyYW5zZm9ybXMgdGhlIGFuZ2xlIHRvIGxpZSB3aXRoaW4gdGhlIHJhbmdlIFswLCBQSS8yXSBhbmQgWzMqUEkvMiwgMipQSV0gKDFzdCBvciA0dGggcXVhZHJhbnRzKVxuLy8gYXMgb3RoZXIgcmFuZ2VzIHByb2R1Y2UgXCJ1cHNpZGUgZG93blwiIGxhYmVsc1xuZnVuY3Rpb24gZ2V0QW5nbGVGcm9tU2VnbWVudChwdDEsIHB0Mikge1xuICAgIGxldCBQSSA9IE1hdGguUEk7XG4gICAgbGV0IFBJXzIgPSBQSSAvIDI7XG4gICAgbGV0IHAxcDIgPSBWZWN0b3Iuc3ViKHB0MSwgcHQyKTtcbiAgICBsZXQgdGhldGEgPSBNYXRoLmF0YW4yKHAxcDJbMF0sIHAxcDJbMV0pICsgUElfMjtcblxuICAgIGlmICh0aGV0YSA+IFBJXzIpIHtcbiAgICAgICAgLy8gSWYgaW4gMm5kIHF1YWRyYW50LCBtb3ZlIHRvIDR0aCBxdWFkcmFudFxuICAgICAgICB0aGV0YSArPSBQSTtcbiAgICAgICAgdGhldGEgJT0gMiAqIE1hdGguUEk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoZXRhIDwgMCkge1xuICAgICAgICAvLyBJZiBpbiA0dGggcXVhZHJhbnQsIG1ha2UgYSBwb3NpdGl2ZSBhbmdsZVxuICAgICAgICB0aGV0YSArPSAyICogUEk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoZXRhO1xufVxuXG5mdW5jdGlvbiBjYWxjRml0bmVzcyhsaW5lX2xlbmd0aCwgbGFiZWxfbGVuZ3RoKXtcbiAgICByZXR1cm4gMSAtIGxpbmVfbGVuZ3RoIC8gbGFiZWxfbGVuZ3RoO1xufVxuIiwiaW1wb3J0IExhYmVsIGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IFBvaW50QW5jaG9yIGZyb20gJy4vcG9pbnRfYW5jaG9yJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCBPQkIgZnJvbSAnLi4vdXRpbHMvb2JiJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbFBvaW50IGV4dGVuZHMgTGFiZWwge1xuXG4gICAgY29uc3RydWN0b3IgKHBvc2l0aW9uLCBzaXplLCBsYXlvdXQpIHtcbiAgICAgICAgc3VwZXIoc2l6ZSwgbGF5b3V0KTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFtwb3NpdGlvblswXSwgcG9zaXRpb25bMV1dO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHRoaXMubGF5b3V0LnBhcmVudDtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcblxuICAgICAgICBpZiAodGhpcy5sYXlvdXQuYW5jaG9yKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0X2FuY2hvcl9pbmRleCA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGFzTmV4dCA9IHRoaXMuZ2V0TmV4dEZpdCgpO1xuICAgICAgICB0aGlzLnRocm93X2F3YXkgPSAhaGFzTmV4dDtcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLmNvbXB1dGVPZmZzZXQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVCQm94ZXMoKTtcbiAgICB9XG5cbiAgICBjb21wdXRlT2Zmc2V0ICgpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBbdGhpcy5sYXlvdXQub2Zmc2V0WzBdLCB0aGlzLmxheW91dC5vZmZzZXRbMV1dO1xuXG4gICAgICAgIC8vIEFkZGl0aW9uYWwgYW5jaG9yL29mZnNldCBmb3IgcG9pbnQ6XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgICAgICAgICAgLy8gcG9pbnQncyBvd24gYW5jaG9yLCB0ZXh0IGFuY2hvciBhcHBsaWVkIHRvIHBvaW50LCBhZGRpdGlvbmFsIHBvaW50IG9mZnNldFxuICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBQb2ludEFuY2hvci5jb21wdXRlT2Zmc2V0KHRoaXMub2Zmc2V0LCBwYXJlbnQuc2l6ZSwgcGFyZW50LmFuY2hvciwgUG9pbnRBbmNob3IuemVyb19idWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBQb2ludEFuY2hvci5jb21wdXRlT2Zmc2V0KHRoaXMub2Zmc2V0LCBwYXJlbnQuc2l6ZSwgdGhpcy5hbmNob3IsIFBvaW50QW5jaG9yLnplcm9fYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQub2Zmc2V0ICE9PSBTdHlsZVBhcnNlci56ZXJvUGFpcikgeyAgICAgICAgLy8gcG9pbnQgaGFzIGFuIG9mZnNldFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldCA9PT0gU3R5bGVQYXJzZXIuemVyb1BhaXIpIHsgICAgICAvLyBubyB0ZXh0IG9mZnNldCwgdXNlIHBvaW50J3NcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBwYXJlbnQub2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGV4dCBoYXMgb2Zmc2V0LCBhZGQgcG9pbnQnc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldFswXSArPSBwYXJlbnQub2Zmc2V0WzBdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldFsxXSArPSBwYXJlbnQub2Zmc2V0WzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gUG9pbnRBbmNob3IuY29tcHV0ZU9mZnNldCh0aGlzLm9mZnNldCwgdGhpcy5zaXplLCB0aGlzLmFuY2hvcik7XG4gICAgfVxuXG4gICAgdXBkYXRlQkJveGVzICgpIHtcbiAgICAgICAgbGV0IHdpZHRoID0gKHRoaXMuc2l6ZVswXSArIHRoaXMubGF5b3V0LmJ1ZmZlclswXSAqIDIpICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsICogTGFiZWwuZXBzaWxvbjtcbiAgICAgICAgbGV0IGhlaWdodCA9ICh0aGlzLnNpemVbMV0gKyB0aGlzLmxheW91dC5idWZmZXJbMV0gKiAyKSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbCAqIExhYmVsLmVwc2lsb247XG5cbiAgICAgICAgLy8gZnVkZ2Ugd2lkdGggdmFsdWUgYXMgdGV4dCBtYXkgb3ZlcmZsb3cgYm91bmRpbmcgYm94IGlmIGl0IGhhcyBpdGFsaWMsIGJvbGQsIGV0YyBzdHlsZVxuICAgICAgICBpZiAodGhpcy5sYXlvdXQuaXRhbGljKXtcbiAgICAgICAgICAgIHdpZHRoICs9IDUgKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcCA9IFtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMF0gKyAodGhpcy5vZmZzZXRbMF0gKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWwpLFxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblsxXSAtICh0aGlzLm9mZnNldFsxXSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLm9iYiA9IG5ldyBPQkIocFswXSwgcFsxXSwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuYWFiYiA9IHRoaXMub2JiLmdldEV4dGVudCgpO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBtb3ZlIHRoZSBsYWJlbCBpbnRvIHRoZSB0aWxlIGJvdW5kc1xuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBsYWJlbCB3YXMgbW92ZWQgaW50byB0aWxlLCBmYWxzZSBpZiBpdCBjb3VsZG4ndCBiZSBtb3ZlZFxuICAgIG1vdmVJbnRvVGlsZSAoKSB7XG4gICAgICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlswXSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMF0gKz0gLXRoaXMuYWFiYlswXTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlsyXSA+PSBHZW8udGlsZV9zY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblswXSAtPSB0aGlzLmFhYmJbMl0gLSBHZW8udGlsZV9zY2FsZSArIDE7XG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFhYmJbM10gPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzFdIC09IHRoaXMuYWFiYlszXTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlsxXSA8PSAtR2VvLnRpbGVfc2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMV0gLT0gdGhpcy5hYWJiWzFdICsgR2VvLnRpbGVfc2NhbGUgLSAxO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCQm94ZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH1cblxuICAgIGdldE5leHRGaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXQuY3VsbF9mcm9tX3RpbGUgfHwgdGhpcy5pblRpbGVCb3VuZHMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXlvdXQubW92ZV9pbnRvX3RpbGUpe1xuICAgICAgICAgICAgdGhpcy5tb3ZlSW50b1RpbGUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5sYXlvdXQuYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG9uIHNlY29uZCBhbmNob3IgKGZpcnN0IGFuY2hvciB3YXMgc2V0IG9uIGNyZWF0aW9uKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5sYXlvdXQuYW5jaG9yLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5jaG9yID0gdGhpcy5sYXlvdXQuYW5jaG9yW2ldO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRfYW5jaG9yX2luZGV4ID0gaTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pblRpbGVCb3VuZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vIGFuY2hvcnMgcmVzdWx0IGluIGZpdFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzY2FyZCAoYmJveGVzLCBleGNsdWRlID0gbnVsbCkge1xuICAgICAgICBpZiAoc3VwZXIuZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUpKSB7XG4gICAgICAgICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIGFuY2hvciBzcGVjaWZpZWQsIHRyeSB0aGVtIGluIG9yZGVyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmxheW91dC5hbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgb24gc2Vjb25kIGFuY2hvciAoZmlyc3QgYW5jaG9yIHdhcyBzZXQgb24gY3JlYXRpb24pXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT10aGlzLnN0YXJ0X2FuY2hvcl9pbmRleDsgaSA8IHRoaXMubGF5b3V0LmFuY2hvci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuY2hvciA9IHRoaXMubGF5b3V0LmFuY2hvcltpXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXlvdXQuY3VsbF9mcm9tX3RpbGUgJiYgIXRoaXMuaW5UaWxlQm91bmRzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdXBlci5kaXNjYXJkKGJib3hlcywgZXhjbHVkZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbn1cblxuLy8gUGxhY2VtZW50IHN0cmF0ZWdpZXNcbkxhYmVsUG9pbnQuUExBQ0VNRU5UID0ge1xuICAgIFZFUlRFWDogMCwgICAgICAgICAgLy8gcGxhY2UgbGFiZWxzIGF0IGVuZHBvaW50cyBvZiBsaW5lIHNlZ21lbnRzXG4gICAgTUlEUE9JTlQ6IDEsICAgICAgICAvLyBwbGFjZSBsYWJlbHMgYXQgbWlkcG9pbnRzIG9mIGxpbmUgc2VnbWVudHNcbiAgICBTUEFDRUQ6IDIsICAgICAgICAgIC8vIHBsYWNlIGxhYmVscyBlcXVhbGx5IHNwYWNlZCBhbG9uZyBsaW5lXG4gICAgQ0VOVFJPSUQ6IDMgICAgICAgICAvLyBwbGFjZSBsYWJlbHMgYXQgY2VudGVyIG9mIHBvbHlnb25zXG59O1xuIiwiLy8gU2V0cyBvZiB2YWx1ZXMgdG8gbWF0Y2ggZm9yIGRpcmVjdGlvbmFsIGFuZCBjb3JuZXIgYW5jaG9yc1xuY29uc3QgbGVmdHMgPSBbJ2xlZnQnLCAndG9wLWxlZnQnLCAnYm90dG9tLWxlZnQnXTtcbmNvbnN0IHJpZ2h0cyA9IFsncmlnaHQnLCAndG9wLXJpZ2h0JywgJ2JvdHRvbS1yaWdodCddO1xuY29uc3QgdG9wcyA9IFsndG9wJywgJ3RvcC1sZWZ0JywgJ3RvcC1yaWdodCddO1xuY29uc3QgYm90dG9tcyA9IFsnYm90dG9tJywgJ2JvdHRvbS1sZWZ0JywgJ2JvdHRvbS1yaWdodCddO1xuXG5sZXQgUG9pbnRBbmNob3I7XG5cbmV4cG9ydCBkZWZhdWx0IFBvaW50QW5jaG9yID0ge1xuXG4gICAgY29tcHV0ZU9mZnNldCAob2Zmc2V0LCBzaXplLCBhbmNob3IsIGJ1ZmZlciA9IG51bGwpIHtcbiAgICAgICAgaWYgKCFhbmNob3IgfHwgYW5jaG9yID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvZmZzZXQyID0gW29mZnNldFswXSwgb2Zmc2V0WzFdXTtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyIHx8IHRoaXMuZGVmYXVsdF9idWZmZXI7XG5cbiAgICAgICAgLy8gQW4gb3B0aW9uYWwgbGVmdC9yaWdodCBvZmZzZXRcbiAgICAgICAgaWYgKHRoaXMuaXNMZWZ0QW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgIG9mZnNldDJbMF0gLT0gc2l6ZVswXSAvIDI7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzBdIC09IGJ1ZmZlclswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzUmlnaHRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlswXSArPSBzaXplWzBdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzBdICs9IGJ1ZmZlclsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFuIG9wdGlvbmFsIHRvcC9ib3R0b20gb2Zmc2V0XG4gICAgICAgIGlmICh0aGlzLmlzVG9wQW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgIG9mZnNldDJbMV0gLT0gc2l6ZVsxXSAvIDI7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID09PSAndG9wJykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMV0gLT0gYnVmZmVyWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNCb3R0b21BbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlsxXSArPSBzaXplWzFdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0MlsxXSArPSBidWZmZXJbM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2Zmc2V0MjtcbiAgICB9LFxuXG4gICAgYWxpZ25Gb3JBbmNob3IgKGFuY2hvcikge1xuICAgICAgICBpZiAoYW5jaG9yICYmIGFuY2hvciAhPT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGVmdEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzUmlnaHRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdjZW50ZXInO1xuICAgIH0sXG5cbiAgICBpc0xlZnRBbmNob3IgKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gKGxlZnRzLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgaXNSaWdodEFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAocmlnaHRzLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgaXNUb3BBbmNob3IgKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gKHRvcHMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICBpc0JvdHRvbUFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAoYm90dG9tcy5pbmRleE9mKGFuY2hvcikgPiAtMSk7XG4gICAgfSxcblxuICAgIC8vIEJ1ZmZlcnM6IFtsZWZ0LCByaWdodCwgdG9wLCBib3R0b21dXG4gICAgZGVmYXVsdF9idWZmZXI6IFsyLjUsIDIuNSwgMS41LCAwLjc1XSxcbiAgICB6ZXJvX2J1ZmZlcjogWzAsIDAsIDAsIDBdXG5cbn07XG4iLCIvLyBMb2dpYyBmb3IgcGxhY2luZyBwb2ludCBsYWJlbHMgYWxvbmcgYSBsaW5lIGdlb21ldHJ5XG5cbmltcG9ydCBMYWJlbFBvaW50IGZyb20gJy4vbGFiZWxfcG9pbnQnO1xuaW1wb3J0IHtpc0Nvb3JkT3V0c2lkZVRpbGV9IGZyb20gJy4uL2J1aWxkZXJzL2NvbW1vbic7XG5cbmNvbnN0IFBMQUNFTUVOVCA9IExhYmVsUG9pbnQuUExBQ0VNRU5UO1xuY29uc3QgZGVmYXVsdF9zcGFjaW5nID0gODA7IC8vIHNwYWNpbmcgb2YgcG9pbnRzIGFsb25nIGxpbmUgaW4gcGl4ZWxzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBsYWNlUG9pbnRzT25MaW5lIChsaW5lLCBzaXplLCBvcHRpb25zKSB7XG4gICAgbGV0IGxhYmVscyA9IFtdO1xuICAgIGxldCBzdHJhdGVneSA9IG9wdGlvbnMucGxhY2VtZW50O1xuICAgIGxldCBtaW5fbGVuZ3RoID0gTWF0aC5tYXgoc2l6ZVswXSwgc2l6ZVsxXSkgKiBvcHRpb25zLnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvICogb3B0aW9ucy51bml0c19wZXJfcGl4ZWw7XG5cbiAgICBzd2l0Y2ggKHN0cmF0ZWd5KXtcbiAgICAgICAgY2FzZSBQTEFDRU1FTlQuU1BBQ0VEOlxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGdldFBvc2l0aW9uc0FuZEFuZ2xlcyhsaW5lLCBtaW5fbGVuZ3RoLCBvcHRpb25zKTtcbiAgICAgICAgICAgIC8vIGZhbHNlIHdpbGwgYmUgcmV0dXJuZWQgaWYgbGluZSBoYXZlIG5vIGxlbmd0aFxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSByZXN1bHQucG9zaXRpb25zO1xuICAgICAgICAgICAgbGV0IGFuZ2xlcyA9IHJlc3VsdC5hbmdsZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gcG9zaXRpb25zW2ldO1xuICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IGFuZ2xlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aWxlX2VkZ2VzID09PSB0cnVlIHx8ICFpc0Nvb3JkT3V0c2lkZVRpbGUocG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IG5ldyBMYWJlbFBvaW50KHBvc2l0aW9uLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBhbmdsZTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBMQUNFTUVOVC5WRVJURVg6XG4gICAgICAgICAgICBsZXQgcCwgcSwgbGFiZWw7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKXtcbiAgICAgICAgICAgICAgICBwID0gbGluZVtpXTtcbiAgICAgICAgICAgICAgICBxID0gbGluZVtpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGlsZV9lZGdlcyA9PT0gdHJ1ZSB8fCAhaXNDb29yZE91dHNpZGVUaWxlKHApKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbmV3IExhYmVsUG9pbnQocCwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLmFuZ2xlID0gZ2V0QW5nbGUocCwgcSwgb3B0aW9ucy5hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFkZCBsYXN0IGVuZHBvaW50XG4gICAgICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbFBvaW50KHEsIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBnZXRBbmdsZShwLCBxLCBvcHRpb25zLmFuZ2xlKTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURQT0lOVDpcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspe1xuICAgICAgICAgICAgICAgIGxldCBwID0gbGluZVtpXTtcbiAgICAgICAgICAgICAgICBsZXQgcSA9IGxpbmVbaSArIDFdO1xuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IFtcbiAgICAgICAgICAgICAgICAgICAgMC41ICogKHBbMF0gKyBxWzBdKSxcbiAgICAgICAgICAgICAgICAgICAgMC41ICogKHBbMV0gKyBxWzFdKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGlsZV9lZGdlcyA9PT0gdHJ1ZSB8fCAhaXNDb29yZE91dHNpZGVUaWxlKHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW1pbl9sZW5ndGggfHwgbm9ybShwLCBxKSA+IG1pbl9sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IG5ldyBMYWJlbFBvaW50KHBvc2l0aW9uLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLmFuZ2xlID0gZ2V0QW5nbGUocCwgcSwgb3B0aW9ucy5hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGxhYmVscztcbn1cblxuZnVuY3Rpb24gZ2V0UG9zaXRpb25zQW5kQW5nbGVzKGxpbmUsIG1pbl9sZW5ndGgsIG9wdGlvbnMpe1xuICAgIGxldCB1cHAgPSBvcHRpb25zLnVuaXRzX3Blcl9waXhlbDtcbiAgICBsZXQgc3BhY2luZyA9IChvcHRpb25zLnBsYWNlbWVudF9zcGFjaW5nIHx8IGRlZmF1bHRfc3BhY2luZykgKiB1cHA7XG5cbiAgICBsZXQgbGVuZ3RoID0gZ2V0TGluZUxlbmd0aChsaW5lKTtcbiAgICBpZiAobGVuZ3RoIDw9IG1pbl9sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBudW1fbGFiZWxzID0gTWF0aC5tYXgoTWF0aC5mbG9vcihsZW5ndGggLyBzcGFjaW5nKSwgMSk7XG4gICAgbGV0IHJlbWFpbmRlciA9IGxlbmd0aCAtIChudW1fbGFiZWxzIC0gMSkgKiBzcGFjaW5nO1xuICAgIGxldCBwb3NpdGlvbnMgPSBbXTtcbiAgICBsZXQgYW5nbGVzID0gW107XG5cbiAgICBsZXQgZGlzdGFuY2UgPSAwLjUgKiByZW1haW5kZXI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1fbGFiZWxzOyBpKyspe1xuICAgICAgICBsZXQge3Bvc2l0aW9uLCBhbmdsZX0gPSBpbnRlcnBvbGF0ZUxpbmUobGluZSwgZGlzdGFuY2UsIG1pbl9sZW5ndGgsIG9wdGlvbnMpO1xuICAgICAgICBpZiAocG9zaXRpb24gIT0gbnVsbCAmJiBhbmdsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaChwb3NpdGlvbik7XG4gICAgICAgICAgICBhbmdsZXMucHVzaChhbmdsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGlzdGFuY2UgKz0gc3BhY2luZztcbiAgICB9XG5cbiAgICByZXR1cm4ge3Bvc2l0aW9ucywgYW5nbGVzfTtcbn1cblxuZnVuY3Rpb24gZ2V0QW5nbGUocCwgcSwgYW5nbGUgPSAwKXtcbiAgICByZXR1cm4gKGFuZ2xlID09PSAnYXV0bycpID8gTWF0aC5hdGFuMihxWzBdIC0gcFswXSwgcVsxXSAtIHBbMV0pIDogYW5nbGU7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVMZW5ndGgobGluZSl7XG4gICAgbGV0IGRpc3RhbmNlID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKXtcbiAgICAgICAgZGlzdGFuY2UgKz0gbm9ybShsaW5lW2ldLCBsaW5lW2krMV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGlzdGFuY2U7XG59XG5cbmZ1bmN0aW9uIG5vcm0ocCwgcSl7XG4gICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhwWzBdIC0gcVswXSwgMikgKyBNYXRoLnBvdyhwWzFdIC0gcVsxXSwgMikpO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUxpbmUobGluZSwgZGlzdGFuY2UsIG1pbl9sZW5ndGgsIG9wdGlvbnMpe1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGxldCBwb3NpdGlvbiwgYW5nbGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aC0xOyBpKyspe1xuICAgICAgICBsZXQgcCA9IGxpbmVbaV07XG4gICAgICAgIGxldCBxID0gbGluZVtpKzFdO1xuXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IG5vcm0ocCwgcSk7XG4gICAgICAgIGlmIChsZW5ndGggPD0gbWluX2xlbmd0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBzdW0gKz0gbGVuZ3RoO1xuXG4gICAgICAgIGlmIChzdW0gPiBkaXN0YW5jZSl7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGludGVycG9sYXRlU2VnbWVudChwLCBxLCBzdW0gLSBkaXN0YW5jZSk7XG4gICAgICAgICAgICBhbmdsZSA9IGdldEFuZ2xlKHAsIHEsIG9wdGlvbnMuYW5nbGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtwb3NpdGlvbiwgYW5nbGV9O1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZVNlZ21lbnQocCwgcSwgZGlzdGFuY2Upe1xuICAgIGxldCBsZW5ndGggPSBub3JtKHAsIHEpO1xuICAgIGxldCByYXRpbyA9IGRpc3RhbmNlIC8gbGVuZ3RoO1xuICAgIHJldHVybiBbXG4gICAgICAgIHJhdGlvICogcFswXSArICgxIC0gcmF0aW8pICogcVswXSxcbiAgICAgICAgcmF0aW8gKiBwWzFdICsgKDEgLSByYXRpbykgKiBxWzFdXG4gICAgXTtcbn1cbiIsImltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwZWF0R3JvdXAge1xuXG4gICAgY29uc3RydWN0b3IgKGtleSwgcmVwZWF0X2Rpc3QsIG1heF9yZXBlYXRfZGlzdCkge1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5yZXBlYXRfZGlzdCA9IHJlcGVhdF9kaXN0O1xuICAgICAgICB0aGlzLnJlcGVhdF9kaXN0X3NxID0gdGhpcy5yZXBlYXRfZGlzdCAqIHRoaXMucmVwZWF0X2Rpc3Q7XG4gICAgICAgIHRoaXMubWF4X3JlcGVhdF9kaXN0X3NxID0gbWF4X3JlcGVhdF9kaXN0ICogbWF4X3JlcGVhdF9kaXN0O1xuICAgICAgICB0aGlzLm9uZV9wZXJfZ3JvdXAgPSAodGhpcy5yZXBlYXRfZGlzdF9zcSA+PSB0aGlzLm1heF9yZXBlYXRfZGlzdF9zcSkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gW107XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYW4gb2JqZWN0IHRvIHNlZSBpZiBpdCdzIGEgcmVwZWF0IGluIHRoaXMgZ3JvdXBcbiAgICBjaGVjayAob2JqKSB7XG4gICAgICAgIC8vIElmIG9ubHkgb25lIG9iamVjdCBhbGxvd2VkIHBlciBncm91cCwgc2hvcnRjdXQgZGlzdGFuY2UgbG9naWNcbiAgICAgICAgaWYgKHRoaXMub25lX3Blcl9ncm91cCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyByZXBvcnRlZCBkaXN0YW5jZSBtYXhlcyBvdXQgYXQgdGhyZXNob2xkIGluIHRoaXMgY2FzZVxuICAgICAgICAgICAgICAgIC8vIChub3QgdHJ1ZSBkaXN0IHZhbHVlIHNpbmNlIHdlIHNraXBwZWQgY2FsY3VsYXRpbmcgaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzdF9zcTogdGhpcy5tYXhfcmVwZWF0X2Rpc3Rfc3EsXG4gICAgICAgICAgICAgICAgICAgIHJlcGVhdF9kaXN0X3NxOiB0aGlzLnJlcGVhdF9kaXN0X3NxLFxuICAgICAgICAgICAgICAgICAgICBvbmVfcGVyX2dyb3VwOiB0aGlzLm9uZV9wZXJfZ3JvdXBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBvYmplY3QgZm9yIHRoaXMgZ3JvdXAgeWV0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBkaXN0YW5jZSBmcm9tIG5ldyBvYmplY3QgdG8gb2JqZWN0cyBhbHJlYWR5IGluIGdyb3VwXG4gICAgICAgIGxldCBwMSA9IG9iai5wb3NpdGlvbjtcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdGhpcy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwMiA9IHRoaXMucG9zaXRpb25zW2ldO1xuICAgICAgICAgICAgbGV0IGR4ID0gcDFbMF0gLSBwMlswXTtcbiAgICAgICAgICAgIGxldCBkeSA9IHAxWzFdIC0gcDJbMV07XG4gICAgICAgICAgICBsZXQgZGlzdF9zcSA9IGR4ICogZHggKyBkeSAqIGR5O1xuXG4gICAgICAgICAgICAvLyBGb3VuZCBhbiBleGlzdGluZyBvYmplY3Qgd2l0aGluIGFsbG93ZWQgZGlzdGFuY2VcbiAgICAgICAgICAgIGlmIChkaXN0X3NxIDwgdGhpcy5yZXBlYXRfZGlzdF9zcSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Rfc3EsXG4gICAgICAgICAgICAgICAgICAgIHJlcGVhdF9kaXN0X3NxOiB0aGlzLnJlcGVhdF9kaXN0X3NxXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBvYmplY3QgdG8gdGhpcyBncm91cFxuICAgIGFkZCAob2JqKSB7XG4gICAgICAgIC8vIG9ubHkgc3RvcmUgb2JqZWN0J3MgcG9zaXRpb24sIHRvIHNhdmUgc3BhY2UgLyBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKG9iaiAmJiBvYmoucG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25zLnB1c2gob2JqLnBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0YXRpYyBtZXRob2RzIGFyZSB1c2VkIHRvIG1hbmFnZSByZXBlYXQgZ3JvdXBzLCB3aXRoaW4gYW5kIGFjcm9zcyB0aWxlc1xuXG4gICAgLy8gUmVzZXQgYWxsIGdyb3VwcyBmb3IgdGhpcyB0aWxlXG4gICAgc3RhdGljIGNsZWFyICh0aWxlKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBzW3RpbGVdID0ge307XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYW4gb2JqZWN0IHRvIHNlZSBpZiBpdCdzIGEgcmVwZWF0IHdpdGhpbiBpdHMgZGVzaWduYXRlZCBncm91cFxuICAgIHN0YXRpYyBjaGVjayAob2JqLCBsYXlvdXQsIHRpbGUpIHtcbiAgICAgICAgaWYgKGxheW91dC5yZXBlYXRfZGlzdGFuY2UgJiYgbGF5b3V0LnJlcGVhdF9ncm91cCAmJiB0aGlzLmdyb3Vwc1t0aWxlXVtsYXlvdXQucmVwZWF0X2dyb3VwXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdLmNoZWNrKG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgYW4gb2JqZWN0IHRvIGl0cyBkZXNpZ25hdGVkIGdyb3VwXG4gICAgc3RhdGljIGFkZCAob2JqLCBsYXlvdXQsIHRpbGUpIHtcbiAgICAgICAgaWYgKGxheW91dC5yZXBlYXRfZGlzdGFuY2UgJiYgbGF5b3V0LnJlcGVhdF9ncm91cCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3Vwc1t0aWxlXVtsYXlvdXQucmVwZWF0X2dyb3VwXSA9IG5ldyBSZXBlYXRHcm91cChcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9ncm91cCxcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9kaXN0YW5jZSxcbiAgICAgICAgICAgICAgICAgICAgUmVwZWF0R3JvdXAubWF4X3JlcGVhdF9kaXN0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdLmFkZChvYmopO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbi8vIEN1cnJlbnQgc2V0IG9mIHJlcGVhdCBncm91cHMsIGdyb3VwZWQgYW5kIGtleWVkIGJ5IHRpbGVcblJlcGVhdEdyb3VwLmdyb3VwcyA9IHt9O1xuXG4vLyBNYXggcmVwZWF0IGRpc3Q6IGZvciBncm91cHMgd2l0aCBhIHJlcGVhdCBkaXN0IGJleW9uZCB0aGlzIHRocmVzaG9sZCwgb25seSBvbmUgbGFiZWxcbi8vIHdpbGwgYmUgYWxsb3dlZCBwZXIgZ3JvdXAsIGUuZy4gc2V0IHRvIHRpbGUgc2l6ZSBmb3Igb25lLWxhYmVsLXBlci10aWxlXG5SZXBlYXRHcm91cC5tYXhfcmVwZWF0X2Rpc3QgPSBHZW8udGlsZV9zY2FsZTtcbiIsImltcG9ydCBUaHJlYWQgZnJvbSAnLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFNjZW5lIGZyb20gJy4vc2NlbmUnO1xuaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5cbi8vIEV4cG9ydHMgbXVzdCBhcHBlYXIgb3V0c2lkZSBhIGZ1bmN0aW9uLCBidXQgd2lsbCBvbmx5IGJlIGRlZmluZWQgaW4gbWFpbiB0aHJlYWQgKGJlbG93KVxuZXhwb3J0IHZhciBMZWFmbGV0TGF5ZXI7XG5leHBvcnQgZnVuY3Rpb24gbGVhZmxldExheWVyKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZXh0ZW5kTGVhZmxldChvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kTGVhZmxldChvcHRpb25zKSB7XG5cbiAgICAvLyBJZiBMZWFmbGV0TGF5ZXIgaXMgYWxyZWFkeSBkZWZpbmVkIHdoZW4gdGhpcyBpcyBjYWxsZWQganVzdCByZXR1cm4gdGhhdCBpbW1lZGlhdGVseVxuICAgIC8vIGUuZy4gaWYgeW91IGNhbGwgbGVhZmxldExheWVyIG11bHRpcGxlIHRpbWVzICh3aGljaCBpcyB2YWxpZClcbiAgICBpZiAodHlwZW9mIExlYWZsZXRMYXllciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMZWFmbGV0TGF5ZXIob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gTGVhZmxldCBsYXllciBmdW5jdGlvbmFsaXR5IGlzIG9ubHkgZGVmaW5lZCBpbiBtYWluIHRocmVhZFxuICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuXG4gICAgICAgIGxldCBMID0gb3B0aW9ucy5sZWFmbGV0IHx8IHdpbmRvdy5MO1xuXG4gICAgICAgIC8vIERldGVybWluZSBpZiB3ZSBhcmUgZXh0ZW5kaW5nIHRoZSBsZWFmbGV0IDAuNy54IFRpbGVMYXllciBjbGFzcywgb3IgdGhlIG5ld2VyXG4gICAgICAgIC8vIGxlYWZsZXQgMS54IEdyaWRMYXllciBjbGFzcy5cbiAgICAgICAgbGV0IGxheWVyQmFzZUNsYXNzID0gTC5HcmlkTGF5ZXIgPyBMLkdyaWRMYXllciA6IEwuVGlsZUxheWVyO1xuICAgICAgICBsZXQgbGVhZmxldFZlcnNpb24gPSBsYXllckJhc2VDbGFzcyA9PT0gTC5HcmlkTGF5ZXIgPyAnMS54JyA6ICcwLjcueCc7XG4gICAgICAgIGxldCBsYXllckNsYXNzQ29uZmlnID0ge307XG5cbiAgICAgICAgLy8gSWYgZXh0ZW5kaW5nIGxlYWZsZXQgMC43LnggVGlsZUxheWVyLCBhZGRpdGlvbmFsIG1vZGlmaWNhdGlvbnMgYXJlIG5lZWRlZFxuICAgICAgICBpZiAobGF5ZXJCYXNlQ2xhc3MgPT09IEwuVGlsZUxheWVyKSB7XG4gICAgICAgICAgICBsYXllckNsYXNzQ29uZmlnLl9hZGRUaWxlID0gZnVuY3Rpb24oKXt9O1xuICAgICAgICAgICAgbGF5ZXJDbGFzc0NvbmZpZy5fcmVtb3ZlVGlsZSA9IGZ1bmN0aW9uKCl7fTtcbiAgICAgICAgICAgIGxheWVyQ2xhc3NDb25maWcuX3Jlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJCYXNlQ2xhc3MucHJvdG90eXBlLl9yZXNldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIC8vIHJlLWFkZCB0aGUgY2FudmFzIHNpbmNlIGJhc2UgY2xhc3MgYHZpZXdyZXNldGAgZXZlbnQgY2FuIHJlbW92ZSBpdFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lICYmIHRoaXMuc2NlbmUuY29udGFpbmVyICYmIHRoaXMuc2NlbmUuY2FudmFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2NlbmUuY2FudmFzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmaW5lIGN1c3RvbSBsYXllciBtZXRob2RzXG4gICAgICAgIE9iamVjdC5hc3NpZ24obGF5ZXJDbGFzc0NvbmZpZywge1xuXG4gICAgICAgICAgICBpbml0aWFsaXplIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNob3dEZWJ1ZyA9ICghb3B0aW9ucy5zaG93RGVidWcgPyBmYWxzZSA6IHRydWUpO1xuXG4gICAgICAgICAgICAgICAgTC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU2NlbmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgLy8gRm9yY2UgbGVhZmxldCB6b29tIGFuaW1hdGlvbnMgb2ZmXG4gICAgICAgICAgICAgICAgdGhpcy5fem9vbUFuaW1hdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjcmVhdGVTY2VuZSAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZSA9IFNjZW5lLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNjZW5lLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW1Xb3JrZXJzOiB0aGlzLm9wdGlvbnMubnVtV29ya2VycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZVVwZGF0ZTogdGhpcy5vcHRpb25zLnByZVVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RVcGRhdGU6IHRoaXMub3B0aW9ucy5wb3N0VXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91c1pvb206IChMZWFmbGV0TGF5ZXIubGVhZmxldFZlcnNpb24gPT09ICcxLngnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hEZW5zaXR5RGlzcGxheTogdGhpcy5vcHRpb25zLmhpZ2hEZW5zaXR5RGlzcGxheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0xldmVsOiB0aGlzLm9wdGlvbnMubG9nTGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRyb3NwZWN0aW9uOiB0aGlzLm9wdGlvbnMuaW50cm9zcGVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2VkIG9wdGlvbiwgYXBwIHdpbGwgaGF2ZSB0byBtYW51YWxseSBjYWxsZWQgc2NlbmUudXBkYXRlKCkgcGVyIGZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUmVuZGVyTG9vcDogdGhpcy5vcHRpb25zLmRpc2FibGVSZW5kZXJMb29wLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZWQgb3B0aW9uLCB3aWxsIHJlcXVpcmUgbGlicmFyeSB0byBiZSBzZXJ2ZWQgYXMgc2FtZSBob3N0IGFzIHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93Q3Jvc3NEb21haW5Xb3JrZXJzOiB0aGlzLm9wdGlvbnMuYWxsb3dDcm9zc0RvbWFpbldvcmtlcnNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBGaW5pc2ggaW5pdGlhbGl6aW5nIHNjZW5lIGFuZCBzZXR1cCBldmVudHMgd2hlbiBsYXllciBpcyBhZGRlZCB0byBtYXBcbiAgICAgICAgICAgIG9uQWRkIChtYXApIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTY2VuZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxheWVyQmFzZUNsYXNzLnByb3RvdHlwZS5vbkFkZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5yZXNpemUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdyZXNpemUnLCB0aGlzLmhvb2tzLnJlc2l6ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLm1vdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl91cGRhdGluZ190YW5ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBtYXAuZ2V0Q2VudGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuem9vbSA9IE1hdGgubWluKG1hcC5nZXRab29tKCksIG1hcC5nZXRNYXhab29tKCkgfHwgR2VvLmRlZmF1bHRfdmlld19tYXhfem9vbSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS52aWV3LnNldFZpZXcodmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuaW1tZWRpYXRlUmVkcmF3KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJzZVRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ21vdmUnLCB0aGlzLmhvb2tzLm1vdmUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy56b29tc3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl91cGRhdGluZ190YW5ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS52aWV3LnN0YXJ0Wm9vbSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ3pvb21zdGFydCcsIHRoaXMuaG9va3Muem9vbXN0YXJ0KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MuZHJhZ3N0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0UGFubmluZyh0cnVlKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignZHJhZ3N0YXJ0JywgdGhpcy5ob29rcy5kcmFnc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5tb3ZlZW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0UGFubmluZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5ob29rcy5tb3ZlZW5kKTtcblxuICAgICAgICAgICAgICAgIC8vIEZvcmNlIGxlYWZsZXQgem9vbSBhbmltYXRpb25zIG9mZlxuICAgICAgICAgICAgICAgIG1hcC5fem9vbUFuaW1hdGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBNb2RpZnkgZGVmYXVsdCBMZWFmbGV0IGJlaGF2aW9yc1xuICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5U2Nyb2xsV2hlZWxCZWhhdmlvcihtYXApO1xuICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5RG91YmxlQ2xpY2tab29tKG1hcCk7XG5cbiAgICAgICAgICAgICAgICAvLyBTZXR1cCBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dXBTZWxlY3Rpb25FdmVudEhhbmRsZXJzKG1hcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25FdmVudHModGhpcy5vcHRpb25zLmV2ZW50cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgR0wgY2FudmFzIHRvIGxheWVyIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcblxuICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgdmlld1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplT25GaXJzdFZpc2libGUoKTtcblxuICAgICAgICAgICAgICAgIC8vIFN1YnNjcmliZSB0byB0YW5ncmFtIGV2ZW50c1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZTogdGhpcy5vblRhbmdyYW1WaWV3VXBkYXRlLmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIFVzZSBsZWFmbGV0J3MgZXhpc3RpbmcgZXZlbnQgc3lzdGVtIGFzIHRoZSBjYWxsYmFjayBtZWNoYW5pc21cbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmxvYWQodGhpcy5vcHRpb25zLnNjZW5lLFxuICAgICAgICAgICAgICAgICAgICB7IGNvbmZpZ19wYXRoOiB0aGlzLm9wdGlvbnMuc2NlbmVCYXNlUGF0aCwgYmxvY2tpbmc6IGZhbHNlIH0pLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXZlcnNlVHJhbnNmb3JtKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnaW5pdCcpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9uUmVtb3ZlIChtYXApIHtcbiAgICAgICAgICAgICAgICBsYXllckJhc2VDbGFzcy5wcm90b3R5cGUub25SZW1vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ3Jlc2l6ZScsIHRoaXMuaG9va3MucmVzaXplKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdtb3ZlJywgdGhpcy5ob29rcy5tb3ZlKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCd6b29tc3RhcnQnLCB0aGlzLmhvb2tzLnpvb21zdGFydCk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignZHJhZ3N0YXJ0JywgdGhpcy5ob29rcy5kcmFnc3RhcnQpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ21vdmVlbmQnLCB0aGlzLmhvb2tzLm1vdmVlbmQpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ2NsaWNrJywgdGhpcy5ob29rcy5jbGljayk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW91c2Vtb3ZlJywgdGhpcy5ob29rcy5tb3VzZW1vdmUpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ21vdXNlb3V0JywgdGhpcy5ob29rcy5tb3VzZW91dCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMuaG9va3MudmlzaWJpbGl0eWNoYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNyZWF0ZVRpbGUgKGNvb3Jkcykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBjb29yZHMueCArICcvJyArIGNvb3Jkcy55ICsgJy8nICsgY29vcmRzLno7XG4gICAgICAgICAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGlsZS1rZXknLCBrZXkpO1xuICAgICAgICAgICAgICAgIGRpdi5zdHlsZS53aWR0aCA9ICcyNTZweCc7XG4gICAgICAgICAgICAgICAgZGl2LnN0eWxlLmhlaWdodCA9ICcyNTZweCc7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dEZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVidWdfb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnRleHRDb250ZW50ID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5sZWZ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS50b3AgPSAwO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLmNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5mb250U2l6ZSA9ICcxNnB4JztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS50ZXh0T3V0bGluZSA9ICcxcHggIzAwMDAwMCc7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUucGFkZGluZyA9ICc4cHgnO1xuXG4gICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkZWJ1Z19vdmVybGF5KTtcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlclN0eWxlID0gJ3NvbGlkJztcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlckNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlcldpZHRoID0gJzFweCc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpdjtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIE1vZGlmeSBsZWFmbGV0J3MgZGVmYXVsdCBzY3JvbGwgd2hlZWwgYmVoYXZpb3IgdG8gcmVuZGVyIGZyYW1lcyBtb3JlIGZyZXF1ZW50bHlcbiAgICAgICAgICAgIC8vIChzaG91bGQgZ2VuZXJhbGx5IGxlYWQgdG8gc21vb3RoZXIgc2Nyb2xsIHdpdGggVGFuZ3JhbSBmcmFtZSByZS1yZW5kZXIpXG4gICAgICAgICAgICBtb2RpZnlTY3JvbGxXaGVlbEJlaGF2aW9yIChtYXApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZS52aWV3LmNvbnRpbnVvdXNfem9vbSAmJiBtYXAuc2Nyb2xsV2hlZWxab29tICYmIHRoaXMub3B0aW9ucy5tb2RpZnlTY3JvbGxXaGVlbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwLm9wdGlvbnMuem9vbVNuYXAgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSBtYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5kaXNhYmxlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5fb25XaGVlbFNjcm9sbCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsdGEgPSBMLkRvbUV2ZW50LmdldFdoZWVsRGVsdGEoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWx0YSArPSBkZWx0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RNb3VzZVBvcyA9IHRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BlcmZvcm1ab29tKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBMLkRvbUV2ZW50LnN0b3AoZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5fcGVyZm9ybVpvb20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSBtYXAuZ2V0Wm9vbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuX3N0b3AoKTsgLy8gc3RvcCBwYW5uaW5nIGFuZCBmbHkgYW5pbWF0aW9ucyBpZiBhbnlcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbHRhID0gdGhpcy5fZGVsdGEgLyAodGhpcy5fbWFwLm9wdGlvbnMud2hlZWxQeFBlclpvb21MZXZlbCAqIDQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsdGEgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHpvb20gKyBkZWx0YSkgPj0gdGhpcy5fbWFwLmdldE1heFpvb20oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gdGhpcy5fbWFwLmdldE1heFpvb20oKSAtIHpvb207IC8vIGRvbid0IGdvIHBhc3QgbWF4IHpvb21cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWx0YSkgeyByZXR1cm47IH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5vcHRpb25zLnNjcm9sbFdoZWVsWm9vbSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0Wm9vbSh6b29tICsgZGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0Wm9vbUFyb3VuZCh0aGlzLl9sYXN0TW91c2VQb3MsIHpvb20gKyBkZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBNb2RpZnkgbGVhZmxldCdzIGRlZmF1bHQgZG91YmxlLWNsaWNrIHpvb20gYmVoYXZpb3IsIHRvIG1hdGNoIHR5cGljYWwgdmVjdG9yIGJhc2VtYXAgcHJvZHVjdHNcbiAgICAgICAgICAgIG1vZGlmeURvdWJsZUNsaWNrWm9vbSAobWFwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUudmlldy5jb250aW51b3VzX3pvb20gJiYgbWFwLmRvdWJsZUNsaWNrWm9vbSAmJiB0aGlzLm9wdGlvbnMubW9kaWZ5RG91YmxlQ2xpY2tab29tICE9PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE1vZGlmaWVkIHZlcnNpb24gb2YgTGVhZmxldCdzIHNldFpvb21Bcm91bmQgdGhhdCBkb2Vzbid0IHRyaWdnZXIgYSBtb3ZlRW5kIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldFpvb21Bcm91bmROb01vdmVFbmQgPSBmdW5jdGlvbiAobWFwLCBsYXRsbmcsIHpvb20sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY2FsZSA9IG1hcC5nZXRab29tU2NhbGUoem9vbSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0hhbGYgPSBtYXAuZ2V0U2l6ZSgpLmRpdmlkZUJ5KDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclBvaW50ID0gbGF0bG5nIGluc3RhbmNlb2YgTC5Qb2ludCA/IGxhdGxuZyA6IG1hcC5sYXRMbmdUb0NvbnRhaW5lclBvaW50KGxhdGxuZyksXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJPZmZzZXQgPSBjb250YWluZXJQb2ludC5zdWJ0cmFjdCh2aWV3SGFsZikubXVsdGlwbHlCeSgxIC0gMSAvIHNjYWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDZW50ZXIgPSBtYXAuY29udGFpbmVyUG9pbnRUb0xhdExuZyh2aWV3SGFsZi5hZGQoY2VudGVyT2Zmc2V0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXAuX21vdmUobmV3Q2VudGVyLCB6b29tLCB7IGZseVRvOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBMZWFmbGV0J3MgZmx5VG8sIGZvciBzaG9ydCBhbmltYXRpb25zIHpvb21pbmcgYXJvdW5kIGEgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmx5QXJvdW5kID0gZnVuY3Rpb24gKG1hcCwgdGFyZ2V0Q2VudGVyLCB0YXJnZXRab29tLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlIHx8ICFMLkJyb3dzZXIuYW55M2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnNldFZpZXcodGFyZ2V0Q2VudGVyLCB0YXJnZXRab29tLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLl9zdG9wKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydFpvb20gPSBtYXAuX3pvb207XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlciA9IEwubGF0TG5nKHRhcmdldENlbnRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRab29tID0gdGFyZ2V0Wm9vbSA9PT0gdW5kZWZpbmVkID8gc3RhcnRab29tIDogdGFyZ2V0Wm9vbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFpvb20gPSBNYXRoLm1pbih0YXJnZXRab29tLCBtYXAuZ2V0TWF4Wm9vbSgpKTsgLy8gZG9uJ3QgZ28gcGFzdCBtYXggem9vbVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnJvbSA9IG1hcC5wcm9qZWN0KG1hcC5nZXRDZW50ZXIoKSwgc3RhcnRab29tKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byA9IG1hcC5wcm9qZWN0KHRhcmdldENlbnRlciwgc3RhcnRab29tKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb24gPyAxMDAwICogb3B0aW9ucy5kdXJhdGlvbiA6IDc1O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmcmFtZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gZHVyYXRpb247XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldXNlIGludGVybmFsIGZseVRvIGZyYW1lIHRvIGVuc3VyZSB0aGVzZSBhbmltYXRpb25zIGFyZSBjYW5jZWxlZCBsaWtlIG90aGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuX2ZseVRvRnJhbWUgPSBMLlV0aWwucmVxdWVzdEFuaW1GcmFtZShmcmFtZSwgbWFwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VudGVyID0gZnJvbS5hZGQodG8uc3VidHJhY3QoZnJvbSkubXVsdGlwbHlCeSh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IFtjZW50ZXIueCwgY2VudGVyLnldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBHZW8ubWV0ZXJzVG9MYXRMbmcoY2VudGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Wm9vbUFyb3VuZE5vTW92ZUVuZChtYXAsIHRhcmdldENlbnRlciwgc3RhcnRab29tICsgKHRhcmdldFpvb20gLSBzdGFydFpvb20pICogdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Wm9vbUFyb3VuZE5vTW92ZUVuZChtYXAsIHRhcmdldENlbnRlciwgdGFyZ2V0Wm9vbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5fbW92ZUVuZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5fbW92ZVN0YXJ0KHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jYWxsKG1hcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE1vZGlmeSB0aGUgZG91YmxlLWNsaWNrIHpvb20gaGFuZGxlciB0byBkbyBhIHNob3J0IHpvb20gYW5pbWF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSBtYXAuZG91YmxlQ2xpY2tab29tLmVuYWJsZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgbWFwLmRvdWJsZUNsaWNrWm9vbS5kaXNhYmxlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbWFwLmRvdWJsZUNsaWNrWm9vbS5fb25Eb3VibGVDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFpvb20gPSBtYXAuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gbWFwLm9wdGlvbnMuem9vbURlbHRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSBlLm9yaWdpbmFsRXZlbnQuc2hpZnRLZXkgPyBvbGRab29tIC0gZGVsdGEgOiBvbGRab29tICsgZGVsdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXAub3B0aW9ucy5kb3VibGVDbGlja1pvb20gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx5QXJvdW5kKG1hcCwgbWFwLmdldENlbnRlcigpLCB6b29tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx5QXJvdW5kKG1hcCwgbWFwLmNvbnRhaW5lclBvaW50VG9MYXRMbmcoZS5jb250YWluZXJQb2ludCksIHpvb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuZG91YmxlQ2xpY2tab29tLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdXBkYXRlVmlldyAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZpZXcgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCk7XG4gICAgICAgICAgICAgICAgdmlldy56b29tID0gTWF0aC5taW4odGhpcy5fbWFwLmdldFpvb20oKSwgdGhpcy5fbWFwLmdldE1heFpvb20oKSB8fCBHZW8uZGVmYXVsdF92aWV3X21heF96b29tKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0Vmlldyh2aWV3KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHVwZGF0ZVNpemUgKCkge1xuICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5fbWFwLmdldFNpemUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnJlc2l6ZU1hcChzaXplLngsIHNpemUueSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICByZXNpemVPbkZpcnN0VmlzaWJsZSAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0X3Zpc2liaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MudmlzaWJpbGl0eWNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0X3Zpc2liaWxpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3Zpc2liaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLmhvb2tzLnZpc2liaWxpdHljaGFuZ2UpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25UYW5ncmFtVmlld1VwZGF0ZSAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXAgfHwgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5zZXRWaWV3KFt0aGlzLnNjZW5lLnZpZXcuY2VudGVyLmxhdCwgdGhpcy5zY2VuZS52aWV3LmNlbnRlci5sbmddLCB0aGlzLnNjZW5lLnZpZXcuem9vbSwgeyBhbmltYXRlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJldmVyc2VUcmFuc2Zvcm0oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICByZW5kZXIgKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudXBkYXRlKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBSZXZlcnNlIHRoZSBDU1MgcG9zaXRpb25pbmcgTGVhZmxldCBhcHBsaWVzIHRvIHRoZSBsYXllciwgc2luY2UgVGFuZ3JhbSdzIFdlYkdMIGNhbnZhc1xuICAgICAgICAgICAgLy8gaXMgZXhwZWN0ZWQgdG8gYmUgJ2Fic29sdXRlbHknIHBvc2l0aW9uZWQuXG4gICAgICAgICAgICByZXZlcnNlVHJhbnNmb3JtICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21hcCB8fCAhdGhpcy5zY2VuZSB8fCAhdGhpcy5zY2VuZS5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciB0b3BfbGVmdCA9IHRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChbMCwgMF0pO1xuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5zZXRQb3NpdGlvbih0aGlzLnNjZW5lLmNvbnRhaW5lciwgdG9wX2xlZnQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gVGllIExlYWZsZXQgZXZlbnQgaGFuZGxlcnMgdG8gVGFuZ3JhbSBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICAgICAgc2V0dXBTZWxlY3Rpb25FdmVudEhhbmRsZXJzIChtYXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzID0ge307XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLmNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5jbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRGZWF0dXJlQXQoZXZlbnQuY29udGFpbmVyUG9pbnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4oc2VsZWN0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBPYmplY3QuYXNzaWduKHt9LCBzZWxlY3Rpb24sIHsgbGVhZmxldF9ldmVudDogZXZlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuY2xpY2socmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignY2xpY2snLCB0aGlzLmhvb2tzLmNsaWNrKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MubW91c2Vtb3ZlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3ZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRGZWF0dXJlQXQoZXZlbnQuY29udGFpbmVyUG9pbnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4oc2VsZWN0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBPYmplY3QuYXNzaWduKHt9LCBzZWxlY3Rpb24sIHsgbGVhZmxldF9ldmVudDogZXZlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIocmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignbW91c2Vtb3ZlJywgdGhpcy5ob29rcy5tb3VzZW1vdmUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5tb3VzZW91dCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIG1vdXNlIGxlYXZlcyBtYXAsIHNlbmQgYW4gYWRkaXRpb25hbCBzZWxlY3Rpb24gZXZlbnQgdG8gaW5kaWNhdGUgbm8gZmVhdHVyZSBpcyBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIoeyBjaGFuZ2VkOiB0cnVlLCBsZWFmbGV0X2V2ZW50OiBldmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdtb3VzZW91dCcsIHRoaXMuaG9va3MubW91c2VvdXQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gU2V0IHVzZXItZGVmaW5lZCBoYW5kbGVycyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24gZXZlbnRzXG4gICAgICAgICAgICAvLyBDdXJyZW50bHkgb25seSBvbmUgaGFuZGxlciBjYW4gYmUgZGVmaW5lZCBmb3IgZWFjaCBldmVudCB0eXBlXG4gICAgICAgICAgICAvLyBFdmVudCB0eXBlcyBhcmU6IGBjbGlja2AsIGBob3ZlcmAgKGxlYWZsZXQgYG1vdXNlbW92ZWApXG4gICAgICAgICAgICBzZXRTZWxlY3Rpb25FdmVudHMgKGV2ZW50cykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMgPSBPYmplY3QuYXNzaWduKHRoaXMuX3NlbGVjdGlvbl9ldmVudHMsIGV2ZW50cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBsYXllciBjbGFzc1xuICAgICAgICBMZWFmbGV0TGF5ZXIgPSBsYXllckJhc2VDbGFzcy5leHRlbmQobGF5ZXJDbGFzc0NvbmZpZyk7XG5cbiAgICAgICAgLy8gUG9seWZpbGwgc29tZSAxLjAgbWV0aG9kc1xuICAgICAgICBpZiAodHlwZW9mIExlYWZsZXRMYXllci5yZW1vdmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIExlYWZsZXRMYXllci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgncmVtb3ZlJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgTGVhZmxldExheWVyLmxheWVyQmFzZUNsYXNzID0gbGF5ZXJCYXNlQ2xhc3M7XG4gICAgICAgIExlYWZsZXRMYXllci5sZWFmbGV0VmVyc2lvbiA9IGxlYWZsZXRWZXJzaW9uO1xuXG4gICAgICAgIHJldHVybiBuZXcgTGVhZmxldExheWVyKG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbC9nbHNsJztcbmltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuL3ZlY3Rvcic7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuXG5jb25zdCBzaGFkZXJTcmNfYW1iaWVudExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9hbWJpZW50TGlnaHQuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfZGlyZWN0aW9uYWxMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvZGlyZWN0aW9uYWxMaWdodC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19wb2ludExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9wb2ludExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3Nwb3RMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvc3BvdExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuXG4vLyBBYnN0cmFjdCBsaWdodFxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcblxuICAgICAgICBpZiAoY29uZmlnLmFtYmllbnQgPT0gbnVsbCB8fCB0eXBlb2YgY29uZmlnLmFtYmllbnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmFtYmllbnQgPSBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLmFtYmllbnQgfHwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFtYmllbnQgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGNvbmZpZy5hbWJpZW50KS5zbGljZSgwLCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuZGlmZnVzZSA9PSBudWxsIHx8IHR5cGVvZiBjb25maWcuZGlmZnVzZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuZGlmZnVzZSA9IEdMU0wuZXhwYW5kVmVjMyhjb25maWcuZGlmZnVzZSAhPSBudWxsID8gY29uZmlnLmRpZmZ1c2UgOiAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlmZnVzZSA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoY29uZmlnLmRpZmZ1c2UpLnNsaWNlKDAsIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5zcGVjdWxhciA9PSBudWxsIHx8IHR5cGVvZiBjb25maWcuc3BlY3VsYXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLnNwZWN1bGFyID0gR0xTTC5leHBhbmRWZWMzKGNvbmZpZy5zcGVjdWxhciB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3BlY3VsYXIgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGNvbmZpZy5zcGVjdWxhcikuc2xpY2UoMCwgMyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBsaWdodCBieSB0eXBlIG5hbWUsIGZhY3Rvcnktc3R5bGVcbiAgICAvLyAnY29uZmlnJyBtdXN0IGluY2x1ZGUgJ25hbWUnIGFuZCAndHlwZScsIGFsb25nIHdpdGggYW55IG90aGVyIHR5cGUtc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHN0YXRpYyBjcmVhdGUgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBpZiAoTGlnaHQudHlwZXNbY29uZmlnLnR5cGVdKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpZ2h0LnR5cGVzW2NvbmZpZy50eXBlXSh2aWV3LCBjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGxpZ2h0IGZvciBhIHN0eWxlOiBmcmFnbWVudCBsaWdodGluZywgdmVydGV4IGxpZ2h0aW5nLCBvciBub25lXG4gICAgc3RhdGljIHNldE1vZGUgKG1vZGUsIHN0eWxlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBtb2RlID0gJ2ZyYWdtZW50JztcbiAgICAgICAgfVxuICAgICAgICBtb2RlID0gTGlnaHQuZW5hYmxlZCAmJiAoKG1vZGUgIT0gbnVsbCkgPyBtb2RlIDogJ2ZyYWdtZW50Jyk7IC8vIGRlZmF1bHQgdG8gZnJhZ21lbnQgbGlnaHRpbmdcbiAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9MSUdIVElOR19GUkFHTUVOVCddID0gKG1vZGUgPT09ICdmcmFnbWVudCcpO1xuICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX0xJR0hUSU5HX1ZFUlRFWCddID0gKG1vZGUgPT09ICd2ZXJ0ZXgnKTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3QgYWxsIHByb3ZpZGVkIGxpZ2h0IGRlZmluaXRpb25zLCBhbmQgY2FsY3VsYXRlIGN1bXVsYXRpdmUgbGlnaHQgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0IChsaWdodHMpIHtcbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgaW5qZWN0aW9uc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKExpZ2h0LmJsb2NrKTtcblxuICAgICAgICAvLyBJZiBsaWdodGluZyBpcyBnbG9iYWxseSBkaXNhYmxlZCwgbm90aGluZyBpcyBpbmplY3RlZCAobW9zdGx5IGZvciBkZWJ1Z2dpbmcgb3IgbGl2ZSBlZGl0aW5nKVxuICAgICAgICBpZiAoIUxpZ2h0LmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnN0cnVjdCBjb2RlIHRvIGNhbGN1bGF0ZSBlYWNoIGxpZ2h0IGluc3RhbmNlXG4gICAgICAgIGxldCBjYWxjdWxhdGVMaWdodHMgPSBcIlwiO1xuICAgICAgICBpZiAobGlnaHRzICYmIE9iamVjdC5rZXlzKGxpZ2h0cykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gQ29sbGVjdCB1bmlxdWVzIHR5cGVzIG9mIGxpZ2h0c1xuICAgICAgICAgICAgbGV0IHR5cGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBsaWdodF9uYW1lIGluIGxpZ2h0cykge1xuICAgICAgICAgICAgICAgIHR5cGVzW2xpZ2h0c1tsaWdodF9uYW1lXS50eXBlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBlYWNoIHR5cGUgb2YgbGlnaHRcbiAgICAgICAgICAgIGZvciAobGV0IHR5cGUgaW4gdHlwZXMpIHtcbiAgICAgICAgICAgICAgICBMaWdodC50eXBlc1t0eXBlXS5pbmplY3QoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IHBlci1pbnN0YW5jZSBibG9ja3MgYW5kIGNvbnN0cnVjdCB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlIGVhY2ggbGlnaHRcbiAgICAgICAgICAgIGZvciAobGV0IGxpZ2h0X25hbWUgaW4gbGlnaHRzKSB7XG4gICAgICAgICAgICAgICAgLy8gRGVmaW5lIGluc3RhbmNlXG4gICAgICAgICAgICAgICAgbGlnaHRzW2xpZ2h0X25hbWVdLmluamVjdCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjYWxjdWxhdGlvbiBmdW5jdGlvbiB0byB0aGUgbGlzdFxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUxpZ2h0cyArPSBgY2FsY3VsYXRlTGlnaHQoJHtsaWdodF9uYW1lfSwgX2V5ZVRvUG9pbnQsIF9ub3JtYWwpO1xcbmA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHbHVlIHRvZ2V0aGVyIHRoZSBmaW5hbCBsaWdodGluZyBmdW5jdGlvbiB0aGF0IHN1bXMgYWxsIHRoZSBsaWdodHNcbiAgICAgICAgbGV0IGNhbGN1bGF0ZUZ1bmN0aW9uID0gYFxuICAgICAgICAgICAgdmVjNCBjYWxjdWxhdGVMaWdodGluZyhpbiB2ZWMzIF9leWVUb1BvaW50LCBpbiB2ZWMzIF9ub3JtYWwsIGluIHZlYzQgX2NvbG9yKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBEbyBpbml0aWFsIG1hdGVyaWFsIGNhbGN1bGF0aW9ucyBvdmVyIG5vcm1hbCwgZW1pc3Npb24sIGFtYmllbnQsIGRpZmZ1c2UgYW5kIHNwZWN1bGFyIHZhbHVlc1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU1hdGVyaWFsKF9leWVUb1BvaW50LF9ub3JtYWwpO1xuXG4gICAgICAgICAgICAgICAgLy8gVW4gcm9sbCB0aGUgbG9vcCBvZiBpbmRpdmlkdWFsIGxpZ3RocyB0byBjYWxjdWxhdGVcbiAgICAgICAgICAgICAgICAke2NhbGN1bGF0ZUxpZ2h0c31cblxuICAgICAgICAgICAgICAgIC8vICBGaW5hbCBsaWdodCBpbnRlbnNpdHkgY2FsY3VsYXRpb25cbiAgICAgICAgICAgICAgICB2ZWM0IGNvbG9yID0gdmVjNCh2ZWMzKDAuKSwgX2NvbG9yLmEpOyAvLyBzdGFydCB3aXRoIHZlcnRleCBjb2xvciBhbHBoYVxuXG4gICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfRU1JU1NJT05cbiAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiID0gbWF0ZXJpYWwuZW1pc3Npb24ucmdiO1xuICAgICAgICAgICAgICAgICAgICBjb2xvci5hICo9IG1hdGVyaWFsLmVtaXNzaW9uLmE7XG4gICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9BTUJJRU5UXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLnJnYiArPSBsaWdodF9hY2N1bXVsYXRvcl9hbWJpZW50LnJnYiAqIF9jb2xvci5yZ2IgKiBtYXRlcmlhbC5hbWJpZW50LnJnYjtcbiAgICAgICAgICAgICAgICAgICAgY29sb3IuYSAqPSBtYXRlcmlhbC5hbWJpZW50LmE7XG4gICAgICAgICAgICAgICAgI2Vsc2VcbiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRVxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX2FtYmllbnQucmdiICogX2NvbG9yLnJnYiAqIG1hdGVyaWFsLmRpZmZ1c2UucmdiO1xuICAgICAgICAgICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0VcbiAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX2RpZmZ1c2UucmdiICogX2NvbG9yLnJnYiAqIG1hdGVyaWFsLmRpZmZ1c2UucmdiO1xuICAgICAgICAgICAgICAgICAgICBjb2xvci5hICo9IG1hdGVyaWFsLmRpZmZ1c2UuYTtcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX1NQRUNVTEFSXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLnJnYiArPSBsaWdodF9hY2N1bXVsYXRvcl9zcGVjdWxhci5yZ2IgKiBtYXRlcmlhbC5zcGVjdWxhci5yZ2I7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLmEgKj0gbWF0ZXJpYWwuc3BlY3VsYXIuYTtcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgIC8vIENsYW1wIGZpbmFsIGNvbG9yXG4gICAgICAgICAgICAgICAgY29sb3IgPSBjbGFtcChjb2xvciwgMC4wLCAxLjApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yO1xuICAgICAgICAgICAgfWA7XG5cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgY2FsY3VsYXRlRnVuY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIENvbW1vbiBpbnN0YW5jZSBkZWZpbml0aW9uXG4gICAgaW5qZWN0ICgpIHtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gIGBcbiAgICAgICAgICAgIHVuaWZvcm0gJHt0aGlzLnN0cnVjdF9uYW1lfSB1XyR7dGhpcy5uYW1lfTtcbiAgICAgICAgICAgICR7dGhpcy5zdHJ1Y3RfbmFtZX0gJHt0aGlzLm5hbWV9O1xuICAgICAgICAgICAgYDtcbiAgICAgICAgbGV0IGFzc2lnbiA9IGBcbiAgICAgICAgICAgICR7dGhpcy5uYW1lfSA9IHVfJHt0aGlzLm5hbWV9O1xcblxuICAgICAgICBgO1xuXG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIGluc3RhbmNlKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnc2V0dXAnLCBhc3NpZ24pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlICgpIHtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgb25jZSBwZXIgZnJhbWUgcGVyIHByb2dyYW0gKGUuZy4gZm9yIG1haW4gcmVuZGVyIHBhc3MsIHRoZW4gZm9yIGVhY2ggYWRkaXRpb25hbFxuICAgIC8vIHBhc3MgZm9yIGZlYXR1cmUgc2VsZWN0aW9uLCBldGMuKVxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgLy8gIFRocmVlIGNvbW1vbiBsaWdodCBwcm9wZXJ0aWVzXG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5hbWJpZW50YCwgdGhpcy5hbWJpZW50KTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmRpZmZ1c2VgLCB0aGlzLmRpZmZ1c2UpO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uc3BlY3VsYXJgLCB0aGlzLnNwZWN1bGFyKTtcbiAgICB9XG5cbn1cblxuTGlnaHQudHlwZXMgPSB7fTsgLy8gcmVmZXJlbmNlcyB0byBzdWJjbGFzc2VzIGJ5IHNob3J0IG5hbWVcbkxpZ2h0LmJsb2NrID0gJ2xpZ2h0aW5nJzsgLy8gc2hhZGVyIGJsb2NrIG5hbWVcbkxpZ2h0LmVuYWJsZWQgPSB0cnVlOyAvLyBsaWdodGluZyBjYW4gYmUgZ2xvYmFsbHkgZW5hYmxlZC9kaXNhYmxlZFxuXG5cbi8vIExpZ2h0IHN1YmNsYXNzZXNcbmNsYXNzIEFtYmllbnRMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnYW1iaWVudCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnQW1iaWVudExpZ2h0JztcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0KCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfYW1iaWVudExpZ2h0KTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5hbWJpZW50YCwgdGhpcy5hbWJpZW50KTtcbiAgICB9XG5cbn1cbkxpZ2h0LnR5cGVzWydhbWJpZW50J10gPSBBbWJpZW50TGlnaHQ7XG5cbmNsYXNzIERpcmVjdGlvbmFsTGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3VwZXIodmlldywgY29uZmlnKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2RpcmVjdGlvbmFsJztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdEaXJlY3Rpb25hbExpZ2h0JztcblxuICAgICAgICBpZiAoY29uZmlnLmRpcmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gY29uZmlnLmRpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgZGlyZWN0aW9uYWwgbGlnaHQgbWFpbnRhaW5zIGZ1bGwgaW50ZW5zaXR5IG9uIGdyb3VuZCwgd2l0aCBiYXNpYyBleHRydXNpb24gc2hhZGluZ1xuICAgICAgICAgICAgbGV0IHRoZXRhID0gMTM1OyAvLyBhbmdsZSBvZiBsaWdodCBpbiB4eSBwbGFuZSAocm90YXRlZCBhcm91bmQgeiBheGlzKVxuICAgICAgICAgICAgbGV0IHNjYWxlID0gTWF0aC5zaW4oTWF0aC5QSSo2MC8xODApOyAvLyBzY2FsaW5nIGZhY3RvciB0byBrZWVwIHRvdGFsIGRpcmVjdGlvbmFsIGludGVuc2l0eSB0byAwLjVcbiAgICAgICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IFtcbiAgICAgICAgICAgICAgICBNYXRoLmNvcyhNYXRoLlBJKnRoZXRhLzE4MCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICBNYXRoLnNpbihNYXRoLlBJKnRoZXRhLzE4MCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICAtMC41XG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICBpZiAoY29uZmlnLmFtYmllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYW1iaWVudCA9IEdMU0wuZXhwYW5kVmVjMygwLjUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gdGhpcy5fZGlyZWN0aW9uLm1hcChwYXJzZUZsb2F0KTtcbiAgICB9XG5cbiAgICBnZXQgZGlyZWN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpcmVjdGlvbjtcbiAgICB9XG5cbiAgICBzZXQgZGlyZWN0aW9uICh2KSB7XG4gICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IFZlY3Rvci5ub3JtYWxpemUodik7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IHN0cnVjdCBhbmQgY2FsY3VsYXRlIGZ1bmN0aW9uXG4gICAgc3RhdGljIGluamVjdCgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX2RpcmVjdGlvbmFsTGlnaHQpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgc3VwZXIuc2V0dXBQcm9ncmFtKF9wcm9ncmFtKTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmRpcmVjdGlvbmAsIHRoaXMuZGlyZWN0aW9uKTtcbiAgICB9XG5cbn1cbkxpZ2h0LnR5cGVzWydkaXJlY3Rpb25hbCddID0gRGlyZWN0aW9uYWxMaWdodDtcblxuXG5jbGFzcyBQb2ludExpZ2h0IGV4dGVuZHMgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAncG9pbnQnO1xuICAgICAgICB0aGlzLnN0cnVjdF9uYW1lID0gJ1BvaW50TGlnaHQnO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBjb25maWcucG9zaXRpb24gfHwgWzAsIDAsICcxMDBweCddO1xuICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZSA9IFtdOyAvLyBwb3NpdGlvbiBpbiBleWVzcGFjZVxuICAgICAgICB0aGlzLm9yaWdpbiA9IGNvbmZpZy5vcmlnaW4gfHwgJ2dyb3VuZCc7XG4gICAgICAgIHRoaXMuYXR0ZW51YXRpb24gPSAhaXNOYU4ocGFyc2VGbG9hdChjb25maWcuYXR0ZW51YXRpb24pKSA/IHBhcnNlRmxvYXQoY29uZmlnLmF0dGVudWF0aW9uKSA6IDA7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5yYWRpdXMpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5yYWRpdXMpICYmIGNvbmZpZy5yYWRpdXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSBjb25maWcucmFkaXVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSBbbnVsbCwgY29uZmlnLnJhZGl1c107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJhZGl1cyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0ICgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX3BvaW50TGlnaHQpO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBpc250YW5jZS1zcGVjaWZpYyBzZXR0aW5nc1xuICAgIGluamVjdCgpIHtcbiAgICAgICAgc3VwZXIuaW5qZWN0KCk7XG5cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fRVhQT05FTlQnXSA9ICh0aGlzLmF0dGVudWF0aW9uICE9PSAwKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fSU5ORVJfUkFESVVTJ10gPSAodGhpcy5yYWRpdXMgIT0gbnVsbCAmJiB0aGlzLnJhZGl1c1swXSAhPSBudWxsKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fT1VURVJfUkFESVVTJ10gPSAodGhpcy5yYWRpdXMgIT0gbnVsbCk7XG4gICAgfVxuXG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVFeWVQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIHVwZGF0ZUV5ZVBvc2l0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMub3JpZ2luID09PSAnd29ybGQnKSB7XG4gICAgICAgICAgICAvLyBGb3Igd29ybGQgb3JpZ2luLCBmb3JtYXQgaXM6IFtsb25naXR1ZGUsIGxhdGl0dWRlLCBtZXRlcnMgKGRlZmF1bHQpIG9yIHBpeGVscyB3L3B4IHVuaXRzXVxuXG4gICAgICAgICAgICAvLyBNb3ZlIGxpZ2h0J3Mgd29ybGQgcG9zaXRpb24gaW50byBjYW1lcmEgc3BhY2VcbiAgICAgICAgICAgIGxldCBbeCwgeV0gPSBHZW8ubGF0TG5nVG9NZXRlcnModGhpcy5wb3NpdGlvbik7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVswXSA9IHggLSB0aGlzLnZpZXcuY2FtZXJhLnBvc2l0aW9uX21ldGVyc1swXTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzFdID0geSAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzFdO1xuXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsyXSA9IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh0aGlzLnBvc2l0aW9uWzJdLFxuICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSk7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsyXSA9IHRoaXMucG9zaXRpb25fZXllWzJdIC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMl07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5vcmlnaW4gPT09ICdncm91bmQnIHx8IHRoaXMub3JpZ2luID09PSAnY2FtZXJhJykge1xuICAgICAgICAgICAgLy8gRm9yIGNhbWVyYSBvciBncm91bmQgb3JpZ2luLCBmb3JtYXQgaXM6IFt4LCB5LCB6XSBpbiBtZXRlcnMgKGRlZmF1bHQpIG9yIHBpeGVscyB3L3B4IHVuaXRzXG5cbiAgICAgICAgICAgIC8vIExpZ2h0IGlzIGluIGNhbWVyYSBzcGFjZSBieSBkZWZhdWx0XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZSA9IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh0aGlzLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9yaWdpbiA9PT0gJ2dyb3VuZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBMZWF2ZSBsaWdodCdzIHh5IGluIGNhbWVyYSBzcGFjZSwgYnV0IHogbmVlZHMgdG8gYmUgbW92ZWQgcmVsYXRpdmUgdG8gZ3JvdW5kIHBsYW5lXG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMl0gPSB0aGlzLnBvc2l0aW9uX2V5ZVsyXSAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zaXRpb25fZXllWzNdID0gMTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIHN1cGVyLnNldHVwUHJvZ3JhbShfcHJvZ3JhbSk7XG5cbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnNGZ2JywgYHVfJHt0aGlzLm5hbWV9LnBvc2l0aW9uYCwgdGhpcy5wb3NpdGlvbl9leWUpO1xuXG4gICAgICAgIGlmKFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX0VYUE9ORU5UJ10pIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LmF0dGVudWF0aW9uRXhwb25lbnRgLCB0aGlzLmF0dGVudWF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX0lOTkVSX1JBRElVUyddKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5pbm5lclJhZGl1c2AsXG4gICAgICAgICAgICAgICAgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucmFkaXVzWzBdLFxuICAgICAgICAgICAgICAgICAgICB7IHpvb206IHRoaXMudmlldy56b29tLCBtZXRlcnNfcGVyX3BpeGVsOiBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy52aWV3Lnpvb20pIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX09VVEVSX1JBRElVUyddKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5vdXRlclJhZGl1c2AsXG4gICAgICAgICAgICAgICAgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucmFkaXVzWzFdLFxuICAgICAgICAgICAgICAgICAgICB7IHpvb206IHRoaXMudmlldy56b29tLCBtZXRlcnNfcGVyX3BpeGVsOiBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy52aWV3Lnpvb20pIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkxpZ2h0LnR5cGVzWydwb2ludCddID0gUG9pbnRMaWdodDtcblxuXG5jbGFzcyBTcG90TGlnaHQgZXh0ZW5kcyBQb2ludExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yICh2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3VwZXIodmlldywgY29uZmlnKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3Nwb3RsaWdodCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnU3BvdExpZ2h0JztcblxuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHRoaXMuX2RpcmVjdGlvbiA9IChjb25maWcuZGlyZWN0aW9uIHx8IFswLCAwLCAtMV0pLm1hcChwYXJzZUZsb2F0KTsgLy8gW3gsIHksIHpdXG4gICAgICAgIHRoaXMuZXhwb25lbnQgPSBjb25maWcuZXhwb25lbnQgPyBwYXJzZUZsb2F0KGNvbmZpZy5leHBvbmVudCkgOiAwLjI7XG4gICAgICAgIHRoaXMuYW5nbGUgPSBjb25maWcuYW5nbGUgPyBwYXJzZUZsb2F0KGNvbmZpZy5hbmdsZSkgOiAyMDtcbiAgICB9XG5cbiAgICBnZXQgZGlyZWN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpcmVjdGlvbjtcbiAgICB9XG5cbiAgICBzZXQgZGlyZWN0aW9uICh2KSB7XG4gICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IFZlY3Rvci5ub3JtYWxpemUodik7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IHN0cnVjdCBhbmQgY2FsY3VsYXRlIGZ1bmN0aW9uXG4gICAgc3RhdGljIGluamVjdCAoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIHNoYWRlclNyY19zcG90TGlnaHQpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgc3VwZXIuc2V0dXBQcm9ncmFtKF9wcm9ncmFtKTtcblxuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uZGlyZWN0aW9uYCwgdGhpcy5kaXJlY3Rpb24pO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5zcG90Q29zQ3V0b2ZmYCwgTWF0aC5jb3ModGhpcy5hbmdsZSAqIDMuMTQxNTkgLyAxODApKTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCBgdV8ke3RoaXMubmFtZX0uc3BvdEV4cG9uZW50YCwgdGhpcy5leHBvbmVudCk7XG4gICAgfVxuXG59XG5MaWdodC50eXBlc1snc3BvdGxpZ2h0J10gPSBTcG90TGlnaHQ7XG4iLCJpbXBvcnQgR0xTTCBmcm9tICcuL2dsL2dsc2wnO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoYWRlclNyY19tYXRlcmlhbCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvbWF0ZXJpYWwuZ2xzbCcsICd1dGY4Jyk7XG5cbmNvbnN0IG1hdGVyaWFsX3Byb3BzID0gWydlbWlzc2lvbicsICdhbWJpZW50JywgJ2RpZmZ1c2UnLCAnc3BlY3VsYXInXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWF0ZXJpYWwge1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcpIHtcblxuICAgICAgICBjb25maWcgPSBjb25maWcgfHwge307XG5cbiAgICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBhbGwgaGF2ZSB0aGUgc2FtZSBkZWZhdWx0cywgc28gdGhleSBjYW4gYmUgc2V0IGluIGJ1bGtcbiAgICAgICAgbWF0ZXJpYWxfcHJvcHMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW3Byb3BdO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUudGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZTogdmFsdWUudGV4dHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmc6IHZhbHVlLm1hcHBpbmcgfHwgJ3NwaGVyZW1hcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogR0xTTC5leHBhbmRWZWMzKHZhbHVlLnNjYWxlICE9IG51bGwgPyB2YWx1ZS5zY2FsZSA6IDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50OiBHTFNMLmV4cGFuZFZlYzQodmFsdWUuYW1vdW50ICE9IG51bGwgPyB2YWx1ZS5hbW91bnQgOiAxKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcF0gPSB7IGFtb3VudDogR0xTTC5leHBhbmRWZWM0KHZhbHVlKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcF0gPSB7IGFtb3VudDogU3R5bGVQYXJzZXIucGFyc2VDb2xvcih2YWx1ZSkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4dHJhIHNwZWN1bGFyIHByb3BzXG4gICAgICAgIGlmICh0aGlzLnNwZWN1bGFyKSB7XG4gICAgICAgICAgICB0aGlzLnNwZWN1bGFyLnNoaW5pbmVzcyA9IGNvbmZpZy5zaGluaW5lc3MgPyBwYXJzZUZsb2F0KGNvbmZpZy5zaGluaW5lc3MpIDogMC4yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hcHBpbmdcbiAgICAgICAgaWYgKGNvbmZpZy5ub3JtYWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5ub3JtYWwgPSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZTogY29uZmlnLm5vcm1hbC50ZXh0dXJlLFxuICAgICAgICAgICAgICAgIG1hcHBpbmc6IGNvbmZpZy5ub3JtYWwubWFwcGluZyB8fCAndHJpcGxhbmFyJyxcbiAgICAgICAgICAgICAgICBzY2FsZTogR0xTTC5leHBhbmRWZWMzKGNvbmZpZy5ub3JtYWwuc2NhbGUgIT0gbnVsbCA/IGNvbmZpZy5ub3JtYWwuc2NhbGUgOiAxKSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IGNvbmZpZy5ub3JtYWwuYW1vdW50ICE9IG51bGwgPyBjb25maWcubm9ybWFsLmFtb3VudCA6IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgYSBtYXRlcmlhbCBjb25maWcgYmxvY2sgaGFzIHN1ZmZpY2llbnQgcHJvcGVydGllcyB0byBjcmVhdGUgYSBtYXRlcmlhbFxuICAgIHN0YXRpYyBpc1ZhbGlkIChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLmVtaXNzaW9uID09IG51bGwgJiZcbiAgICAgICAgICAgIGNvbmZpZy5hbWJpZW50ID09IG51bGwgJiZcbiAgICAgICAgICAgIGNvbmZpZy5kaWZmdXNlID09IG51bGwgJiZcbiAgICAgICAgICAgIGNvbmZpZy5zcGVjdWxhciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpbmplY3QgKHN0eWxlKSB7XG4gICAgICAgIC8vIEZvciBlYWNoIHByb3BlcnR5LCBzZXRzIGRlZmluZXMgdG8gY29uZmlndXJlIHRleHR1cmUgbWFwcGluZywgd2l0aCBhIHBhdHRlcm4gbGlrZTpcbiAgICAgICAgLy8gICBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0UsIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRV9URVhUVVJFLCBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0VfVEVYVFVSRV9TUEhFUkVNQVBcbiAgICAgICAgLy8gQWxzbyBzZXRzIGZsYWdzIHRvIGtlZXAgdHJhY2sgb2YgZWFjaCB1bmlxdWUgbWFwcGluZyB0eXBlIGJlaW5nIHVzZWQsIGUuZy46XG4gICAgICAgIC8vICAgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFX1NQSEVSRU1BUFxuICAgICAgICAvLyBFbmFibGVzIHRleHR1cmUgY29vcmRpbmF0ZXMgaWYgbmVlZGVkIGFuZCBub3QgYWxyZWFkeSBvblxuICAgICAgICBtYXRlcmlhbF9wcm9wcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgbGV0IGRlZiA9IGBUQU5HUkFNX01BVEVSSUFMXyR7cHJvcC50b1VwcGVyQ2FzZSgpfWA7XG4gICAgICAgICAgICBsZXQgdGV4ZGVmID0gZGVmICsgJ19URVhUVVJFJztcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbZGVmXSA9ICh0aGlzW3Byb3BdICE9IG51bGwpO1xuICAgICAgICAgICAgaWYgKHRoaXNbcHJvcF0gJiYgdGhpc1twcm9wXS50ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1t0ZXhkZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdHlsZS5kZWZpbmVzW3RleGRlZiArICdfJyArIHRoaXNbcHJvcF0ubWFwcGluZy50b1VwcGVyQ2FzZSgpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1tgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFXyR7dGhpc1twcm9wXS5tYXBwaW5nLnRvVXBwZXJDYXNlKCl9YF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHN0eWxlLnRleGNvb3JkcyB8fCAodGhpc1twcm9wXS5tYXBwaW5nID09PSAndXYnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hcHBpbmdcbiAgICAgICAgLy8gQXMgYW5vdmUsIHNldHMgZmxhZ3MgdG8ga2VlcCB0cmFjayBvZiBlYWNoIHVuaXF1ZSBtYXBwaW5nIHR5cGUgYmVpbmcgdXNlZCwgZS5nLjpcbiAgICAgICAgLy8gICBUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfU1BIRVJFTUFQXG4gICAgICAgIGlmICh0aGlzLm5vcm1hbCAmJiB0aGlzLm5vcm1hbC50ZXh0dXJlKSB7XG4gICAgICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX01BVEVSSUFMX05PUk1BTF9URVhUVVJFJ10gPSB0cnVlO1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9NQVRFUklBTF9OT1JNQUxfVEVYVFVSRV8nICsgdGhpcy5ub3JtYWwubWFwcGluZy50b1VwcGVyQ2FzZSgpXSA9IHRydWU7XG4gICAgICAgICAgICBzdHlsZS5kZWZpbmVzW2BUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfJHt0aGlzLm5vcm1hbC5tYXBwaW5nLnRvVXBwZXJDYXNlKCl9YF0gPSB0cnVlO1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gc3R5bGUudGV4Y29vcmRzIHx8ICh0aGlzLm5vcm1hbC5tYXBwaW5nID09PSAndXYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnJlcGxhY2VTaGFkZXJCbG9jayhNYXRlcmlhbC5ibG9jaywgc2hhZGVyU3JjX21hdGVyaWFsLCAnTWF0ZXJpYWwnKTtcbiAgICAgICAgc3R5bGUuYWRkU2hhZGVyQmxvY2soJ3NldHVwJywgJ1xcbm1hdGVyaWFsID0gdV9tYXRlcmlhbDtcXG4nLCAnTWF0ZXJpYWwnKTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIC8vIEZvciBlYWNoIHByb3BlcnR5LCBzZXRzIHVuaWZvcm1zIGluIHRoZSBwYXR0ZXJuOlxuICAgICAgICAvLyB1X21hdGVyaWFsLmRpZmZ1c2UsIHVfbWF0ZXJpYWwuZGlmZnVzZVNjYWxlIHVfbWF0ZXJpYWxfZGlmZnVzZV90ZXh0dXJlXG4gICAgICAgIG1hdGVyaWFsX3Byb3BzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICBpZiAodGhpc1twcm9wXSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW3Byb3BdLnRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3Byb2dyYW0uc2V0VGV4dHVyZVVuaWZvcm0oYHVfbWF0ZXJpYWxfJHtwcm9wfV90ZXh0dXJlYCwgdGhpc1twcm9wXS50ZXh0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfbWF0ZXJpYWwuJHtwcm9wfVNjYWxlYCwgdGhpc1twcm9wXS5zY2FsZSk7XG4gICAgICAgICAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzRmdicsIGB1X21hdGVyaWFsLiR7cHJvcH1gLCB0aGlzW3Byb3BdLmFtb3VudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzW3Byb3BdLmFtb3VudCkge1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCc0ZnYnLCBgdV9tYXRlcmlhbC4ke3Byb3B9YCwgdGhpc1twcm9wXS5hbW91bnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRXh0cmEgc3BlY3VsYXIgcHJvcHNcbiAgICAgICAgaWYgKHRoaXMuc3BlY3VsYXIpIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfbWF0ZXJpYWwuc2hpbmluZXNzJywgdGhpcy5zcGVjdWxhci5zaGluaW5lc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hcHBpbmdcbiAgICAgICAgaWYgKHRoaXMubm9ybWFsICYmIHRoaXMubm9ybWFsLnRleHR1cmUpIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnNldFRleHR1cmVVbmlmb3JtKCd1X21hdGVyaWFsX25vcm1hbF90ZXh0dXJlJywgdGhpcy5ub3JtYWwudGV4dHVyZSk7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9tYXRlcmlhbC5ub3JtYWxTY2FsZScsIHRoaXMubm9ybWFsLnNjYWxlKTtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfbWF0ZXJpYWwubm9ybWFsQW1vdW50JywgdGhpcy5ub3JtYWwuYW1vdW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuTWF0ZXJpYWwuYmxvY2sgPSAnbWF0ZXJpYWwnO1xuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuaW1wb3J0ICcuL3V0aWxzL3BvbHlmaWxscyc7XG5cbi8vIFRoZSBsZWFmbGV0IGxheWVyIHBsdWdpbiBpcyBjdXJyZW50bHkgdGhlIHByaW1hcnkgcHVibGljIEFQSVxuaW1wb3J0IHtsZWFmbGV0TGF5ZXJ9IGZyb20gJy4vbGVhZmxldF9sYXllcic7XG5cbi8vIFRoZSBzY2VuZSB3b3JrZXIgaXMgb25seSBhY3RpdmF0ZWQgd2hlbiBhIHdvcmtlciB0aHJlYWQgaXMgaW5zdGFudGlhdGVkLCBidXQgbXVzdCBhbHdheXMgYmUgbG9hZGVkXG5pbXBvcnQgU2NlbmUgZnJvbSAnLi9zY2VuZSc7XG5pbXBvcnQge1NjZW5lV29ya2VyfSBmcm9tICcuL3NjZW5lX3dvcmtlcic7XG5cbi8vIEFkZGl0aW9uYWwgbW9kdWxlcyBhcmUgZXhwb3NlZCBmb3IgZGVidWdnaW5nXG5pbXBvcnQgdmVyc2lvbiBmcm9tICcuL3V0aWxzL3ZlcnNpb24nO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuL3ZlY3Rvcic7XG5pbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL3NvdXJjZXMvZGF0YV9zb3VyY2UnO1xuaW1wb3J0ICcuL3NvdXJjZXMvZ2VvanNvbic7XG5pbXBvcnQgJy4vc291cmNlcy90b3BvanNvbic7XG5pbXBvcnQgJy4vc291cmNlcy9tdnQnO1xuaW1wb3J0ICcuL3NvdXJjZXMvcmFzdGVyJztcbmltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWZXJ0ZXhEYXRhIGZyb20gJy4vZ2wvdmVydGV4X2RhdGEnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC90ZXh0dXJlJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuL21hdGVyaWFsJztcbmltcG9ydCBMaWdodCBmcm9tICcuL2xpZ2h0JztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCB7bGF5ZXJfY2FjaGV9IGZyb20gJy4vc3R5bGVzL2xheWVyJztcbmltcG9ydCB7U3R5bGVNYW5hZ2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgRmVhdHVyZVNlbGVjdGlvbiBmcm9tICcuL3NlbGVjdGlvbic7XG5pbXBvcnQgQ2FudmFzVGV4dCBmcm9tICcuL3N0eWxlcy90ZXh0L2NhbnZhc190ZXh0JztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4vdXRpbHMvZGVidWdfc2V0dGluZ3MnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBKU1ppcCBmcm9tICdqc3ppcCc7XG5cbi8vIE1ha2Ugc29tZSBtb2R1bGVzIGFjY2Vzc2libGUgZm9yIGRlYnVnZ2luZ1xudmFyIGRlYnVnID0ge1xuICAgIGxvZyxcbiAgICB5YW1sLFxuICAgIFRocmVhZCxcbiAgICBVdGlscyxcbiAgICBHZW8sXG4gICAgVmVjdG9yLFxuICAgIERhdGFTb3VyY2UsXG4gICAgR0xTTCxcbiAgICBTaGFkZXJQcm9ncmFtLFxuICAgIFZlcnRleERhdGEsXG4gICAgVGV4dHVyZSxcbiAgICBNYXRlcmlhbCxcbiAgICBMaWdodCxcbiAgICBTY2VuZSxcbiAgICBTY2VuZVdvcmtlcixcbiAgICBXb3JrZXJCcm9rZXIsXG4gICAgbGF5ZXJfY2FjaGUsXG4gICAgU3R5bGVNYW5hZ2VyLFxuICAgIFN0eWxlUGFyc2VyLFxuICAgIENvbGxpc2lvbixcbiAgICBGZWF0dXJlU2VsZWN0aW9uLFxuICAgIENhbnZhc1RleHQsXG4gICAgZGVidWdTZXR0aW5nc1xufTtcblxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgVXRpbHMucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoKTtcblxuICAgIC8vIEF0dGFjaCBQcm9taXNlIHBvbHlmaWxsIHRvIHdpbmRvd1xuICAgIC8vIEFsbG93cyBGb250RmFjZU9ic2VydmVyIHRvIHVzZSBwb2x5ZmlsbCAod2l0aG91dCBuZWVkaW5nIHRvIGluY2x1ZGUgaXRzIG93biBkdXBsaWNhdGUgcG9seWZpbGwpXG4gICAgaWYgKHdpbmRvdy5Qcm9taXNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgd2luZG93LlByb21pc2UgPSBQcm9taXNlO1xuICAgICAgICBKU1ppcC5leHRlcm5hbC5Qcm9taXNlID0gUHJvbWlzZTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGxlYWZsZXRMYXllcixcbiAgICBkZWJ1ZyxcbiAgICB2ZXJzaW9uXG59O1xuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgKiBhcyBVUkxzIGZyb20gJy4vdXRpbHMvdXJscyc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IENvbnRleHQgZnJvbSAnLi9nbC9jb250ZXh0JztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWZXJ0ZXhBcnJheU9iamVjdCBmcm9tICcuL2dsL3Zhbyc7XG5pbXBvcnQge1N0eWxlTWFuYWdlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQge1N0eWxlfSBmcm9tICcuL3N0eWxlcy9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFNjZW5lTG9hZGVyIGZyb20gJy4vc2NlbmVfbG9hZGVyJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5pbXBvcnQgTGlnaHQgZnJvbSAnLi9saWdodCc7XG5pbXBvcnQgVGlsZU1hbmFnZXIgZnJvbSAnLi90aWxlX21hbmFnZXInO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9zb3VyY2VzL2RhdGFfc291cmNlJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCBSZW5kZXJTdGF0ZU1hbmFnZXIgZnJvbSAnLi9nbC9yZW5kZXJfc3RhdGUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vc3R5bGVzL3RleHQvZm9udF9tYW5hZ2VyJztcbmltcG9ydCBNZWRpYUNhcHR1cmUgZnJvbSAnLi91dGlscy9tZWRpYV9jYXB0dXJlJztcblxuLy8gTG9hZCBzY2VuZSBkZWZpbml0aW9uOiBwYXNzIGFuIG9iamVjdCBkaXJlY3RseSwgb3IgYSBVUkwgYXMgc3RyaW5nIHRvIGxvYWQgcmVtb3RlbHlcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjZW5lIHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ19zb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHN1YnNjcmliZU1peGluKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuaWQgPSBTY2VuZS5pZCsrO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gbnVsbDsgLy8gd2lsbCBiZSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNjZW5lIGlzIGxvYWRlZFxuICAgICAgICB0aGlzLnNvdXJjZXMgPSB7fTtcblxuICAgICAgICB0aGlzLnZpZXcgPSBuZXcgVmlldyh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50aWxlX21hbmFnZXIgPSBuZXcgVGlsZU1hbmFnZXIoeyBzY2VuZTogdGhpcywgdmlldzogdGhpcy52aWV3IH0pO1xuICAgICAgICB0aGlzLm51bV93b3JrZXJzID0gb3B0aW9ucy5udW1Xb3JrZXJzIHx8IDI7XG4gICAgICAgIHRoaXMud29ya2VyX3VybCA9IG9wdGlvbnMud29ya2VyVXJsO1xuICAgICAgICBpZiAob3B0aW9ucy5kaXNhYmxlVmVydGV4QXJyYXlPYmplY3RzID09PSB0cnVlKSB7XG4gICAgICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBVdGlscy51c2VfaGlnaF9kZW5zaXR5X2Rpc3BsYXkgPSBvcHRpb25zLmhpZ2hEZW5zaXR5RGlzcGxheSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5oaWdoRGVuc2l0eURpc3BsYXkgOiB0cnVlO1xuICAgICAgICBVdGlscy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvKCk7XG5cbiAgICAgICAgdGhpcy5jb25maWcgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbmZpZ19zb3VyY2UgPSBjb25maWdfc291cmNlO1xuICAgICAgICB0aGlzLmNvbmZpZ19zZXJpYWxpemVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19zb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuc3R5bGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyID0gbmV3IFN0eWxlTWFuYWdlcigpO1xuXG4gICAgICAgIHRoaXMuYnVpbGRpbmcgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNrcyBjdXJyZW50IHNjZW5lIGJ1aWxkaW5nIHN0YXRlICh0aWxlcyBiZWluZyBidWlsdCwgZXRjLilcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBhIHJlZHJhd1xuICAgICAgICB0aGlzLmFuaW1hdGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IHJlZHJhdyBldmVyeSBmcmFtZVxuICAgICAgICB0aGlzLnByZVVwZGF0ZSA9IG9wdGlvbnMucHJlVXBkYXRlOyAgICAgICAgICAgICAvLyBvcHRpb25hbCBwcmUtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICB0aGlzLnBvc3RVcGRhdGUgPSBvcHRpb25zLnBvc3RVcGRhdGU7ICAgICAgICAgICAvLyBvcHRpb25hbCBwb3N0LXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcCA9ICFvcHRpb25zLmRpc2FibGVSZW5kZXJMb29wOyAgLy8gZGlzYWJsZSByZW5kZXIgbG9vcCAtIGFwcCB3aWxsIGhhdmUgdG8gbWFudWFsbHkgY2FsbCBTY2VuZS5yZW5kZXIoKSBwZXIgZnJhbWVcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9zdG9wID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyX2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5sYXN0X3JlbmRlcl9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mcmFtZSA9IDA7XG4gICAgICAgIHRoaXMubWVkaWFfY2FwdHVyZSA9IG5ldyBNZWRpYUNhcHR1cmUoKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmludHJvc3BlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldFRpbWUoKTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyO1xuXG4gICAgICAgIHRoaXMubGlnaHRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gbnVsbDtcblxuICAgICAgICB0aGlzLmNyZWF0ZUxpc3RlbmVycygpO1xuICAgICAgICB0aGlzLnVwZGF0aW5nID0gMDtcbiAgICAgICAgdGhpcy5nZW5lcmF0aW9uID0gU2NlbmUuZ2VuZXJhdGlvbjsgLy8gYW4gaWQgdGhhdCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgdGhlIHNjZW5lIGNvbmZpZyBpcyBpbnZhbGlkYXRlZFxuICAgICAgICB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbiA9IFNjZW5lLmdlbmVyYXRpb247IC8vIGxhc3QgZ2VuZXJhdGlvbiBpZCB3aXRoIGEgY29tcGxldGUgdmlld1xuICAgICAgICB0aGlzLnNldHVwRGVidWcoKTtcblxuICAgICAgICB0aGlzLmxvZ19sZXZlbCA9IG9wdGlvbnMubG9nTGV2ZWwgfHwgJ3dhcm4nO1xuICAgICAgICBsb2cuc2V0TGV2ZWwodGhpcy5sb2dfbGV2ZWwpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGUgKGNvbmZpZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NlbmUoY29uZmlnLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHNjZW5lIChvciByZWxvYWQgZXhpc3Rpbmcgc2NlbmUgaWYgbm8gbmV3IHNvdXJjZSBzcGVjaWZpZWQpXG4gICAgLy8gT3B0aW9uczpcbiAgICAvLyAgIGBjb25maWdfcGF0aGA6IGJhc2UgVVJMIGFnYWluc3Qgd2hpY2ggcm9vIHNjZW5lIHJlc291cmNlcyBzaG91bGQgYmUgcmVzb2x2ZWQgKHVzZWZ1bCBmb3IgUGxheSkgKGRlZmF1bHQgbnVsbGwpXG4gICAgLy8gICBgYmxvY2tpbmdgOiBzaG91bGQgcmVuZGVyaW5nIGJsb2NrIG9uIHNjZW5lIGxvYWQgY29tcGxldGlvbiAoZGVmYXVsdCB0cnVlKVxuICAgIGxvYWQoY29uZmlnX3NvdXJjZSA9IG51bGwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXppbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRpbmcrKztcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsdHkgZm9yIHBhc3NpbmcgYGNvbmZpZ19wYXRoYCBzdHJpbmcgYXMgc2Vjb25kIGFyZ3VtZW50XG4gICAgICAgIC8vIChzaW5jZSB0cmFuc2l0aW9uZWQgdG8gdXNpbmcgb3B0aW9ucyBhcmd1bWVudCB0byBhY2NlcHQgbW9yZSBwYXJhbWV0ZXJzKVxuICAgICAgICBvcHRpb25zID0gKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykgPyB7IGNvbmZpZ19wYXRoOiBvcHRpb25zIH0gOiBvcHRpb25zO1xuICAgICAgICBsZXQgY29uZmlnX3BhdGggPSBvcHRpb25zLmNvbmZpZ19wYXRoO1xuXG4gICAgICAgIC8vIFNob3VsZCByZW5kZXJpbmcgYmxvY2sgb24gbG9hZCAobm90IGRlc2lyYWJsZSBmb3IgaW5pdGlhbCBsb2FkLCBvZnRlbiBkZXNpcmVkIGZvciBsaXZlIHN0eWxlLXN3aXRjaGluZylcbiAgICAgICAgb3B0aW9ucy5ibG9ja2luZyA9IChvcHRpb25zLmJsb2NraW5nICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5ibG9ja2luZyA6IHRydWU7XG5cbiAgICAgICAgLy8gTG9hZCBzY2VuZSBkZWZpbml0aW9uIChzb3VyY2VzLCBzdHlsZXMsIGV0Yy4pLCB0aGVuIGNyZWF0ZSBzdHlsZXMgJiB3b3JrZXJzXG4gICAgICAgIHRoaXMuY3JlYXRlQ2FudmFzKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gdGhpcy5sb2FkU2NlbmUoY29uZmlnX3NvdXJjZSwgY29uZmlnX3BhdGgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmNyZWF0ZVdvcmtlcnMoKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmVhdHVyZVNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2NlbmUgbG9hZGVkIGZyb20gYSBKUyBvYmplY3QsIG9yIG1vZGlmaWVkIGJ5IGEgYGxvYWRgIGV2ZW50LCBtYXkgY29udGFpbiBjb21waWxlZCBKUyBmdW5jdGlvbnNcbiAgICAgICAgICAgICAgICAvLyB3aGljaCBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQsIHdoaWxlIG9uZSBsb2FkZWQgb25seSBmcm9tIGEgVVJMIGRvZXMgbm90LlxuICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZV9mdW5jcyA9ICgodHlwZW9mIHRoaXMuY29uZmlnX3NvdXJjZSA9PT0gJ29iamVjdCcpIHx8IHRoaXMuaGFzU3Vic2NyaWJlcnNGb3IoJ2xvYWQnKSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGluZyA9IHRoaXMudXBkYXRlQ29uZmlnKHsgc2VyaWFsaXplX2Z1bmNzLCBmYWRlX2luOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2NraW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0aW5nLS07XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlID0gdGhpcy5jb25maWdfc291cmNlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdF92YWxpZF9jb25maWdfcGF0aCA9IHRoaXMuY29uZmlnX3BhdGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJfbG9vcCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR1cFJlbmRlckxvb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmcgPSAwO1xuXG4gICAgICAgICAgICAvLyBSZXBvcnQgYW5kIHJldmVydCB0byBsYXN0IHZhbGlkIGNvbmZpZyBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGxldCB0eXBlLCBtZXNzYWdlO1xuICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdZQU1MRXhjZXB0aW9uJykge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAneWFtbCc7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICdFcnJvciBwYXJzaW5nIHNjZW5lIFlBTUwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogbW9yZSBlcnJvciB0eXBlc1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnRXJyb3IgaW5pdGlhbGl6aW5nIHNjZW5lJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignZXJyb3InLCB7IHR5cGUsIG1lc3NhZ2UsIGVycm9yLCB1cmw6IHRoaXMuY29uZmlnX3NvdXJjZSB9KTtcblxuICAgICAgICAgICAgbWVzc2FnZSA9IGBTY2VuZS5sb2FkKCkgZmFpbGVkIHRvIGxvYWQgJHt0aGlzLmNvbmZpZ19zb3VyY2V9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3NvdXJjZSkge1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBsb2coJ2luZm8nLCBgU2NlbmUubG9hZCgpIHJldmVydGluZyB0byBsYXN0IHZhbGlkIGNvbmZpZ3VyYXRpb25gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkKHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlLCB0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3BhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nKCdlcnJvcicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXppbmc7XG4gICAgfVxuXG4gICAgLy8gRm9yIEFQSSBjb21wYXRpYmlsaXR5XG4gICAgcmVsb2FkKGNvbmZpZ19zb3VyY2UgPSBudWxsLCBjb25maWdfcGF0aCA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZChjb25maWdfc291cmNlLCBjb25maWdfcGF0aCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX3N0b3AgPSB0cnVlOyAvLyBzY2hlZHVsZSByZW5kZXIgbG9vcCB0byBzdG9wXG5cbiAgICAgICAgdGhpcy5kZXN0cm95TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzICYmIHRoaXMuY2FudmFzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jYW52YXMpO1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdsKSB7XG4gICAgICAgICAgICBUZXh0dXJlLmRlc3Ryb3kodGhpcy5nbCk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuZGVzdHJveSh0aGlzLmdsKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzID0ge307XG5cbiAgICAgICAgICAgIFNoYWRlclByb2dyYW0ucmVzZXQoKTtcblxuICAgICAgICAgICAgLy8gRm9yY2UgY29udGV4dCBsb3NzXG4gICAgICAgICAgICBsZXQgZXh0ID0gdGhpcy5nbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2xvc2VfY29udGV4dCcpO1xuICAgICAgICAgICAgaWYgKGV4dCkge1xuICAgICAgICAgICAgICAgIGV4dC5sb3NlQ29udGV4dCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmdsID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc291cmNlcyA9IHt9O1xuXG4gICAgICAgIHRoaXMuZGVzdHJveVdvcmtlcnMoKTtcbiAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnRpbGVfbWFuYWdlciA9IG51bGw7XG4gICAgfVxuXG4gICAgY3JlYXRlQ2FudmFzKCkge1xuICAgICAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5jb250YWluZXIgfHwgZG9jdW1lbnQuYm9keTtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS50b3AgPSAwO1xuICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5sZWZ0ID0gMDtcblxuICAgICAgICAvLyBGb3JjZSB0YW5ncmFtIGNhbnZhcyB1bmRlcm5lYXRoIGFsbCBsZWFmbGV0IGxheWVycywgYW5kIHNldCBiYWNrZ3JvdW5kIHRvIHRyYW5zcGFyZW50XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY2FudmFzKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5nbCA9IENvbnRleHQuZ2V0Q29udGV4dCh0aGlzLmNhbnZhcywge1xuICAgICAgICAgICAgICAgIGFscGhhOiB0cnVlLCBwcmVtdWx0aXBsaWVkQWxwaGE6IHRydWUsIC8vIFRPRE86IHZhcnkgdy9zY2VuZSBhbHBoYVxuICAgICAgICAgICAgICAgIGRldmljZV9waXhlbF9yYXRpbzogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb3VsZG4ndCBjcmVhdGUgV2ViR0wgY29udGV4dC4gXCIgK1xuICAgICAgICAgICAgICAgIFwiWW91ciBicm93c2VyIG1heSBub3Qgc3VwcG9ydCBXZWJHTCwgb3IgaXQncyB0dXJuZWQgb2ZmPyBcIiArXG4gICAgICAgICAgICAgICAgXCJWaXNpdCBodHRwOi8vd2ViZ2xyZXBvcnQuY29tLyBmb3IgbW9yZSBpbmZvLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNpemVNYXAodGhpcy5jb250YWluZXIuY2xpZW50V2lkdGgsIHRoaXMuY29udGFpbmVyLmNsaWVudEhlaWdodCk7XG4gICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmluaXQodGhpcy5nbCk7XG4gICAgICAgIHRoaXMucmVuZGVyX3N0YXRlcyA9IG5ldyBSZW5kZXJTdGF0ZU1hbmFnZXIodGhpcy5nbCk7XG4gICAgICAgIHRoaXMubWVkaWFfY2FwdHVyZS5zZXRDYW52YXModGhpcy5jYW52YXMpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgVVJMIHRvIGxvYWQgdGhlIHdlYiB3b3JrZXIgZnJvbVxuICAgIGdldFdvcmtlclVybCgpIHtcbiAgICAgICAgbGV0IHdvcmtlcl91cmwgPSB0aGlzLndvcmtlcl91cmwgfHwgVVJMcy5maW5kQ3VycmVudFVSTCgndGFuZ3JhbS5kZWJ1Zy5qcycsICd0YW5ncmFtLm1pbi5qcycpO1xuXG4gICAgICAgIGlmICghd29ya2VyX3VybCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgbG9hZCB3b3JrZXIgYmVjYXVzZSBjb3VsZG4ndCBmaW5kIGJhc2UgVVJMIHRoYXQgbGlicmFyeSB3YXMgbG9hZGVkIGZyb21cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbXBvcnQgY3VzdG9tIGRhdGEgc291cmNlIHNjcmlwdHMgYWxvbmdzaWRlIGNvcmUgbGlicmFyeVxuICAgICAgICAvLyBOT1RFOiB3b3JrYXJvdW5kIGZvciBpc3N1ZSB3aGVyZSBsYXJnZSBsaWJyYXJpZXMgaW50ZXJtaXR0ZW50bHkgZmFpbCB0byBsb2FkIGluIHdlYiB3b3JrZXJzLFxuICAgICAgICAvLyB3aGVuIG11bHRpcGxlIGltcG9ydFNjcmlwdHMoKSBjYWxscyBhcmUgdXNlZC4gTG9hZGluZyBhbGwgc2NyaXB0cyAoaW5jbHVkaW5nIFRhbmdyYW0gaXRzZWxmKVxuICAgICAgICAvLyBpbiBvbmUgY2FsbCBhdCBhdCB3b3JrZXIgY3JlYXRpb24gdGltZSBoYXMgbm90IGV4aGliaXRlZCB0aGUgc2FtZSBpc3N1ZS5cbiAgICAgICAgbGV0IHVybHMgPSBbLi4udGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzXTtcbiAgICAgICAgdXJscy5wdXNoKHdvcmtlcl91cmwpOyAvLyBsb2FkIFRhbmdyYW0gKmxhc3QqIChoYXMgYmVlbiBtb3JlIHJlbGlhYmxlLCB0aG91Z2ggcmVhc29uIHVua25vd24pXG4gICAgICAgIGxldCBib2R5ID0gYGltcG9ydFNjcmlwdHMoJHt1cmxzLm1hcCh1cmwgPT4gYCcke3VybH0nYCkuam9pbignLCcpfSk7YDtcbiAgICAgICAgcmV0dXJuIFVSTHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtib2R5XSwgeyB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcgfSkpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBsaXN0IG9mIGFueSBjdXN0b20gZGF0YSBzb3VyY2Ugc2NyaXB0cyAoaWYgYW55KVxuICAgIHVwZGF0ZURhdGFTb3VyY2VTY3JpcHRzICgpIHtcbiAgICAgICAgbGV0IHByZXZfc2NyaXB0cyA9IFsuLi4odGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzfHxbXSldOyAvLyBzYXZlIGxpc3Qgb2YgcHJldmlvdXNseSBsb2FkZWQgc2NyaXB0c1xuICAgICAgICBsZXQgc2NyaXB0cyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLnNvdXJjZXMpLm1hcChzID0+IHRoaXMuY29uZmlnLnNvdXJjZXNbc10uc2NyaXB0cykuZmlsdGVyKHggPT4geCk7XG4gICAgICAgIGlmIChzY3JpcHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCAnbG9hZGluZyBjdXN0b20gZGF0YSBzb3VyY2Ugc2NyaXB0cyBpbiB3b3JrZXI6Jywgc2NyaXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzID0gW10uY29uY2F0KC4uLnNjcmlwdHMpLnNvcnQoKTtcblxuICAgICAgICAvLyBTY3JpcHRzIGNoYW5nZWQ/XG4gICAgICAgIHJldHVybiAhKHRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0cy5sZW5ndGggPT09IHByZXZfc2NyaXB0cy5sZW5ndGggJiZcbiAgICAgICAgICAgIHRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0cy5ldmVyeSgodiwgaSkgPT4gdiA9PT0gcHJldl9zY3JpcHRzW2ldKSk7XG4gICAgfVxuXG4gICAgLy8gV2ViIHdvcmtlcnMgaGFuZGxlIGhlYXZ5IGR1dHkgdGlsZSBjb25zdHJ1Y3Rpb246IG5ldHdvcmtpbmcsIGdlb21ldHJ5IHByb2Nlc3NpbmcsIGV0Yy5cbiAgICBjcmVhdGVXb3JrZXJzKCkge1xuICAgICAgICAvLyBSZXNldCBvbGQgd29ya2VycyAoaWYgYW55KSBpZiB3ZSBuZWVkIHRvIHJlLWluc3RhbnRpYXRlIHdpdGggbmV3IGV4dGVybmFsIHNjcmlwdHNcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlRGF0YVNvdXJjZVNjcmlwdHMoKSkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95V29ya2VycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLndvcmtlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VXb3JrZXJzKHRoaXMuZ2V0V29ya2VyVXJsKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICAvLyBJbnN0YW50aWF0ZSB3b3JrZXJzIGZyb20gVVJMLCBpbml0IGV2ZW50IGhhbmRsZXJzXG4gICAgbWFrZVdvcmtlcnModXJsKSB7XG4gICAgICAgIHZhciBxdWV1ZSA9IFtdO1xuXG4gICAgICAgIHRoaXMud29ya2VycyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZD0wOyBpZCA8IHRoaXMubnVtX3dvcmtlcnM7IGlkKyspIHtcbiAgICAgICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKHVybCk7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnNbaWRdID0gd29ya2VyO1xuXG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIuYWRkV29ya2VyKHdvcmtlcik7XG5cbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgU2NlbmUubWFrZVdvcmtlcnM6IGluaXRpYWxpemluZyB3b3JrZXIgJHtpZH1gKTtcbiAgICAgICAgICAgIGxldCBfaWQgPSBpZDtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHdvcmtlciwgJ3NlbGYuaW5pdCcsIHRoaXMuaWQsIGlkLCB0aGlzLm51bV93b3JrZXJzLCB0aGlzLmxvZ19sZXZlbCwgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKS50aGVuKFxuICAgICAgICAgICAgICAgIChpZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYFNjZW5lLm1ha2VXb3JrZXJzOiBpbml0aWFsaXplZCB3b3JrZXIgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBgU2NlbmUubWFrZVdvcmtlcnM6IGZhaWxlZCB0byBpbml0aWFsaXplIHdvcmtlciAke19pZH06YCwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZXh0X3dvcmtlciA9IDA7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChxdWV1ZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBsb2cuc2V0V29ya2Vycyh0aGlzLndvcmtlcnMpO1xuXG4gICAgICAgICAgICAvLyBMZXQgVmVydGV4RWxlbWVudHMga25vdyBpZiAzMiBiaXQgaW5kaWNlcyBmb3IgZWxlbWVudCBhcnJheXMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgICAgbGV0IFVpbnQzMl9mbGFnID0gdGhpcy5nbC5nZXRFeHRlbnNpb24oXCJPRVNfZWxlbWVudF9pbmRleF91aW50XCIpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ1ZlcnRleEVsZW1lbnRzLnNldFVpbnQzMkZsYWcnLCBVaW50MzJfZmxhZyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlc3Ryb3lXb3JrZXJzKCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLndvcmtlcnMpKSB7XG4gICAgICAgICAgICBsb2cuc2V0V29ya2VycyhudWxsKTtcbiAgICAgICAgICAgIHRoaXMud29ya2Vycy5mb3JFYWNoKCh3b3JrZXIpID0+IHtcbiAgICAgICAgICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud29ya2VycyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBc3NpZ24gdGlsZSB0byB3b3JrZXIgdGhyZWFkIGJhc2VkIG9uIGRhdGEgc291cmNlXG4gICAgZ2V0V29ya2VyRm9yRGF0YVNvdXJjZShzb3VyY2UpIHtcbiAgICAgICAgbGV0IHdvcmtlcjtcblxuICAgICAgICBpZiAoc291cmNlLnRpbGVkKSB7XG4gICAgICAgICAgICAvLyBSb3VuZCByb2JpbiB0aWxlZCBzb3VyY2VzIGFjcm9zcyBhbGwgd29ya2Vyc1xuICAgICAgICAgICAgd29ya2VyID0gdGhpcy53b3JrZXJzW3RoaXMubmV4dF93b3JrZXJdO1xuICAgICAgICAgICAgdGhpcy5uZXh0X3dvcmtlciA9ICh0aGlzLm5leHRfd29ya2VyICsgMSkgJSB0aGlzLndvcmtlcnMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gUGluIGFsbCB0aWxlcyBmcm9tIGVhY2ggbm9uLXRpbGVkIHNvdXJjZSB0byBhIHNpbmdsZSB3b3JrZXJcbiAgICAgICAgICAgIC8vIFByZXZlbnRzIGRhdGEgZm9yIHRoZXNlIHNvdXJjZXMgZnJvbSBiZWluZyBsb2FkZWQgbW9yZSB0aGFuIG9uY2VcbiAgICAgICAgICAgIHdvcmtlciA9IHRoaXMud29ya2Vyc1tzb3VyY2UuaWQgJSB0aGlzLndvcmtlcnMubGVuZ3RoXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfVxuXG4gICAgLy8gU2NlbmUgaXMgcmVhZHkgZm9yIHJlbmRlcmluZ1xuICAgIHJlYWR5KCkge1xuICAgICAgICBpZiAoIXRoaXMudmlldy5yZWFkeSgpIHx8IE9iamVjdC5rZXlzKHRoaXMuc291cmNlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlc2l6ZSB0aGUgbWFwIHdoZW4gZGV2aWNlIHBpeGVsIHJhdGlvIGNoYW5nZXMsIGUuZy4gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkaXNwbGF5c1xuICAgIHVwZGF0ZURldmljZVBpeGVsUmF0aW8gKCkge1xuICAgICAgICBpZiAoVXRpbHMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpKSB7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi51cGRhdGVEZXZpY2VQaXhlbFJhdGlvJywgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucmVidWlsZCgpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucmVzaXplTWFwKHRoaXMudmlldy5zaXplLmNzcy53aWR0aCwgdGhpcy52aWV3LnNpemUuY3NzLmhlaWdodCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzaXplTWFwKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMudmlldy5zZXRWaWV3cG9ydFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGlmICh0aGlzLmdsKSB7XG4gICAgICAgICAgICBDb250ZXh0LnJlc2l6ZSh0aGlzLmdsLCB3aWR0aCwgaGVpZ2h0LCBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVxdWVzdCBzY2VuZSBiZSByZWRyYXduIGF0IG5leHQgYW5pbWF0aW9uIGxvb3BcbiAgICByZXF1ZXN0UmVkcmF3KCkge1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZWRyYXcgc2NlbmUgaW1tZWRpYXRlbHkgLSBkb24ndCB3YWl0IGZvciBhbmltYXRpb24gbG9vcFxuICAgIC8vIFVzZSBzcGFyaW5nbHksIGJ1dCBmb3IgY2FzZXMgd2hlcmUgeW91IG5lZWQgdGhlIGNsb3Nlc3QgcG9zc2libGUgc3luYyB3aXRoIG90aGVyIFVJIGVsZW1lbnRzLFxuICAgIC8vIHN1Y2ggYXMgb3RoZXIsIG5vbi1XZWJHTCBtYXAgbGF5ZXJzIChlLmcuIExlYWZsZXQgcmFzdGVyIGxheWVycywgbWFya2VycywgZXRjLilcbiAgICBpbW1lZGlhdGVSZWRyYXcoKSB7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHJlbmRlckxvb3AgKCkge1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX2FjdGl2ZSA9IHRydWU7IC8vIG9ubHkgbGV0IHRoZSByZW5kZXIgbG9vcCBpbnN0YW50aWF0ZSBvbmNlXG5cbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgc2NlbmVcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXF1ZXN0IHRoZSBuZXh0IGZyYW1lIGlmIG5vdCBzY2hlZHVsZWQgdG8gc3RvcFxuICAgICAgICBpZiAoIXRoaXMucmVuZGVyX2xvb3Bfc3RvcCkge1xuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJlbmRlckxvb3AuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcl9sb29wX3N0b3AgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2xvb3BfYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXR1cCB0aGUgcmVuZGVyIGxvb3BcbiAgICBzZXR1cFJlbmRlckxvb3AoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnJlbmRlckxvb3AoKTsgfSwgMCk7IC8vIGRlbGF5IHN0YXJ0IGJ5IG9uZSB0aWNrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIC8vIFJlbmRlciBvbiBkZW1hbmRcbiAgICAgICAgdmFyIHdpbGxfcmVuZGVyID0gIShcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID09PSBmYWxzZSB8fFxuICAgICAgICAgICAgdGhpcy51cGRhdGluZyA+IDAgfHxcbiAgICAgICAgICAgIHRoaXMucmVhZHkoKSA9PT0gZmFsc2VcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBQcmUtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnByZVVwZGF0ZSh3aWxsX3JlbmRlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCYWlsIGlmIG5vIG5lZWQgdG8gcmVuZGVyXG4gICAgICAgIGlmICghd2lsbF9yZW5kZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7IC8vIHN1YmNsYXNzZXMgY2FuIHNldCB0aGlzIGJhY2sgdG8gdHJ1ZSB3aGVuIGFuaW1hdGlvbiBpcyBuZWVkZWRcblxuICAgICAgICAvLyBSZW5kZXIgdGhlIHNjZW5lXG4gICAgICAgIHRoaXMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdDb21wbGV0ZSgpOyAvLyBmaXJlcyBldmVudCB3aGVuIHJlbmRlcmVkIHRpbGUgc2V0IG9yIHN0eWxlIGNoYW5nZXNcbiAgICAgICAgdGhpcy5tZWRpYV9jYXB0dXJlLmNvbXBsZXRlU2NyZWVuc2hvdCgpOyAvLyBjb21wbGV0ZXMgc2NyZWVuc2hvdCBjYXB0dXJlIGlmIHJlcXVlc3RlZFxuXG4gICAgICAgIC8vIFBvc3QtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucG9zdFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5wb3N0VXBkYXRlKHdpbGxfcmVuZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlZHJhdyBldmVyeSBmcmFtZSBpZiBhbmltYXRpbmdcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZWQgPT09IHRydWUgfHwgdGhpcy52aWV3LmlzQW5pbWF0aW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mcmFtZSsrO1xuICAgICAgICBsb2coJ3RyYWNlJywgJ1NjZW5lLnJlbmRlcigpJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcblxuICAgICAgICAvLyBVcGRhdGUgc3R5bGVzLCBjYW1lcmEsIGxpZ2h0c1xuICAgICAgICB0aGlzLnZpZXcudXBkYXRlKCk7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMubGlnaHRzKS5mb3JFYWNoKGkgPT4gdGhpcy5saWdodHNbaV0udXBkYXRlKCkpO1xuXG4gICAgICAgIC8vIFJlbmRlciBtYWluIHBhc3NcbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnQgPSB0aGlzLnJlbmRlclBhc3MoKTtcblxuICAgICAgICAvLyBSZW5kZXIgc2VsZWN0aW9uIHBhc3MgKGlmIG5lZWRlZClcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLnBlbmRpbmdSZXF1ZXN0cygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3LnBhbm5pbmcgfHwgdGhpcy52aWV3Lnpvb21pbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhclBlbmRpbmdSZXF1ZXN0cygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uYmluZCgpOyAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBGQk9cbiAgICAgICAgICAgIHRoaXMucmVuZGVyUGFzcyhcbiAgICAgICAgICAgICAgICAnc2VsZWN0aW9uX3Byb2dyYW0nLCAgICAgICAgICAgICAgICAvLyByZW5kZXIgdy9hbHRlcm5hdGUgcHJvZ3JhbVxuICAgICAgICAgICAgICAgIHsgYWxsb3dfYmxlbmQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVhZCgpOyAgICAgICAgICAgICAgICAgIC8vIHJlYWQgcmVzdWx0cyBmcm9tIHNlbGVjdGlvbiBidWZmZXJcblxuICAgICAgICAgICAgLy8gUmVzZXQgdG8gc2NyZWVuIGJ1ZmZlclxuICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnRfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJfY291bnQgIT09IHRoaXMubGFzdF9yZW5kZXJfY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplKCkudGhlbihzaXplID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZSkgeyAvLyByZXR1cm5zIHVuZGVmaW5lZCBpZiBwcmV2aW91cyByZXF1ZXN0IHBlbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdpbmZvJywgYFNjZW5lOiByZW5kZXJlZCAke3RoaXMucmVuZGVyX2NvdW50fSBwcmltaXRpdmVzICgke3NpemV9IGZlYXR1cmVzIGluIHNlbGVjdGlvbiBtYXApYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0X3JlbmRlcl9jb3VudCA9IHRoaXMucmVuZGVyX2NvdW50O1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBhbGwgYWN0aXZlIHN0eWxlcywgZ3JvdXBlZCBieSBibGVuZC9kZXB0aCB0eXBlIChvcGFxdWUsIG92ZXJsYXksIGV0Yy4pIGFuZCBieSBwcm9ncmFtIChzdHlsZSlcbiAgICAvLyBDYWxsZWQgYm90aCBmb3IgbWFpbiByZW5kZXIgcGFzcywgYW5kIGZvciBzZWNvbmRhcnkgcGFzc2VzIGxpa2Ugc2VsZWN0aW9uIGJ1ZmZlclxuICAgIHJlbmRlclBhc3MocHJvZ3JhbV9rZXkgPSAncHJvZ3JhbScsIHsgYWxsb3dfYmxlbmQgfSA9IHt9KSB7XG4gICAgICAgIC8vIG9wdGlvbmFsbHkgZm9yY2UgYWxwaGEgb2ZmIChlLmcuIGZvciBzZWxlY3Rpb24gcGFzcylcbiAgICAgICAgYWxsb3dfYmxlbmQgPSAoYWxsb3dfYmxlbmQgPT0gbnVsbCkgPyB0cnVlIDogYWxsb3dfYmxlbmQ7XG5cbiAgICAgICAgdGhpcy5jbGVhckZyYW1lKHsgY2xlYXJfY29sb3I6IHRydWUsIGNsZWFyX2RlcHRoOiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIFNvcnQgc3R5bGVzIGJ5IGJsZW5kIG9yZGVyXG4gICAgICAgIGxldCBzdHlsZXMgPSB0aGlzLnRpbGVfbWFuYWdlci5nZXRBY3RpdmVTdHlsZXMoKS5cbiAgICAgICAgICAgIG1hcChzID0+IHRoaXMuc3R5bGVzW3NdKS5cbiAgICAgICAgICAgIGZpbHRlcihzID0+IHMpLiAvLyBndWFyZCBhZ2FpbnN0IG1pc3Npbmcgc3R5bGVzLCBzdWNoIGFzIHdoaWxlIGxvYWRpbmcgYSBuZXcgc2NlbmVcbiAgICAgICAgICAgIHNvcnQoU3R5bGUuYmxlbmRPcmRlclNvcnQpO1xuXG4gICAgICAgIC8vIFJlbmRlciBzdHlsZXNcbiAgICAgICAgbGV0IGNvdW50ID0gMDsgLy8gaG93IG1hbnkgcHJpbWl0aXZlcyB3ZXJlIHJlbmRlcmVkXG4gICAgICAgIGxldCBsYXN0X2JsZW5kO1xuICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzdHlsZXMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHN0eWxlc1tzXTtcblxuICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgcmVuZGVyIHN0YXRlIHdoZW4gYmxlbmQgbW9kZSBjaGFuZ2VzXG4gICAgICAgICAgICBpZiAoc3R5bGUuYmxlbmQgIT09IGxhc3RfYmxlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LFxuICAgICAgICAgICAgICAgICAgICBTdHlsZS5yZW5kZXJfc3RhdGVzW3N0eWxlLmJsZW5kXSwgICAgICAgLy8gcmVuZGVyIHN0YXRlIGZvciBibGVuZCBtb2RlXG4gICAgICAgICAgICAgICAgICAgIHsgYmxlbmQ6IChhbGxvd19ibGVuZCAmJiBzdHlsZS5ibGVuZCkgfSAvLyBlbmFibGUvZGlzYWJsZSBibGVuZGluZyAoZS5nLiBubyBibGVuZCBmb3Igc2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJTdGF0ZShzdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudCArPSB0aGlzLnJlbmRlclN0eWxlKHN0eWxlLm5hbWUsIHByb2dyYW1fa2V5KTtcbiAgICAgICAgICAgIGxhc3RfYmxlbmQgPSBzdHlsZS5ibGVuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG5cbiAgICByZW5kZXJTdHlsZShzdHlsZV9uYW1lLCBwcm9ncmFtX2tleSkge1xuICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLnN0eWxlc1tzdHlsZV9uYW1lXTtcbiAgICAgICAgbGV0IGZpcnN0X2Zvcl9zdHlsZSA9IHRydWU7XG4gICAgICAgIGxldCByZW5kZXJfY291bnQgPSAwO1xuICAgICAgICBsZXQgcHJvZ3JhbTtcblxuICAgICAgICAvLyBSZW5kZXIgdGlsZSBHTCBnZW9tZXRyaWVzXG4gICAgICAgIGxldCByZW5kZXJhYmxlX3RpbGVzID0gdGhpcy50aWxlX21hbmFnZXIuZ2V0UmVuZGVyYWJsZVRpbGVzKCk7XG4gICAgICAgIGZvciAobGV0IHQ9MDsgdCA8IHJlbmRlcmFibGVfdGlsZXMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gcmVuZGVyYWJsZV90aWxlc1t0XTtcblxuICAgICAgICAgICAgaWYgKHRpbGUubWVzaGVzW3N0eWxlX25hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3R5bGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgICAgIC8vIE9ubHkgc2V0dXAgc3R5bGUgaWYgcmVuZGVyaW5nIGZvciBmaXJzdCB0aW1lIHRoaXMgZnJhbWVcbiAgICAgICAgICAgIC8vIChsYXp5IGluaXQsIG5vdCBhbGwgc3R5bGVzIHdpbGwgYmUgdXNlZCBpbiBhbGwgc2NyZWVuIHZpZXdzOyBzb21lIHN0eWxlcyBtaWdodCBiZSBkZWZpbmVkIGJ1dCBuZXZlciB1c2VkKVxuICAgICAgICAgICAgaWYgKGZpcnN0X2Zvcl9zdHlsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGZpcnN0X2Zvcl9zdHlsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHByb2dyYW0gPSB0aGlzLnNldHVwU3R5bGUoc3R5bGUsIHByb2dyYW1fa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIXByb2dyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTa2lwIHByb3h5IHRpbGVzIGlmIG5ldyB0aWxlcyBoYXZlIGZpbmlzaGVkIGxvYWRpbmcgdGhpcyBzdHlsZVxuICAgICAgICAgICAgaWYgKCF0aWxlLnNob3VsZFByb3h5Rm9yU3R5bGUoc3R5bGVfbmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgYFNjZW5lLnJlbmRlclN0eWxlKCk6IFNraXAgcHJveHkgdGlsZSBmb3Igc3R5bGUgJyR7c3R5bGVfbmFtZX0nIGAsIHRpbGUsIHRpbGUucHJveHlfZm9yKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGlsZS1zcGVjaWZpYyBzdGF0ZVxuICAgICAgICAgICAgdGhpcy52aWV3LnNldHVwVGlsZSh0aWxlLCBwcm9ncmFtKTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIHRpbGVcbiAgICAgICAgICAgIGxldCBtZXNoID0gdGlsZS5tZXNoZXNbc3R5bGVfbmFtZV07XG4gICAgICAgICAgICBpZiAoc3R5bGUucmVuZGVyKG1lc2gpKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgaW5jdXIgYWRkaXRpb25hbCByZW5kZXJzIHdoaWxlIHZpZXdwb3J0IGlzIG1vdmluZ1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMudmlldy5wYW5uaW5nIHx8IHRoaXMudmlldy56b29taW5nKSkge1xuICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlbmRlcl9jb3VudCArPSBtZXNoLmdlb21ldHJ5X2NvdW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlbmRlcl9jb3VudDtcbiAgICB9XG5cbiAgICBzZXR1cFN0eWxlKHN0eWxlLCBwcm9ncmFtX2tleSkge1xuICAgICAgICAvLyBHZXQgc2hhZGVyIHByb2dyYW0gZnJvbSBzdHlsZSwgbGF6aWx5IGNvbXBpbGluZyBpZiBuZWNlc3NhcnlcbiAgICAgICAgbGV0IHByb2dyYW07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwcm9ncmFtID0gc3R5bGUuZ2V0UHJvZ3JhbShwcm9ncmFtX2tleSk7XG4gICAgICAgICAgICBpZiAoIXByb2dyYW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignd2FybmluZycsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3R5bGVzJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgY29tcGlsaW5nIHN0eWxlICR7c3R5bGUubmFtZX1gLFxuICAgICAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgICAgIHNoYWRlcl9lcnJvcnM6IHN0eWxlLnByb2dyYW0gJiYgc3R5bGUucHJvZ3JhbS5zaGFkZXJfZXJyb3JzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2dyYW0udXNlKCk7XG4gICAgICAgIHN0eWxlLnNldHVwKCk7XG5cbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3RpbWUnLCB0aGlzLmFuaW1hdGVkID8gKCgoK25ldyBEYXRlKCkpIC0gdGhpcy5zdGFydF90aW1lKSAvIDEwMDApIDogMCk7XG4gICAgICAgIHRoaXMudmlldy5zZXR1cFByb2dyYW0ocHJvZ3JhbSk7XG4gICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5saWdodHMpIHtcbiAgICAgICAgICAgIHRoaXMubGlnaHRzW2ldLnNldHVwUHJvZ3JhbShwcm9ncmFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH1cblxuICAgIGNsZWFyRnJhbWUoeyBjbGVhcl9jb2xvciwgY2xlYXJfZGVwdGggfSA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgY2xlYXJfY29sb3IgPSAoY2xlYXJfY29sb3IgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTsgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGNsZWFyX2RlcHRoID0gKGNsZWFyX2RlcHRoID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7IC8vIGRlZmF1bHQgdHJ1ZVxuXG4gICAgICAgIC8vIFNldCBHTCBzdGF0ZVxuICAgICAgICB0aGlzLnJlbmRlcl9zdGF0ZXMuZGVwdGhfd3JpdGUuc2V0KHsgZGVwdGhfd3JpdGU6IGNsZWFyX2RlcHRoIH0pO1xuXG4gICAgICAgIGxldCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGlmIChjbGVhcl9jb2xvciB8fCBjbGVhcl9kZXB0aCkge1xuICAgICAgICAgICAgbGV0IG1hc2sgPSAoY2xlYXJfY29sb3IgJiYgZ2wuQ09MT1JfQlVGRkVSX0JJVCkgfCAoY2xlYXJfZGVwdGggJiYgZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG4gICAgICAgICAgICBnbC5jbGVhcihtYXNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFJlbmRlclN0YXRlKHsgZGVwdGhfdGVzdCwgZGVwdGhfd3JpdGUsIGN1bGxfZmFjZSwgYmxlbmQgfSA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgLy8gVE9ETzogd2hlbiB3ZSBhYnN0cmFjdCBvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgcmVuZGVyIHBhc3NlcywgdGhlc2UgY2FuIGJlIHBlci1wYXNzIGNvbmZpZyBvcHRpb25zXG4gICAgICAgIGxldCByZW5kZXJfc3RhdGVzID0gdGhpcy5yZW5kZXJfc3RhdGVzO1xuICAgICAgICBkZXB0aF90ZXN0ID0gKGRlcHRoX3Rlc3QgPT09IGZhbHNlKSA/IGZhbHNlIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5kZXB0aF90ZXN0OyAgICAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBkZXB0aF93cml0ZSA9IChkZXB0aF93cml0ZSA9PT0gZmFsc2UpID8gZmFsc2UgOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmRlcHRoX3dyaXRlOyAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBjdWxsX2ZhY2UgPSAoY3VsbF9mYWNlID09PSBmYWxzZSkgPyBmYWxzZSA6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuY3VsbGluZzsgICAgICAgICAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBibGVuZCA9IChibGVuZCAhPSBudWxsKSA/IGJsZW5kIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5ibGVuZGluZzsgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgZmFsc2VcblxuICAgICAgICAvLyBSZXNldCBmcmFtZSBzdGF0ZVxuICAgICAgICBsZXQgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgIHJlbmRlcl9zdGF0ZXMuZGVwdGhfdGVzdC5zZXQoeyBkZXB0aF90ZXN0OiBkZXB0aF90ZXN0IH0pO1xuICAgICAgICByZW5kZXJfc3RhdGVzLmRlcHRoX3dyaXRlLnNldCh7IGRlcHRoX3dyaXRlOiBkZXB0aF93cml0ZSB9KTtcbiAgICAgICAgcmVuZGVyX3N0YXRlcy5jdWxsaW5nLnNldCh7IGN1bGw6IGN1bGxfZmFjZSwgZmFjZTogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5jdWxsaW5nX2ZhY2UgfSk7XG5cbiAgICAgICAgLy8gQmxlbmRpbmcgb2YgYWxwaGEgY2hhbm5lbCBpcyBtb2RpZmllZCB0byBhY2NvdW50IGZvciBXZWJHTCBhbHBoYSBiZWhhdmlvciwgc2VlOlxuICAgICAgICAvLyBodHRwOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvd2ViZ2wtYW5kLWFscGhhLmh0bWxcbiAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTE1MzM0MTZcbiAgICAgICAgaWYgKGJsZW5kKSB7XG4gICAgICAgICAgICAvLyBPcGFxdWU6IGFsbCBzb3VyY2UsIG5vIGRlc3RpbmF0aW9uXG4gICAgICAgICAgICBpZiAoYmxlbmQgPT09ICdvcGFxdWUnKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRyYWRpdGlvbmFsIGFscGhhIGJsZW5kaW5nXG4gICAgICAgICAgICBlbHNlIGlmIChibGVuZCA9PT0gJ292ZXJsYXknIHx8IGJsZW5kID09PSAnaW5sYXknKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBnbC5TUkNfQUxQSEEsIGRzdDogZ2wuT05FX01JTlVTX1NSQ19BTFBIQSxcbiAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhOiBnbC5PTkUsIGRzdF9hbHBoYTogZ2wuT05FX01JTlVTX1NSQ19BTFBIQVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWRkaXRpdmUgYmxlbmRpbmdcbiAgICAgICAgICAgIGVsc2UgaWYgKGJsZW5kID09PSAnYWRkJykge1xuICAgICAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYmxlbmQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNyYzogZ2wuT05FLCBkc3Q6IGdsLk9ORVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTXVsdGlwbGljYXRpdmUgYmxlbmRpbmdcbiAgICAgICAgICAgIGVsc2UgaWYgKGJsZW5kID09PSAnbXVsdGlwbHknKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBnbC5aRVJPLCBkc3Q6IGdsLlNSQ19DT0xPUlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoeyBibGVuZDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXF1ZXN0IGZlYXR1cmUgc2VsZWN0aW9uIGF0IGdpdmVuIHBpeGVsLiBSdW5zIGFzeW5jIGFuZCByZXR1cm5zIHJlc3VsdHMgdmlhIGEgcHJvbWlzZS5cbiAgICBnZXRGZWF0dXJlQXQocGl4ZWwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgXCJTY2VuZS5nZXRGZWF0dXJlQXQoKSBjYWxsZWQgYmVmb3JlIHNjZW5lIHdhcyBpbml0aWFsaXplZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBvaW50IHNjYWxlZCB0byBbMC4uMV0gcmFuZ2VcbiAgICAgICAgdmFyIHBvaW50ID0ge1xuICAgICAgICAgICAgeDogcGl4ZWwueCAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAvIHRoaXMudmlldy5zaXplLmRldmljZS53aWR0aCxcbiAgICAgICAgICAgIHk6IHBpeGVsLnkgKiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gLyB0aGlzLnZpZXcuc2l6ZS5kZXZpY2UuaGVpZ2h0XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7IC8vIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBzY2VuZSByZS1yZW5kZXJzIGZvciB0aGVzZSB0byBiZSBwcm9jZXNzZWRcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLmdldEZlYXR1cmVBdChwb2ludCkuXG4gICAgICAgICAgICB0aGVuKHNlbGVjdGlvbiA9PiBPYmplY3QuYXNzaWduKHNlbGVjdGlvbiwgeyBwaXhlbCB9KSkuXG4gICAgICAgICAgICBjYXRjaChlcnJvciA9PiBQcm9taXNlLnJlc29sdmUoeyBlcnJvciB9KSk7XG4gICAgfVxuXG4gICAgLy8gUmVidWlsZCBnZW9tZXRyeSwgd2l0aG91dCByZS1wYXJzaW5nIHRoZSBjb25maWcgb3IgcmUtY29tcGlsaW5nIHN0eWxlc1xuICAgIC8vIFRPRE86IGRldGVjdCB3aGljaCBlbGVtZW50cyBuZWVkIHRvIGJlIHJlZnJlc2hlZC9yZWJ1aWx0IChzdHlsZXNoZWV0IGNoYW5nZXMsIGV0Yy4pXG4gICAgcmVidWlsZChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYnVpbGRHZW9tZXRyeShvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBSZWJ1aWxkIGFsbCB0aWxlc1xuICAgIC8vIHN5bmM6IGJvb2xlYW4gb2Ygd2hldGhlciB0byBzeW5jIHRoZSBjb25maWcgb2JqZWN0IHRvIHRoZSB3b3JrZXJcbiAgICAvLyBzb3VyY2VzOiBvcHRpb25hbCBhcnJheSBvZiBkYXRhIHNvdXJjZXMgdG8gc2VsZWN0aXZlbHkgcmVidWlsZCAoYnkgZGVmYXVsdCBhbGwgb3VyIHJlYnVpbHQpXG4gICAgcmVidWlsZEdlb21ldHJ5KHsgc3luYyA9IHRydWUsIHNvdXJjZXMgPSBudWxsLCBzZXJpYWxpemVfZnVuY3MsIHByb2ZpbGUgPSBmYWxzZSwgZmFkZV9pbiA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gU2tpcCByZWJ1aWxkIGlmIGFscmVhZHkgaW4gcHJvZ3Jlc3NcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gUXVldWUgdXAgdG8gb25lIHJlYnVpbGQgY2FsbCBhdCBhIHRpbWUsIG9ubHkgc2F2ZSBsYXN0IHJlcXVlc3RcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5idWlsZGluZy5xdWV1ZWQgJiYgdGhpcy5idWlsZGluZy5xdWV1ZWQucmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBwcmV2aW91cyByZXF1ZXN0IHRoYXQgaXQgZGlkIG5vdCBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgJ1NjZW5lLnJlYnVpbGQ6IHJlcXVlc3Qgc3VwZXJjZWRlZCBieSBhIG5ld2VyIGNhbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGluZy5xdWV1ZWQucmVzb2x2ZShmYWxzZSk7IC8vIGZhbHNlIGZsYWcgaW5kaWNhdGVzIHJlYnVpbGQgcmVxdWVzdCB3YXMgc3VwZXJjZWRlZFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNhdmUgcXVldWVkIHJlcXVlc3RcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkaW5nLnF1ZXVlZCA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTY2VuZS5yZWJ1aWxkKCk6IHF1ZXVpbmcgcmVxdWVzdGApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJhY2sgdGlsZSBidWlsZCBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5idWlsZGluZyA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG5cbiAgICAgICAgICAgIC8vIFByb2ZpbGluZ1xuICAgICAgICAgICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9maWxlKCdTY2VuZS5yZWJ1aWxkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBjb25maWcgKGluIGNhc2UgSlMgb2JqZWN0cyB3ZXJlIG1hbmlwdWxhdGVkIGRpcmVjdGx5KVxuICAgICAgICAgICAgaWYgKHN5bmMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNDb25maWdUb1dvcmtlcih7IHNlcmlhbGl6ZV9mdW5jcyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVzZXRGZWF0dXJlU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0VGltZSgpO1xuXG4gICAgICAgICAgICAvLyBSZWJ1aWxkIHZpc2libGUgdGlsZXNcbiAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLnBydW5lVG9WaXNpYmxlVGlsZXMoKTtcbiAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLmZvckVhY2hUaWxlKHRpbGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc291cmNlcyB8fCBzb3VyY2VzLmluZGV4T2YodGlsZS5zb3VyY2UubmFtZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5idWlsZFRpbGUodGlsZSwgeyBmYWRlX2luIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIudXBkYXRlVGlsZXNGb3JWaWV3KCk7IC8vIHBpY2tzIHVwIGFkZGl0aW9uYWwgdGlsZXMgZm9yIGFueSBuZXcvY2hhbmdlZCBkYXRhIHNvdXJjZXNcbiAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLmNoZWNrQnVpbGRRdWV1ZSgpOyAgICAvLyByZXNvbHZlIGltbWVkaWF0ZWx5IGlmIG5vIHRpbGVzIHRvIGJ1aWxkXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUHJvZmlsaW5nXG4gICAgICAgICAgICBpZiAocHJvZmlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2ZpbGVFbmQoJ1NjZW5lLnJlYnVpbGQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVGlsZSBtYW5hZ2VyIGZpbmlzaGVkIGJ1aWxkaW5nIHRpbGVzXG4gICAgLy8gVE9ETyBtb3ZlIHRvIHRpbGUgbWFuYWdlclxuICAgIHRpbGVNYW5hZ2VyQnVpbGREb25lKCkge1xuICAgICAgICBpZiAodGhpcy5idWlsZGluZykge1xuICAgICAgICAgICAgbG9nKCdpbmZvJywgYFNjZW5lOiBidWlsZCBnZW9tZXRyeSBmaW5pc2hlZGApO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmcucmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQW5vdGhlciByZWJ1aWxkIHF1ZXVlZD9cbiAgICAgICAgICAgIHZhciBxdWV1ZWQgPSB0aGlzLmJ1aWxkaW5nLnF1ZXVlZDtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHF1ZXVlZCkge1xuICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgU2NlbmU6IHN0YXJ0aW5nIHF1ZXVlZCByZWJ1aWxkKCkgcmVxdWVzdGApO1xuICAgICAgICAgICAgICAgIHRoaXMucmVidWlsZCgpLnRoZW4ocXVldWVkLnJlc29sdmUsIHF1ZXVlZC5yZWplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgTG9hZCAob3IgcmVsb2FkKSB0aGUgc2NlbmUgY29uZmlnXG4gICAgICAgQHJldHVybiB7UHJvbWlzZX1cbiAgICAqL1xuICAgIGxvYWRTY2VuZShjb25maWdfc291cmNlID0gbnVsbCwgY29uZmlnX3BhdGggPSBudWxsKSB7XG4gICAgICAgIHRoaXMuY29uZmlnX3NvdXJjZSA9IGNvbmZpZ19zb3VyY2UgfHwgdGhpcy5jb25maWdfc291cmNlO1xuICAgICAgICB0aGlzLmNvbmZpZ19nbG9iYWxzX2FwcGxpZWQgPSBbXTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnX3NvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3BhdGggPSBVUkxzLnBhdGhGb3JVUkwoY29uZmlnX3BhdGggfHwgdGhpcy5jb25maWdfc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3BhdGggPSBVUkxzLnBhdGhGb3JVUkwoY29uZmlnX3BhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFNjZW5lTG9hZGVyLmxvYWRTY2VuZSh0aGlzLmNvbmZpZ19zb3VyY2UsIHRoaXMuY29uZmlnX3BhdGgpLnRoZW4oY29uZmlnID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdsb2FkJywgeyBjb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc291cmNlIHRvIGEgc2NlbmUsIGFyZ3VtZW50cyBgbmFtZWAgYW5kIGBjb25maWdgIG5lZWQgdG8gYmUgcHJvdmlkZWQ6XG4gICAgLy8gIC0gSWYgdGhlIG5hbWUgZG9lc24ndCBtYXRjaCBhIHNvdXJjZXMgaXQgd2lsbCBjcmVhdGUgaXRcbiAgICAvLyAgLSB0aGUgYGNvbmZpZ2Agb2JqIGZvbGxvdyB0aGUgWUFNTCBzY2VuZSBzcGVjLCBleDogYGBge3R5cGU6ICdUb3BvSlNPTicsIHVybDogXCIvL3ZlY3Rvci5tYXB6ZW4uY29tL29zbS9hbGwve3p9L3t4fS97eX0udG9wb2pzb25cIl19YGBgXG4gICAgLy8gICAgdGhhdCBsb29rcyBsaWtlOlxuICAgIC8vXG4gICAgLy8gICAgICBzY2VuZS5zZXREYXRhU291cmNlKFwib3NtXCIsIHt0eXBlOiAnVG9wb0pTT04nLCB1cmw6IFwiLy92ZWN0b3IubWFwemVuLmNvbS9vc20vYWxsL3t6fS97eH0ve3l9LnRvcG9qc29uXCIgfSk7XG4gICAgLy9cbiAgICAvLyAgLSBhbHNvIGNhbiBiZSBwYXNzIGEgYGBgZGF0YWBgYCBvYmo6IGBgYHt0eXBlOiAnR2VvSlNPTicsIGRhdGE6IEpTT2JqIF19YGBgXG4gICAgLy9cbiAgICAvLyAgICAgIHZhciBnZW9qc29uX2RhdGEgPSB7fTtcbiAgICAvLyAgICAgIC4uLlxuICAgIC8vICAgICAgc2NlbmUuc2V0RGF0YVNvdXJjZShcImR5bmFtaWNfZGF0YVwiLCB7dHlwZTogJ0dlb0pTT04nLCBkYXRhOiBnZW9qc29uX2RhdGEgfSk7XG4gICAgLy9cbiAgICBzZXREYXRhU291cmNlIChuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKCFuYW1lIHx8ICFjb25maWcgfHwgIWNvbmZpZy50eXBlIHx8ICghY29uZmlnLnVybCAmJiAhY29uZmlnLmRhdGEpKSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgXCJObyBuYW1lIHByb3ZpZGVkIG9yIG5vdCBhIHZhbGlkIGNvbmZpZzpcIiwgbmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2FkID0gKHRoaXMuY29uZmlnLnNvdXJjZXNbbmFtZV0gPT0gbnVsbCk7XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLmNvbmZpZy5zb3VyY2VzW25hbWVdID0gT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnKTtcblxuICAgICAgICBpZiAoc291cmNlLmRhdGEgJiYgdHlwZW9mIHNvdXJjZS5kYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgc291cmNlLnVybCA9IFVSTHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShzb3VyY2UuZGF0YSldKSk7XG4gICAgICAgICAgICBkZWxldGUgc291cmNlLmRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9hZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ29uZmlnKHsgcmVidWlsZDogeyBzb3VyY2VzOiBbbmFtZV0gfSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYnVpbGQoeyBzb3VyY2VzOiBbbmFtZV0gfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVEYXRhU291cmNlcygpIHtcbiAgICAgICAgbGV0IHJlc2V0ID0gW107IC8vIHNvdXJjZXMgdG8gcmVzZXRcbiAgICAgICAgbGV0IHByZXZfc291cmNlX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKTtcblxuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuY29uZmlnLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLmNvbmZpZy5zb3VyY2VzW25hbWVdO1xuICAgICAgICAgICAgbGV0IHByZXZfc291cmNlID0gdGhpcy5zb3VyY2VzW25hbWVdO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlc1tuYW1lXSA9IERhdGFTb3VyY2UuY3JlYXRlKE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZSwge25hbWV9KSwgdGhpcy5zb3VyY2VzKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc291cmNlc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc291cmNlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBDb3VsZCBub3QgY3JlYXRlIGRhdGEgc291cmNlOiAke2UubWVzc2FnZX1gO1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTY2VuZTogJHttZXNzYWdlfWAsIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCd3YXJuaW5nJywgeyB0eXBlOiAnc291cmNlcycsIHNvdXJjZSwgbWVzc2FnZSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGF0YSBzb3VyY2UgY2hhbmdlZD9cbiAgICAgICAgICAgIGlmIChEYXRhU291cmNlLmNoYW5nZWQodGhpcy5zb3VyY2VzW25hbWVdLCBwcmV2X3NvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICByZXNldC5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU291cmNlcyB0aGF0IHdlcmUgcmVtb3ZlZFxuICAgICAgICBwcmV2X3NvdXJjZV9uYW1lcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zb3VyY2VzW3NdKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc291cmNlc1tzXTsgLy8gVE9ETzogcmVtb3ZlIGZyb20gd29ya2VycyB0b28/XG4gICAgICAgICAgICAgICAgcmVzZXQucHVzaChzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRpbGVzIGZyb20gc291cmNlcyB0aGF0IGhhdmUgY2hhbmdlZFxuICAgICAgICBpZiAocmVzZXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIucmVtb3ZlVGlsZXModGlsZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyZXNldC5pbmRleE9mKHRpbGUuc291cmNlLm5hbWUpID4gLTEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIHNvdXJjZXMgdGhhdCB3aWxsIGdlbmVyYXRlIGdlb21ldHJ5IHRpbGVzXG4gICAgICAgIC8vIChhbGwgZXhjZXB0IHRob3NlIHRoYXQgYXJlIG9ubHkgcmFzdGVyIHNvdXJjZXMgYXR0YWNoZWQgdG8gb3RoZXIgc291cmNlcylcbiAgICAgICAgZm9yIChsZXQgbG4gaW4gdGhpcy5jb25maWcubGF5ZXJzKSB7XG4gICAgICAgICAgICBsZXQgbGF5ZXIgPSB0aGlzLmNvbmZpZy5sYXllcnNbbG5dO1xuICAgICAgICAgICAgaWYgKGxheWVyLmRhdGEgJiYgdGhpcy5zb3VyY2VzW2xheWVyLmRhdGEuc291cmNlXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlc1tsYXllci5kYXRhLnNvdXJjZV0uYnVpbGRzX2dlb21ldHJ5X3RpbGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgYWxsIHRleHR1cmVzIGluIHRoZSBzY2VuZSBkZWZpbml0aW9uXG4gICAgbG9hZFRleHR1cmVzKCkge1xuICAgICAgICByZXR1cm4gVGV4dHVyZS5jcmVhdGVGcm9tT2JqZWN0KHRoaXMuZ2wsIHRoaXMuY29uZmlnLnRleHR1cmVzKS5cbiAgICAgICAgICAgIHRoZW4oKCkgPT4gVGV4dHVyZS5jcmVhdGVEZWZhdWx0KHRoaXMuZ2wpKTsgLy8gY3JlYXRlIGEgJ2RlZmF1bHQnIHRleHR1cmUgZm9yIHBsYWNlaG9sZGVyc1xuICAgIH1cblxuICAgIC8vIENhbGxlZCAoY3VycmVudGx5IG1hbnVhbGx5KSBhZnRlciBzdHlsZXMgYXJlIHVwZGF0ZWQgaW4gc3R5bGVzaGVldFxuICAgIHVwZGF0ZVN0eWxlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkICYmICF0aGlzLmluaXRpYWxpemluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTY2VuZS51cGRhdGVTdHlsZXMoKSBjYWxsZWQgYmVmb3JlIHNjZW5lIHdhcyBpbml0aWFsaXplZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gKFJlKWJ1aWxkIHN0eWxlcyBmcm9tIGNvbmZpZ1xuICAgICAgICB0aGlzLnN0eWxlcyA9IHRoaXMuc3R5bGVfbWFuYWdlci5idWlsZCh0aGlzLmNvbmZpZy5zdHlsZXMpO1xuICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuaW5pdFN0eWxlcyh0aGlzKTtcblxuICAgICAgICAvLyBPcHRpb25hbGx5IHNldCBHTCBjb250ZXh0ICh1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIG9yIHJlLWluaXRpYWxpemluZyBHTCByZXNvdXJjZXMpXG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRoaXMuc3R5bGVzKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlc1tzdHlsZV0uc2V0R0wodGhpcy5nbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgZXhwbGljaXRseSBzZXQgc2NlbmUgYW5pbWF0aW9uIGZsYWcgaWYgZGVmaW5lZCwgb3RoZXJ3aXNlIHR1cm4gb24gYW5pbWF0aW9uIGlmIHRoZXJlIGFyZSBhbnkgYW5pbWF0ZWQgc3R5bGVzXG4gICAgICAgIHRoaXMuYW5pbWF0ZWQgPVxuICAgICAgICAgICAgdGhpcy5jb25maWcuc2NlbmUuYW5pbWF0ZWQgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2NlbmUuYW5pbWF0ZWQgOlxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3R5bGVzKS5zb21lKHMgPT4gdGhpcy5zdHlsZXNbc10uYW5pbWF0ZWQpO1xuXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBhY3RpdmUgY2FtZXJhIC0gZm9yIHB1YmxpYyBBUElcbiAgICBnZXRBY3RpdmVDYW1lcmEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFjdGl2ZSBjYW1lcmEgLSBmb3IgcHVibGljIEFQSVxuICAgIHNldEFjdGl2ZUNhbWVyYShuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuc2V0QWN0aXZlQ2FtZXJhKG5hbWUpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBsaWdodGluZ1xuICAgIGNyZWF0ZUxpZ2h0cygpIHtcbiAgICAgICAgdGhpcy5saWdodHMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLmNvbmZpZy5saWdodHMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcubGlnaHRzW2ldIHx8IHR5cGVvZiB0aGlzLmNvbmZpZy5saWdodHNbaV0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbGlnaHQgPSB0aGlzLmNvbmZpZy5saWdodHNbaV07XG4gICAgICAgICAgICBsaWdodC5uYW1lID0gaS5yZXBsYWNlKCctJywgJ18nKTsgLy8gbGlnaHQgbmFtZXMgYXJlIGluamVjdGVkIGluIHNoYWRlcnMsIGNhbid0IGhhdmUgaHlwaGVuc1xuICAgICAgICAgICAgbGlnaHQudmlzaWJsZSA9IChsaWdodC52aXNpYmxlID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgICAgICBpZiAobGlnaHQudmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGlnaHRzW2xpZ2h0Lm5hbWVdID0gTGlnaHQuY3JlYXRlKHRoaXMudmlldywgbGlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIExpZ2h0LmluamVjdCh0aGlzLmxpZ2h0cyk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGJhY2tncm91bmQgY29sb3JcbiAgICBzZXRCYWNrZ3JvdW5kKCkge1xuICAgICAgICBsZXQgYmcgPSB0aGlzLmNvbmZpZy5zY2VuZS5iYWNrZ3JvdW5kO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSB7fTtcbiAgICAgICAgaWYgKGJnICYmIGJnLmNvbG9yKSB7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmQuY29sb3IgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGJnLmNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuYmFja2dyb3VuZC5jb2xvcikge1xuICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLmNvbG9yID0gWzAsIDAsIDAsIDBdOyAvLyBkZWZhdWx0IGJhY2tncm91bmQgVE9ETzogdmFyeSB3L3NjZW5lIGFscGhhXG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBiYWNrZ3JvdW5kIGlzIGZ1bGx5IG9wYXF1ZSwgc2V0IGNhbnZhcyBiYWNrZ3JvdW5kIHRvIG1hdGNoXG4gICAgICAgIGlmICh0aGlzLmJhY2tncm91bmQuY29sb3JbM10gPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9XG4gICAgICAgICAgICAgICAgYHJnYmEoJHt0aGlzLmJhY2tncm91bmQuY29sb3IubWFwKGMgPT4gTWF0aC5mbG9vcihjICogMjU1KSkuam9pbignLCAnKX0pYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdsLmNsZWFyQ29sb3IoLi4udGhpcy5iYWNrZ3JvdW5kLmNvbG9yKTtcbiAgICB9XG5cbiAgICAvLyBUdXJuIGludHJvc3BlY3Rpb24gbW9kZSBvbi9vZmZcbiAgICBzZXRJbnRyb3NwZWN0aW9uICh2YWwpIHtcbiAgICAgICAgdGhpcy5pbnRyb3NwZWN0aW9uID0gdmFsIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0aW5nKys7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNvbmZpZygpLnRoZW4oKCkgPT4gdGhpcy51cGRhdGluZy0tKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc2NlbmUgY29uZmlnLCBhbmQgb3B0aW9uYWxseSByZWJ1aWxkIGdlb21ldHJ5XG4gICAgLy8gcmVidWlsZCBjYW4gYmUgYm9vbGVhbiwgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgcmVidWlsZCBvcHRpb25zIHRvIHBhc3N0aHJvdWdoXG4gICAgdXBkYXRlQ29uZmlnKHsgcmVidWlsZCA9IHRydWUsIHNlcmlhbGl6ZV9mdW5jcywgZmFkZV9pbiA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSArK1NjZW5lLmdlbmVyYXRpb247XG4gICAgICAgIHRoaXMudXBkYXRpbmcrKztcblxuICAgICAgICB0aGlzLmNvbmZpZyA9IFNjZW5lTG9hZGVyLmFwcGx5R2xvYmFsUHJvcGVydGllcyh0aGlzLmNvbmZpZywgdGhpcy5jb25maWdfZ2xvYmFsc19hcHBsaWVkKTtcbiAgICAgICAgU2NlbmVMb2FkZXIuaG9pc3RUZXh0dXJlcyh0aGlzLmNvbmZpZyk7IC8vIG1vdmUgaW5saW5lIHRleHR1cmVzIGludG8gZ2xvYmFsIHRleHR1cmUgc2V0XG4gICAgICAgIHRoaXMuc3R5bGVfbWFuYWdlci5pbml0KCk7XG4gICAgICAgIHRoaXMudmlldy5yZXNldCgpO1xuICAgICAgICB0aGlzLmNyZWF0ZUxpZ2h0cygpO1xuICAgICAgICB0aGlzLmNyZWF0ZURhdGFTb3VyY2VzKCk7XG4gICAgICAgIHRoaXMubG9hZFRleHR1cmVzKCk7XG4gICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZCgpO1xuICAgICAgICBGb250TWFuYWdlci5sb2FkRm9udHModGhpcy5jb25maWcuZm9udHMpO1xuXG4gICAgICAgIC8vIFRPRE86IGRldGVjdCBjaGFuZ2VzIHRvIHN0eWxlcz8gYWxyZWFkeSAoY3VycmVudGx5KSBuZWVkIHRvIHJlY29tcGlsZSBhbnl3YXkgd2hlbiBjYW1lcmEgb3IgbGlnaHRzIGNoYW5nZVxuICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcygpO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsbHkgcmVidWlsZCBnZW9tZXRyeVxuICAgICAgICBsZXQgZG9uZSA9IHJlYnVpbGQgP1xuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkKE9iamVjdC5hc3NpZ24oeyBzZXJpYWxpemVfZnVuY3MsIGZhZGVfaW4gfSwgdHlwZW9mIHJlYnVpbGQgPT09ICdvYmplY3QnICYmIHJlYnVpbGQpKSA6XG4gICAgICAgICAgICB0aGlzLnN5bmNDb25maWdUb1dvcmtlcih7IHNlcmlhbGl6ZV9mdW5jcyB9KTsgLy8gcmVidWlsZCgpIGFsc28gc3luY3MgY29uZmlnXG5cbiAgICAgICAgLy8gRmluaXNoIGJ5IHVwZGF0aW5nIGJvdW5kcyBhbmQgcmUtcmVuZGVyaW5nXG4gICAgICAgIHRoaXMudXBkYXRpbmctLTtcbiAgICAgICAgdGhpcy52aWV3LnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB0aGlzLnJlcXVlc3RSZWRyYXcoKTtcblxuICAgICAgICByZXR1cm4gZG9uZTtcbiAgICB9XG5cbiAgICAvLyBTZXJpYWxpemUgY29uZmlnIGFuZCBzZW5kIHRvIHdvcmtlclxuICAgIHN5bmNDb25maWdUb1dvcmtlcih7IHNlcmlhbGl6ZV9mdW5jcyA9IHRydWUgfSA9IHt9KSB7XG4gICAgICAgIC8vIFRlbGwgd29ya2VycyB3ZSdyZSBhYm91dCB0byByZWJ1aWxkIChzbyB0aGV5IGNhbiB1cGRhdGUgc3R5bGVzLCBldGMuKVxuICAgICAgICB0aGlzLmNvbmZpZ19zZXJpYWxpemVkID1cbiAgICAgICAgICAgIHNlcmlhbGl6ZV9mdW5jcyA/IFV0aWxzLnNlcmlhbGl6ZVdpdGhGdW5jdGlvbnModGhpcy5jb25maWcpIDogSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYudXBkYXRlQ29uZmlnJywge1xuICAgICAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZ19zZXJpYWxpemVkLFxuICAgICAgICAgICAgZ2VuZXJhdGlvbjogdGhpcy5nZW5lcmF0aW9uLFxuICAgICAgICAgICAgaW50cm9zcGVjdGlvbjogdGhpcy5pbnRyb3NwZWN0aW9uXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIExpc3RlbiB0byByZWxhdGVkIG9iamVjdHNcbiAgICBjcmVhdGVMaXN0ZW5lcnMgKCkge1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IHt9O1xuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnZpZXcgPSB7XG4gICAgICAgICAgICBtb3ZlOiAoKSA9PiB0aGlzLnRyaWdnZXIoJ21vdmUnKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnZpZXcuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnZpZXcpO1xuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnRleHR1cmUgPSB7XG4gICAgICAgICAgICB1cGRhdGU6ICgpID0+IHRoaXMuZGlydHkgPSB0cnVlLFxuICAgICAgICAgICAgd2FybmluZzogKGRhdGEpID0+IHRoaXMudHJpZ2dlcignd2FybmluZycsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiAndGV4dHVyZXMnIH0sIGRhdGEpKVxuICAgICAgICB9O1xuICAgICAgICBUZXh0dXJlLnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy50ZXh0dXJlKTtcblxuICAgICAgICB0aGlzLmxpc3RlbmVycy5zY2VuZV9sb2FkZXIgPSB7XG4gICAgICAgICAgICBlcnJvcjogKGRhdGEpID0+IHRoaXMudHJpZ2dlcignZXJyb3InLCBPYmplY3QuYXNzaWduKHsgdHlwZTogJ3NjZW5lJyB9LCBkYXRhKSlcbiAgICAgICAgfTtcbiAgICAgICAgU2NlbmVMb2FkZXIuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnNjZW5lX2xvYWRlcik7XG4gICAgfVxuXG4gICAgZGVzdHJveUxpc3RlbmVycyAoKSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVBbGwoKTtcbiAgICAgICAgdGhpcy52aWV3LnVuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnZpZXcpO1xuICAgICAgICBUZXh0dXJlLnVuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnRleHR1cmUpO1xuICAgICAgICBTY2VuZUxvYWRlci51bnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy5zY2VuZV9sb2FkZXIpO1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IG51bGw7XG4gICAgfVxuXG4gICAgcmVzZXRGZWF0dXJlU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IG5ldyBGZWF0dXJlU2VsZWN0aW9uKHRoaXMuZ2wsIHRoaXMud29ya2Vycyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy53b3JrZXJzKSB7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi5yZXNldEZlYXR1cmVTZWxlY3Rpb24nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldHMgdGhlIGN1cnJlbnQgZmVhdHVyZSBzZWxlY3Rpb24gbWFwIHNpemUgYWNyb3NzIGFsbCB3b3JrZXJzLiBSZXR1cm5zIGEgcHJvbWlzZS5cbiAgICBnZXRGZWF0dXJlU2VsZWN0aW9uTWFwU2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZmV0Y2hpbmdfc2VsZWN0aW9uX21hcCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOyAvLyByZXR1cm4gdW5kZWZpbmVkIGlmIGFscmVhZHkgcGVuZGluZ1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmV0Y2hpbmdfc2VsZWN0aW9uX21hcCA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLmdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplJylcbiAgICAgICAgICAgIC50aGVuKHNpemVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoaW5nX3NlbGVjdGlvbl9tYXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYik7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBpbnRlcm5hbCBjbG9jaywgbW9zdGx5IHVzZWZ1bCBmb3IgY29uc2lzdGVudCBleHBlcmllbmNlIHdoZW4gY2hhbmdpbmcgc3R5bGVzL2RlYnVnZ2luZ1xuICAgIHJlc2V0VGltZSgpIHtcbiAgICAgICAgdGhpcy5zdGFydF90aW1lID0gK25ldyBEYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gRmlyZXMgZXZlbnQgd2hlbiByZW5kZXJlZCB0aWxlIHNldCBvciBzdHlsZSBjaGFuZ2VzXG4gICAgdXBkYXRlVmlld0NvbXBsZXRlICgpIHtcbiAgICAgICAgaWYgKCh0aGlzLnJlbmRlcl9jb3VudF9jaGFuZ2VkIHx8IHRoaXMuZ2VuZXJhdGlvbiAhPT0gdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24pICYmXG4gICAgICAgICAgICAhdGhpcy50aWxlX21hbmFnZXIuaXNMb2FkaW5nVmlzaWJsZVRpbGVzKCkpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdF9jb21wbGV0ZV9nZW5lcmF0aW9uID0gdGhpcy5nZW5lcmF0aW9uO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCd2aWV3X2NvbXBsZXRlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldFZpZXdDb21wbGV0ZSAoKSB7XG4gICAgICAgIHRoaXMubGFzdF9jb21wbGV0ZV9nZW5lcmF0aW9uID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUYWtlIGEgc2NyZWVuc2hvdFxuICAgIC8vIEFzeW5jaHJvbm91cyBiZWNhdXNlIHdlIGhhdmUgdG8gd2FpdCBmb3IgbmV4dCByZW5kZXIgdG8gY2FwdHVyZSBidWZmZXJcbiAgICAvLyBSZXR1cm5zIGEgcHJvbWlzZVxuICAgIHNjcmVlbnNob3QgKCkge1xuICAgICAgICB0aGlzLnJlcXVlc3RSZWRyYXcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVkaWFfY2FwdHVyZS5zY3JlZW5zaG90KCk7XG4gICAgfVxuXG4gICAgc3RhcnRWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICB0aGlzLnJlcXVlc3RSZWRyYXcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVkaWFfY2FwdHVyZS5zdGFydFZpZGVvQ2FwdHVyZSgpO1xuICAgIH1cblxuICAgIHN0b3BWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZWRpYV9jYXB0dXJlLnN0b3BWaWRlb0NhcHR1cmUoKTtcbiAgICB9XG5cblxuICAgIC8vIFN0YXRzL2RlYnVnL3Byb2ZpbGluZyBtZXRob2RzXG5cbiAgICAvLyBQcm9maWxlIGhlbHBlcnMsIGlzc3VlcyBhIHByb2ZpbGUgb24gbWFpbiB0aHJlYWQgJiBhbGwgd29ya2Vyc1xuICAgIF9wcm9maWxlKG5hbWUpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlKGBtYWluIHRocmVhZDogJHtuYW1lfWApO1xuICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi5wcm9maWxlJywgbmFtZSk7XG4gICAgfVxuXG4gICAgX3Byb2ZpbGVFbmQobmFtZSkge1xuICAgICAgICBjb25zb2xlLnByb2ZpbGVFbmQoYG1haW4gdGhyZWFkOiAke25hbWV9YCk7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnByb2ZpbGVFbmQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBEZWJ1ZyBjb25maWcgYW5kIGZ1bmN0aW9uc1xuICAgIHNldHVwRGVidWcgKCkge1xuICAgICAgICBsZXQgc2NlbmUgPSB0aGlzO1xuICAgICAgICB0aGlzLmRlYnVnID0ge1xuICAgICAgICAgICAgLy8gUmVidWlsZCBnZW9tZXRyeSBhIGdpdmVuICMgb2YgdGltZXMgYW5kIHByaW50IGF2ZXJhZ2UsIG1pbiwgbWF4IHRpbWluZ3NcbiAgICAgICAgICAgIHRpbWVSZWJ1aWxkIChudW0gPSAxLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgICAgICBsZXQgdGltZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgY3ljbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBzY2VuZS5yZWJ1aWxkKG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMucHVzaCgrbmV3IERhdGUoKSAtIHN0YXJ0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVzLmxlbmd0aCA8IG51bSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXZnID0gfn4odGltZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYikgLyB0aW1lcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnaW5mbycsIGBQcm9maWxlZCByZWJ1aWxkICR7bnVtfSB0aW1lczogJHthdmd9IGF2ZyAoJHtNYXRoLm1pbiguLi50aW1lcyl9IG1pbiwgJHtNYXRoLm1heCguLi50aW1lcyl9IG1heClgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjeWNsZSgpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gUmV0dXJuIGdlb21ldHJ5IGNvdW50cyBvZiB2aXNpYmxlIHRpbGVzLCBncm91cGVkIGJ5IHN0eWxlIG5hbWVcbiAgICAgICAgICAgIGdlb21ldHJ5Q291bnRCeVN0eWxlICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgY291bnRzID0ge307XG4gICAgICAgICAgICAgICAgc2NlbmUudGlsZV9tYW5hZ2VyLmdldFJlbmRlcmFibGVUaWxlcygpLmZvckVhY2godGlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRpbGUubWVzaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbc3R5bGVdID0gY291bnRzW3N0eWxlXSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzW3N0eWxlXSArPSB0aWxlLm1lc2hlc1tzdHlsZV0uZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRzO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2VvbWV0cnlDb3VudEJ5QmFzZVN0eWxlICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGVfY291bnRzID0gc2NlbmUuZGVidWcuZ2VvbWV0cnlDb3VudEJ5U3R5bGUoKTtcbiAgICAgICAgICAgICAgICBsZXQgY291bnRzID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gc3R5bGVfY291bnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiYXNlID0gc2NlbmUuc3R5bGVzW3N0eWxlXS5iYXNlU3R5bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgY291bnRzW2Jhc2VdID0gY291bnRzW2Jhc2VdIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50c1tiYXNlXSArPSBzdHlsZV9jb3VudHNbc3R5bGVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxufVxuXG5TY2VuZS5pZCA9IDA7ICAgICAgICAgLy8gdW5pcXVlIGlkIGZvciBhIHNjZW5lIGluc3RhbmNlXG5TY2VuZS5nZW5lcmF0aW9uID0gMDsgLy8gaWQgdGhhdCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSBzY2VuZSBjb25maWcgaXMgcmUtcGFyc2VkXG4iLCJpbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgKiBhcyBVUkxzIGZyb20gJy4vdXRpbHMvdXJscyc7XG5pbXBvcnQgSlNaaXAgZnJvbSAnanN6aXAnO1xuXG5leHBvcnQgY2xhc3MgU2NlbmVCdW5kbGUge1xuXG4gICAgY29uc3RydWN0b3IodXJsLCBwYXRoLCBwYXJlbnQgPSBudWxsKSB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuXG4gICAgICAgIC8vIElmIGEgYmFzZSBwYXRoIHdhcyBwcm92aWRlZCwgdXNlIGl0IGZvciByZXNvbHZpbmcgbG9jYWwgYnVuZGxlIHJlc291cmNlcyBvbmx5IGlmXG4gICAgICAgIC8vIHRoZSBiYXNlIHBhdGggaXMgYWJzb2x1dGUsIG9yIHRoaXMgYnVuZGxlJ3MgcGF0aCBpcyByZWxhdGl2ZVxuICAgICAgICBpZiAocGF0aCAmJiAoIVVSTHMuaXNSZWxhdGl2ZVVSTChwYXRoKSB8fCBVUkxzLmlzUmVsYXRpdmVVUkwodGhpcy51cmwpKSkge1xuICAgICAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IFVSTHMucGF0aEZvclVSTCh0aGlzLnVybCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBhdGhfZm9yX3BhcmVudCA9IHBhdGggfHwgdGhpcy5wYXRoOyAvLyBmb3IgcmVzb2x2aW5nIHBhdGhzIHJlbGF0aXZlIHRvIGEgcGFyZW50IGJ1bmRsZVxuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuICAgICAgICAvLyBBbiBhbmNlc3RvciBidW5kbGUgbWF5IGJlIGEgY29udGFpbmVyIChlLmcuIHppcCBmaWxlKSB0aGF0IG5lZWRzIHRvIHJlc29sdmUgcmVsYXRpdmUgcGF0aHNcbiAgICAgICAgLy8gZm9yIGFueSBzY2VuZXMgaXQgY29udGFpbnMsIGUuZy4gYHJvb3QuemlwYCBoYXMgYSBgcm9vdC55YW1sYCB0aGF0IGluY2x1ZGVzIGEgYGZvbGRlci9jaGlsZC55YW1sYDpcbiAgICAgICAgLy8gcmVzb3VyY2VzIHdpdGhpbiBgY2hpbGQueWFtbGAgbXVzdCBiZSByZXNvbHZlZCB0aHJvdWdoIHRoZSBidW5kbGUgZm9yIGByb290LnppcGBcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudC5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMucGFyZW50LmNvbnRhaW5lcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucGFyZW50LmlzQ29udGFpbmVyKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmxvYWRSZXNvdXJjZSh0aGlzLnVybCk7XG4gICAgfVxuXG4gICAgLy8gSW5mbyBmb3IgcmV0cmlldmluZyBhIHNwZWNpZmljIHJlc291cmNlIGZyb20gdGhpcyBidW5kbGVcbiAgICAvLyB1cmw6IGZ1bGx5IHF1YWxpZmllZCBVUkwgdG8gcmV0cmlldmUgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlIChlLmcuIHppcHMgd2lsbCB0cmFuc2Zvcm0gdGhpcyB0byBibG9iIFVSTClcbiAgICAvLyBwYXRoOiBvcmlnaW5hbCBwYXRoIG9mIHRoZSByZXNvdXJjZSB3aXRoaW4gdGhlIGJ1bmRsZSAoZm9yIHJlc29sdmluZyBwYXRocyB1cCB0aGUgYnVuZGxlIHRyZWUpXG4gICAgLy8gdHlwZTogZmlsZSBleHRlbnNpb24gKHVzZWQgZm9yIGRldGVybWluaW5nIGJ1bmRsZSB0eXBlLCBgeWFtbGAgb3IgYHppcGApXG4gICAgcmVzb3VyY2VGb3IodXJsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsRm9yKHVybCksXG4gICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGhGb3IodXJsKSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZUZvcih1cmwpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdXJsRm9yKHVybCkge1xuICAgICAgICBpZiAoaXNHbG9iYWwodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVUkxzLmlzUmVsYXRpdmVVUkwodXJsKSAmJiB0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LnVybEZvcih0aGlzLnBhdGhfZm9yX3BhcmVudCArIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFVSTHMuYWRkQmFzZVVSTCh1cmwsIHRoaXMucGF0aCk7XG4gICAgfVxuXG4gICAgcGF0aEZvcih1cmwpIHtcbiAgICAgICAgcmV0dXJuIFVSTHMucGF0aEZvclVSTCh1cmwpO1xuICAgIH1cblxuICAgIHR5cGVGb3IodXJsKSB7XG4gICAgICAgIHJldHVybiBVUkxzLmV4dGVuc2lvbkZvclVSTCh1cmwpO1xuICAgIH1cblxuICAgIGlzQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBaaXBTY2VuZUJ1bmRsZSBleHRlbmRzIFNjZW5lQnVuZGxlIHtcblxuICAgIGNvbnN0cnVjdG9yKHVybCwgcGF0aCwgcGFyZW50KSB7XG4gICAgICAgIHN1cGVyKHVybCwgcGF0aCwgcGFyZW50KTtcbiAgICAgICAgdGhpcy56aXAgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbGVzID0ge307XG4gICAgICAgIHRoaXMucm9vdCA9IG51bGw7XG4gICAgICAgIHRoaXMucGF0aCA9ICcnO1xuICAgIH1cblxuICAgIGlzQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICB0aGlzLnppcCA9IG5ldyBKU1ppcCgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuaW8odGhpcy51cmwsIDYwMDAwLCAnYXJyYXlidWZmZXInKVxuICAgICAgICAgICAgICAgIC50aGVuKGJvZHkgPT4gdGhpcy56aXAubG9hZEFzeW5jKGJvZHkpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucGFyc2VaaXBGaWxlcygpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMubG9hZFJvb3QoKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZSA9PiBQcm9taXNlLnJlamVjdChlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXJsRm9yKHVybCkge1xuICAgICAgICBpZiAoaXNHbG9iYWwodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVUkxzLmlzUmVsYXRpdmVVUkwodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXJsRm9yWmlwRmlsZShVUkxzLmZsYXR0ZW5SZWxhdGl2ZVVSTCh1cmwpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIudXJsRm9yKHVybCk7XG4gICAgfVxuXG4gICAgdHlwZUZvcih1cmwpIHtcbiAgICAgICAgaWYgKFVSTHMuaXNSZWxhdGl2ZVVSTCh1cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlRm9yWmlwRmlsZSh1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci50eXBlRm9yKHVybCk7XG4gICAgfVxuXG4gICAgbG9hZFJvb3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRSb290KClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IFV0aWxzLmxvYWRSZXNvdXJjZSh0aGlzLnVybEZvclppcEZpbGUodGhpcy5yb290KSkpO1xuICAgIH1cblxuICAgIGZpbmRSb290KCkge1xuICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGEgc2luZ2xlIFlBTUwgZmlsZSBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSB6aXBcbiAgICAgICAgY29uc3QgeWFtbHMgPSBPYmplY3Qua2V5cyh0aGlzLmZpbGVzKVxuICAgICAgICAgICAgLmZpbHRlcihwYXRoID0+IHRoaXMuZmlsZXNbcGF0aF0uZGVwdGggPT09IDApXG4gICAgICAgICAgICAuZmlsdGVyKHBhdGggPT4gVVJMcy5leHRlbnNpb25Gb3JVUkwocGF0aCkgPT09ICd5YW1sJyk7XG5cbiAgICAgICAgaWYgKHlhbWxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0geWFtbHNbMF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyByb290IGZvdW5kXG4gICAgICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICAgICAgICBsZXQgbXNnID0gYENvdWxkIG5vdCBmaW5kIHJvb3Qgc2NlbmUgZm9yIGJ1bmRsZSAnJHt0aGlzLnVybH0nOiBgO1xuICAgICAgICAgICAgbXNnICs9IGBUaGUgemlwIGFyY2hpdmUncyByb290IGxldmVsIG11c3QgY29udGFpbiBhIHNpbmdsZSBzY2VuZSBmaWxlIHdpdGggdGhlICcueWFtbCcgZXh0ZW5zaW9uLiBgO1xuICAgICAgICAgICAgaWYgKHlhbWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYEZvdW5kIG11bHRpcGxlIFlBTUwgZmlsZXMgYXQgdGhlIHJvb3QgbGV2ZWw6ICR7eWFtbHMubWFwKHIgPT4gJ1xcJycgKyByICsgJ1xcJycgKS5qb2luKCcsICcpfS5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbXNnICs9IGBGb3VuZCBOTyBZQU1MIGZpbGVzIGF0IHRoZSByb290IGxldmVsLmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoRXJyb3IobXNnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHBhcnNlWmlwRmlsZXMoKSB7XG4gICAgICAgIGxldCBwYXRocyA9IFtdO1xuICAgICAgICBsZXQgcXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy56aXAuZm9yRWFjaCgocGF0aCwgZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFmaWxlLmRpcikge1xuICAgICAgICAgICAgICAgIHBhdGhzLnB1c2gocGF0aCk7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaChmaWxlLmFzeW5jKCdhcnJheWJ1ZmZlcicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHF1ZXVlKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gcGF0aHNbaV07XG4gICAgICAgICAgICAgICAgbGV0IGRlcHRoID0gcGF0aC5zcGxpdCgnLycpLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlc1twYXRoXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YVtpXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogVVJMcy5leHRlbnNpb25Gb3JVUkwocGF0aCksXG4gICAgICAgICAgICAgICAgICAgIGRlcHRoXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXJsRm9yWmlwRmlsZShmaWxlKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbGVzW2ZpbGVdKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsZXNbZmlsZV0udXJsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlc1tmaWxlXS51cmwgPSBVUkxzLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbdGhpcy5maWxlc1tmaWxlXS5kYXRhXSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc1tmaWxlXS51cmw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0eXBlRm9yWmlwRmlsZShmaWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVzW2ZpbGVdICYmIHRoaXMuZmlsZXNbZmlsZV0udHlwZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjZW5lQnVuZGxlKHVybCwgcGF0aCwgcGFyZW50LCB0eXBlID0gbnVsbCkge1xuICAgIGlmICh0eXBlID09PSAnemlwJyB8fCAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgVVJMcy5leHRlbnNpb25Gb3JVUkwodXJsKSA9PT0gJ3ppcCcpKSB7XG4gICAgICAgIHJldHVybiBuZXcgWmlwU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNjZW5lQnVuZGxlKHVybCwgcGF0aCwgcGFyZW50KTtcbn1cblxuLy8gUmVmZXJlbmNlcyBhIGdsb2JhbCBwcm9wZXJ0eT9cbmV4cG9ydCBmdW5jdGlvbiBpc0dsb2JhbCAodmFsKSB7XG4gICAgaWYgKHZhbCAmJiB2YWwuc2xpY2UoMCwgNykgPT09ICdnbG9iYWwuJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgR0xTTCBmcm9tICcuL2dsL2dsc2wnO1xuaW1wb3J0ICogYXMgVVJMcyBmcm9tICcuL3V0aWxzL3VybHMnO1xuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tICcuL3V0aWxzL21lcmdlJztcbmltcG9ydCBzdWJzY3JpYmVNaXhpbiBmcm9tICcuL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQge2NyZWF0ZVNjZW5lQnVuZGxlLCBpc0dsb2JhbH0gZnJvbSAnLi9zY2VuZV9idW5kbGUnO1xuXG52YXIgU2NlbmVMb2FkZXI7XG5cbmV4cG9ydCBkZWZhdWx0IFNjZW5lTG9hZGVyID0ge1xuXG4gICAgLy8gTG9hZCBzY2VuZXMgZGVmaW5pdGlvbnMgZnJvbSBVUkwgJiBwcm9wcm9jZXNzXG4gICAgbG9hZFNjZW5lKHVybCwgcGF0aCA9IG51bGwpIHtcbiAgICAgICAgbGV0IGVycm9ycyA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkU2NlbmVSZWN1cnNpdmUoeyB1cmwsIHBhdGggfSwgbnVsbCwgZXJyb3JzKS5cbiAgICAgICAgICAgIHRoZW4oY29uZmlnID0+IHRoaXMuZmluYWxpemUoY29uZmlnKSkuXG4gICAgICAgICAgICB0aGVuKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcm9vdCBzY2VuZSBmYWlsZWQgdG8gbG9hZCwgcmVqZWN0IHdpdGggZmlyc3QgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yc1swXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNjZW5lIGxvYWRlZCwgYnV0IHNvbWUgaW1wb3J0cyBoYWQgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5mb3JFYWNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYEZhaWxlZCB0byBpbXBvcnQgc2NlbmU6ICR7ZXJyb3IudXJsfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ2Vycm9yJywgbWVzc2FnZSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdlcnJvcicsIHsgdHlwZTogJ3NjZW5lX2ltcG9ydCcsIG1lc3NhZ2UsIGVycm9yLCB1cmw6IGVycm9yLnVybCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gTG9hZHMgc2NlbmUgZmlsZXMgZnJvbSBVUkwsIHJlY3Vyc2l2ZWx5IGxvYWRpbmcgJ2ltcG9ydCcgc2NlbmVzXG4gICAgLy8gT3B0aW9uYWwgKmluaXRpYWwqIHBhdGggb25seSAod29uJ3QgYmUgcGFzc2VkIHRvIHJlY3Vyc2l2ZSAnaW1wb3J0JyBjYWxscylcbiAgICAvLyBVc2VmdWwgZm9yIGxvYWRpbmcgcmVzb3VyY2VzIGluIGJhc2Ugc2NlbmUgZmlsZSBmcm9tIGEgc2VwYXJhdGUgbG9jYXRpb25cbiAgICAvLyAoZS5nLiBpbiBUYW5ncmFtIFBsYXksIHdoZW4gbW9kaWZpZWQgbG9jYWwgc2NlbmUgc2hvdWxkIHN0aWxsIHJlZmVyIHRvIG9yaWdpbmFsIHJlc291cmNlIFVSTHMpXG4gICAgbG9hZFNjZW5lUmVjdXJzaXZlKHsgdXJsLCBwYXRoLCB0eXBlIH0sIHBhcmVudCwgZXJyb3JzID0gW10pIHtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJ1bmRsZSA9IGNyZWF0ZVNjZW5lQnVuZGxlKHVybCwgcGF0aCwgcGFyZW50LCB0eXBlKTtcblxuICAgICAgICByZXR1cm4gYnVuZGxlLmxvYWQoKS50aGVuKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmltcG9ydCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemUoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFjY2VwdCBzaW5nbGUgZW50cnkgb3IgYXJyYXlcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWcuaW1wb3J0KSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5pbXBvcnQgPSBbY29uZmlnLmltcG9ydF07IC8vIGNvbnZlcnQgdG8gYXJyYXlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ29sbGVjdCBVUkxzIG9mIHNjZW5lcyB0byBpbXBvcnRcbiAgICAgICAgICAgIGxldCBpbXBvcnRzID0gW107XG4gICAgICAgICAgICBjb25maWcuaW1wb3J0LmZvckVhY2godXJsID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHNjZW5lIG9iamVjdHMgdG8gVVJMc1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBVUkxzLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkodXJsKV0pKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpbXBvcnRzLnB1c2goYnVuZGxlLnJlc291cmNlRm9yKHVybCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLmltcG9ydDsgLy8gZG9uJ3Qgd2FudCB0byBtZXJnZSB0aGlzIHByb3BlcnR5XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLlxuICAgICAgICAgICAgYWxsKGltcG9ydHMubWFwKHJlc291cmNlID0+IHRoaXMubG9hZFNjZW5lUmVjdXJzaXZlKHJlc291cmNlLCBidW5kbGUsIGVycm9ycykpKS5cbiAgICAgICAgICAgICAgICB0aGVuKGNvbmZpZ3MgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBtZXJnZU9iamVjdHMoe30sIC4uLmNvbmZpZ3MsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgLy8gQ29sbGVjdCBzY2VuZSBsb2FkIGVycm9ycyBhcyB3ZSBnb1xuICAgICAgICAgICAgZXJyb3IudXJsID0gdXJsO1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gTm9ybWFsaXplIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgYWRqdXN0IHdpdGhpbiBlYWNoIGxvY2FsIHNjZW5lIGZpbGUgKHVzdWFsbHkgYnkgcGF0aClcbiAgICBub3JtYWxpemUoY29uZmlnLCBidW5kbGUpIHtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVEYXRhU291cmNlcyhjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplRm9udHMoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZVRleHR1cmVzKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIHBhdGhzIGZvciBkYXRhIHNvdXJjZVxuICAgIG5vcm1hbGl6ZURhdGFTb3VyY2VzKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIGNvbmZpZy5zb3VyY2VzID0gY29uZmlnLnNvdXJjZXMgfHwge307XG5cbiAgICAgICAgZm9yIChsZXQgc24gaW4gY29uZmlnLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSBjb25maWcuc291cmNlc1tzbl07XG4gICAgICAgICAgICBzb3VyY2UudXJsID0gYnVuZGxlLnVybEZvcihzb3VyY2UudXJsKTtcblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlLnNjcmlwdHMpKSB7XG4gICAgICAgICAgICAgICAgc291cmNlLnNjcmlwdHMgPSBzb3VyY2Uuc2NyaXB0cy5tYXAodXJsID0+IGJ1bmRsZS51cmxGb3IodXJsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0sXG5cbiAgICAvLyBFeHBhbmQgcGF0aHMgZm9yIGZvbnRzXG4gICAgbm9ybWFsaXplRm9udHMoY29uZmlnLCBidW5kbGUpIHtcbiAgICAgICAgY29uZmlnLmZvbnRzID0gY29uZmlnLmZvbnRzIHx8IHt9O1xuXG4gICAgICAgIGZvciAobGV0IGZhbWlseSBpbiBjb25maWcuZm9udHMpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5mb250c1tmYW1pbHldKSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5mb250c1tmYW1pbHldLmZvckVhY2goZmFjZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZhY2UudXJsID0gZmFjZS51cmwgJiYgYnVuZGxlLnVybEZvcihmYWNlLnVybCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZmFjZSA9IGNvbmZpZy5mb250c1tmYW1pbHldO1xuICAgICAgICAgICAgICAgIGZhY2UudXJsID0gZmFjZS51cmwgJiYgYnVuZGxlLnVybEZvcihmYWNlLnVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0sXG5cbiAgICAvLyBFeHBhbmQgcGF0aHMgYW5kIGNlbnRyYWxpemUgdGV4dHVyZSBkZWZpbml0aW9ucyBmb3IgYSBzY2VuZSBvYmplY3RcbiAgICBub3JtYWxpemVUZXh0dXJlcyhjb25maWcsIGJ1bmRsZSkge1xuICAgICAgICBjb25maWcudGV4dHVyZXMgPSBjb25maWcudGV4dHVyZXMgfHwge307XG5cbiAgICAgICAgLy8gQWRkIGN1cnJlbnQgc2NlbmUncyBiYXNlIHBhdGggdG8gZ2xvYmFsbHkgZGVmaW5lZCB0ZXh0dXJlc1xuICAgICAgICAvLyBPbmx5IGFkZHMgcGF0aCBmb3IgdGV4dHVyZXMgd2l0aCByZWxhdGl2ZSBVUkxzLCBzbyB0ZXh0dXJlcyBpbiBpbXBvcnRlZCBzY2VuZXMgZ2V0IHRoZSBiYXNlXG4gICAgICAgIC8vIHBhdGggb2YgdGhlaXIgaW1tZWRpYXRlIHNjZW5lIGZpbGVcbiAgICAgICAgaWYgKGNvbmZpZy50ZXh0dXJlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgdG4gaW4gY29uZmlnLnRleHR1cmVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHR1cmUgPSBjb25maWcudGV4dHVyZXNbdG5dO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlLnVybCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLnVybCA9IGJ1bmRsZS51cmxGb3IodGV4dHVyZS51cmwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgVVJMcyBmb3IgaW5saW5lIHRleHR1cmVzXG4gICAgICAgIGlmIChjb25maWcuc3R5bGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzbiBpbiBjb25maWcuc3R5bGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gY29uZmlnLnN0eWxlc1tzbl07XG5cbiAgICAgICAgICAgICAgICAvLyBTdHlsZSBgdGV4dHVyZWBcbiAgICAgICAgICAgICAgICBsZXQgdGV4ID0gc3R5bGUudGV4dHVyZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRleCA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t0ZXhdICYmICFpc0dsb2JhbCh0ZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnRleHR1cmUgPSBidW5kbGUudXJsRm9yKHRleCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTWF0ZXJpYWxcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUubWF0ZXJpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgWydlbWlzc2lvbicsICdhbWJpZW50JywgJ2RpZmZ1c2UnLCAnc3BlY3VsYXInLCAnbm9ybWFsJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGVyaWFsIHByb3BlcnR5IGhhcyBhIHRleHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXggPSBzdHlsZS5tYXRlcmlhbFtwcm9wXSAhPSBudWxsICYmIHN0eWxlLm1hdGVyaWFsW3Byb3BdLnRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRleCA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t0ZXhdICYmICFpc0dsb2JhbCh0ZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUubWF0ZXJpYWxbcHJvcF0udGV4dHVyZSA9IGJ1bmRsZS51cmxGb3IodGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2hhZGVyIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBHTFNMLnBhcnNlVW5pZm9ybXMoc3R5bGUuc2hhZGVycy51bmlmb3JtcykuZm9yRWFjaCgoe3R5cGUsIHZhbHVlLCBrZXksIHVuaWZvcm1zfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGV4dHVyZSBieSBVUkwgKHN0cmluZy1uYW1lZCB0ZXh0dXJlIG5vdCByZWZlcmVuY2luZyBleGlzdGluZyB0ZXh0dXJlIGRlZmluaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NhbXBsZXIyRCcgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3ZhbHVlXSAmJiAhaXNHbG9iYWwodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXNba2V5XSA9IGJ1bmRsZS51cmxGb3IodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0sXG5cbiAgICAvLyBTdWJzdGl0dXRlcyBnbG9iYWwgc2NlbmUgcHJvcGVydGllcyAodGhvc2UgZGVmaW5lZCBpbiB0aGUgYGNvbmZpZy5nbG9iYWxgIG9iamVjdCkgZm9yIGFueSBzdHlsZSB2YWx1ZXNcbiAgICAvLyBvZiB0aGUgZm9ybSBgZ2xvYmFsLmAsIGZvciBleGFtcGxlIGBjb2xvcjogZ2xvYmFsLnBhcmtfY29sb3JgIHdvdWxkIGJlIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIChpZiBhbnkpXG4gICAgLy8gZGVmaW5lZCBmb3IgdGhlIGBwYXJrX2NvbG9yYCBwcm9wZXJ0eSBpbiBgY29uZmlnLmdsb2JhbC5wYXJrX2NvbG9yYC5cbiAgICBhcHBseUdsb2JhbFByb3BlcnRpZXMoY29uZmlnLCBhcHBsaWVkKSB7XG4gICAgICAgIGlmICghY29uZmlnLmdsb2JhbCB8fCBPYmplY3Qua2V5cyhjb25maWcuZ2xvYmFsKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWc7IC8vIG5vIGdsb2JhbCBwcm9wZXJ0aWVzIHRvIHRyYW5zZm9ybVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2UgcHJvcGVydGllcyBmcm9tIGdsb2JhbHNcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gJzonO1xuICAgICAgICBjb25zdCBwcm9wcyA9IGZsYXR0ZW5Qcm9wZXJ0aWVzKGNvbmZpZy5nbG9iYWwsIHNlcGFyYXRvcik7XG5cbiAgICAgICAgLy8gUmUtYXBwbHkgcHJldmlvdXNseSBhcHBsaWVkIHByb3BlcnRpZXNcbiAgICAgICAgLy8gTkI6IGEgY3VycmVudCBzaG9ydGNvbWluZyBoZXJlIGlzIHRoYXQgeW91IGNhbm5vdCBcInVuLWxpbmtcIiBhIHRhcmdldCBwcm9wZXJ0eSBmcm9tIGEgZ2xvYmFsXG4gICAgICAgIC8vIGF0IHJ1bi10aW1lLiBPbmNlIGEgZ2xvYmFsIHByb3BlcnR5IHN1YnN0aXR1dGlvbiBoYXMgYmVlbiByZWNvcmRlcmQsIGl0IHdpbGwgYWx3YXlzIGJlIHJlLWFwcGxpZWRcbiAgICAgICAgLy8gb24gc3Vic2VxdWVudCBzY2VuZSB1cGRhdGVzLCBldmVuIGlmIHRoZSB0YXJnZXQgcHJvcGVydHkgd2FzIHVwZGF0ZWQgdG8gYW5vdGhlciBsaXRlcmFsIHZhbHVlLlxuICAgICAgICAvLyBUaGlzIGlzIHVubGlrZWx5IHRvIGJlIGEgY29tbW9uIG9jY3VycmVuY2UgYW4gYWNjZXB0YWJsZSBsaW1pdGF0aW9uIGZvciBub3cuXG4gICAgICAgIGFwcGxpZWQuZm9yRWFjaCgoeyBwcm9wLCB0YXJnZXQsIGtleSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBwcm9wc1twcm9wXTtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ2luZm8nLCBgUmUtYXBwbHlpbmcgJHtwcm9wfSB3aXRoIHZhbHVlICR7cHJvcHNbcHJvcF19IHRvIGtleSAke2tleX0gaW5gLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBGaW5kIGFuZCBhcHBseSBuZXcgcHJvcGVydGllc1xuICAgICAgICBmdW5jdGlvbiBhcHBseVByb3BzIChvYmosIHRhcmdldCwga2V5KSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZ1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcCA9IChvYmouc2xpY2UoMCwgNykgPT09ICdnbG9iYWwuJykgJiYgKG9iai5zbGljZSg3KS5yZXBsYWNlKC9cXC4vZywgc2VwYXJhdG9yKSk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgJiYgcHJvcHNbcHJvcF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHJlY29yZCBvZiB3aGVyZSBwcm9wZXJ0eSBpcyBhcHBsaWVkXG4gICAgICAgICAgICAgICAgICAgIGFwcGxpZWQucHVzaCh7IHByb3AsIHRhcmdldCwga2V5IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IHByb3BzW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBvYmplY3QgcHJvcGVydGllc1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwIGluIG9iaikge1xuICAgICAgICAgICAgICAgICAgICBvYmpbcF0gPSBhcHBseVByb3BzKG9ialtwXSwgb2JqLCBwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcGx5UHJvcHMoY29uZmlnKTtcbiAgICB9LFxuXG4gICAgLy8gTW92ZSBpbmxpbmUgKFVSTCBzdHJpbmcpIHRleHR1cmVzIHRvIHRoZSBzY2VuZSdzIHRvcC1sZXZlbCBzZXQgb2YgdGV4dHVyZXMgKGNvbmZpZy50ZXh0dXJlcykuXG4gICAgLy8gVGhlcmUgYXJlIDMgc3VjaCBjYXNlcyBvZiB0ZXh0dXJlczpcbiAgICAvLyAtIGluIGEgc3R5bGUncyBgdGV4dHVyZWAgcHJvcGVydHlcbiAgICAvLyAtIGluIGEgc3R5bGUncyBgbWF0ZXJpYWxgIHByb3BlcnRpZXNcbiAgICAvLyAtIGluIGEgc3R5bGUncyBjdXN0b20gdW5pZm9ybXMgKGBzaGFkZXJzLnVuaWZvcm1zYClcbiAgICBob2lzdFRleHR1cmVzIChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNuIGluIGNvbmZpZy5zdHlsZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBjb25maWcuc3R5bGVzW3NuXTtcblxuICAgICAgICAgICAgICAgIC8vIFN0eWxlIGB0ZXh0dXJlYFxuICAgICAgICAgICAgICAgIGxldCB0ZXggPSBzdHlsZS50ZXh0dXJlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGV4ID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3RleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHRleDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpc0dsb2JhbCh1cmwpID8gYHRleHR1cmUtJHt1cmx9YCA6IHVybDtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRleHR1cmVzW25hbWVdID0geyB1cmwgfTtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4dHVyZSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTWF0ZXJpYWxcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUubWF0ZXJpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgWydlbWlzc2lvbicsICdhbWJpZW50JywgJ2RpZmZ1c2UnLCAnc3BlY3VsYXInLCAnbm9ybWFsJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGVyaWFsIHByb3BlcnR5IGhhcyBhIHRleHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXggPSBzdHlsZS5tYXRlcmlhbFtwcm9wXSAhPSBudWxsICYmIHN0eWxlLm1hdGVyaWFsW3Byb3BdLnRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRleCA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t0ZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGlzR2xvYmFsKHVybCkgPyBgdGV4dHVyZS0ke3VybH1gIDogdXJsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50ZXh0dXJlc1tuYW1lXSA9IHsgdXJsIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUubWF0ZXJpYWxbcHJvcF0udGV4dHVyZSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNoYWRlciB1bmlmb3Jtc1xuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgICAgICAgICAgR0xTTC5wYXJzZVVuaWZvcm1zKHN0eWxlLnNoYWRlcnMudW5pZm9ybXMpLmZvckVhY2goKHt0eXBlLCB2YWx1ZSwga2V5LCB1bmlmb3Jtc30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRleHR1cmUgYnkgVVJMIChzdHJpbmctbmFtZWQgdGV4dHVyZSBub3QgcmVmZXJlbmNpbmcgZXhpc3RpbmcgdGV4dHVyZSBkZWZpbml0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzYW1wbGVyMkQnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t2YWx1ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpc0dsb2JhbCh1cmwpID8gYHRleHR1cmUtJHt1cmx9YCA6IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudGV4dHVyZXNbbmFtZV0gPSB7IHVybCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zW2tleV0gPSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gTm9ybWFsaXplIHNvbWUgc2NlbmUtd2lkZSBzZXR0aW5ncyB0aGF0IGFwcGx5IHRvIHRoZSBmaW5hbCwgbWVyZ2VkIHNjZW5lXG4gICAgZmluYWxpemUoY29uZmlnKSB7XG4gICAgICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdG9wLWxldmVsIHByb3BlcnRpZXNcbiAgICAgICAgY29uZmlnLnNjZW5lID0gY29uZmlnLnNjZW5lIHx8IHt9O1xuICAgICAgICBjb25maWcuY2FtZXJhcyA9IGNvbmZpZy5jYW1lcmFzIHx8IHt9O1xuICAgICAgICBjb25maWcubGlnaHRzID0gY29uZmlnLmxpZ2h0cyB8fCB7fTtcbiAgICAgICAgY29uZmlnLnN0eWxlcyA9IGNvbmZpZy5zdHlsZXMgfHwge307XG4gICAgICAgIGNvbmZpZy5sYXllcnMgPSBjb25maWcubGF5ZXJzIHx8IHt9O1xuXG4gICAgICAgIC8vIEFzc2lnbiBpZHMgdG8gZGF0YSBzb3VyY2VzXG4gICAgICAgIGxldCBzb3VyY2VfaWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2UgaW4gY29uZmlnLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvbmZpZy5zb3VyY2VzW3NvdXJjZV0uaWQgPSBzb3VyY2VfaWQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG9ubHkgb25lIGNhbWVyYSBzcGVjaWZpZWQsIHNldCBpdCBhcyBkZWZhdWx0XG4gICAgICAgIGlmIChjb25maWcuY2FtZXJhKSB7XG4gICAgICAgICAgICBjb25maWcuY2FtZXJhcy5kZWZhdWx0ID0gY29uZmlnLmNhbWVyYTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIGNhbWVyYXMgc3BlY2lmaWVkLCBjcmVhdGUgb25lXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjb25maWcuY2FtZXJhcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25maWcuY2FtZXJhcy5kZWZhdWx0ID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBubyBsaWdodHMgc3BlY2lmaWVkLCBjcmVhdGUgZGVmYXVsdFxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlnLmxpZ2h0cykubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcubGlnaHRzKS5ldmVyeShpID0+IGNvbmZpZy5saWdodHNbaV0udmlzaWJsZSA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICBjb25maWcubGlnaHRzLmRlZmF1bHRfbGlnaHQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2RpcmVjdGlvbmFsJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG59O1xuXG4vLyBGbGF0dGVuIG5lc3RlZCBwcm9wZXJ0aWVzIGZvciBzaW1wbGVyIHN0cmluZyBsb29rLXVwc1xuLy8gZS5nLiBnbG9iYWwuYmFja2dyb3VuZC5jb2xvciAtPiAnZ2xvYmFsOmJhY2tncm91bmQ6Y29sb3InXG5mdW5jdGlvbiBmbGF0dGVuUHJvcGVydGllcyAob2JqLCBzZXBhcmF0b3IgPSAnOicsIHByZWZpeCA9IG51bGwsIHByb3BzID0ge30pIHtcbiAgICBwcmVmaXggPSBwcmVmaXggPyAocHJlZml4ICsgc2VwYXJhdG9yKSA6ICcnO1xuXG4gICAgZm9yIChsZXQgcCBpbiBvYmopIHtcbiAgICAgICAgbGV0IGtleSA9IHByZWZpeCArIHA7XG4gICAgICAgIGxldCB2YWwgPSBvYmpbcF07XG4gICAgICAgIHByb3BzW2tleV0gPSB2YWw7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGZsYXR0ZW5Qcm9wZXJ0aWVzKHZhbCwgc2VwYXJhdG9yLCBrZXksIHByb3BzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcHM7XG59XG5cbnN1YnNjcmliZU1peGluKFNjZW5lTG9hZGVyKTtcbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi91dGlscy9tZXJnZSc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9zb3VyY2VzL2RhdGFfc291cmNlJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQge1N0eWxlTWFuYWdlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQge3BhcnNlTGF5ZXJzfSBmcm9tICcuL3N0eWxlcy9sYXllcic7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuXG5leHBvcnQgdmFyIFNjZW5lV29ya2VyID0gc2VsZjtcblxuLy8gV29ya2VyIGZ1bmN0aW9uYWxpdHkgd2lsbCBvbmx5IGJlIGRlZmluZWQgaW4gd29ya2VyIHRocmVhZFxuaWYgKFRocmVhZC5pc193b3JrZXIpIHtcblxuT2JqZWN0LmFzc2lnbihzZWxmLCB7XG5cbiAgICBGZWF0dXJlU2VsZWN0aW9uLFxuXG4gICAgc291cmNlczoge30sXG4gICAgc3R5bGVzOiB7fSxcbiAgICBsYXllcnM6IHt9LFxuICAgIHRpbGVzOiB7fSxcbiAgICBvYmplY3RzOiB7fSxcbiAgICBjb25maWc6IHt9LCAgICAgLy8gcmF3IGNvbmZpZyAoZS5nLiBmdW5jdGlvbnMsIGV0Yy4gbm90IGV4cGFuZGVkKVxuXG4gICAgLy8gSW5pdGlhbGl6ZSB3b3JrZXJcbiAgICBpbml0IChzY2VuZV9pZCwgd29ya2VyX2lkLCBudW1fd29ya2VycywgbG9nX2xldmVsLCBkZXZpY2VfcGl4ZWxfcmF0aW8pIHtcbiAgICAgICAgc2VsZi5zY2VuZV9pZCA9IHNjZW5lX2lkO1xuICAgICAgICBzZWxmLl93b3JrZXJfaWQgPSB3b3JrZXJfaWQ7XG4gICAgICAgIHNlbGYubnVtX3dvcmtlcnMgPSBudW1fd29ya2VycztcbiAgICAgICAgbG9nLnNldExldmVsKGxvZ19sZXZlbCk7XG4gICAgICAgIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyA9IGRldmljZV9waXhlbF9yYXRpbztcbiAgICAgICAgRmVhdHVyZVNlbGVjdGlvbi5zZXRQcmVmaXgoc2VsZi5fd29ya2VyX2lkKTtcbiAgICAgICAgc2VsZi5zdHlsZV9tYW5hZ2VyID0gbmV3IFN0eWxlTWFuYWdlcigpO1xuICAgICAgICByZXR1cm4gd29ya2VyX2lkO1xuICAgIH0sXG5cbiAgICAvLyBTdGFydHMgYSBjb25maWcgcmVmcmVzaFxuICAgIHVwZGF0ZUNvbmZpZyAoeyBjb25maWcsIGdlbmVyYXRpb24sIGludHJvc3BlY3Rpb24gfSkge1xuICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZyk7XG5cbiAgICAgICAgc2VsZi5sYXN0X2NvbmZpZyA9IG1lcmdlT2JqZWN0cyh7fSwgc2VsZi5jb25maWcpO1xuICAgICAgICBzZWxmLmNvbmZpZyA9IG1lcmdlT2JqZWN0cyh7fSwgY29uZmlnKTtcbiAgICAgICAgc2VsZi5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjtcbiAgICAgICAgc2VsZi5pbnRyb3NwZWN0aW9uID0gaW50cm9zcGVjdGlvbjtcblxuICAgICAgICAvLyBEYXRhIGJsb2NrIGZ1bmN0aW9ucyBhcmUgbm90IGNvbnRleHQgd3JhcHBlZCBsaWtlIHRoZSByZXN0IG9mIHRoZSBzdHlsZSBmdW5jdGlvbnMgYXJlXG4gICAgICAgIC8vIFRPRE86IHByb2JhYmx5IHdhbnQgYSBjbGVhbmVyIHdheSB0byBleGNsdWRlIHRoZXNlXG4gICAgICAgIGZvciAobGV0IGxheWVyIGluIGNvbmZpZy5sYXllcnMpIHtcbiAgICAgICAgICAgIGlmIChjb25maWcubGF5ZXJzW2xheWVyXSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5sYXllcnNbbGF5ZXJdLmRhdGEgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLmxheWVyc1tsYXllcl0uZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHBhbmQgZ2xvYmFsIHByb3BlcnRpZXNcbiAgICAgICAgc2VsZi5nbG9iYWwgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLmdsb2JhbCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGRhdGEgc291cmNlc1xuICAgICAgICBzZWxmLmNyZWF0ZURhdGFTb3VyY2VzKGNvbmZpZyk7XG5cbiAgICAgICAgLy8gRXhwYW5kIHN0eWxlc1xuICAgICAgICBjb25maWcuc3R5bGVzID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKGNvbmZpZy5zdHlsZXMsIFN0eWxlUGFyc2VyLndyYXBGdW5jdGlvbik7XG4gICAgICAgIHNlbGYuc3R5bGVzID0gc2VsZi5zdHlsZV9tYW5hZ2VyLmJ1aWxkKGNvbmZpZy5zdHlsZXMpO1xuICAgICAgICBzZWxmLnN0eWxlX21hbmFnZXIuaW5pdFN0eWxlcyh7XG4gICAgICAgICAgICBnZW5lcmF0aW9uOiBzZWxmLmdlbmVyYXRpb24sXG4gICAgICAgICAgICBzdHlsZXM6IHNlbGYuc3R5bGVzLFxuICAgICAgICAgICAgc291cmNlczogc2VsZi5zb3VyY2VzLFxuICAgICAgICAgICAgaW50cm9zcGVjdGlvbjogc2VsZi5pbnRyb3NwZWN0aW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFBhcnNlIGVhY2ggdG9wLWxldmVsIGxheWVyIGFzIGEgc2VwYXJhdGUgdHJlZVxuICAgICAgICBzZWxmLmxheWVycyA9IHBhcnNlTGF5ZXJzKGNvbmZpZy5sYXllcnMsIHNlbGYuc3R5bGVfbWFuYWdlci5zdHlsZXMpO1xuXG4gICAgICAgIC8vIFN5bmMgdGV0eHVyZSBpbmZvIGZyb20gbWFpbiB0aHJlYWRcbiAgICAgICAgc2VsZi5zeW5jaW5nX3RleHR1cmVzID0gc2VsZi5zeW5jVGV4dHVyZXMoY29uZmlnLnRleHR1cmVzKTtcblxuICAgICAgICAvLyBSZXR1cm4gcHJvbWlzZSBmb3Igd2hlbiBjb25maWcgcmVmcmVzaCBmaW5pc2hlc1xuICAgICAgICBzZWxmLmNvbmZpZ3VyaW5nID0gc2VsZi5zeW5jaW5nX3RleHR1cmVzLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGB1cGRhdGVkIGNvbmZpZ2ApO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gQ3JlYXRlIGRhdGEgc291cmNlcyBhbmQgY2xlYXIgdGlsZSBjYWNoZSBpZiBuZWNlc3NhcnlcbiAgICBjcmVhdGVEYXRhU291cmNlcyAoY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5zb3VyY2VzID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKGNvbmZpZy5zb3VyY2VzKTsgLy8gcGFyc2UgbmV3IHNvdXJjZXNcbiAgICAgICAgc2VsZi5zb3VyY2VzID0ge307IC8vIGNsZWFyIHByZXZpb3VzIHNvdXJjZXNcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBjb25maWcuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IHNvdXJjZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc291cmNlID0gRGF0YVNvdXJjZS5jcmVhdGUoT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnLnNvdXJjZXNbbmFtZV0sIHtuYW1lfSksIHNlbGYuc291cmNlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLnNvdXJjZXNbbmFtZV0gPSBzb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aWxlIGNhY2hlIGlmIGRhdGEgc291cmNlIGNvbmZpZyBjaGFuZ2VkXG4gICAgICAgIGlmICghc2VsZi5jb25maWcuc291cmNlcyB8fFxuICAgICAgICAgICAgIXNlbGYubGFzdF9jb25maWcuc291cmNlcyB8fFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc2VsZi5jb25maWcuc291cmNlcykuc29tZShzID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2VsZi5jb25maWcuc291cmNlc1tzXSkgIT09IEpTT04uc3RyaW5naWZ5KHNlbGYubGFzdF9jb25maWcuc291cmNlc1tzXSk7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgc2VsZi50aWxlcyA9IHt9O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgd2hlbiBjb25maWcgcmVmcmVzaCBpcyBmaW5pc2hlZFxuICAgIGF3YWl0Q29uZmlndXJhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNvbmZpZ3VyaW5nO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBhIHRpbGU6IGxvYWQgZnJvbSB0aWxlIHNvdXJjZSBpZiBidWlsZGluZyBmb3IgZmlyc3QgdGltZSwgb3RoZXJ3aXNlIHJlYnVpbGQgd2l0aCBleGlzdGluZyBkYXRhXG4gICAgYnVpbGRUaWxlICh7IHRpbGUgfSkge1xuICAgICAgICAvLyBUaWxlIGNhY2hlZD9cbiAgICAgICAgaWYgKHNlbGYuZ2V0VGlsZSh0aWxlLmtleSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBsb2FkaW5nP1xuICAgICAgICAgICAgaWYgKHNlbGYuZ2V0VGlsZSh0aWxlLmtleSkubG9hZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSB0aWxlIGNhY2hlXG4gICAgICAgIHRpbGUgPSBzZWxmLnRpbGVzW3RpbGUua2V5XSA9IE9iamVjdC5hc3NpZ24oc2VsZi5nZXRUaWxlKHRpbGUua2V5KSB8fCB7fSwgdGlsZSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGNvbmZpZyAoc3R5bGVzLCBldGMuKSwgdGhlbiBidWlsZCB0aWxlXG4gICAgICAgIHJldHVybiBzZWxmLmF3YWl0Q29uZmlndXJhdGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBidWlsZGluZyB0aGUgdGlsZVxuICAgICAgICAgICAgaWYgKHRpbGUubG9hZGVkICE9PSB0cnVlKSB7XG5cbiAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRpbGUubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGlsZS5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBzZWxmLmxvYWRUaWxlU291cmNlRGF0YSh0aWxlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmdldFRpbGUodGlsZS5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHN0b3AgdGlsZSBidWlsZCBhZnRlciBkYXRhIHNvdXJjZSBsb2FkIGJlY2F1c2UgdGlsZSB3YXMgcmVtb3ZlZDogJHt0aWxlLmtleX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFdhcm4gYW5kIGNvbnRpbnVlIG9uIGRhdGEgc291cmNlIGVycm9yXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlLnNvdXJjZV9kYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgdGlsZSBsb2FkIGVycm9yKHMpIGZvciAke3RpbGUua2V5fTogJHt0aWxlLnNvdXJjZV9kYXRhLmVycm9yfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgVGlsZS5idWlsZEdlb21ldHJ5KHRpbGUsIHNlbGYpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5lcnJvciA9IGVycm9yLnN0YWNrO1xuICAgICAgICAgICAgICAgICAgICBsb2coJ2Vycm9yJywgYHRpbGUgbG9hZCBlcnJvciBmb3IgJHt0aWxlLmtleX06ICR7dGlsZS5lcnJvcn1gKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGVycm9yIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShgVGlsZU1hbmFnZXJfJHtzZWxmLnNjZW5lX2lkfS5idWlsZFRpbGVFcnJvcmAsIFRpbGUuc2xpY2UodGlsZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGlsZSBhbHJlYWR5IGxvYWRlZCwganVzdCByZWJ1aWxkXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHVzZWQgd29ya2VyIGNhY2hlIGZvciB0aWxlICR7dGlsZS5rZXl9YCk7XG5cbiAgICAgICAgICAgICAgICAvLyBCdWlsZCBnZW9tZXRyeVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFRpbGUuYnVpbGRHZW9tZXRyeSh0aWxlLCBzZWxmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBlcnJvciB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgICAgICAgICB0aWxlLmVycm9yID0gZXJyb3IudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKGBUaWxlTWFuYWdlcl8ke3NlbGYuc2NlbmVfaWR9LmJ1aWxkVGlsZUVycm9yYCwgVGlsZS5zbGljZSh0aWxlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gTG9hZCB0aGlzIHRpbGUncyBkYXRhIHNvdXJjZVxuICAgIGxvYWRUaWxlU291cmNlRGF0YSAodGlsZSkge1xuICAgICAgICBpZiAoc2VsZi5zb3VyY2VzW3RpbGUuc291cmNlXSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc291cmNlc1t0aWxlLnNvdXJjZV0ubG9hZCh0aWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRpbGUuc291cmNlX2RhdGEgPSB7fTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGlsZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0VGlsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYudGlsZXNba2V5XTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZlIHRpbGVcbiAgICByZW1vdmVUaWxlIChrZXkpIHtcbiAgICAgICAgdmFyIHRpbGUgPSBzZWxmLnRpbGVzW2tleV07XG5cbiAgICAgICAgaWYgKHRpbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ2FuY2VsIGlmIGxvYWRpbmdcbiAgICAgICAgICAgIGlmICh0aWxlLmxvYWRpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYGNhbmNlbCB0aWxlIGxvYWQgZm9yICR7a2V5fWApO1xuICAgICAgICAgICAgICAgIHRpbGUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIFRpbGUuY2FuY2VsKHRpbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBjYWNoZVxuICAgICAgICAgICAgRmVhdHVyZVNlbGVjdGlvbi5jbGVhclRpbGUoa2V5KTtcbiAgICAgICAgICAgIGRlbGV0ZSBzZWxmLnRpbGVzW2tleV07XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYHJlbW92ZSB0aWxlIGZyb20gY2FjaGUgZm9yICR7a2V5fWApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEdldCBhIGZlYXR1cmUgZnJvbSB0aGUgc2VsZWN0aW9uIG1hcFxuICAgIGdldEZlYXR1cmVTZWxlY3Rpb24gKHsgaWQsIGtleSB9ID0ge30pIHtcbiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IEZlYXR1cmVTZWxlY3Rpb24ubWFwW2tleV07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIGZlYXR1cmU6IChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmZlYXR1cmUpXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8vIFJlc2V0cyB0aGUgZmVhdHVyZSBzZWxlY3Rpb24gc3RhdGVcbiAgICByZXNldEZlYXR1cmVTZWxlY3Rpb24gKCkge1xuICAgICAgICBGZWF0dXJlU2VsZWN0aW9uLnJlc2V0KCk7XG4gICAgfSxcblxuICAgIC8vIFNlbGVjdGlvbiBtYXAgc2l6ZSBmb3IgdGhpcyB3b3JrZXJcbiAgICBnZXRGZWF0dXJlU2VsZWN0aW9uTWFwU2l6ZSAoKSB7XG4gICAgICAgIHJldHVybiBGZWF0dXJlU2VsZWN0aW9uLmdldE1hcFNpemUoKTtcbiAgICB9LFxuXG4gICAgLy8gVGV4dHVyZSBpbmZvIG5lZWRzIHRvIGJlIHN5bmNlZCBmcm9tIG1haW4gdGhyZWFkLCBlLmcuIHdpZHRoL2hlaWdodCwgd2hpY2ggd2Ugb25seSBrbm93IGFmdGVyIHRoZSB0ZXh0dXJlIGxvYWRzXG4gICAgc3luY1RleHR1cmVzICh0ZXhfY29uZmlnKSB7XG4gICAgICAgIGxldCB0ZXh0dXJlcyA9IFtdO1xuICAgICAgICBpZiAodGV4X2NvbmZpZykge1xuICAgICAgICAgICAgdGV4dHVyZXMucHVzaCguLi5PYmplY3Qua2V5cyh0ZXhfY29uZmlnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2coJ3RyYWNlJywgJ3N5bmMgdGV4dHVyZXMgdG8gd29ya2VyOicsIHRleHR1cmVzKTtcbiAgICAgICAgaWYgKHRleHR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnN5bmNUZXh0dXJlc1RvV29ya2VyKHRleHR1cmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfSxcblxuICAgIC8vIFN5bmMgZGV2aWNlIHBpeGVsIHJhdGlvIGZyb20gbWFpbiB0aHJlYWRcbiAgICB1cGRhdGVEZXZpY2VQaXhlbFJhdGlvIChkZXZpY2VfcGl4ZWxfcmF0aW8pIHtcbiAgICAgICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvID0gZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgIH0sXG5cbiAgICAvLyBQcm9maWxpbmcgaGVscGVyc1xuICAgIHByb2ZpbGUgKG5hbWUpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlKGB3b3JrZXIgJHtzZWxmLl93b3JrZXJfaWR9OiAke25hbWV9YCk7XG4gICAgfSxcblxuICAgIHByb2ZpbGVFbmQgKG5hbWUpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlRW5kKGB3b3JrZXIgJHtzZWxmLl93b3JrZXJfaWR9OiAke25hbWV9YCk7XG4gICAgfVxuXG59KTtcblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnc2VsZicsIHNlbGYpO1xuXG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZlYXR1cmVTZWxlY3Rpb24ge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIHdvcmtlcnMpIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLndvcmtlcnMgPSB3b3JrZXJzOyAvLyBwb29sIG9mIHdvcmtlcnMgdG8gcmVxdWVzdCBmZWF0dXJlIGxvb2stdXBzIGZyb20sIGtleWVkIGJ5IGlkXG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIC8vIFNlbGVjdGlvbiBzdGF0ZSB0cmFja2luZ1xuICAgICAgICB0aGlzLnJlcXVlc3RzID0ge307IC8vIHBlbmRpbmcgc2VsZWN0aW9uIHJlcXVlc3RzXG4gICAgICAgIHRoaXMuZmVhdHVyZSA9IG51bGw7IC8vIGN1cnJlbnRseSBzZWxlY3RlZCBmZWF0dXJlXG4gICAgICAgIHRoaXMucmVhZF9kZWxheSA9IDU7IC8vIGRlbGF5IHRpbWUgZnJvbSBzZWxlY3Rpb24gcmVuZGVyIHRvIGZyYW1lYnVmZmVyIHNhbXBsZSwgdG8gYXZvaWQgQ1BVL0dQVSBzeW5jIGxvY2tcbiAgICAgICAgdGhpcy5yZWFkX2RlbGF5X3RpbWVyID0gbnVsbDsgLy8gY3VycmVudCB0aW1lciAoc2V0VGltZW91dCkgZm9yIGRlbGF5ZWQgc2VsZWN0aW9uIHJlYWRzXG5cbiAgICAgICAgdGhpcy5waXhlbCA9IG5ldyBVaW50OEFycmF5KDQpO1xuICAgICAgICB0aGlzLnBpeGVsMzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMucGl4ZWwuYnVmZmVyKTtcblxuICAgICAgICAvLyBGcmFtZSBidWZmZXIgZm9yIHNlbGVjdGlvblxuICAgICAgICAvLyBUT0RPOiBpbml0aWF0ZSBsYXppbHkgaW4gY2FzZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueSBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5mYm8gPSB0aGlzLmdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG4gICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZmJvKTtcbiAgICAgICAgdGhpcy5mYm9fc2l6ZSA9IHsgd2lkdGg6IDI1NiwgaGVpZ2h0OiAyNTYgfTsgLy8gVE9ETzogbWFrZSBjb25maWd1cmFibGUgLyBhZGFwdGl2ZSBiYXNlZCBvbiBjYW52YXMgc2l6ZVxuICAgICAgICB0aGlzLmZib19zaXplLmFzcGVjdCA9IHRoaXMuZmJvX3NpemUud2lkdGggLyB0aGlzLmZib19zaXplLmhlaWdodDtcblxuICAgICAgICAvLyBUZXh0dXJlIGZvciB0aGUgRkJPIGNvbG9yIGF0dGFjaG1lbnRcbiAgICAgICAgdmFyIGZib190ZXh0dXJlID0gVGV4dHVyZS5jcmVhdGUoIHRoaXMuZ2wsICdzZWxlY3Rpb25fZmJvJywgeyBmaWx0ZXJpbmc6ICduZWFyZXN0JyB9KTtcbiAgICAgICAgZmJvX3RleHR1cmUuc2V0RGF0YSh0aGlzLmZib19zaXplLndpZHRoLCB0aGlzLmZib19zaXplLmhlaWdodCwgbnVsbCwgeyBmaWx0ZXJpbmc6ICduZWFyZXN0JyB9KTtcbiAgICAgICAgdGhpcy5nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCh0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmdsLkNPTE9SX0FUVEFDSE1FTlQwLCB0aGlzLmdsLlRFWFRVUkVfMkQsIGZib190ZXh0dXJlLnRleHR1cmUsIDApO1xuXG4gICAgICAgIC8vIFJlbmRlcmJ1ZmZlciBmb3IgdGhlIEZCTyBkZXB0aCBhdHRhY2htZW50XG4gICAgICAgIHZhciBmYm9fZGVwdGhfcmIgPSB0aGlzLmdsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmdsLmJpbmRSZW5kZXJidWZmZXIodGhpcy5nbC5SRU5ERVJCVUZGRVIsIGZib19kZXB0aF9yYik7XG4gICAgICAgIHRoaXMuZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSh0aGlzLmdsLlJFTkRFUkJVRkZFUiwgdGhpcy5nbC5ERVBUSF9DT01QT05FTlQxNiwgdGhpcy5mYm9fc2l6ZS53aWR0aCwgdGhpcy5mYm9fc2l6ZS5oZWlnaHQpO1xuICAgICAgICB0aGlzLmdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZ2wuREVQVEhfQVRUQUNITUVOVCwgdGhpcy5nbC5SRU5ERVJCVUZGRVIsIGZib19kZXB0aF9yYik7XG5cbiAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2wgJiYgdGhpcy5mYm8pIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5mYm8pO1xuICAgICAgICAgICAgdGhpcy5mYm8gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBmcmVlIHRleHR1cmU/XG4gICAgfVxuXG4gICAgYmluZCgpIHtcbiAgICAgICAgLy8gU3dpdGNoIHRvIEZCT1xuICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmZibyk7XG4gICAgICAgIHRoaXMuZ2wudmlld3BvcnQoMCwgMCwgdGhpcy5mYm9fc2l6ZS53aWR0aCwgdGhpcy5mYm9fc2l6ZS5oZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAvLyBSdW5zIGFzeW5jaHJvbm91c2x5LCBzY2hlZHVsZXMgc2VsZWN0aW9uIGJ1ZmZlciB0byBiZSB1cGRhdGVkXG4gICAgZ2V0RmVhdHVyZUF0KHBvaW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBRdWV1ZSByZXF1ZXN0cyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24sIGFuZCB0aGV5IHdpbGwgYmUgcGlja2VkIHVwIGJ5IHRoZSByZW5kZXIgbG9vcFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZCA9ICh0aGlzLnNlbGVjdGlvbl9yZXF1ZXN0X2lkICsgMSkgfHwgMDtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdHNbdGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZF0gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3BvaW50JyxcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZCxcbiAgICAgICAgICAgICAgICBwb2ludCxcbiAgICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQW55IHBlbmRpbmcgc2VsZWN0aW9uIHJlcXVlc3RzXG4gICAgcGVuZGluZ1JlcXVlc3RzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZXF1ZXN0cykubGVuZ3RoICYmIHRoaXMucmVxdWVzdHM7XG4gICAgfVxuXG4gICAgY2xlYXJQZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgICAgIGZvciAodmFyIHIgaW4gdGhpcy5yZXF1ZXN0cykge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW3JdO1xuXG4gICAgICAgICAgICAvLyBUaGlzIHJlcXVlc3Qgd2FzIGFscmVhZHkgc2VudCB0byB0aGUgd29ya2VyLCB3ZSdyZSBqdXN0IGF3YWl0aW5nIGl0cyByZXBseVxuICAgICAgICAgICAgaWYgKHJlcXVlc3Quc2VudCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZWplY3QgcmVxdWVzdCBzaW5jZSBpdCB3aWxsIG5ldmVyIGJlIGZ1bGZpbGxlZFxuICAgICAgICAgICAgLy8gVE9ETzogcGFzcyBhIHJlYXNvbiBmb3IgcmVqZWN0aW9uP1xuICAgICAgICAgICAgcmVxdWVzdC5yZWplY3QoeyByZXF1ZXN0IH0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVxdWVzdHNbcl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWFkIHBlbmRpbmcgcmVzdWx0cyBmcm9tIHRoZSBzZWxlY3Rpb24gYnVmZmVyLiBDYWxsZWQgYWZ0ZXIgcmVuZGVyaW5nIHRvIHNlbGVjdGlvbiBidWZmZXIuXG4gICAgcmVhZCgpIHtcbiAgICAgICAgLy8gRGVsYXkgcmVhZGluZyB0aGUgcGl4ZWwgcmVzdWx0IGZyb20gdGhlIHNlbGVjdGlvbiBidWZmZXIgdG8gYXZvaWQgQ1BVL0dQVSBzeW5jIGxvY2suXG4gICAgICAgIC8vIENhbGxpbmcgcmVhZFBpeGVscyBzeW5jaHJvbm91c2x5IGNhdXNlZCBhIG1hc3NpdmUgcGVyZm9ybWFuY2UgaGl0LCBwcmVzdW1hYmx5IHNpbmNlIGl0XG4gICAgICAgIC8vIGZvcmNlZCB0aGlzIGZ1bmN0aW9uIHRvIHdhaXQgZm9yIHRoZSBHUFUgdG8gZmluaXNoIHJlbmRlcmluZyBhbmQgcmV0cmlldmUgdGhlIHRleHR1cmUgY29udGVudHMuXG4gICAgICAgIGlmICh0aGlzLnJlYWRfZGVsYXlfdGltZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZF9kZWxheV90aW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkX2RlbGF5X3RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZmJvKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgciBpbiB0aGlzLnJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW3JdO1xuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyByZXF1ZXN0IHdhcyBhbHJlYWR5IHNlbnQgdG8gdGhlIHdvcmtlciwgd2UncmUganVzdCBhd2FpdGluZyBpdHMgcmVwbHlcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5zZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgc2VsZWN0aW9uIHR5cGVzLCBzdWNoIGFzIGZlYXR1cmVzIHdpdGhpbiBhIGJveFxuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnR5cGUgIT09ICdwb2ludCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgc2VsZWN0aW9uIG1hcCBhZ2FpbnN0IEZCT1xuICAgICAgICAgICAgICAgIGdsLnJlYWRQaXhlbHMoXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IocmVxdWVzdC5wb2ludC54ICogdGhpcy5mYm9fc2l6ZS53aWR0aCksXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoKDEgLSByZXF1ZXN0LnBvaW50LnkpICogdGhpcy5mYm9fc2l6ZS5oZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICAxLCAxLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLnBpeGVsKTtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZV9rZXkgPSAodGhpcy5waXhlbFswXSArICh0aGlzLnBpeGVsWzFdIDw8IDgpICsgKHRoaXMucGl4ZWxbMl0gPDwgMTYpICsgKHRoaXMucGl4ZWxbM10gPDwgMjQpKSA+Pj4gMDtcblxuICAgICAgICAgICAgICAgIC8vIElmIGZlYXR1cmUgZm91bmQsIGFzayBhcHByb3ByaWF0ZSB3ZWIgd29ya2VyIHRvIGxvb2t1cCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgdmFyIHdvcmtlcl9pZCA9IHRoaXMucGl4ZWxbM107XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtlcl9pZCAhPT0gMjU1KSB7IC8vIDI1NSBpbmRpY2F0ZXMgYW4gZW1wdHkgc2VsZWN0aW9uIGJ1ZmZlciBwaXhlbFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53b3JrZXJzW3dvcmtlcl9pZF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud29ya2Vyc1t3b3JrZXJfaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWxmLmdldEZlYXR1cmVTZWxlY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IHJlcXVlc3QuaWQsIGtleTogZmVhdHVyZV9rZXkgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKG1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoUmVhZChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE5vIGZlYXR1cmUgZm91bmQsIGJ1dCBzdGlsbCBuZWVkIHRvIHJlc29sdmUgcHJvbWlzZVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaFJlYWQoeyBpZDogcmVxdWVzdC5pZCwgZmVhdHVyZTogbnVsbCB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0LnNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuXG4gICAgICAgIH0sIHRoaXMucmVhZF9kZWxheSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGZpbmRzIGEgZmVhdHVyZSBpbiB0aGUgc2VsZWN0aW9uIGJ1ZmZlclxuICAgIGZpbmlzaFJlYWQgKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW21lc3NhZ2UuaWRdO1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBcIkZlYXR1cmVTZWxlY3Rpb24uZmluaXNoUmVhZCgpOiBjb3VsZCBub3QgZmluZCBtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuOyAvLyByZXF1ZXN0IHdhcyBjbGVhcmVkIGJlZm9yZSBpdCByZXR1cm5lZFxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZlYXR1cmUgPSBtZXNzYWdlLmZlYXR1cmU7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGlmICgoZmVhdHVyZSAhPSBudWxsICYmIHRoaXMuZmVhdHVyZSA9PSBudWxsKSB8fFxuICAgICAgICAgICAgKGZlYXR1cmUgPT0gbnVsbCAmJiB0aGlzLmZlYXR1cmUgIT0gbnVsbCkgfHxcbiAgICAgICAgICAgIChmZWF0dXJlICE9IG51bGwgJiYgdGhpcy5mZWF0dXJlICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5mZWF0dXJlKSkpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsgLy8gc3RvcmUgdGhlIG1vc3QgcmVjZW50bHkgc2VsZWN0ZWQgZmVhdHVyZVxuXG4gICAgICAgIC8vIFJlc29sdmUgdGhlIHJlcXVlc3RcbiAgICAgICAgcmVxdWVzdC5yZXNvbHZlKHsgZmVhdHVyZSwgY2hhbmdlZCwgcmVxdWVzdCB9KTtcbiAgICAgICAgZGVsZXRlIHRoaXMucmVxdWVzdHNbbWVzc2FnZS5pZF07IC8vIGRvbmUgcHJvY2Vzc2luZyB0aGlzIHJlcXVlc3RcbiAgICB9XG5cblxuICAgIC8vIFNlbGVjdGlvbiBtYXAgZ2VuZXJhdGlvblxuICAgIC8vIEVhY2ggd29ya2VyIHdpbGwgY3JlYXRlIGl0cyBvd24gaW5kZXBlbmRlbnQsICdsb2NhbCcgc2VsZWN0aW9uIG1hcFxuXG4gICAgLy8gQ3JlYXRlIGEgdW5pcXVlIDMyLWJpdCBjb2xvciB0byBpZGVudGlmeSBhIGZlYXR1cmVcbiAgICAvLyBXb3JrZXJzIGluZGVwZW5kZW50bHkgY3JlYXRlL21vZGlmeSBzZWxlY3Rpb24gY29sb3JzIGluIHRoZWlyIG93biB0aHJlYWRzLCBidXQgd2UgYWxzb1xuICAgIC8vIG5lZWQgdGhlIG1haW4gdGhyZWFkIHRvIGtub3cgd2hlcmUgZWFjaCBmZWF0dXJlIGNvbG9yIG9yaWdpbmF0ZWQuIFRvIGFjY29tcGxpc2ggdGhpcyxcbiAgICAvLyB3ZSBwYXJ0aXRpb24gdGhlIG1hcCBieSBzZXR0aW5nIHRoZSA0dGggY29tcG9uZW50IChhbHBoYSBjaGFubmVsKSB0byB0aGUgd29ya2VyJ3MgaWQuXG4gICAgc3RhdGljIG1ha2VFbnRyeSh0aWxlKSB7XG4gICAgICAgIC8vIDMyLWJpdCBjb2xvciBrZXlcbiAgICAgICAgdGhpcy5tYXBfZW50cnkrKztcbiAgICAgICAgdmFyIGlyID0gdGhpcy5tYXBfZW50cnkgJiAyNTU7XG4gICAgICAgIHZhciBpZyA9ICh0aGlzLm1hcF9lbnRyeSA+PiA4KSAmIDI1NTtcbiAgICAgICAgdmFyIGliID0gKHRoaXMubWFwX2VudHJ5ID4+IDE2KSAmIDI1NTtcbiAgICAgICAgdmFyIGlhID0gdGhpcy5tYXBfcHJlZml4O1xuICAgICAgICB2YXIgciA9IGlyIC8gMjU1O1xuICAgICAgICB2YXIgZyA9IGlnIC8gMjU1O1xuICAgICAgICB2YXIgYiA9IGliIC8gMjU1O1xuICAgICAgICB2YXIgYSA9IGlhIC8gMjU1O1xuICAgICAgICB2YXIga2V5ID0gKGlyICsgKGlnIDw8IDgpICsgKGliIDw8IDE2KSArIChpYSA8PCAyNCkpID4+PiAwOyAvLyBuZWVkIHVuc2lnbmVkIHJpZ2h0IHNoaWZ0IHRvIGNvbnZlcnQgdG8gcG9zaXRpdmUgI1xuXG4gICAgICAgIHRoaXMubWFwW2tleV0gPSB7XG4gICAgICAgICAgICBjb2xvcjogW3IsIGcsIGIsIGFdLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1hcF9zaXplKys7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aWxlLXNwZWNpZmljIHRyYWNraW5nIGluZm9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVzW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy50aWxlc1t0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICAgICAgZW50cmllczogW10sICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9mIGZlYXR1cmUgZW50cmllcyBpbiB0aGlzIHRocmVhZFxuICAgICAgICAgICAgICAgIHRpbGU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YnNldCBvZiB0aWxlIHByb3BlcnRpZXMgdG8gcGFzcyBiYWNrIHdpdGggZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgICBrZXk6IHRpbGUua2V5LFxuICAgICAgICAgICAgICAgICAgICBjb29yZHM6IHRpbGUuY29vcmRzLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZV96b29tOiB0aWxlLnN0eWxlX3pvb20sXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGlsZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb246IHRpbGUuZ2VuZXJhdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpbGVzW3RpbGUua2V5XS5lbnRyaWVzLnB1c2goa2V5KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5tYXBba2V5XTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbWFrZUNvbG9yKGZlYXR1cmUsIHRpbGUsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gdGhpcy5tYWtlRW50cnkodGlsZSk7XG4gICAgICAgIHNlbGVjdG9yLmZlYXR1cmUgPSB7XG4gICAgICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgIHNvdXJjZV9uYW1lOiBjb250ZXh0LnNvdXJjZSxcbiAgICAgICAgICAgIHNvdXJjZV9sYXllcjogY29udGV4dC5sYXllcixcbiAgICAgICAgICAgIGxheWVyczogY29udGV4dC5sYXllcnMsXG4gICAgICAgICAgICB0aWxlOiB0aGlzLnRpbGVzW3RpbGUua2V5XS50aWxlXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yLmNvbG9yO1xuICAgIH1cblxuICAgIHN0YXRpYyByZXNldCgpIHtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLm1hcCA9IHt9O1xuICAgICAgICB0aGlzLm1hcF9zaXplID0gMDtcbiAgICAgICAgdGhpcy5tYXBfZW50cnkgPSAwO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhclRpbGUoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLnRpbGVzW2tleV0pIHtcbiAgICAgICAgICAgIHRoaXMudGlsZXNba2V5XS5lbnRyaWVzLmZvckVhY2goayA9PiBkZWxldGUgdGhpcy5tYXBba10pO1xuICAgICAgICAgICAgdGhpcy5tYXBfc2l6ZSAtPSB0aGlzLnRpbGVzW2tleV0uZW50cmllcy5sZW5ndGg7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy50aWxlc1trZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldE1hcFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcF9zaXplO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXRQcmVmaXgocHJlZml4KSB7XG4gICAgICAgIHRoaXMubWFwX3ByZWZpeCA9IHByZWZpeDtcbiAgICB9XG5cbn1cblxuLy8gU3RhdGljIHByb3BlcnRpZXNcbkZlYXR1cmVTZWxlY3Rpb24ubWFwID0ge307ICAgLy8gdGhpcyB3aWxsIGJlIHVuaXF1ZSBwZXIgbW9kdWxlIGluc3RhbmNlIChzbyB1bmlxdWUgcGVyIHdvcmtlcilcbkZlYXR1cmVTZWxlY3Rpb24udGlsZXMgPSB7fTsgLy8gc2VsZWN0aW9uIGtleXMsIGJ5IHRpbGVcbkZlYXR1cmVTZWxlY3Rpb24ubWFwX3NpemUgPSAwO1xuRmVhdHVyZVNlbGVjdGlvbi5tYXBfZW50cnkgPSAwO1xuRmVhdHVyZVNlbGVjdGlvbi5tYXBfcHJlZml4ID0gMDsgLy8gc2V0IGJ5IHdvcmtlciB0byB3b3JrZXIgaWQgI1xuRmVhdHVyZVNlbGVjdGlvbi5kZWZhdWx0Q29sb3IgPSBbMCwgMCwgMCwgMV07XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUgKi9cbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCB7TWV0aG9kTm90SW1wbGVtZW50ZWR9IGZyb20gJy4uL3V0aWxzL2Vycm9ycyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0ICogYXMgVVJMcyBmcm9tICcuLi91dGlscy91cmxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0YVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoY29uZmlnLCBzb3VyY2VzKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOyAvLyBzYXZlIG9yaWdpbmFsIGNvbmZpZ1xuICAgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzOyAvLyBmdWxsIHNldCBvZiBkYXRhIHNvdXJjZXMgVE9ETzogY2VudHJhbGl6ZSB0aGVzZSBsaWtlIHRleHR1cmVzP1xuICAgICAgICB0aGlzLmlkID0gY29uZmlnLmlkO1xuICAgICAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICAgICAgdGhpcy5wYWRfc2NhbGUgPSBjb25maWcucGFkX3NjYWxlIHx8IDAuMDAwMTsgLy8gc2NhbGUgdGlsZSB1cCBieSBzbWFsbCBmYWN0b3IgdG8gY292ZXIgc2VhbXNcbiAgICAgICAgdGhpcy5kZWZhdWx0X3dpbmRpbmcgPSBudWxsOyAvLyB3aW5kaW5nIG9yZGVyIHdpbGwgYWRhcHQgdG8gZGF0YSBzb3VyY2VcbiAgICAgICAgdGhpcy5yYXN0ZXJzID0gW107IC8vIGF0dGFjaGVkIHJhc3RlciB0aWxlIHNvdXJjZXNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnJhc3RlcnMpKSB7IC8vIGNvcHkgdW5pcXVlIHNldCBvZiByYXN0ZXIgc291cmNlc1xuICAgICAgICAgICAgY29uZmlnLnJhc3RlcnMuZm9yRWFjaChyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yYXN0ZXJzLmluZGV4T2YocikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmFzdGVycy5wdXNoKHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHNvdXJjZSBkYXRhXG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gY29uZmlnLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uYmluZCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25cbiAgICAgICAgdGhpcy5leHRyYV9kYXRhID0gY29uZmlnLmV4dHJhX2RhdGE7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBzY3JpcHRzIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25cbiAgICAgICAgLy8gTk9URTogdGhlc2UgYXJlIGxvYWRlZCBhbG9uZ3NpZGUgdGhlIGxpYnJhcnkgd2hlbiB0aGUgd29ya2VycyBhcmUgaW5zdGFudGlhdGVkXG4gICAgICAgIHRoaXMuc2NyaXB0cyA9IGNvbmZpZy5zY3JpcHRzO1xuXG4gICAgICAgIC8vIG92ZXJ6b29tIHdpbGwgYXBwbHkgZm9yIHpvb21zIGhpZ2hlciB0aGFuIHRoaXNcbiAgICAgICAgdGhpcy5tYXhfem9vbSA9IChjb25maWcubWF4X3pvb20gIT0gbnVsbCkgPyBjb25maWcubWF4X3pvb20gOiBHZW8uZGVmYXVsdF9zb3VyY2VfbWF4X3pvb207XG5cbiAgICAgICAgLy8gbm8gdGlsZXMgd2lsbCBiZSByZXF1ZXN0ZWQgb3IgZGlzcGxheWVkIG91dHNpZGUgb2YgdGhlc2UgbWluL21heCB2YWx1ZXNcbiAgICAgICAgdGhpcy5taW5fZGlzcGxheV96b29tID0gKGNvbmZpZy5taW5fZGlzcGxheV96b29tICE9IG51bGwpID8gY29uZmlnLm1pbl9kaXNwbGF5X3pvb20gOiAwO1xuICAgICAgICB0aGlzLm1heF9kaXNwbGF5X3pvb20gPSAoY29uZmlnLm1heF9kaXNwbGF5X3pvb20gIT0gbnVsbCkgPyBjb25maWcubWF4X2Rpc3BsYXlfem9vbSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgdGlsZSBzb3VyY2UgYnkgdHlwZSwgZmFjdG9yeS1zdHlsZVxuICAgIHN0YXRpYyBjcmVhdGUgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBpZiAoRGF0YVNvdXJjZS50eXBlc1tzb3VyY2UudHlwZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZS50eXBlc1tzb3VyY2UudHlwZV0oc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvbiBjaGFuZ2VkXG4gICAgc3RhdGljIGNoYW5nZWQgKHNvdXJjZSwgcHJldl9zb3VyY2UpIHtcbiAgICAgICAgaWYgKCFzb3VyY2UgfHwgIXByZXZfc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjdXIgPSBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2UuY29uZmlnLCB7IGlkOiBudWxsIH0pOyAvLyBudWxsIG91dCBpZHMgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBjb21wYXJlIHRoZW1cbiAgICAgICAgbGV0IHByZXYgPSBPYmplY3QuYXNzaWduKHt9LCBwcmV2X3NvdXJjZS5jb25maWcsIHsgaWQ6IG51bGwgfSk7XG5cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGN1cikgIT09IEpTT04uc3RyaW5naWZ5KHByZXYpO1xuICAgIH1cblxuICAgIC8vIE1lcmNhdG9yIHByb2plY3Rpb25cbiAgICBzdGF0aWMgcHJvamVjdERhdGEgKHNvdXJjZSkge1xuICAgICAgICB2YXIgdGltZXIgPSArbmV3IERhdGUoKTtcbiAgICAgICAgZm9yICh2YXIgdCBpbiBzb3VyY2UubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbnVtX2ZlYXR1cmVzID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBudW1fZmVhdHVyZXM7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgW3gsIHldID0gR2VvLmxhdExuZ1RvTWV0ZXJzKGNvb3JkKTtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMF0gPSB4O1xuICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IHk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc291cmNlLmRlYnVnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNvdXJjZS5kZWJ1Zy5wcm9qZWN0aW9uID0gK25ldyBEYXRlKCkgLSB0aW1lcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICBSZS1zY2FsZSBnZW9tZXRyaWVzIHdpdGhpbiBlYWNoIHNvdXJjZSB0byBpbnRlcm5hbCB0aWxlIHVuaXRzXG4gICAgKi9cbiAgICBzdGF0aWMgc2NhbGVEYXRhIChzb3VyY2UsIHtjb29yZHM6IHt6fSwgbWluLCBtYXh9KSB7XG4gICAgICAgIGxldCB1bml0c19wZXJfbWV0ZXIgPSBHZW8udW5pdHNQZXJNZXRlcih6KTtcbiAgICAgICAgZm9yICh2YXIgdCBpbiBzb3VyY2UubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbnVtX2ZlYXR1cmVzID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBudW1fZmVhdHVyZXM7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb29yZFswXSA9IChjb29yZFswXSAtIG1pbi54KSAqIHVuaXRzX3Blcl9tZXRlcjtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSAoY29vcmRbMV0gLSBtaW4ueSkgKiB1bml0c19wZXJfbWV0ZXIgKiAtMTsgLy8gZmxpcCBjb29yZHMgcG9zaXRpdmVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWQoZGVzdCkge1xuICAgICAgICBkZXN0LnNvdXJjZV9kYXRhID0ge307XG4gICAgICAgIGRlc3Quc291cmNlX2RhdGEubGF5ZXJzID0ge307XG4gICAgICAgIGRlc3QucGFkX3NjYWxlID0gdGhpcy5wYWRfc2NhbGU7XG4gICAgICAgIGRlc3QucmFzdGVycyA9IFsuLi50aGlzLnJhc3RlcnNdOyAvLyBjb3B5IGxpc3Qgb2YgcmFzdGVycyB0byBsb2FkIGZvciB0aWxlXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWQoZGVzdCkudGhlbigoZGVzdCkgPT4ge1xuICAgICAgICAgICAgLy8gUG9zdC1wcm9jZXNzaW5nXG4gICAgICAgICAgICBmb3IgKGxldCBsYXllciBpbiBkZXN0LnNvdXJjZV9kYXRhLmxheWVycykge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gZGVzdC5zb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuZmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5mZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgR2VvLnRyYW5zZm9ybUdlb21ldHJ5KGZlYXR1cmUuZ2VvbWV0cnksIGNvb3JkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGbGlwIFkgY29vcmRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSAtY29vcmRbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTbGlnaHRseSBzY2FsZSB1cCB0aWxlIHRvIGNvdmVyIHNlYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFkX3NjYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWzBdID0gTWF0aC5yb3VuZChjb29yZFswXSAqICgxICsgdGhpcy5wYWRfc2NhbGUpIC0gKEdlby50aWxlX3NjYWxlICogdGhpcy5wYWRfc2NhbGUvMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IE1hdGgucm91bmQoY29vcmRbMV0gKiAoMSArIHRoaXMucGFkX3NjYWxlKSAtIChHZW8udGlsZV9zY2FsZSAqIHRoaXMucGFkX3NjYWxlLzIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGZpcnN0IGVuY291bnRlcmVkIHBvbHlnb24gd2luZGluZyBvcmRlciBhcyBkZWZhdWx0IGZvciBkYXRhIHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEZWZhdWx0V2luZGluZyhmZWF0dXJlLmdlb21ldHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZXN0LmRlZmF1bHRfd2luZGluZyA9IHRoaXMuZGVmYXVsdF93aW5kaW5nIHx8ICdDQ1cnO1xuICAgICAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN1Yi1jbGFzc2VzIG11c3QgaW1wbGVtZW50XG4gICAgX2xvYWQoZGVzdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ19sb2FkJyk7XG4gICAgfVxuXG4gICAgLy8gSW5mZXIgd2luZGluZyBmb3IgZGF0YSBzb3VyY2UgZnJvbSBmaXJzdCByaW5nIG9mIHByb3ZpZGVkIGdlb21ldHJ5XG4gICAgdXBkYXRlRGVmYXVsdFdpbmRpbmcgKGdlb20pIHtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdF93aW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChnZW9tLnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdF93aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKGdlb20uY29vcmRpbmF0ZXNbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZ2VvbS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdF93aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKGdlb20uY29vcmRpbmF0ZXNbMF1bMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRfd2luZGluZztcbiAgICB9XG5cbiAgICAvLyBBbGwgZGF0YSBzb3VyY2VzIHN1cHBvcnQgYSBtaW4gem9vbSwgdGlsZWQgc291cmNlcyBjYW4gc3ViY2xhc3MgZm9yIG1vcmUgc3BlY2lmaWMgbGltaXRzIChlLmcuIGJvdW5kaW5nIGJveClcbiAgICBpbmNsdWRlc1RpbGUgKGNvb3Jkcywgc3R5bGVfem9vbSkge1xuICAgICAgICAvLyBMaW1pdCBieSB0aGlzIGRhdGEgc291cmNlXG4gICAgICAgIGlmIChjb29yZHMueiA8IHRoaXMubWluX2Rpc3BsYXlfem9vbSB8fCAodGhpcy5tYXhfZGlzcGxheV96b29tICE9IG51bGwgJiYgc3R5bGVfem9vbSA+IHRoaXMubWF4X2Rpc3BsYXlfem9vbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpbWl0IGJ5IGFueSBkZXBlbmRlbnQgcmFzdGVyIHNvdXJjZXNcbiAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgdGhpcy5yYXN0ZXJzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VfbmFtZSA9IHRoaXMucmFzdGVyc1tyXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZXNbc291cmNlX25hbWVdICYmXG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VzW3NvdXJjZV9uYW1lXSAhPT0gdGhpcyAmJlxuICAgICAgICAgICAgICAgICF0aGlzLnNvdXJjZXNbc291cmNlX25hbWVdLmluY2x1ZGVzVGlsZShjb29yZHMsIGNvb3Jkcy56KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVyIGEgbmV3IGRhdGEgc291cmNlIHR5cGUsIHVuZGVyIGEgdHlwZSBuYW1lXG4gICAgc3RhdGljIHJlZ2lzdGVyKHR5cGVfY2xhc3MsIHR5cGVfbmFtZSkge1xuICAgICAgICBpZiAoIXR5cGVfY2xhc3MgfHwgIXR5cGVfbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRGF0YVNvdXJjZS50eXBlc1t0eXBlX25hbWVdID0gdHlwZV9jbGFzcztcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS50eXBlcyA9IHt9OyAvLyBzZXQgb2Ygc3VwcG9ydGVkIGRhdGEgc291cmNlIGNsYXNzZXMsIHJlZmVyZW5jZWQgYnkgdHlwZSBuYW1lXG5cblxuLyoqKiBHZW5lcmljIG5ldHdvcmsgbG9hZGluZyBzb3VyY2UgLSBhYnN0cmFjdCBjbGFzcyAqKiovXG5cbmV4cG9ydCBjbGFzcyBOZXR3b3JrU291cmNlIGV4dGVuZHMgRGF0YVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG4gICAgICAgIHRoaXMudXJsID0gVVJMcy5hZGRQYXJhbXNUb1VSTChzb3VyY2UudXJsLCBzb3VyY2UudXJsX3BhcmFtcyk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VfdHlwZSA9IFwiXCI7IC8vIHVzZSB0byBzZXQgZXhwbGljaXQgWEhSIHR5cGVcblxuICAgICAgICBpZiAodGhpcy51cmwgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ05ldHdvcmsgZGF0YSBzb3VyY2UgbXVzdCBwcm92aWRlIGEgYHVybGAgcHJvcGVydHknKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9sb2FkIChkZXN0KSB7XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLmZvcm1hdFVybCh0aGlzLnVybCwgZGVzdCk7XG5cbiAgICAgICAgbGV0IHNvdXJjZV9kYXRhID0gZGVzdC5zb3VyY2VfZGF0YTtcbiAgICAgICAgc291cmNlX2RhdGEudXJsID0gdXJsO1xuICAgICAgICBkZXN0LmRlYnVnID0gZGVzdC5kZWJ1ZyB8fCB7fTtcbiAgICAgICAgZGVzdC5kZWJ1Zy5uZXR3b3JrID0gK25ldyBEYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNvdXJjZV9kYXRhLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIC8vIEZvciB0ZXN0aW5nIG5ldHdvcmsgZXJyb3JzXG4gICAgICAgICAgICAvLyB2YXIgcHJvbWlzZSA9IFV0aWxzLmlvKHVybCwgNjAgKiAxMDAsIHRoaXMucmVzcG9uc2VfdHlwZSk7XG4gICAgICAgICAgICAvLyBpZiAoTWF0aC5yYW5kb20oKSA8IC43KSB7XG4gICAgICAgICAgICAvLyAgICAgcHJvbWlzZSA9IFByb21pc2UucmVqZWN0KEVycm9yKCdmYWtlIGRhdGEgc291cmNlIGVycm9yJykpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgLy8gcHJvbWlzZS50aGVuKChib2R5KSA9PiB7XG4gICAgICAgICAgICBsZXQgcHJvbWlzZSA9IFV0aWxzLmlvKHVybCwgNjAgKiAxMDAwLCB0aGlzLnJlc3BvbnNlX3R5cGUpO1xuICAgICAgICAgICAgc291cmNlX2RhdGEucmVxdWVzdCA9IHByb21pc2UucmVxdWVzdDtcblxuICAgICAgICAgICAgcHJvbWlzZS50aGVuKChib2R5KSA9PiB7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5yZXNwb25zZV9zaXplID0gYm9keS5sZW5ndGggfHwgYm9keS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGRlc3QuZGVidWcubmV0d29yayA9ICtuZXcgRGF0ZSgpIC0gZGVzdC5kZWJ1Zy5uZXR3b3JrO1xuICAgICAgICAgICAgICAgIGRlc3QuZGVidWcucGFyc2luZyA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VTb3VyY2VEYXRhKGRlc3QsIHNvdXJjZV9kYXRhLCBib2R5KTtcbiAgICAgICAgICAgICAgICBkZXN0LmRlYnVnLnBhcnNpbmcgPSArbmV3IERhdGUoKSAtIGRlc3QuZGVidWcucGFyc2luZztcbiAgICAgICAgICAgICAgICByZXNvbHZlKGRlc3QpO1xuICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgc291cmNlX2RhdGEuZXJyb3IgPSBlcnJvci5zdGFjaztcbiAgICAgICAgICAgICAgICByZXNvbHZlKGRlc3QpOyAvLyByZXNvbHZlIHJlcXVlc3QgYnV0IHBhc3MgYWxvbmcgZXJyb3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTdWItY2xhc3NlcyBtdXN0IGltcGxlbWVudDpcblxuICAgIGZvcm1hdFVybCAodXJsX3RlbXBsYXRlLCBkZXN0KSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZCgnZm9ybWF0VXJsJyk7XG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhIChkZXN0LCBzb3VyY2UsIHJlcG9uc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkKCdwYXJzZVNvdXJjZURhdGEnKTtcbiAgICB9XG59XG5cblxuLyoqKiBHZW5lcmljIG5ldHdvcmsgdGlsZSBsb2FkaW5nIC0gYWJzdHJhY3QgY2xhc3MgKioqL1xuXG5leHBvcnQgY2xhc3MgTmV0d29ya1RpbGVTb3VyY2UgZXh0ZW5kcyBOZXR3b3JrU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcblxuICAgICAgICB0aGlzLnRpbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYXJzZUJvdW5kcyhzb3VyY2UpO1xuXG4gICAgICAgIC8vIGluZGljYXRlcyBpZiBzb3VyY2Ugc2hvdWxkIGJ1aWxkIGdlb21ldHJ5IHRpbGVzLCBlbmFibGVkIGZvciBzb3VyY2VzIHJlZmVyZW5jZWQgaW4gdGhlIHNjZW5lJ3MgbGF5ZXJzLFxuICAgICAgICAvLyBhbmQgbGVmdCBkaXNhYmxlZCBmb3Igc291cmNlcyB0aGF0IGFyZSBuZXZlciByZWZlcmVuY2VkLCBvciBvbmx5IHVzZWQgYXMgcmFzdGVyIHRleHR1cmVzXG4gICAgICAgIHRoaXMuYnVpbGRzX2dlb21ldHJ5X3RpbGVzID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy50bXMgPSAoc291cmNlLnRtcyA9PT0gdHJ1ZSk7IC8vIG9wdGlvbmFsbHkgZmxpcCB0aWxlIGNvb3JkcyBmb3IgVE1TXG4gICAgICAgIHRoaXMudXJsX2hvc3RzID0gbnVsbDtcbiAgICAgICAgdmFyIGhvc3RfbWF0Y2ggPSB0aGlzLnVybC5tYXRjaCgve3M6XFxbKFtefStdKylcXF19Lyk7XG4gICAgICAgIGlmIChob3N0X21hdGNoICE9IG51bGwgJiYgaG9zdF9tYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnVybF9ob3N0cyA9IGhvc3RfbWF0Y2hbMV0uc3BsaXQoJywnKTtcbiAgICAgICAgICAgIHRoaXMubmV4dF9ob3N0ID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCBib3VuZHMgZnJvbSBzb3VyY2UgY29uZmlnIHBhcmFtZXRlcnNcbiAgICBwYXJzZUJvdW5kcyAoc291cmNlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZS5ib3VuZHMpICYmIHNvdXJjZS5ib3VuZHMubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICB0aGlzLmJvdW5kcyA9IHNvdXJjZS5ib3VuZHM7XG4gICAgICAgICAgICBsZXQgW3csIHMsIGUsIG5dID0gdGhpcy5ib3VuZHM7XG4gICAgICAgICAgICB0aGlzLmJvdW5kc19tZXRlcnMgPSB7XG4gICAgICAgICAgICAgICAgbWluOiBHZW8ubGF0TG5nVG9NZXRlcnMoW3csIG5dKSxcbiAgICAgICAgICAgICAgICBtYXg6IEdlby5sYXRMbmdUb01ldGVycyhbZSwgc10pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzX3RpbGVzID0geyBtaW46IHt9LCBtYXg6IHt9IH07IC8vIG1heCB0aWxlIGJvdW5kcyBwZXIgem9vbSAobGF6aWx5IGV2YWx1YXRlZClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybnMgZmFsc2UgaWYgdGlsZSBpcyBvdXRzaWRlIGRhdGEgc291cmNlJ3MgYm91bmRzLCB0cnVlIGlmIHdpdGhpblxuICAgIGNoZWNrQm91bmRzIChjb29yZHMpIHtcbiAgICAgICAgLy8gQ2hlY2sgdGlsZSBib3VuZHNcbiAgICAgICAgaWYgKHRoaXMuYm91bmRzKSB7XG4gICAgICAgICAgICBjb29yZHMgPSBHZW8ud3JhcFRpbGUoY29vcmRzLCB7IHg6IHRydWUgfSk7XG5cbiAgICAgICAgICAgIGxldCBtaW4gPSB0aGlzLmJvdW5kc190aWxlcy5taW5bY29vcmRzLnpdO1xuICAgICAgICAgICAgaWYgKCFtaW4pIHtcbiAgICAgICAgICAgICAgICBtaW4gPSB0aGlzLmJvdW5kc190aWxlcy5taW5bY29vcmRzLnpdID0gR2VvLnRpbGVGb3JNZXRlcnModGhpcy5ib3VuZHNfbWV0ZXJzLm1pbiwgY29vcmRzLnopO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbWF4ID0gdGhpcy5ib3VuZHNfdGlsZXMubWF4W2Nvb3Jkcy56XTtcbiAgICAgICAgICAgIGlmICghbWF4KSB7XG4gICAgICAgICAgICAgICAgbWF4ID0gdGhpcy5ib3VuZHNfdGlsZXMubWF4W2Nvb3Jkcy56XSA9IEdlby50aWxlRm9yTWV0ZXJzKHRoaXMuYm91bmRzX21ldGVycy5tYXgsIGNvb3Jkcy56KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvb3Jkcy54IDwgbWluLnggfHwgY29vcmRzLnggPiBtYXgueCB8fFxuICAgICAgICAgICAgICAgIGNvb3Jkcy55IDwgbWluLnkgfHwgY29vcmRzLnkgPiBtYXgueSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpbmNsdWRlc1RpbGUgKGNvb3Jkcywgc3R5bGVfem9vbSkge1xuICAgICAgICBpZiAoIXN1cGVyLmluY2x1ZGVzVGlsZShjb29yZHMsIHN0eWxlX3pvb20pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aWxlIGJvdW5kc1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tCb3VuZHMoY29vcmRzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvcm1hdFVybCh1cmxfdGVtcGxhdGUsIHRpbGUpIHtcbiAgICAgICAgbGV0IGNvb3JkcyA9IEdlby53cmFwVGlsZSh0aWxlLmNvb3JkcywgeyB4OiB0cnVlIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnRtcykge1xuICAgICAgICAgICAgY29vcmRzLnkgPSBNYXRoLnBvdygyLCBjb29yZHMueikgLSAxIC0gY29vcmRzLnk7IC8vIG9wdGlvbmFsbHkgZmxpcCB0aWxlIGNvb3JkcyBmb3IgVE1TXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdXJsID0gdXJsX3RlbXBsYXRlLnJlcGxhY2UoJ3t4fScsIGNvb3Jkcy54KS5yZXBsYWNlKCd7eX0nLCBjb29yZHMueSkucmVwbGFjZSgne3p9JywgY29vcmRzLnopO1xuXG4gICAgICAgIGlmICh0aGlzLnVybF9ob3N0cyAhPSBudWxsKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgve3M6XFxbKFtefStdKylcXF19LywgdGhpcy51cmxfaG9zdHNbdGhpcy5uZXh0X2hvc3RdKTtcbiAgICAgICAgICAgIHRoaXMubmV4dF9ob3N0ID0gKHRoaXMubmV4dF9ob3N0ICsgMSkgJSB0aGlzLnVybF9ob3N0cy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICAvLyBDaGVja3MgZm9yIHRoZSB4L3kveiB0aWxlIHBhdHRlcm4gaW4gVVJMIHRlbXBsYXRlXG4gICAgdXJsSGFzVGlsZVBhdHRlcm4odXJsKSB7XG4gICAgICAgIHJldHVybiB1cmwgJiZcbiAgICAgICAgICAgIHVybC5zZWFyY2goJ3t4fScpID4gLTEgJiZcbiAgICAgICAgICAgIHVybC5zZWFyY2goJ3t5fScpID4gLTEgJiZcbiAgICAgICAgICAgIHVybC5zZWFyY2goJ3t6fScpID4gLTE7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgRGF0YVNvdXJjZSwge05ldHdvcmtTb3VyY2UsIE5ldHdvcmtUaWxlU291cmNlfSBmcm9tICcuL2RhdGFfc291cmNlJztcbmltcG9ydCB7ZGVjb2RlTXVsdGlQb2x5Z29ufSBmcm9tICcuL212dCc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbi8vIEZvciB0aWxpbmcgR2VvSlNPTiBjbGllbnQtc2lkZVxuaW1wb3J0IGdlb2pzb252dCBmcm9tICdnZW9qc29uLXZ0JztcblxuLyoqXG4gR2VvSlNPTiBzdGFuZGFsb25lIChub24tdGlsZWQpIHNvdXJjZVxuIFVzZXMgZ2VvanNvbi12dCBzcGxpdCBpbnRvIHRpbGVzIGNsaWVudC1zaWRlXG4qL1xuXG5leHBvcnQgY2xhc3MgR2VvSlNPTlNvdXJjZSBleHRlbmRzIE5ldHdvcmtTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG4gICAgICAgIHRoaXMubG9hZF9kYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy50aWxlX2luZGV4ZXMgPSB7fTsgLy8gZ2VvanNvbi12dCB0aWxlIGluZGljZXMsIGJ5IGxheWVyIG5hbWVcbiAgICAgICAgdGhpcy5tYXhfem9vbSA9IE1hdGgubWF4KHRoaXMubWF4X3pvb20gfHwgMCwgMTUpOyAvLyBUT0RPOiBtYXggem9vbSA8IDE1IGNhdXNlcyBhcnRpZmFjdHMvbm8tZHJhdyBhdCAyMCwgaW52ZXN0aWdhdGVcbiAgICAgICAgdGhpcy5wYWRfc2NhbGUgPSAwOyAvLyB3ZSBkb24ndCB3YW50IHBhZGRpbmcgb24gYXV0by10aWxlZCBzb3VyY2VzXG4gICAgfVxuXG4gICAgX2xvYWQoZGVzdCkge1xuICAgICAgICBpZiAoIXRoaXMubG9hZF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRfZGF0YSA9IHN1cGVyLl9sb2FkKHsgc291cmNlX2RhdGE6IHsgbGF5ZXJzOiB7fSB9IH0pLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2FybiBhbmQgY29udGludWUgb24gZGF0YSBzb3VyY2UgZXJyb3JcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5zb3VyY2VfZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgZGF0YSBzb3VyY2UgbG9hZCBlcnJvcihzKSBmb3Igc291cmNlICcke3RoaXMubmFtZX0nLCBVUkwgJyR7dGhpcy51cmx9JzogJHtkYXRhLnNvdXJjZV9kYXRhLmVycm9yfWApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBsYXllcnMgPSBkYXRhLnNvdXJjZV9kYXRhLmxheWVycztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBsYXllcl9uYW1lIGluIGxheWVycykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbGVfaW5kZXhlc1tsYXllcl9uYW1lXSA9IGdlb2pzb252dChsYXllcnNbbGF5ZXJfbmFtZV0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFpvb206IHRoaXMubWF4X3pvb20sICAvLyBtYXggem9vbSB0byBwcmVzZXJ2ZSBkZXRhaWwgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRvbGVyYW5jZTogMywgLy8gc2ltcGxpZmljYXRpb24gdG9sZXJhbmNlIChoaWdoZXIgbWVhbnMgc2ltcGxlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVudDogR2VvLnRpbGVfc2NhbGUsIC8vIHRpbGUgZXh0ZW50IChib3RoIHdpZHRoIGFuZCBoZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI6IDAuMDAwMSAgICAgLy8gdGlsZSBidWZmZXIgb24gZWFjaCBzaWRlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZF9kYXRhLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgbGF5ZXJfbmFtZSBpbiB0aGlzLnRpbGVfaW5kZXhlcykge1xuICAgICAgICAgICAgICAgIGRlc3Quc291cmNlX2RhdGEubGF5ZXJzW2xheWVyX25hbWVdID0gdGhpcy5nZXRUaWxlRmVhdHVyZXMoZGVzdCwgbGF5ZXJfbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0VGlsZUZlYXR1cmVzKHRpbGUsIGxheWVyX25hbWUpIHtcbiAgICAgICAgbGV0IGNvb3JkcyA9IEdlby53cmFwVGlsZSh0aWxlLmNvb3JkcywgeyB4OiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIHJlcXVlc3QgYSBwYXJ0aWN1bGFyIHRpbGVcbiAgICAgICAgbGV0IHQgPSB0aGlzLnRpbGVfaW5kZXhlc1tsYXllcl9uYW1lXS5nZXRUaWxlKGNvb3Jkcy56LCBjb29yZHMueCwgY29vcmRzLnkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZnJvbSBNVlQtc3R5bGUgSlNPTiBzdHJ1Y3QgdG8gR2VvSlNPTlxuICAgICAgICBsZXQgY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKHQgJiYgdC5mZWF0dXJlcykge1xuICAgICAgICAgICAgY29sbGVjdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdC5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSB0LmZlYXR1cmVzW2ldO1xuXG4gICAgICAgICAgICAgICAgLy8gR2VvSlNPTiBmZWF0dXJlXG4gICAgICAgICAgICAgICAgbGV0IGYgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHt9LFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnRhZ3NcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzID0gZmVhdHVyZS5nZW9tZXRyeS5tYXAoY29vcmQgPT4gW2Nvb3JkWzBdLCBjb29yZFsxXV0pO1xuICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5LnR5cGUgPSAnTXVsdGlQb2ludCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZlYXR1cmUudHlwZSA9PT0gMiB8fCBmZWF0dXJlLnR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS5jb29yZGluYXRlcyA9IGZlYXR1cmUuZ2VvbWV0cnkubWFwKHJpbmcgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJpbmcubWFwKGNvb3JkID0+IFtjb29yZFswXSwgY29vcmRbMV1dKVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLnR5cGUgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkudHlwZSA9ICdNdWx0aUxpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkgPSBkZWNvZGVNdWx0aVBvbHlnb24oZi5nZW9tZXRyeSk7IC8vIHVuLWZsYXR0ZW4gcmluZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLmdlb21ldHJ5ID09IG51bGwpIHsgLy8gc2tpcCBwb2x5cyB0aGF0IGNvdWxkbid0IGJlIGRlY29kZWQgKGUuZy4gZGVnZW5lcmF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbi5mZWF0dXJlcy5wdXNoKGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgfVxuXG4gICAgZm9ybWF0VXJsIChkZXN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVybDtcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IHBhcnNlZF9yZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICBsZXQgbGF5ZXJzID0gdGhpcy5nZXRMYXllcnMocGFyc2VkX3Jlc3BvbnNlKTtcbiAgICAgICAgc291cmNlLmxheWVycyA9IHRoaXMucHJlcHJvY2Vzc0xheWVycyhsYXllcnMpO1xuICAgIH1cblxuICAgIHByZXByb2Nlc3NMYXllcnMgKGxheWVycyl7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBsYXllcnMpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IGxheWVyc1trZXldO1xuICAgICAgICAgICAgdGhpcy5wcmVwcm9jZXNzRmVhdHVyZXMobGF5ZXIuZmVhdHVyZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgZGF0YSB0cmFuc2Zvcm1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGxheWVycykubGVuZ3RoID09PSAxICYmIGxheWVycy5fZGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIGxheWVycy5fZGVmYXVsdCA9IHRoaXMudHJhbnNmb3JtKGxheWVycy5fZGVmYXVsdCwgdGhpcy5leHRyYV9kYXRhKTsgLy8gc2luZ2xlLWxheWVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXllcnMgPSB0aGlzLnRyYW5zZm9ybShsYXllcnMsIHRoaXMuZXh0cmFfZGF0YSk7IC8vIG11bHRpcGxlIGxheWVyc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9XG5cbiAgICAvLyBQcmVwcm9jZXNzIGZlYXR1cmVzLiBDdXJyZW50bHkgdXNlZCB0byBhZGQgYSBuZXcgXCJjZW50cm9pZFwiIGZlYXR1cmUgZm9yIHBvbHlnb24gbGFiZWxpbmdcbiAgICBwcmVwcm9jZXNzRmVhdHVyZXMgKGZlYXR1cmVzKSB7XG4gICAgICAgIC8vIERlZmluZSBjZW50cm9pZHMgZm9yIHBvbHlnb25zIGZvciBjZW50cm9pZCBsYWJlbCBwbGFjZW1lbnRcbiAgICAgICAgLy8gQXZvaWRzIHJlZHVuZGFudCBsYWJlbCBwbGFjZW1lbnQgZm9yIGVhY2ggZ2VuZXJhdGVkIHRpbGUgYXQgaGlnaGVyIHpvb20gbGV2ZWxzXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5nZW5lcmF0ZV9sYWJlbF9jZW50cm9pZHMpe1xuICAgICAgICAgICAgbGV0IGZlYXR1cmVzX2NlbnRyb2lkID0gW107XG4gICAgICAgICAgICBsZXQgY2VudHJvaWRfcHJvcGVydGllcyA9IHtcImxhYmVsX3BsYWNlbWVudFwiIDogdHJ1ZX07XG5cbiAgICAgICAgICAgIGZlYXR1cmVzLmZvckVhY2goZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNvb3JkaW5hdGVzLCBjZW50cm9pZF9mZWF0dXJlO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJvaWRfZmVhdHVyZSA9IGdldENlbnRyb2lkRmVhdHVyZUZvclBvbHlnb24oY29vcmRpbmF0ZXMsIGZlYXR1cmUucHJvcGVydGllcywgY2VudHJvaWRfcHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlc19jZW50cm9pZC5wdXNoKGNlbnRyb2lkX2ZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ011bHRpUG9seWdvbic6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgY2VudHJvaWQgZmVhdHVyZSBmb3IgbGFyZ2VzdCBwb2x5Z29uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyA9IGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF4X2FyZWEgPSAtSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF4X2FyZWFfaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvb3JkaW5hdGVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcmVhID0gR2VvLnBvbHlnb25BcmVhKGNvb3JkaW5hdGVzW2luZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZWEgPiBtYXhfYXJlYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYXJlYSA9IGFyZWE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hcmVhX2luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJvaWRfZmVhdHVyZSA9IGdldENlbnRyb2lkRmVhdHVyZUZvclBvbHlnb24oY29vcmRpbmF0ZXNbbWF4X2FyZWFfaW5kZXhdLCBmZWF0dXJlLnByb3BlcnRpZXMsIGNlbnRyb2lkX3Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXNfY2VudHJvaWQucHVzaChjZW50cm9pZF9mZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBhcHBlbmQgY2VudHJvaWQgZmVhdHVyZXMgdG8gZmVhdHVyZXMgYXJyYXlcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGZlYXR1cmVzLCBmZWF0dXJlc19jZW50cm9pZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0IHNpbmdsZSBvciBtdWx0aXBsZSBsYXllcnMgaW4gcmV0dXJuZWQgZGF0YVxuICAgIGdldExheWVycyAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgX2RlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IFtkYXRhXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF9kZWZhdWx0OiBkYXRhXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuLyoqXG4gR2VvSlNPTiB2ZWN0b3IgdGlsZXNcbiBAY2xhc3MgR2VvSlNPTlRpbGVTb3VyY2VcbiovXG5leHBvcnQgY2xhc3MgR2VvSlNPTlRpbGVTb3VyY2UgZXh0ZW5kcyBOZXR3b3JrVGlsZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgVVJMIHRpbGUgcGF0dGVybiwgaWYgbm90IGZvdW5kLCB0cmVhdCBhcyBzdGFuZGFsb25lIEdlb0pTT04vVG9wb0pTT04gb2JqZWN0XG4gICAgICAgIGlmICghdGhpcy51cmxIYXNUaWxlUGF0dGVybih0aGlzLnVybCkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGluc3RhbmNlIHR5cGUgZnJvbSBwYXJlbnQgY2xhc3NcbiAgICAgICAgICAgIGlmIChzb3VyY2UudHlwZSA9PT0gJ0dlb0pTT04nKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBpbnN0YW5jZSB0eXBlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW9KU09OU291cmNlKHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzIGJhY2sgdG8gcGFyZW50IGNsYXNzIHRvIGluc3RhbnRpYXRlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICAgIHRoaXMucHJlcGFyZUdlb0pTT04oZGF0YSwgdGlsZSwgc291cmNlKTtcbiAgICB9XG5cbiAgICBwcmVwYXJlR2VvSlNPTiAoZGF0YSwgdGlsZSwgc291cmNlKSB7XG4gICAgICAgIC8vIEFwcGx5IG9wdGlvbmFsIGRhdGEgdHJhbnNmb3JtXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLnRyYW5zZm9ybShkYXRhLCB0aGlzLmV4dHJhX2RhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgc291cmNlLmxheWVycyA9IEdlb0pTT05Tb3VyY2UucHJvdG90eXBlLmdldExheWVycyhkYXRhKTtcblxuICAgICAgICAvLyBBIFwic3ludGhldGljXCIgdGlsZSB0aGF0IGFkanVzdHMgdGhlIHRpbGUgbWluIGFuY2hvciB0byBhY2NvdW50IGZvciB0aWxlIGxvbmdpdHVkZSB3cmFwcGluZ1xuICAgICAgICBsZXQgYW5jaG9yID0ge1xuICAgICAgICAgICAgY29vcmRzOiB0aWxlLmNvb3JkcyxcbiAgICAgICAgICAgIG1pbjogR2VvLm1ldGVyc0ZvclRpbGUoR2VvLndyYXBUaWxlKHRpbGUuY29vcmRzLCB7IHg6IHRydWUgfSkpXG4gICAgICAgIH07XG5cbiAgICAgICAgRGF0YVNvdXJjZS5wcm9qZWN0RGF0YShzb3VyY2UpOyAvLyBtZXJjYXRvciBwcm9qZWN0aW9uXG4gICAgICAgIERhdGFTb3VyY2Uuc2NhbGVEYXRhKHNvdXJjZSwgYW5jaG9yKTsgLy8gcmUtc2NhbGUgZnJvbSBtZXRlcnMgdG8gbG9jYWwgdGlsZSBjb29yZHNcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS5yZWdpc3RlcihHZW9KU09OVGlsZVNvdXJjZSwgJ0dlb0pTT04nKTsgICAgICAvLyBwcmVmZXJlZCBzaG9ydGVyIG5hbWVcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBjZW50cm9pZCBwb2ludCBmZWF0dXJlIGZyb20gcG9seWdvbiBjb29yZGluYXRlcyBhbmQgcHJvdmlkZWQgZmVhdHVyZSBtZXRhLWRhdGFcbmZ1bmN0aW9uIGdldENlbnRyb2lkRmVhdHVyZUZvclBvbHlnb24gKGNvb3JkaW5hdGVzLCBwcm9wZXJ0aWVzLCBuZXdQcm9wZXJ0aWVzKSB7XG4gICAgbGV0IGNlbnRyb2lkID0gR2VvLmNlbnRyb2lkKGNvb3JkaW5hdGVzKTtcblxuICAgIC8vIGNsb25lIHByb3BlcnRpZXMgYW5kIG1peGl4IG5ld1Byb3BlcnRpZXNcbiAgICBsZXQgY2VudHJvaWRfcHJvcGVydGllcyA9IHt9O1xuICAgIE9iamVjdC5hc3NpZ24oY2VudHJvaWRfcHJvcGVydGllcywgcHJvcGVydGllcywgbmV3UHJvcGVydGllcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgICAgcHJvcGVydGllczogY2VudHJvaWRfcHJvcGVydGllcyxcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiUG9pbnRcIixcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBjZW50cm9pZFxuICAgICAgICB9XG4gICAgfTtcbn1cbiIsImltcG9ydCBEYXRhU291cmNlLCB7TmV0d29ya1RpbGVTb3VyY2V9IGZyb20gJy4vZGF0YV9zb3VyY2UnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5pbXBvcnQgUGJmIGZyb20gJ3BiZic7XG5pbXBvcnQge1ZlY3RvclRpbGUsIFZlY3RvclRpbGVGZWF0dXJlfSBmcm9tICd2ZWN0b3ItdGlsZSc7XG5cbi8qKlxuIE1hcGJveCBWZWN0b3IgVGlsZSBmb3JtYXRcbiBAY2xhc3MgTVZUU291cmNlXG4qL1xuZXhwb3J0IGNsYXNzIE1WVFNvdXJjZSBleHRlbmRzIE5ldHdvcmtUaWxlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZV90eXBlID0gXCJhcnJheWJ1ZmZlclwiOyAvLyBiaW5hcnkgZGF0YVxuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICAvLyBDb252ZXJ0IE1hcGJveCB2ZWN0b3IgdGlsZSB0byBHZW9KU09OXG4gICAgICAgIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpO1xuICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFBiZihkYXRhKTtcbiAgICAgICAgc291cmNlLmRhdGEgPSBuZXcgVmVjdG9yVGlsZShidWZmZXIpO1xuICAgICAgICBzb3VyY2UubGF5ZXJzID0gdGhpcy50b0dlb0pTT04oc291cmNlLmRhdGEpO1xuXG4gICAgICAgIC8vIEFwcGx5IG9wdGlvbmFsIGRhdGEgdHJhbnNmb3JtXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNvdXJjZS5sYXllcnMgPSB0aGlzLnRyYW5zZm9ybShzb3VyY2UubGF5ZXJzLCB0aGlzLmV4dHJhX2RhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHNvdXJjZS5kYXRhOyAvLyBjb21tZW50IG91dCB0byBzYXZlIHJhdyBkYXRhIGZvciBkZWJ1Z2dpbmdcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggbGF5ZXJzL2ZlYXR1cmVzIHVzaW5nIE1hcGJveCBsaWIgQVBJLCBjb252ZXJ0IHRvIEdlb0pTT04gZmVhdHVyZXNcbiAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGtleXMgZm9yIGVhY2ggbGF5ZXIsIGUuZy4geyBsYXllcjogZ2VvanNvbiB9XG4gICAgdG9HZW9KU09OICh0aWxlKSB7XG4gICAgICAgIHZhciBsYXllcnMgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgbCBpbiB0aWxlLmxheWVycykge1xuICAgICAgICAgICAgdmFyIGxheWVyID0gdGlsZS5sYXllcnNbbF07XG4gICAgICAgICAgICB2YXIgbGF5ZXJfZ2VvanNvbiA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yICh2YXIgZj0wOyBmIDwgbGF5ZXIubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZSA9IGxheWVyLmZlYXR1cmUoZik7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmVfZ2VvanNvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeToge30sXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlX2dlb2pzb24uZ2VvbWV0cnk7XG4gICAgICAgICAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0gZmVhdHVyZS5sb2FkR2VvbWV0cnkoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByPTA7IHIgPCBjb29yZGluYXRlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmluZyA9IGNvb3JkaW5hdGVzW3JdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTA7IGMgPCByaW5nLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByaW5nW2NdID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10ueCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nW2NdLnlcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBjb29yZGluYXRlcztcblxuICAgICAgICAgICAgICAgIGlmIChWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1tmZWF0dXJlLnR5cGVdID09PSAnUG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPSAnUG9pbnQnO1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1tmZWF0dXJlLnR5cGVdID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkudHlwZSA9ICdMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS50eXBlID0gJ011bHRpTGluZVN0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbZmVhdHVyZS50eXBlXSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gZGVjb2RlTXVsdGlQb2x5Z29uKGdlb21ldHJ5KTsgLy8gdW4tZmxhdHRlbiByaW5nc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxheWVyX2dlb2pzb24uZmVhdHVyZXMucHVzaChmZWF0dXJlX2dlb2pzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGF5ZXJzW2xdID0gbGF5ZXJfZ2VvanNvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5ZXJzO1xuICAgIH1cblxufVxuXG4vLyBEZWNvZGUgbXVsdGlwb2x5Z29ucywgd2hpY2ggYXJlIGVuY29kZWQgYXMgYSBzaW5nbGUgc2V0IG9mIHJpbmdzXG4vLyBXaW5kaW5nIG9yZGVyIG9mIGZpcnN0IHJpbmcgaXMgYXNzdW1lZCB0byBpbmRpY2F0ZSBleHRlcmlvciByaW5nLFxuLy8gdGhlIG9wcG9zaXRlIHdpbmRpbmcgb3JkZXIgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiBhIG5ldyBwb2x5Z29uLlxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZU11bHRpUG9seWdvbiAoZ2VvbSkge1xuICAgIGxldCBwb2x5cyA9IFtdO1xuICAgIGxldCBwb2x5ID0gW107XG4gICAgbGV0IG91dGVyX3dpbmRpbmc7XG4gICAgZm9yIChsZXQgcj0wOyByIDwgZ2VvbS5jb29yZGluYXRlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICBsZXQgcmluZyA9IGdlb20uY29vcmRpbmF0ZXNbcl07XG4gICAgICAgIGxldCB3aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKHJpbmcpO1xuICAgICAgICBpZiAod2luZGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB6ZXJvLWFyZWEgcmluZ3NcbiAgICAgICAgfVxuXG4gICAgICAgIG91dGVyX3dpbmRpbmcgPSBvdXRlcl93aW5kaW5nIHx8IHdpbmRpbmc7IC8vIGFzc3VtZSBmaXJzdCByaW5nIGluZGljYXRlcyBvdXRlciByaW5nIHdpbmRpbmdcblxuICAgICAgICBpZiAod2luZGluZyA9PT0gb3V0ZXJfd2luZGluZyAmJiBwb2x5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBvbHlzLnB1c2gocG9seSk7XG4gICAgICAgICAgICBwb2x5ID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcG9seS5wdXNoKHJpbmcpO1xuICAgIH1cbiAgICBpZiAocG9seS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHBvbHlzLnB1c2gocG9seSk7XG4gICAgfVxuXG4gICAgLy8gU2luZ2xlIG9yIG11bHRpP1xuICAgIGlmIChwb2x5cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZ2VvbS50eXBlID0gJ1BvbHlnb24nO1xuICAgICAgICBnZW9tLmNvb3JkaW5hdGVzID0gcG9seXNbMF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHBvbHlzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZ2VvbS50eXBlID0gJ011bHRpUG9seWdvbic7XG4gICAgICAgIGdlb20uY29vcmRpbmF0ZXMgPSBwb2x5cztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdlb20gPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBnZW9tO1xufVxuXG5EYXRhU291cmNlLnJlZ2lzdGVyKE1WVFNvdXJjZSwgJ01WVCcpO1xuIiwiaW1wb3J0IERhdGFTb3VyY2UsIHtOZXR3b3JrVGlsZVNvdXJjZX0gZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQgVGlsZSBmcm9tICcuLi90aWxlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuZXhwb3J0IGNsYXNzIFJhc3RlclRpbGVTb3VyY2UgZXh0ZW5kcyBOZXR3b3JrVGlsZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcblxuICAgICAgICBpZiAodGhpcy5yYXN0ZXJzLmluZGV4T2YodGhpcy5uYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucmFzdGVycy51bnNoaWZ0KHRoaXMubmFtZSk7IC8vIGFkZCB0aGlzIHJhc3RlciBhcyB0aGUgZmlyc3RcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlcmluZyA9IHNvdXJjZS5maWx0ZXJpbmc7IC8vIG9wdGlvbmFsIHRleHR1cmUgZmlsdGVyaW5nIChuZWFyZXN0LCBsaW5lYXIsIG1pcG1hcClcblxuICAgICAgICAvLyBzYXZlIHRleHR1cmUgb2JqZWN0cyBieSB0aWxlIGtleSwgc28gVVJMIHJlbWFpbnMgc3RhYmxlIGlmIHRpbGUgaXMgYnVpbHQgbXVsdGlwbGUgdGltZXMsXG4gICAgICAgIC8vIGUuZy4gYXZvaWQgcmUtbG9hZGluZyB0aGUgc2FtZSB0aWxlIHRleHR1cmUgdW5kZXIgYSBkaWZmZXJlbnQgc3ViZG9tYWluIHdoZW4gdXNpbmcgdGlsZSBob3N0c1xuICAgICAgICB0aGlzLnRleHR1cmVzID0ge307XG4gICAgfVxuXG4gICAgbG9hZCh0aWxlKSB7XG4gICAgICAgIHRpbGUuc291cmNlX2RhdGEgPSB7fTtcbiAgICAgICAgdGlsZS5zb3VyY2VfZGF0YS5sYXllcnMgPSB7fTtcbiAgICAgICAgdGlsZS5wYWRfc2NhbGUgPSB0aGlzLnBhZF9zY2FsZTtcbiAgICAgICAgdGlsZS5yYXN0ZXJzID0gWy4uLnRoaXMucmFzdGVyc107IC8vIGNvcHkgbGlzdCBvZiByYXN0ZXJzIHRvIGxvYWQgZm9yIHRpbGVcblxuICAgICAgICAvLyBHZW5lcmF0ZSBhIHNpbmdsZSBxdWFkIHRoYXQgZmlsbHMgdGhlIGVudGlyZSB0aWxlXG4gICAgICAgIGxldCBzY2FsZSA9IEdlby50aWxlX3NjYWxlO1xuICAgICAgICB0aWxlLnNvdXJjZV9kYXRhLmxheWVycyA9IHtcbiAgICAgICAgICAgIF9kZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICBmZWF0dXJlczogW3tcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBbW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAwXSwgW3NjYWxlLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2NhbGUsIC1zY2FsZV0sIFswLCAtc2NhbGVdLCBbMCwgMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIF1dXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHt9XG4gICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aWxlLmRlZmF1bHRfd2luZGluZyA9ICdDVyc7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGlsZSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRleHR1cmUgaW5mbyBmb3IgYSByYXN0ZXIgdGlsZVxuICAgIHRpbGVUZXh0dXJlICh0aWxlKSB7XG4gICAgICAgIGxldCBrZXkgPSB0aWxlLmNvb3Jkcy5rZXk7XG4gICAgICAgIGlmICghdGhpcy50ZXh0dXJlc1trZXldKSB7XG4gICAgICAgICAgICBsZXQgY29vcmRzID0gVGlsZS5jb29yZGluYXRlV2l0aE1heFpvb20odGlsZS5jb29yZHMsIHRoaXMubWF4X3pvb20pO1xuICAgICAgICAgICAgbGV0IHVybCA9IHRoaXMuZm9ybWF0VXJsKHRoaXMudXJsLCB7IGNvb3JkcyB9KTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZXNba2V5XSA9IHsgdXJsLCBmaWx0ZXJpbmc6IHRoaXMuZmlsdGVyaW5nLCBjb29yZHMgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50ZXh0dXJlc1trZXldO1xuICAgIH1cblxufVxuXG5EYXRhU291cmNlLnJlZ2lzdGVyKFJhc3RlclRpbGVTb3VyY2UsICdSYXN0ZXInKTtcbiIsImltcG9ydCBEYXRhU291cmNlIGZyb20gJy4vZGF0YV9zb3VyY2UnO1xuaW1wb3J0IHtHZW9KU09OU291cmNlLCBHZW9KU09OVGlsZVNvdXJjZX0gZnJvbSAnLi9nZW9qc29uJztcblxuaW1wb3J0ICogYXMgdG9wb2pzb24gZnJvbSAndG9wb2pzb24tY2xpZW50JztcblxuLyoqXG4gVG9wb0pTT04gc3RhbmRhbG9uZSAobm9uLXRpbGVkKSBzb3VyY2VcbiBVc2VzIGdlb2pzb24tdnQgc3BsaXQgaW50byB0aWxlcyBjbGllbnQtc2lkZVxuKi9cblxuZXhwb3J0IGNsYXNzIFRvcG9KU09OU291cmNlIGV4dGVuZHMgR2VvSlNPTlNvdXJjZSB7XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgZGF0YSA9IHRoaXMudG9HZW9KU09OKGRhdGEpO1xuXG4gICAgICAgIGxldCBsYXllcnMgPSB0aGlzLmdldExheWVycyhkYXRhKTtcbiAgICAgICAgc3VwZXIucHJlcHJvY2Vzc0xheWVycyhsYXllcnMpO1xuICAgICAgICBzb3VyY2UubGF5ZXJzID0gbGF5ZXJzO1xuICAgIH1cblxuICAgIHRvR2VvSlNPTiAoZGF0YSkge1xuICAgICAgICAvLyBTaW5nbGUgbGF5ZXJcbiAgICAgICAgaWYgKGRhdGEub2JqZWN0cyAmJlxuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGF0YS5vYmplY3RzKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IE9iamVjdC5rZXlzKGRhdGEub2JqZWN0cylbMF07XG4gICAgICAgICAgICBkYXRhID0gZ2V0VG9wb0pTT05GZWF0dXJlKGRhdGEsIGRhdGEub2JqZWN0c1tsYXllcl0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE11bHRpcGxlIGxheWVyc1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYXllcnMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhLm9iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBsYXllcnNba2V5XSA9IGdldFRvcG9KU09ORmVhdHVyZShkYXRhLCBkYXRhLm9iamVjdHNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhID0gbGF5ZXJzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxufVxuXG5mdW5jdGlvbiBnZXRUb3BvSlNPTkZlYXR1cmUgKHRvcG9sb2d5LCBvYmplY3QpIHtcbiAgICBsZXQgZmVhdHVyZSA9IHRvcG9qc29uLmZlYXR1cmUodG9wb2xvZ3ksIG9iamVjdCk7XG5cbiAgICAvLyBDb252ZXJ0IHNpbmdsZSBmZWF0dXJlIHRvIGEgZmVhdHVyZSBjb2xsZWN0aW9uXG4gICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgIGZlYXR1cmUgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgZmVhdHVyZXM6IFtmZWF0dXJlXVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZmVhdHVyZTtcbn1cblxuXG4vKipcbiBUb3BvSlNPTiB2ZWN0b3IgdGlsZXNcbiBAY2xhc3MgVG9wb0pTT05UaWxlU291cmNlXG4qL1xuZXhwb3J0IGNsYXNzIFRvcG9KU09OVGlsZVNvdXJjZSBleHRlbmRzIEdlb0pTT05UaWxlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuXG4gICAgICAgIC8vIFJlcGxhY2Ugd2l0aCBub24tdGlsZWQgc291cmNlIGlmIHRpbGVkIHNvdXJjZSBmYWlsZWQgdG8gaW5zdGFudGlhdGVcbiAgICAgICAgaWYgKCF0aGlzLnVybEhhc1RpbGVQYXR0ZXJuKHRoaXMudXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUb3BvSlNPTlNvdXJjZShzb3VyY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICAgIGRhdGEgPSBUb3BvSlNPTlNvdXJjZS5wcm90b3R5cGUudG9HZW9KU09OKGRhdGEpO1xuICAgICAgICB0aGlzLnByZXBhcmVHZW9KU09OKGRhdGEsIHRpbGUsIHNvdXJjZSk7XG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoVG9wb0pTT05UaWxlU291cmNlLCAnVG9wb0pTT04nKTsgICAgICAgIC8vIHByZWZlcmVkIHNob3J0ZXIgbmFtZVxuIiwiaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi4vdXRpbHMvbWVyZ2UnO1xuaW1wb3J0IHttYXRjaH0gZnJvbSAnbWF0Y2gtZmVhdHVyZSc7XG5cbmV4cG9ydCBjb25zdCB3aGl0ZUxpc3QgPSBbJ2ZpbHRlcicsICdkcmF3JywgJ3Zpc2libGUnLCAnZGF0YSddO1xuXG5leHBvcnQgY29uc3QgbGF5ZXJfY2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gY2FjaGVLZXkgKGxheWVycykge1xuICAgIGlmIChsYXllcnMubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgayA9IGxheWVyc1swXTtcbiAgICAgICAgZm9yICh2YXIgaT0xOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBrICs9ICcvJyArIGxheWVyc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrO1xuICAgIH1cbiAgICByZXR1cm4gbGF5ZXJzWzBdO1xufVxuXG4vLyBNZXJnZSBtYXRjaGluZyBsYXllciB0cmVlcyBpbnRvIGEgZmluYWwgZHJhdyBncm91cFxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlVHJlZXMobWF0Y2hpbmdUcmVlcywgZ3JvdXApIHtcbiAgICBsZXQgZHJhd3MsIHRyZWVEZXB0aCA9IDA7XG5cbiAgICBsZXQgZHJhdyA9IHtcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSAvLyB2aXNpYmxlIGJ5IGRlZmF1bHRcbiAgICB9O1xuXG4gICAgLy8gRmluZCBkZWVwZXN0IHRyZWVcbiAgICBmb3IgKGxldCB0PTA7IHQgPCBtYXRjaGluZ1RyZWVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgIGlmIChtYXRjaGluZ1RyZWVzW3RdLmxlbmd0aCA+IHRyZWVEZXB0aCkge1xuICAgICAgICAgICAgdHJlZURlcHRoID0gbWF0Y2hpbmdUcmVlc1t0XS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBObyBsYXllcnMgdG8gcGFyc2VcbiAgICBpZiAodHJlZURlcHRoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgdHJlZXMgaW4gcGFyYWxsZWxcbiAgICBmb3IgKGxldCB4PTA7IHggPCB0cmVlRGVwdGg7IHgrKykge1xuICAgICAgICAvLyBQdWxsIG91dCB0aGUgcmVxdWVzdGVkIGRyYXcgZ3JvdXAsIGZvciBlYWNoIHRyZWUsIGF0IHRoaXMgZGVwdGhcbiAgICAgICAgZHJhd3MgPSBtYXRjaGluZ1RyZWVzLm1hcCh0cmVlID0+IHRyZWVbeF0gJiYgdHJlZVt4XVtncm91cF0pO1xuICAgICAgICBpZiAoZHJhd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgYnkgbGF5ZXIgbmFtZSBiZWZvcmUgbWVyZ2luZywgc28gbGF5ZXJzIGFyZSBhcHBsaWVkIGRldGVybWluaXN0aWNhbGx5XG4gICAgICAgIC8vIHdoZW4gbXVsdGlwbGUgbGF5ZXJzIG1vZGlmeSB0aGUgc2FtZSBwcm9wZXJ0aWVzXG4gICAgICAgIGRyYXdzLnNvcnQoKGEsIGIpID0+IChhICYmIGEubGF5ZXJfbmFtZSkgPiAoYiAmJiBiLmxheWVyX25hbWUpID8gMSA6IC0xKTtcblxuICAgICAgICAvLyBNZXJnZSBkcmF3IG9iamVjdHNcbiAgICAgICAgbWVyZ2VPYmplY3RzKGRyYXcsIC4uLmRyYXdzKTtcblxuICAgICAgICAvLyBSZW1vdmUgbGF5ZXIgbmFtZXMsIHRoZXkgd2VyZSBvbmx5IHVzZWQgdHJhbnNpZW50bHkgdG8gc29ydCBhbmQgY2FsY3VsYXRlIGZpbmFsIGxheWVyXG4gICAgICAgIC8vIChmaW5hbCBtZXJnZWQgbmFtZXMgd2lsbCBub3QgYmUgYWNjdXJhdGUgc2luY2Ugb25seSBvbmUgdHJlZSBjYW4gd2luKVxuICAgICAgICBkZWxldGUgZHJhdy5sYXllcl9uYW1lO1xuICAgIH1cblxuICAgIC8vIFNob3J0LWNpcmN1aXQgaWYgbm90IHZpc2libGVcbiAgICBpZiAoZHJhdy52aXNpYmxlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZHJhdztcbn1cblxuY29uc3QgYmxhY2tsaXN0ID0gWydhbnknLCAnYWxsJywgJ25vdCcsICdub25lJ107XG5cbmNsYXNzIExheWVyIHtcblxuICAgIGNvbnN0cnVjdG9yKHsgbGF5ZXIsIG5hbWUsIHBhcmVudCwgZHJhdywgdmlzaWJsZSwgZmlsdGVyIH0pIHtcbiAgICAgICAgdGhpcy5pZCA9IExheWVyLmlkKys7XG4gICAgICAgIHRoaXMuY29uZmlnID0gbGF5ZXI7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmZ1bGxfbmFtZSA9IHRoaXMucGFyZW50ID8gKHRoaXMucGFyZW50LmZ1bGxfbmFtZSArICc6JyArIHRoaXMubmFtZSkgOiB0aGlzLm5hbWU7XG4gICAgICAgIHRoaXMuZHJhdyA9IGRyYXc7XG4gICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyO1xuICAgICAgICB0aGlzLmlzX2J1aWx0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMudmlzaWJsZSA9IHZpc2libGUgIT09IHVuZGVmaW5lZCA/IHZpc2libGUgOiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQudmlzaWJsZSk7XG5cbiAgICAgICAgLy8gRGVub3JtYWxpemUgbGF5ZXIgbmFtZSB0byBkcmF3IGdyb3Vwc1xuICAgICAgICBpZiAodGhpcy5kcmF3KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBncm91cCBpbiB0aGlzLmRyYXcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcmF3W2dyb3VwXSA9PSBudWxsIHx8IHR5cGVvZiB0aGlzLmRyYXdbZ3JvdXBdICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGRyYXcgZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBEcmF3IGdyb3VwICcke2dyb3VwfScgZm9yIGxheWVyICR7dGhpcy5mdWxsX25hbWV9IGlzIGludmFsaWQsIG11c3QgYmUgYW4gb2JqZWN0LCBgO1xuICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYGJ1dCB3YXMgc2V0IHRvIFxcYCR7Z3JvdXB9OiAke3RoaXMuZHJhd1tncm91cF19XFxgIGluc3RlYWRgO1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBtc2cpOyAvLyBUT0RPOiBmaXJlIGV4dGVybmFsIGV2ZW50IHRoYXQgY2xpZW50cyB0byBzdWJzY3JpYmUgdG9cblxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5kcmF3W2dyb3VwXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd1tncm91cF0ubGF5ZXJfbmFtZSA9IHRoaXMuZnVsbF9uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJ1aWxkICgpIHtcbiAgICAgICAgbG9nKCd0cmFjZScsIGBCdWlsZGluZyBsYXllciAnJHt0aGlzLmZ1bGxfbmFtZX0nYCk7XG4gICAgICAgIHRoaXMuYnVpbGRGaWx0ZXIoKTtcbiAgICAgICAgdGhpcy5idWlsZERyYXcoKTtcbiAgICAgICAgdGhpcy5pc19idWlsdCA9IHRydWU7XG4gICAgfVxuXG4gICAgYnVpbGREcmF3KCkge1xuICAgICAgICB0aGlzLmRyYXcgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnModGhpcy5kcmF3LCBTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24pO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZWREcmF3ID0gY2FsY3VsYXRlRHJhdyh0aGlzKTtcbiAgICB9XG5cbiAgICBidWlsZEZpbHRlcigpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJfb3JpZ2luYWwgPSB0aGlzLmZpbHRlcjtcbiAgICAgICAgdGhpcy5maWx0ZXIgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnModGhpcy5maWx0ZXIsIFN0eWxlUGFyc2VyLndyYXBGdW5jdGlvbik7XG5cbiAgICAgICAgbGV0IHR5cGUgPSB0eXBlb2YgdGhpcy5maWx0ZXI7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlciAhPSBudWxsICYmIHR5cGUgIT09ICdvYmplY3QnICYmIHR5cGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEludmFsaWQgZmlsdGVyXG4gICAgICAgICAgICBsZXQgbXNnID0gYEZpbHRlciBmb3IgbGF5ZXIgJHt0aGlzLmZ1bGxfbmFtZX0gaXMgaW52YWxpZCwgZmlsdGVyIHZhbHVlIG11c3QgYmUgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uLCBgO1xuICAgICAgICAgICAgbXNnICs9IGBidXQgd2FzIHNldCB0byBcXGBmaWx0ZXI6ICR7dGhpcy5maWx0ZXJ9XFxgIGluc3RlYWRgO1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgbXNnKTsgLy8gVE9ETzogZmlyZSBleHRlcm5hbCBldmVudCB0aGF0IGNsaWVudHMgdG8gc3Vic2NyaWJlIHRvXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWlsZFpvb21zKCk7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkUHJvcE1hdGNoZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlciAhPSBudWxsICYmICh0eXBlb2YgdGhpcy5maWx0ZXIgPT09ICdmdW5jdGlvbicgfHwgT2JqZWN0LmtleXModGhpcy5maWx0ZXIpLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBtYXRjaCh0aGlzLmZpbHRlciwgRmlsdGVyT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgLy8gSW52YWxpZCBmaWx0ZXJcbiAgICAgICAgICAgIGxldCBtc2cgPSBgRmlsdGVyIGZvciBsYXllciAke3RoaXMuZnVsbF9uYW1lfSBpcyBpbnZhbGlkLCBcXGBmaWx0ZXI6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5maWx0ZXIpfVxcYCBgO1xuICAgICAgICAgICAgbXNnICs9IGBmYWlsZWQgd2l0aCBlcnJvciAnJHtlLm1lc3NhZ2V9Jywgc3RhY2sgdHJhY2U6ICR7ZS5zdGFja31gO1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgbXNnKTsgLy8gVE9ETzogZmlyZSBleHRlcm5hbCBldmVudCB0aGF0IGNsaWVudHMgdG8gc3Vic2NyaWJlIHRvXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBab29tcyBvZnRlbiBjdWxsIGxhcmdlIHN3YXRocyBvZiB0aGUgbGF5ZXIgdHJlZSwgc28gdGhleSBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgYW5kIGFyZSBjaGVja2VkIGZpcnN0XG4gICAgYnVpbGRab29tcygpIHtcbiAgICAgICAgbGV0IHpvb20gPSB0aGlzLmZpbHRlciAmJiB0aGlzLmZpbHRlci4kem9vbTtcbiAgICAgICAgbGV0IHp0eXBlID0gdHlwZW9mIHpvb207XG4gICAgICAgIGlmICh6b29tICE9IG51bGwgJiYgenR5cGUgIT09ICdmdW5jdGlvbicpIHsgLy8gZG9uJ3QgYWNjZWxlcmF0ZSBmdW5jdGlvbi1iYXNlZCBmaWx0ZXJzXG4gICAgICAgICAgICB0aGlzLnpvb21zID0ge307XG5cbiAgICAgICAgICAgIGlmICh6dHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvb21zW3pvb21dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoem9vbSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6PTA7IHogPCB6b29tLmxlbmd0aDsgeisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbXNbem9vbVt6XV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHp0eXBlID09PSAnb2JqZWN0JyAmJiAoem9vbS5taW4gIT0gbnVsbCB8fCB6b29tLm1heCAhPSBudWxsKSkge1xuICAgICAgICAgICAgICAgIGxldCB6bWluID0gem9vbS5taW4gfHwgMDtcbiAgICAgICAgICAgICAgICBsZXQgem1heCA9IHpvb20ubWF4IHx8IDI1OyAvLyBUT0RPOiByZXBsYWNlIGNvbnN0YW50IGZvciBtYXggcG9zc2libGUgem9vbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHo9em1pbjsgeiA8IHptYXg7IHorKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb21zW3pdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbHRlci4kem9vbTsgLy8gZG9uJ3QgcHJvY2VzcyB6b29tIHRocm91Z2ggdXN1YWwgZ2VuZXJpYyBmaWx0ZXIgbG9naWNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJ1aWxkUHJvcE1hdGNoZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5maWx0ZXIgfHwgQXJyYXkuaXNBcnJheSh0aGlzLmZpbHRlcikgfHwgdHlwZW9mIHRoaXMuZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKGJsYWNrbGlzdC5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMuZmlsdGVyW2tleV07XG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSB0eXBlb2YgdmFsO1xuICAgICAgICAgICAgICAgIGxldCBhcnJheSA9IEFycmF5LmlzQXJyYXkodmFsKTtcblxuICAgICAgICAgICAgICAgIGlmICghKGFycmF5IHx8IHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGtleVswXSA9PT0gJyQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRleHQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcyA9IHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMucHVzaChba2V5LnN1YnN0cmluZygxKSwgYXJyYXkgPyB2YWwgOiBbdmFsXV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmVhdHVyZSBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzID0gdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcy5wdXNoKFtrZXksIGFycmF5ID8gdmFsIDogW3ZhbF1dKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5maWx0ZXJba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZG9Qcm9wTWF0Y2hlcyAoY29udGV4dCkge1xuICAgICAgICBpZiAodGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXNbcl07XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IGNvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzW21hdGNoWzBdXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgbWF0Y2hbMV0uaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHI9MDsgciA8IHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzW3JdO1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBjb250ZXh0W21hdGNoWzBdXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgbWF0Y2hbMV0uaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZG9lc01hdGNoIChjb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc19idWlsdCkge1xuICAgICAgICAgICAgdGhpcy5idWlsZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gem9vbSBwcmUtZmlsdGVyOiBza2lwIHJlc3Qgb2YgZmlsdGVyIGlmIG91dCBvZiBsYXllciB6b29tIHJhbmdlXG4gICAgICAgIGlmICh0aGlzLnpvb21zICE9IG51bGwgJiYgIXRoaXMuem9vbXNbY29udGV4dC56b29tXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGlyZWN0IGZlYXR1cmUgcHJvcGVydHkgbWF0Y2hlc1xuICAgICAgICBpZiAoIXRoaXMuZG9Qcm9wTWF0Y2hlcyhjb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYW55IHJlbWFpbmluZyBmaWx0ZXIgKG1vcmUgY29tcGxleCBtYXRjaGVzIG9yIGR5bmFtaWMgZnVuY3Rpb24pXG4gICAgICAgIGlmICh0aGlzLmZpbHRlciBpbnN0YW5jZW9mIEZ1bmN0aW9uKXtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlsdGVyIGZ1bmN0aW9uIGVycm9yXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBGaWx0ZXIgZm9yIHRoaXMgJHt0aGlzLmZ1bGxfbmFtZX06IFxcYGZpbHRlcjogJHt0aGlzLmZpbHRlcl9vcmlnaW5hbH1cXGAgYDtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYGZhaWxlZCB3aXRoIGVycm9yICcke2Vycm9yLm1lc3NhZ2V9Jywgc3RhY2sgdHJhY2U6ICR7ZXJyb3Iuc3RhY2t9YDtcbiAgICAgICAgICAgICAgICBsb2coJ2Vycm9yJywgbXNnLCBjb250ZXh0LmZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyID09IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuTGF5ZXIuaWQgPSAwO1xuXG5cbmV4cG9ydCBjbGFzcyBMYXllckxlYWYgZXh0ZW5kcyBMYXllciB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICB0aGlzLmlzX2xlYWYgPSB0cnVlO1xuICAgIH1cblxufVxuXG5leHBvcnQgY2xhc3MgTGF5ZXJUcmVlIGV4dGVuZHMgTGF5ZXIge1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgdGhpcy5pc190cmVlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sYXllcnMgPSBjb25maWcubGF5ZXJzIHx8IFtdO1xuICAgIH1cblxuICAgIGFkZExheWVyIChsYXllcikge1xuICAgICAgICB0aGlzLmxheWVycy5wdXNoKGxheWVyKTtcbiAgICB9XG5cbiAgICBidWlsZERyYXdHcm91cHMgKGNvbnRleHQpIHtcbiAgICAgICAgbGV0IGxheWVycyA9IFtdLCBsYXllcl9pZHMgPSBbXTtcbiAgICAgICAgbWF0Y2hGZWF0dXJlKGNvbnRleHQsIFt0aGlzXSwgbGF5ZXJzLCBsYXllcl9pZHMpO1xuXG4gICAgICAgIGlmIChsYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGNhY2hlX2tleSA9IGNhY2hlS2V5KGxheWVyX2lkcyk7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgZXZhbHVhdGUgZWFjaCBsYXllciBjb21iaW5hdGlvbiBvbmNlICh1bmRlZmluZWQgbWVhbnMgbm90IHlldCBldmFsdWF0ZWQsXG4gICAgICAgICAgICAvLyBudWxsIG1lYW5zIGV2YWx1YXRlZCB3aXRoIG5vIGRyYXcgb2JqZWN0KVxuICAgICAgICAgICAgaWYgKGxheWVyX2NhY2hlW2NhY2hlX2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIEZpbmQgYWxsIHRoZSB1bmlxdWUgdmlzaWJsZSBkcmF3IGJsb2NrcyBmb3IgdGhpcyBsYXllciB0cmVlXG4gICAgICAgICAgICAgICAgbGV0IGRyYXdfZ3JvdXBzID0gbGF5ZXJzLm1hcCh4ID0+IHggJiYgeC52aXNpYmxlICE9PSBmYWxzZSAmJiB4LmNhbGN1bGF0ZWREcmF3KTtcbiAgICAgICAgICAgICAgICBsZXQgZHJhd19rZXlzID0ge307XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCByPTA7IHIgPCBkcmF3X2dyb3Vwcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGF5ZXIgPSBkcmF3X2dyb3Vwc1tyXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZz0wOyBnIDwgbGF5ZXIubGVuZ3RoOyBnKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGxheWVyW2ddO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19rZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGVhY2ggZHJhdyBncm91cFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGRyYXdfa2V5IGluIGRyYXdfa2V5cykge1xuICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldID0gbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV0gPSBtZXJnZVRyZWVzKGRyYXdfZ3JvdXBzLCBkcmF3X2tleSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzYXZlIHRoZSBvbmVzIHRoYXQgd2VyZW4ndCBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmICghbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldLmtleSA9IGNhY2hlX2tleSArICcvJyArIGRyYXdfa2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV0ubGF5ZXJzID0gbGF5ZXJzLm1hcCh4ID0+IHggJiYgeC5mdWxsX25hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTm8gbGF5ZXJzIGV2YWx1YXRlZFxuICAgICAgICAgICAgICAgIGlmIChsYXllcl9jYWNoZVtjYWNoZV9rZXldICYmIE9iamVjdC5rZXlzKGxheWVyX2NhY2hlW2NhY2hlX2tleV0pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5jb25zdCBGaWx0ZXJPcHRpb25zID0ge1xuICAgIC8vIEhhbmRsZSB1bml0IGNvbnZlcnNpb25zIG9uIGZpbHRlciByYW5nZXNcbiAgICByYW5nZVRyYW5zZm9ybSh2YWwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIHZhbC50cmltKCkuc2xpY2UoLTMpID09PSAncHgyJykge1xuICAgICAgICAgICAgcmV0dXJuIGAke3BhcnNlRmxvYXQodmFsKX0gKiBjb250ZXh0Lm1ldGVyc19wZXJfcGl4ZWxfc3FgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gaXNXaGl0ZUxpc3RlZChrZXkpIHtcbiAgICByZXR1cm4gd2hpdGVMaXN0LmluZGV4T2Yoa2V5KSA+IC0xO1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5KG9iaikge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwUHJvcHMob2JqKSB7XG4gICAgbGV0IHdoaXRlTGlzdGVkID0ge30sIG5vbldoaXRlTGlzdGVkID0ge307XG5cbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChpc1doaXRlTGlzdGVkKGtleSkpIHtcbiAgICAgICAgICAgIHdoaXRlTGlzdGVkW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vbldoaXRlTGlzdGVkW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3doaXRlTGlzdGVkLCBub25XaGl0ZUxpc3RlZF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVEcmF3KGxheWVyKSB7XG5cbiAgICBsZXQgZHJhdyAgPSBbXTtcblxuICAgIGlmIChsYXllci5wYXJlbnQpIHtcbiAgICAgICAgbGV0IGNzID0gbGF5ZXIucGFyZW50LmNhbGN1bGF0ZWREcmF3IHx8IFtdO1xuICAgICAgICBkcmF3LnB1c2goLi4uY3MpO1xuICAgIH1cblxuICAgIGRyYXcucHVzaChsYXllci5kcmF3KTtcbiAgICByZXR1cm4gZHJhdztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGF5ZXJUcmVlKG5hbWUsIGxheWVyLCBwYXJlbnQsIHN0eWxlcykge1xuXG4gICAgbGV0IHByb3BlcnRpZXMgPSB7IG5hbWUsIGxheWVyLCBwYXJlbnQgfTtcbiAgICBsZXQgW3doaXRlTGlzdGVkLCBub25XaGl0ZUxpc3RlZF0gPSBncm91cFByb3BzKGxheWVyKTtcbiAgICBsZXQgZW1wdHkgPSBpc0VtcHR5KG5vbldoaXRlTGlzdGVkKTtcbiAgICBsZXQgQ3JlYXRlO1xuXG4gICAgaWYgKGVtcHR5ICYmIHBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgIENyZWF0ZSA9IExheWVyTGVhZjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBDcmVhdGUgPSBMYXllclRyZWU7XG4gICAgfVxuXG4gICAgbGV0IHIgPSBuZXcgQ3JlYXRlKE9iamVjdC5hc3NpZ24ocHJvcGVydGllcywgd2hpdGVMaXN0ZWQpKTtcblxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcGFyZW50LmFkZExheWVyKHIpO1xuICAgIH1cblxuICAgIGlmICghZW1wdHkpIHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIG5vbldoaXRlTGlzdGVkKSB7XG4gICAgICAgICAgICBsZXQgcHJvcGVydHkgPSBub25XaGl0ZUxpc3RlZFtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VMYXllclRyZWUoa2V5LCBwcm9wZXJ0eSwgciwgc3R5bGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW52YWxpZCBsYXllclxuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgTGF5ZXIgdmFsdWUgbXVzdCBiZSBhbiBvYmplY3Q6IGNhbm5vdCBjcmVhdGUgbGF5ZXIgJyR7a2V5fTogJHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eSl9J2A7XG4gICAgICAgICAgICAgICAgbXNnICs9IGAsIHVuZGVyIHBhcmVudCBsYXllciAnJHtyLmZ1bGxfbmFtZX0nLmA7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGFyZW50IGlzIGEgc3R5bGUgbmFtZSwgdGhpcyBtYXkgYmUgYW4gaW5jb3JyZWN0bHkgbmVzdGVkIGxheWVyXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlc1tyLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIG1zZyArPSBgIFRoZSBwYXJlbnQgbmFtZSAnJHtyLm5hbWV9JyBpcyBhbHNvIHRoZSBuYW1lIG9mIGEgc3R5bGUsIGRpZCB5b3UgbWVhbiB0byBjcmVhdGUgYSAnZHJhdycgZ3JvdXBgO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYCB1bmRlciAnJHtwYXJlbnQubmFtZX0nYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYCBpbnN0ZWFkP2A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7IC8vIFRPRE86IGZpcmUgZXh0ZXJuYWwgZXZlbnQgdGhhdCBjbGllbnRzIHRvIHN1YnNjcmliZSB0b1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMYXllcnMgKGxheWVycywgc3R5bGVzKSB7XG4gICAgbGV0IGxheWVyX3RyZWVzID0ge307XG5cbiAgICBmb3IgKGxldCBrZXkgaW4gbGF5ZXJzKSB7XG4gICAgICAgIGxldCBsYXllciA9IGxheWVyc1trZXldO1xuICAgICAgICBpZiAobGF5ZXIpIHtcbiAgICAgICAgICAgIGxheWVyX3RyZWVzW2tleV0gPSBwYXJzZUxheWVyVHJlZShrZXksIGxheWVyLCBudWxsLCBzdHlsZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxheWVyX3RyZWVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGZWF0dXJlKGNvbnRleHQsIGxheWVycywgY29sbGVjdGVkX2xheWVycywgY29sbGVjdGVkX2xheWVyc19pZHMpIHtcbiAgICBsZXQgbWF0Y2hlZCA9IGZhbHNlO1xuICAgIGxldCBjaGlsZE1hdGNoZWQgPSBmYWxzZTtcblxuICAgIGlmIChsYXllcnMubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuXG4gICAgZm9yIChsZXQgcj0wOyByIDwgbGF5ZXJzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gbGF5ZXJzW3JdO1xuXG4gICAgICAgIGlmIChjdXJyZW50LmlzX2xlYWYpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50LmRvZXNNYXRjaChjb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnMucHVzaChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzX2lkcy5wdXNoKGN1cnJlbnQuaWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5pc190cmVlKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5kb2VzTWF0Y2goY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGNoaWxkTWF0Y2hlZCA9IG1hdGNoRmVhdHVyZShcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5sYXllcnMsXG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnMsXG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnNfaWRzXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghY2hpbGRNYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnMucHVzaChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVyc19pZHMucHVzaChjdXJyZW50LmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hlZDtcbn1cbiIsIi8vIFJlbmRlcnMgYW4gYXJyYXkgc3BlY2lmeWluZyBhIGxpbmUgcGF0dGVybiBvZiBhbHRlcm5hdGluZyBkYXNoZXMgYW5kIHNwYWNlcyxcbi8vIHNpbWlsYXIgdG8gYW4gU1ZHIGBkYXNoYXJyYXlgIG9yIENhbnZhcyBzZXRMaW5lRGFzaCgpLCBpbnRvIGEgYnl0ZSBhcnJheSBvZiBSR0JBIHBpeGVsc1xuLy8gUmV0dXJuczpcbi8vIHtcbi8vICAgIHBpeGVsOiByZW5kZXJlZCBpbWFnZSBpbiBVaW50OEFycmF5IGJ1ZmZlclxuLy8gICAgbGVuZ3RoOiBwaXhlbCBsZW5ndGggb2YgcmVuZGVyZWQgZGFzaCBwYXR0ZXJuIChzdW0gb2YgYWxsIGRhc2hlcyBhbmQgc3BhY2VzKVxuLy8gfVxuLy9cbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9TVkcvcGFpbnRpbmcuaHRtbCNTdHJva2VEYXNoYXJyYXlQcm9wZXJ0eVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvU1ZHL0F0dHJpYnV0ZS9zdHJva2UtZGFzaGFycmF5XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEL3NldExpbmVEYXNoXG5cbmNvbnN0IGRlZmF1bHRfZGFzaF9jb2xvciA9IFsyNTUsIDI1NSwgMjU1LCAyNTVdO1xuY29uc3QgZGVmYXVsdF9iYWNrZ3JvdW5kX2NvbG9yID0gWzAsIDAsIDAsIDBdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZW5kZXJEYXNoQXJyYXkgKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGRhc2hfcGl4ZWwgPSBvcHRpb25zLmRhc2hfY29sb3IgfHwgZGVmYXVsdF9kYXNoX2NvbG9yO1xuICAgIGNvbnN0IGJhY2tncm91bmRfY29sb3IgPSBvcHRpb25zLmJhY2tncm91bmRfY29sb3IgfHwgZGVmYXVsdF9iYWNrZ3JvdW5kX2NvbG9yO1xuICAgIGNvbnN0IGRhc2hlcyA9IHBhdHRlcm47XG4gICAgY29uc3Qgc2NhbGUgPSBvcHRpb25zLnNjYWxlIHx8IDE7XG5cbiAgICAvLyBJZiBwYXR0ZXJuIGlzIG9kZCwgcmVwZWF0IGl0IHRvIG1ha2UgaXQgZXZlbiAoc2VlIFNWRyBzcGVjKVxuICAgIGlmIChkYXNoZXMubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkYXNoZXMsIGRhc2hlcyk7XG4gICAgfVxuXG4gICAgbGV0IGRhc2ggPSB0cnVlO1xuICAgIGxldCBwaXhlbHMgPSBbXTtcbiAgICBmb3IgKGxldCBpPTA7IGkgPCBkYXNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNlZ21lbnQgPSBNYXRoLmZsb29yKGRhc2hlc1tpXSAqIHNjYWxlKTtcbiAgICAgICAgZm9yIChsZXQgcz0wOyBzIDwgc2VnbWVudDsgcysrKSB7XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShwaXhlbHMsIGRhc2ggPyBkYXNoX3BpeGVsIDogYmFja2dyb3VuZF9jb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgZGFzaCA9ICFkYXNoOyAvLyBhbHRlcm5hdGUgYmV0d2VlbiBkYXNoZXMgYW5kIHNwYWNlc1xuICAgIH1cblxuICAgIHBpeGVscyA9IG5ldyBVaW50OEFycmF5KHBpeGVscyk7IC8vIGNvbnZlcnQgdG8gdHlwZWQgYXJyYXlcbiAgICBjb25zdCBsZW5ndGggPSBwaXhlbHMubGVuZ3RoIC8gNDsgLy8gb25lIFJHQkEgYnl0ZSBzZXF1ZW5jZXMgdG8gb25lIHBpeGVsXG5cbiAgICByZXR1cm4geyBwaXhlbHMsIGxlbmd0aCB9O1xufVxuIiwiLy8gTGluZSByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IHtTdHlsZX0gZnJvbSAnLi4vc3R5bGUnO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBnbCBmcm9tICcuLi8uLi9nbC9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vLi4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgVmVydGV4TGF5b3V0IGZyb20gJy4uLy4uL2dsL3ZlcnRleF9sYXlvdXQnO1xuaW1wb3J0IHtidWlsZFBvbHlsaW5lc30gZnJvbSAnLi4vLi4vYnVpbGRlcnMvcG9seWxpbmVzJztcbmltcG9ydCByZW5kZXJEYXNoQXJyYXkgZnJvbSAnLi9kYXNoYXJyYXknO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IHtzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXgsIHNoYWRlclNyY19wb2x5Z29uc0ZyYWdtZW50fSBmcm9tICcuLi9wb2x5Z29ucy9wb2x5Z29ucyc7XG5cbmV4cG9ydCB2YXIgTGluZXMgPSBPYmplY3QuY3JlYXRlKFN0eWxlKTtcblxuT2JqZWN0LmFzc2lnbihMaW5lcywge1xuICAgIG5hbWU6ICdsaW5lcycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgdmVydGV4X3NoYWRlcl9zcmM6IHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCxcbiAgICBmcmFnbWVudF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudCxcbiAgICBzZWxlY3Rpb246IHRydWUsIC8vIHR1cm4gZmVhdHVyZSBzZWxlY3Rpb24gb25cblxuICAgIGluaXQoKSB7XG4gICAgICAgIFN0eWxlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBCYXNpYyBhdHRyaWJ1dGVzLCBvdGhlcnMgY2FuIGJlIGFkZGVkIChzZWUgdGV4dHVyZSBVVnMgYmVsb3cpXG4gICAgICAgIHZhciBhdHRyaWJzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9wb3NpdGlvbicsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9leHRydWRlJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9XG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gVGVsbCB0aGUgc2hhZGVyIHdlIHdhbnQgYSBvcmRlciBpbiB2ZXJ0ZXggYXR0cmlidXRlcywgYW5kIHRvIGV4dHJ1ZGUgbGluZXNcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTEFZRVJfT1JERVIgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9FWFRSVURFX0xJTkVTID0gdHJ1ZTtcblxuICAgICAgICAvLyBPcHRpb25hbCBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3NlbGVjdGlvbl9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCBsaW5lIHRleHR1cmUgb3IgZGFzaCBhcnJheVxuICAgICAgICAvLyAobGF0dGVyIHdpbGwgYmUgcmVuZGVyZWQgYXQgY29tcGlsZS10aW1lLCB3aGVuIEdMIGNvbnRleHQgYXZhaWxhYmxlKVxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlIHx8IHRoaXMuZGFzaCkge1xuICAgICAgICAgICAgdGhpcy50ZXhjb29yZHMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgdGV4dHVyZSBVVnNcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9URVhUVVJFX0NPT1JEUyA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIFNjYWxpbmcgZmFjdG9yIHRvIGFkZCBwcmVjaXNpb24gdG8gbGluZSB0ZXh0dXJlIFYgY29vcmRpbmF0ZSBwYWNrZWQgYXMgbm9ybWFsaXplZCBzaG9ydFxuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fREFTSF9TQ0FMRSA9IDE7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9WX1NDQUxFX0FESlVTVCA9IEdlby50aWxlX3NjYWxlICogdGhpcy5kZWZpbmVzLlRBTkdSQU1fREFTSF9TQ0FMRTtcblxuICAgICAgICAgICAgLy8gQWRkIHZlcnRleCBhdHRyaWJ1dGUgZm9yIFVWcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV90ZXhjb29yZCcsIHNpemU6IDIsIHR5cGU6IGdsLlVOU0lHTkVEX1NIT1JULCBub3JtYWxpemVkOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gbmV3IFZlcnRleExheW91dChhdHRyaWJzKTtcblxuICAgICAgICAvLyBBZGRpdGlvbmFsIHNpbmdsZS1hbGxvY2F0ZWQgb2JqZWN0IHVzZWQgZm9yIGhvbGRpbmcgb3V0bGluZSBzdHlsZSBhcyBpdCBpcyBwcm9jZXNzZWRcbiAgICAgICAgLy8gU2VwYXJhdGUgZnJvbSB0aGlzLmZlYXR1cmVfc3R5bGUgc28gdGhhdCBvdXRsaW5lIHByb3BlcnRpZXMgZG8gbm90IG92ZXJ3cml0ZSBjYWxjdWxhdGVkXG4gICAgICAgIC8vIGlubGluZSBwcm9wZXJ0aWVzIChvdXRsaW5lIGNhbGwgaXMgbWFkZSAqd2l0aGluKiB0aGUgaW5saW5lIGNhbGwpXG4gICAgICAgIHRoaXMub3V0bGluZV9mZWF0dXJlX3N0eWxlID0ge307XG4gICAgICAgIHRoaXMuaW5saW5lX2ZlYXR1cmVfc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7IC8vIHNhdmUgcmVmZXJlbmNlIHRvIG1haW4gY29tcHV0ZWQgc3R5bGUgb2JqZWN0XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgY29tcGlsZVNldHVwICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVfc2V0dXApIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VMaW5lVGV4dHVyZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHlsZS5jb21waWxlU2V0dXAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuXG4gICAgLy8gT3B0aW9uYWxseSBhcHBseSBhIGRhc2ggYXJyYXkgcGF0dGVybiB0byB0aGlzIGxpbmVcbiAgICBwYXJzZUxpbmVUZXh0dXJlICgpIHtcbiAgICAgICAgLy8gU3BlY2lmeSBhIGxpbmUgcGF0dGVyblxuICAgICAgICBpZiAodGhpcy5kYXNoKSB7XG4gICAgICAgICAgICAvLyBPcHRpb25hbCBiYWNrZ3JvdW5kIGNvbG9yIGZvciBkYXNoIHBhdHRlcm4gKGRlZmF1bHRzIHRyYW5zcGFyZW50KVxuICAgICAgICAgICAgaWYgKHRoaXMuZGFzaF9iYWNrZ3JvdW5kX2NvbG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3IgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKHRoaXMuZGFzaF9iYWNrZ3JvdW5kX2NvbG9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9MSU5FX0JBQ0tHUk9VTkRfQ09MT1IgPVxuICAgICAgICAgICAgICAgICAgICBgdmVjMygke3RoaXMuZGFzaF9iYWNrZ3JvdW5kX2NvbG9yLnNsaWNlKDAsIDMpLmpvaW4oJywgJyl9KWA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkanVzdCB0ZXhjb29yZCBzY2FsZSB0byBhbGxvdyBmb3IgZGFzaCBwYXR0ZXJucyB0aGF0IGFyZSBhIGZyYWN0aW9uIG9mIGxpbmUgd2lkdGhcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEUgPSAyMDtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1ZfU0NBTEVfQURKVVNUID0gR2VvLnRpbGVfc2NhbGUgKiB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFO1xuXG4gICAgICAgICAgICAvLyBSZW5kZXIgbGluZSBwYXR0ZXJuXG4gICAgICAgICAgICBjb25zdCBkYXNoID0gcmVuZGVyRGFzaEFycmF5KHRoaXMuZGFzaCwgeyBzY2FsZTogdGhpcy5kZWZpbmVzLlRBTkdSQU1fREFTSF9TQ0FMRSB9KTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9ICdfJyArIHRoaXMubmFtZSArICdfZGFzaGFycmF5JztcbiAgICAgICAgICAgIFRleHR1cmUuY3JlYXRlKHRoaXMuZ2wsIHRoaXMudGV4dHVyZSwge1xuICAgICAgICAgICAgICAgIGRhdGE6IGRhc2gucGl4ZWxzLFxuICAgICAgICAgICAgICAgIGhlaWdodDogZGFzaC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiAnbmVhcmVzdCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3BlY2lmeSBhIGxpbmUgdGV4dHVyZSAoZWl0aGVyIGRpcmVjdGx5LCBvciByZW5kZXJlZCBkYXNoIHBhdHRlcm4gZnJvbSBhYm92ZSlcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTElORV9URVhUVVJFID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0FMUEhBX1RFU1QgPSAwLjU7IC8vIHBpeGVscyBiZWxvdyB0aGlzIHRocmVzaG9sZCBhcmUgdHJhbnNwYXJlbnRcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3JtcyA9IHRoaXMuc2hhZGVycy51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMudV90ZXh0dXJlX3JhdGlvID0gMTtcblxuICAgICAgICAgICAgLy8gdXBkYXRlIGxpbmUgcGF0dGVybiBhc3BlY3QgcmF0aW8gYWZ0ZXIgdGV4dHVyZSBsb2Fkc1xuICAgICAgICAgICAgVGV4dHVyZS5nZXRJbmZvKHRoaXMudGV4dHVyZSkudGhlbih0ZXh0dXJlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMudV90ZXh0dXJlX3JhdGlvID0gdGV4dHVyZS5oZWlnaHQgLyB0ZXh0dXJlLndpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIENhbGN1bGF0ZSB3aWR0aCBhdCB6b29tIGdpdmVuIGluIGBjb250ZXh0YFxuICAgIGNhbGNXaWR0aCAod2lkdGgsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuICh3aWR0aCAmJiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkRGlzdGFuY2VQcm9wZXJ0eSh3aWR0aCwgY29udGV4dCkpIHx8IDA7XG4gICAgfSxcblxuICAgIC8vIENhbGN1bGF0ZSB3aWR0aCBhdCBuZXh0IHpvb20gKHVzZWQgZm9yIGxpbmUgd2lkdGggaW50ZXJwb2xhdGlvbilcbiAgICBjYWxjV2lkdGhOZXh0Wm9vbSAod2lkdGgsIGNvbnRleHQpIHtcbiAgICAgICAgY29udGV4dC56b29tKys7XG4gICAgICAgIGxldCB2YWwgPSB0aGlzLmNhbGNXaWR0aCh3aWR0aCwgY29udGV4dCk7XG4gICAgICAgIGNvbnRleHQuem9vbS0tO1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICAvLyBsaW5lIHdpZHRoIGluIG1ldGVyc1xuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLmNhbGNXaWR0aChkcmF3LndpZHRoLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHdpZHRoIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwIGxpbmVzIHdpdGggbmVnYXRpdmUgd2lkdGhcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dF93aWR0aCA9IHRoaXMuY2FsY1dpZHRoTmV4dFpvb20oZHJhdy5uZXh0X3dpZHRoLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoKHdpZHRoID09PSAwICYmIG5leHRfd2lkdGggPT09IDApIHx8IG5leHRfd2lkdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIHNraXAgbGluZXMgdGhhdCBkb24ndCBpbnRlcnBvbGF0ZSB0byBhIHBvc2l0aXZlIHZhbHVlIGF0IG5leHQgem9vbVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29udmVydCB0byB1bml0cyBhbmQgcmVsYXRpdmUgY2hhbmdlIGZyb20gcHJldmlvdXMgem9vbVxuICAgICAgICAvLyBOQjogbXVsdGlwbHkgYnkgMiBiZWNhdXNlIGEgZ2l2ZW4gd2lkdGggaXMgdHdpY2UgYXMgYmlnIGluIHNjcmVlbiBzcGFjZSBhdCB0aGUgbmV4dCB6b29tXG4gICAgICAgIHN0eWxlLndpZHRoID0gd2lkdGggKiBjb250ZXh0LnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTtcbiAgICAgICAgc3R5bGUubmV4dF93aWR0aCA9IChuZXh0X3dpZHRoICogMikgLSB3aWR0aDtcbiAgICAgICAgc3R5bGUubmV4dF93aWR0aCAqPSBjb250ZXh0LnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTtcbiAgICAgICAgc3R5bGUubmV4dF93aWR0aCAvPSAyOyAvLyBOQjogZGl2aWRlIGJ5IDIgYmVjYXVzZSBleHRydXNpb24gd2lkdGggaXMgaGFsdmVkIGluIGJ1aWxkZXIgLSByZW1vdmU/XG5cbiAgICAgICAgc3R5bGUuY29sb3IgPSB0aGlzLnBhcnNlQ29sb3IoZHJhdy5jb2xvciwgY29udGV4dCk7XG4gICAgICAgIGlmICghc3R5bGUuY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhlaWdodCBkZWZhdWx0cyB0byBmZWF0dXJlIGhlaWdodCwgYnV0IGV4dHJ1ZGUgc3R5bGUgY2FuIGR5bmFtaWNhbGx5IGFkanVzdCBoZWlnaHQgYnkgcmV0dXJuaW5nIGEgbnVtYmVyIG9yIGFycmF5IChpbnN0ZWFkIG9mIGEgYm9vbGVhbilcbiAgICAgICAgc3R5bGUueiA9IChkcmF3LnogJiYgU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkoZHJhdy56IHx8IDAsIGNvbnRleHQpKSB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy56O1xuICAgICAgICBzdHlsZS5oZWlnaHQgPSBmZWF0dXJlLnByb3BlcnRpZXMuaGVpZ2h0IHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLmhlaWdodDtcbiAgICAgICAgc3R5bGUuZXh0cnVkZSA9IFN0eWxlUGFyc2VyLmV2YWxQcm9wZXJ0eShkcmF3LmV4dHJ1ZGUsIGNvbnRleHQpO1xuICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzdHlsZS5leHRydWRlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlLmV4dHJ1ZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHN0eWxlLmV4dHJ1ZGUpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc3R5bGUuZXh0cnVkZVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJhaXNlIGxpbmUgaGVpZ2h0IGlmIGV4dHJ1ZGVkXG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlICYmIHN0eWxlLmhlaWdodCkge1xuICAgICAgICAgICAgc3R5bGUueiArPSBzdHlsZS5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS56ICo9IEdlby5oZWlnaHRfc2NhbGU7ICAgICAgICAvLyBwcm92aWRlIHN1Yi1tZXRlciBwcmVjaXNpb24gb2YgaGVpZ2h0IHZhbHVlc1xuICAgICAgICBzdHlsZS5oZWlnaHQgKj0gR2VvLmhlaWdodF9zY2FsZTtcblxuICAgICAgICBzdHlsZS5jYXAgPSBkcmF3LmNhcDtcbiAgICAgICAgc3R5bGUuam9pbiA9IGRyYXcuam9pbjtcbiAgICAgICAgc3R5bGUubWl0ZXJfbGltaXQgPSBkcmF3Lm1pdGVyX2xpbWl0O1xuICAgICAgICBzdHlsZS50aWxlX2VkZ2VzID0gZHJhdy50aWxlX2VkZ2VzOyAvLyB1c3VhbGx5IGFjdGl2YXRlZCBmb3IgZGVidWdnaW5nLCBvciByYXJlIHZpc3VhbGl6YXRpb24gbmVlZHNcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYW4gb3V0bGluZSBzdHlsZVxuICAgICAgICAvLyBSZXVzYWJsZSBvdXRsaW5lIHN0eWxlIG9iamVjdCwgbWFya2VkIGFzIGFscmVhZHkgd3JhcHBlZCBpbiBjYWNoZSBvYmplY3RzIChwcmVwcm9jZXNzZWQgPSB0cnVlKVxuICAgICAgICBzdHlsZS5vdXRsaW5lID0gc3R5bGUub3V0bGluZSB8fCB7IHdpZHRoOiB7fSwgbmV4dF93aWR0aDoge30sIHByZXByb2Nlc3NlZDogdHJ1ZSB9O1xuXG4gICAgICAgIGlmIChkcmF3Lm91dGxpbmUgJiYgZHJhdy5vdXRsaW5lLnZpc2libGUgIT09IGZhbHNlICYmIGRyYXcub3V0bGluZS5jb2xvciAmJiBkcmF3Lm91dGxpbmUud2lkdGgpIHtcbiAgICAgICAgICAgIC8vIG91dGxpbmUgd2lkdGggaW4gbWV0ZXJzXG4gICAgICAgICAgICAvLyBOQjogbXVsdGlwbHkgYnkgMiBiZWNhdXNlIG91dGxpbmUgaXMgYXBwbGllZCBvbiBib3RoIHNpZGVzIG9mIGxpbmVcbiAgICAgICAgICAgIGxldCBvdXRsaW5lX3dpZHRoID0gdGhpcy5jYWxjV2lkdGgoZHJhdy5vdXRsaW5lLndpZHRoLCBjb250ZXh0KSAqIDI7XG4gICAgICAgICAgICBsZXQgb3V0bGluZV9uZXh0X3dpZHRoID0gdGhpcy5jYWxjV2lkdGhOZXh0Wm9vbShkcmF3Lm91dGxpbmUubmV4dF93aWR0aCwgY29udGV4dCkgKiAyO1xuXG4gICAgICAgICAgICBpZiAoKG91dGxpbmVfd2lkdGggPT09IDAgJiYgb3V0bGluZV9uZXh0X3dpZHRoID09PSAwKSB8fCBvdXRsaW5lX3dpZHRoIDwgMCB8fCBvdXRsaW5lX25leHRfd2lkdGggPCAwKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBsaW5lcyB0aGF0IGRvbid0IGludGVycG9sYXRlIGJldHdlZW4gemVybyBvciBncmVhdGVyIHdpZHRoXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5uZXh0X3dpZHRoLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmNvbG9yID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE1haW50YWluIGNvbnNpc3RlbnQgb3V0bGluZSB3aWR0aCBhcm91bmQgdGhlIGxpbmUgZmlsbFxuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUud2lkdGgudmFsdWUgPSBvdXRsaW5lX3dpZHRoICsgd2lkdGg7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5uZXh0X3dpZHRoLnZhbHVlID0gb3V0bGluZV9uZXh0X3dpZHRoICsgbmV4dF93aWR0aDtcblxuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuY29sb3IgPSBkcmF3Lm91dGxpbmUuY29sb3I7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jYXAgPSBkcmF3Lm91dGxpbmUuY2FwIHx8IGRyYXcuY2FwO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuam9pbiA9IGRyYXcub3V0bGluZS5qb2luIHx8IGRyYXcuam9pbjtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm1pdGVyX2xpbWl0ID0gZHJhdy5vdXRsaW5lLm1pdGVyX2xpbWl0IHx8IGRyYXcubWl0ZXJfbGltaXQ7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5zdHlsZSA9IGRyYXcub3V0bGluZS5zdHlsZSB8fCB0aGlzLm5hbWU7XG5cbiAgICAgICAgICAgICAgICAvLyBFeHBsaWNpdGx5IGRlZmluZWQgb3V0bGluZSBvcmRlciwgb3IgaW5oZXJpdGVkIGZyb20gaW5uZXIgbGluZVxuICAgICAgICAgICAgICAgIGlmIChkcmF3Lm91dGxpbmUub3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5vcmRlciA9IHRoaXMucGFyc2VPcmRlcihkcmF3Lm91dGxpbmUub3JkZXIsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5vcmRlciA9IHN0eWxlLm9yZGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIERvbid0IGxldCBvdXRsaW5lIGJlIGFib3ZlIGlubmVyIGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUub3V0bGluZS5vcmRlciA+IHN0eWxlLm9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUub3JkZXIgPSBzdHlsZS5vcmRlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBPdXRsaW5lcyBhcmUgYWx3YXlzIGF0IGhhbGYtbGF5ZXIgaW50ZXJ2YWxzIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGggaW5uZXIgbGluZXNcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyIC09IDAuNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLm91dGxpbmUud2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgc3R5bGUub3V0bGluZS5uZXh0X3dpZHRoLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuY29sb3IgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICBkcmF3LmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcuY29sb3IpO1xuICAgICAgICBkcmF3LndpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LndpZHRoLCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcbiAgICAgICAgZHJhdy5uZXh0X3dpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LndpZHRoLCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTsgLy8gd2lkdGggd2lsbCBiZSBjb21wdXRlZCBmb3IgbmV4dCB6b29tXG4gICAgICAgIGRyYXcueiA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy56LCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcblxuICAgICAgICBpZiAoZHJhdy5vdXRsaW5lKSB7XG4gICAgICAgICAgICBkcmF3Lm91dGxpbmUuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5vdXRsaW5lLmNvbG9yKTtcbiAgICAgICAgICAgIGRyYXcub3V0bGluZS53aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5vdXRsaW5lLndpZHRoLCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcbiAgICAgICAgICAgIGRyYXcub3V0bGluZS5uZXh0X3dpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm91dGxpbmUud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpOyAvLyB3aWR0aCByZS1jb21wdXRlZCBmb3IgbmV4dCB6b29tXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgXCJ0ZW1wbGF0ZVwiIHRoYXQgc2V0cyBjb25zdGFudCBhdHRpYnV0ZXMgZm9yIGVhY2ggdmVydGV4LCB3aGljaCBpcyB0aGVuIG1vZGlmaWVkIHBlciB2ZXJ0ZXggb3IgcGVyIGZlYXR1cmUuXG4gICAgICogQSBwbGFpbiBKUyBhcnJheSBtYXRjaGluZyB0aGUgb3JkZXIgb2YgdGhlIHZlcnRleCBsYXlvdXQuXG4gICAgICovXG4gICAgbWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKSB7XG4gICAgICAgIGxldCBpID0gMDtcblxuICAgICAgICAvLyBwb3NpdGlvbiAtIHggJiB5IGNvb3JkcyB3aWxsIGJlIGZpbGxlZCBpbiBwZXItdmVydGV4IGJlbG93XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnogfHwgMDtcblxuICAgICAgICAvLyBsYXllciBvcmRlciAtIHcgY29vcmQgb2YgJ3Bvc2l0aW9uJyBhdHRyaWJ1dGUgKGZvciBwYWNraW5nIGVmZmljaWVuY3kpXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSB0aGlzLnNjYWxlT3JkZXIoc3R5bGUub3JkZXIpO1xuXG4gICAgICAgIC8vIGV4dHJ1c2lvbiB2ZWN0b3JcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcblxuICAgICAgICAvLyBzY2FsaW5nIHRvIHByZXZpb3VzIGFuZCBuZXh0IHpvb21cbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLm5leHRfd2lkdGg7XG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzBdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMV0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzNdICogMjU1O1xuXG4gICAgICAgIC8vIHNlbGVjdGlvbiBjb2xvclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMF0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzFdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbM10gKiAyNTU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGV4dHVyZSBVVnMgdG8gdGVtcGxhdGUgb25seSBpZiBuZWVkZWRcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4X3RlbXBsYXRlO1xuICAgIH0sXG5cbiAgICBidWlsZExpbmVzKGxpbmVzLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gT3V0bGluZSAoYnVpbGQgZmlyc3Qgc28gdGhhdCBibGVuZGVkIGdlb21ldHJ5IHdpdGhvdXQgYSBkZXB0aCB0ZXN0IGlzIGRyYXduIGZpcnN0L3VuZGVyIHRoZSBpbm5lciBsaW5lKVxuICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSB0aGlzLm91dGxpbmVfZmVhdHVyZV9zdHlsZTsgLy8gc3dhcCBpbiBvdXRsaW5lLXNwZWNpZmljIHN0eWxlIGhvbGRlclxuICAgICAgICBpZiAoc3R5bGUub3V0bGluZSAmJiBzdHlsZS5vdXRsaW5lLmNvbG9yICE9IG51bGwgJiYgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgb3V0bGluZV9zdHlsZSA9IHRoaXMuc3R5bGVzW3N0eWxlLm91dGxpbmUuc3R5bGVdO1xuICAgICAgICAgICAgaWYgKG91dGxpbmVfc3R5bGUpIHtcbiAgICAgICAgICAgICAgICBvdXRsaW5lX3N0eWxlLmFkZEZlYXR1cmUoY29udGV4dC5mZWF0dXJlLCBzdHlsZS5vdXRsaW5lLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1haW4gbGluZVxuICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSB0aGlzLmlubGluZV9mZWF0dXJlX3N0eWxlOyAvLyByZXN0b3JlIGNhbGN1bGF0ZWQgc3R5bGUgZm9yIGlubGluZVxuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuICAgICAgICBidWlsZFBvbHlsaW5lcyhcbiAgICAgICAgICAgIGxpbmVzLFxuICAgICAgICAgICAgc3R5bGUud2lkdGgsXG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YSxcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjYXA6IHN0eWxlLmNhcCxcbiAgICAgICAgICAgICAgICBqb2luOiBzdHlsZS5qb2luLFxuICAgICAgICAgICAgICAgIG1pdGVyX2xpbWl0OiBzdHlsZS5taXRlcl9saW1pdCxcbiAgICAgICAgICAgICAgICBzY2FsaW5nX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9leHRydWRlLFxuICAgICAgICAgICAgICAgIHNjYWxpbmdfbm9ybWFsaXplOiAyNTYsIC8vIHZhbHVlcyBoYXZlIGFuIDgtYml0IGZyYWN0aW9uXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3RleGNvb3JkLFxuICAgICAgICAgICAgICAgIHRleGNvb3JkX3dpZHRoOiAoc3R5bGUud2lkdGggfHwgc3R5bGUubmV4dF93aWR0aCkgLyBjb250ZXh0LnRpbGUub3Zlcnpvb20yLCAvLyBVVnMgY2FuJ3QgY2FsYyBmb3IgemVyby13aWR0aCwgdXNlIG5leHQgem9vbSB3aWR0aCBpbiB0aGF0IGNhc2VcbiAgICAgICAgICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemU6IDY1NTM1LCAvLyBzY2FsZSBVVnMgdG8gdW5zaWduZWQgc2hvcnRzXG4gICAgICAgICAgICAgICAgY2xvc2VkX3BvbHlnb246IG9wdGlvbnMgJiYgb3B0aW9ucy5jbG9zZWRfcG9seWdvbixcbiAgICAgICAgICAgICAgICByZW1vdmVfdGlsZV9lZGdlczogIXN0eWxlLnRpbGVfZWRnZXMgJiYgb3B0aW9ucyAmJiBvcHRpb25zLnJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICAgICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2U6IEdlby50aWxlX3NjYWxlICogY29udGV4dC50aWxlLnBhZF9zY2FsZSAqIDRcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2x5Z29ucyhwb2x5Z29ucywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIC8vIFJlbmRlciBwb2x5Z29ucyBhcyBpbmRpdmlkdWFsIGxpbmVzXG4gICAgICAgIGZvciAobGV0IHA9MDsgcCA8IHBvbHlnb25zLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZXMocG9seWdvbnNbcF0sIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCwgeyBjbG9zZWRfcG9seWdvbjogdHJ1ZSwgcmVtb3ZlX3RpbGVfZWRnZXM6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbn0pO1xuIiwiLy8gUG9pbnQgKyB0ZXh0IGxhYmVsIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IGdsIGZyb20gJy4uLy4uL2dsL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVmVydGV4TGF5b3V0IGZyb20gJy4uLy4uL2dsL3ZlcnRleF9sYXlvdXQnO1xuaW1wb3J0IHtidWlsZFF1YWRzRm9yUG9pbnRzfSBmcm9tICcuLi8uLi9idWlsZGVycy9wb2ludHMnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vLi4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4uLy4uL3ZlY3Rvcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4uLy4uL2xhYmVscy9jb2xsaXNpb24nO1xuaW1wb3J0IExhYmVsUG9pbnQgZnJvbSAnLi4vLi4vbGFiZWxzL2xhYmVsX3BvaW50JztcbmltcG9ydCBwbGFjZVBvaW50c09uTGluZSBmcm9tICcuLi8uLi9sYWJlbHMvcG9pbnRfcGxhY2VtZW50JztcbmltcG9ydCB7VGV4dExhYmVsc30gZnJvbSAnLi4vdGV4dC90ZXh0X2xhYmVscyc7XG5pbXBvcnQge1ZJRVdfUEFOX1NOQVBfVElNRX0gZnJvbSAnLi4vLi4vdmlldyc7XG5pbXBvcnQgZGVidWdTZXR0aW5ncyBmcm9tICcuLi8uLi91dGlscy9kZWJ1Z19zZXR0aW5ncyc7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfcG9pbnRzVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9pbnRzX3ZlcnRleC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19wb2ludHNGcmFnbWVudCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL3BvaW50c19mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKTtcblxuY29uc3QgUExBQ0VNRU5UID0gTGFiZWxQb2ludC5QTEFDRU1FTlQ7XG5cbmV4cG9ydCB2YXIgUG9pbnRzID0gT2JqZWN0LmNyZWF0ZShTdHlsZSk7XG5cbi8vIE1peGluIHRleHQgbGFiZWwgbWV0aG9kc1xuT2JqZWN0LmFzc2lnbihQb2ludHMsIFRleHRMYWJlbHMpO1xuXG5PYmplY3QuYXNzaWduKFBvaW50cywge1xuICAgIG5hbWU6ICdwb2ludHMnLFxuICAgIGJ1aWx0X2luOiB0cnVlLFxuICAgIGNvbGxpc2lvbjogdHJ1ZSwgIC8vIHN0eWxlIGluY2x1ZGVzIGEgY29sbGlzaW9uIHBhc3NcbiAgICBibGVuZDogJ292ZXJsYXknLCAvLyBvdmVybGF5cyBkcmF3biBvbiB0b3Agb2YgYWxsIG90aGVyIHN0eWxlcywgd2l0aCBibGVuZGluZ1xuXG4gICAgaW5pdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgU3R5bGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIEJhc2Ugc2hhZGVyc1xuICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjID0gc2hhZGVyU3JjX3BvaW50c1ZlcnRleDtcbiAgICAgICAgdGhpcy5mcmFnbWVudF9zaGFkZXJfc3JjID0gc2hhZGVyU3JjX3BvaW50c0ZyYWdtZW50O1xuXG4gICAgICAgIHZhciBhdHRyaWJzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9wb3NpdGlvbicsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9zaGFwZScsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV90ZXhjb29yZCcsIHNpemU6IDIsIHR5cGU6IGdsLlVOU0lHTkVEX1NIT1JULCBub3JtYWxpemVkOiB0cnVlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX29mZnNldCcsIHNpemU6IDIsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2Ffc2VsZWN0aW9uX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcblxuICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQgPSBuZXcgVmVydGV4TGF5b3V0KGF0dHJpYnMpO1xuXG4gICAgICAgIC8vIElmIHdlJ3JlIG5vdCByZW5kZXJpbmcgYXMgb3ZlcmxheSwgd2UgbmVlZCBhIGxheWVyIGF0dHJpYnV0ZVxuICAgICAgICBpZiAodGhpcy5ibGVuZCAhPT0gJ292ZXJsYXknKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9MQVlFUl9PUkRFUiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbnN1cmUgYSBsYWJlbCB0ZXh0dXJlIGlzIGFsd2F5cyBib3VuZCAoYXZvaWQgQ2hyb21lICdubyB0ZXh0dXJlIGJvdW5kIHRvIHVuaXQnIHdhcm5pbmdzKVxuICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMgPSB0aGlzLnNoYWRlcnMudW5pZm9ybXMgfHwge307XG4gICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X2xhYmVsX3RleHR1cmUgPSBUZXh0dXJlLmRlZmF1bHQ7XG5cbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fUE9JTlRfVEVYVFVSRSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMudV90ZXh0dXJlID0gdGhpcy50ZXh0dXJlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5hYmxlIGR1YWwgcG9pbnQvdGV4dCBtb2RlXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX01VTFRJX1NBTVBMRVIgPSB0cnVlO1xuXG4gICAgICAgIC8vIEZhZGUgb3V0IHdoZW4gdGlsZSBpcyB6b29taW5nIG91dCwgZS5nLiBhY3RpbmcgYXMgcHJveHkgdGlsZXNcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9PTl9aT09NX09VVCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfT05fWk9PTV9PVVRfUkFURSA9IDI7IC8vIGZhZGUgYXQgMngsIGUuZy4gZnVsbHkgdHJhbnNwYXJlbnQgYXQgMC41IHpvb20gbGV2ZWwgYXdheVxuXG4gICAgICAgIC8vIEZhZGUgaW4gKGRlcGVuZGluZyBvbiB0aWxlIHByb3h5IHN0YXR1cylcbiAgICAgICAgaWYgKGRlYnVnU2V0dGluZ3Muc3VwcHJlc3NfbGFiZWxfZmFkZV9pbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5mYWRlX2luX3RpbWUgPSAwO1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9JTl9SQVRFID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmFkZV9pbl90aW1lID0gMC4xNTsgLy8gdGltZSBpbiBzZWNvbmRzXG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX0lOX1JBVEUgPSAxIC8gdGhpcy5mYWRlX2luX3RpbWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTbmFwIHBvaW50cyB0byBwaXhlbCBncmlkIGFmdGVyIHBhbm5pbmcgc3RvcFxuICAgICAgICBpZiAoZGVidWdTZXR0aW5ncy5zdXBwcmVzc19sYWJlbF9zbmFwX2FuaW1hdGlvbiAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVklFV19QQU5fU05BUF9SQVRFID0gMSAvIFZJRVdfUEFOX1NOQVBfVElNRTsgLy8gaW52ZXJzZSB0aW1lIGluIHNlY29uZHNcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29sbGlzaW9uX2dyb3VwX3BvaW50cyA9IHRoaXMubmFtZSsnLXBvaW50cyc7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQgPSB0aGlzLm5hbWUrJy10ZXh0JztcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSxcblxuICAgIHJlc2V0ICgpIHtcbiAgICAgICAgdGhpcy5xdWV1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNldFRleHQoKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlcyA9IHt9OyAvLyB0cmFjayB3aGljaCBtaXNzaW5nIHNwcml0ZXMgd2UndmUgZm91bmQgKHJlZHVjZSBkdXBlIGxvZyBtZXNzYWdlcylcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGUgdG8gcXVldWUgZmVhdHVyZXMgaW5zdGVhZCBvZiBwcm9jZXNzaW5nIGltbWVkaWF0ZWx5XG4gICAgYWRkRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgdGlsZSA9IGNvbnRleHQudGlsZTtcbiAgICAgICAgaWYgKHRpbGUuZ2VuZXJhdGlvbiAhPT0gdGhpcy5nZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsZWQgaGVyZSBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRlbGF5ZWQgdW50aWwgdGhlIGZlYXR1cmUgcXVldWUgaXMgcGFyc2VkLFxuICAgICAgICAvLyBhbmQgd2Ugd2FudCB0aGUgcHJlcHJvY2Vzc2luZyBkb25lIGJlZm9yZSB3ZSBldmFsdWF0ZSB0ZXh0IHN0eWxlIGJlbG93XG4gICAgICAgIGRyYXcgPSB0aGlzLnByZXByb2Nlc3MoZHJhdyk7XG4gICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0eWxlID0ge307XG4gICAgICAgIHN0eWxlLmNvbG9yID0gdGhpcy5wYXJzZUNvbG9yKGRyYXcuY29sb3IsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFBvaW50IHN0eWxpbmdcblxuICAgICAgICAvLyByZXF1aXJlIGNvbG9yIG9yIHRleHR1cmVcbiAgICAgICAgaWYgKCFzdHlsZS5jb2xvciAmJiAhdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzcHJpdGUgPSBzdHlsZS5zcHJpdGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoZHJhdy5zcHJpdGUsIGNvbnRleHQpO1xuICAgICAgICBzdHlsZS5zcHJpdGVfZGVmYXVsdCA9IGRyYXcuc3ByaXRlX2RlZmF1bHQ7IC8vIG9wdGlvbmFsIGZhbGxiYWNrIGlmICdzcHJpdGUnIG5vdCBmb3VuZFxuXG4gICAgICAgIC8vIGlmIHBvaW50IGhhcyB0ZXh0dXJlIGFuZCBzcHJpdGVzLCByZXF1aXJlIGEgdmFsaWQgc3ByaXRlIHRvIGRyYXdcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSAmJiBUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0gJiYgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLnRleHR1cmVdLnNwcml0ZXMpIHtcbiAgICAgICAgICAgIGlmICghc3ByaXRlICYmICFzdHlsZS5zcHJpdGVfZGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0uc3ByaXRlc1tzcHJpdGVdKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc3ByaXRlIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGRlZmF1bHQgc3ByaXRlXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLnNwcml0ZV9kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNwcml0ZSA9IHN0eWxlLnNwcml0ZV9kZWZhdWx0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHR1cmUudGV4dHVyZXNbdGhpcy50ZXh0dXJlXS5zcHJpdGVzW3Nwcml0ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTdHlsZTogaW4gc3R5bGUgJyR7dGhpcy5uYW1lfScsIGNvdWxkIG5vdCBmaW5kIGRlZmF1bHQgc3ByaXRlICcke3Nwcml0ZX0nIGZvciB0ZXh0dXJlICcke3RoaXMudGV4dHVyZX0nYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlc1tzcHJpdGVdKSB7IC8vIG9ubHkgbG9nIGVhY2ggbWlzc2luZyBzcHJpdGUgb25jZVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBTdHlsZTogaW4gc3R5bGUgJyR7dGhpcy5uYW1lfScsIGNvdWxkIG5vdCBmaW5kIHNwcml0ZSAnJHtzcHJpdGV9JyBmb3IgdGV4dHVyZSAnJHt0aGlzLnRleHR1cmV9J2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlc1tzcHJpdGVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNwcml0ZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYFN0eWxlOiBpbiBzdHlsZSAnJHt0aGlzLm5hbWV9Jywgc3ByaXRlICcke3Nwcml0ZX0nIHdhcyBzcGVjaWZpZWQsIGJ1dCB0ZXh0dXJlICcke3RoaXMudGV4dHVyZX0nIGhhcyBubyBzcHJpdGVzYCk7XG4gICAgICAgICAgICBzcHJpdGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0cyB0ZXhjb29yZCBzY2FsZSBpZiBuZWVkZWQgKGUuZy4gZm9yIHNwcml0ZSBzdWItYXJlYSlcbiAgICAgICAgbGV0IHNwcml0ZV9pbmZvO1xuICAgICAgICBpZiAodGhpcy50ZXh0dXJlICYmIHNwcml0ZSkge1xuICAgICAgICAgICAgc3ByaXRlX2luZm8gPSBUZXh0dXJlLmdldFNwcml0ZUluZm8odGhpcy50ZXh0dXJlLCBzcHJpdGUpO1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gc3ByaXRlX2luZm8udGV4Y29vcmRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBvaW50cyBjYW4gYmUgcGxhY2VkIG9mZiB0aGUgZ3JvdW5kXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG5cbiAgICAgICAgLy8gcG9pbnQgc2l6ZSBkZWZpbmVkIGV4cGxpY2l0bHksIG9yIGRlZmF1bHRzIHRvIHNwcml0ZSBzaXplLCBvciBnZW5lcmljIGZhbGxiYWNrXG4gICAgICAgIHN0eWxlLnNpemUgPSBkcmF3LnNpemU7XG4gICAgICAgIGlmICghc3R5bGUuc2l6ZSkge1xuICAgICAgICAgICAgaWYgKHNwcml0ZV9pbmZvKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHNwcml0ZV9pbmZvLnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gWzE2LCAxNl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS5zaXplID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KHN0eWxlLnNpemUsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2l6ZSB3aWxsIGJlIHNjYWxlZCB0byAxNi1iaXQgc2lnbmVkIGludCwgc28gbWF4IGFsbG93ZWQgd2lkdGggKyBoZWlnaHQgb2YgMjU2IHBpeGVsc1xuICAgICAgICBzdHlsZS5zaXplID0gW1xuICAgICAgICAgICAgTWF0aC5taW4oKHN0eWxlLnNpemVbMF0gfHwgc3R5bGUuc2l6ZSksIDI1NiksXG4gICAgICAgICAgICBNYXRoLm1pbigoc3R5bGUuc2l6ZVsxXSB8fCBzdHlsZS5zaXplKSwgMjU2KVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFBsYWNlbWVudCBzdHJhdGVneVxuICAgICAgICBzdHlsZS5wbGFjZW1lbnQgPSBkcmF3LnBsYWNlbWVudDtcbiAgICAgICAgc3R5bGUucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbywgY29udGV4dCk7XG5cbiAgICAgICAgLy8gU3BhY2luZyBwYXJhbWV0ZXIgKGluIHBpeGVscykgdG8gZXF1YWxseSBzcGFjZSBwb2ludHMgYWxvbmcgYSBsaW5lXG4gICAgICAgIGlmIChzdHlsZS5wbGFjZW1lbnQgPT09IFBMQUNFTUVOVC5TUEFDRUQgJiYgZHJhdy5wbGFjZW1lbnRfc3BhY2luZykge1xuICAgICAgICAgICAgc3R5bGUucGxhY2VtZW50X3NwYWNpbmcgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5wbGFjZW1lbnRfc3BhY2luZywgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbmdsZSBwYXJhbWV0ZXIgKGNhbiBiZSBhIG51bWJlciBvciB0aGUgc3RyaW5nIFwiYXV0b1wiKVxuICAgICAgICBzdHlsZS5hbmdsZSA9IFN0eWxlUGFyc2VyLmV2YWxQcm9wZXJ0eShkcmF3LmFuZ2xlLCBjb250ZXh0KTtcblxuICAgICAgICBzdHlsZS50aWxlX2VkZ2VzID0gZHJhdy50aWxlX2VkZ2VzOyAvLyB1c3VhbGx5IGFjdGl2YXRlZCBmb3IgZGVidWdnaW5nLCBvciByYXJlIHZpc3VhbGl6YXRpb24gbmVlZHNcblxuICAgICAgICBzdHlsZS5zYW1wbGVyID0gMDsgLy8gMCA9IHNwcml0ZXNcblxuICAgICAgICB0aGlzLmNvbXB1dGVMYXlvdXQoc3R5bGUsIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpO1xuXG4gICAgICAgIC8vIFRleHQgc3R5bGluZ1xuICAgICAgICBsZXQgdGYgPVxuICAgICAgICAgICAgZHJhdy50ZXh0ICYmXG4gICAgICAgICAgICBkcmF3LnRleHQudmlzaWJsZSAhPT0gZmFsc2UgJiYgLy8gZXhwbGljaXRseSBoYW5kbGUgYHZpc2libGVgIHByb3BlcnR5IGZvciBuZXN0ZWQgdGV4dFxuICAgICAgICAgICAgdGhpcy5wYXJzZVRleHRGZWF0dXJlKGZlYXR1cmUsIGRyYXcudGV4dCwgY29udGV4dCwgdGlsZSk7XG5cbiAgICAgICAgaWYgKHRmKSB7XG4gICAgICAgICAgICB0Zi5sYXlvdXQucGFyZW50ID0gc3R5bGU7IC8vIHBhcmVudCBwb2ludCB3aWxsIGFwcGx5IGFkZGl0aW9uYWwgYW5jaG9yL29mZnNldCB0byB0ZXh0XG5cbiAgICAgICAgICAgIC8vIFRleHQgbGFiZWxzIGhhdmUgYSBkZWZhdWx0IHByaW9yaXR5IG9mIDAuNSBiZWxvdyB0aGVpciBwYXJlbnQgcG9pbnQgKCswLjUsIHByaW9yaXR5IGlzIGxvd2VyLWlzLWJldHRlcilcbiAgICAgICAgICAgIC8vIFRoaXMgY2FuIGJlIG92ZXJyaWRlbiwgYXMgbG9uZyBhcyBpdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRlZmF1bHRcbiAgICAgICAgICAgIHRmLmxheW91dC5wcmlvcml0eSA9IGRyYXcudGV4dC5wcmlvcml0eSA/IE1hdGgubWF4KHRmLmxheW91dC5wcmlvcml0eSwgc3R5bGUucHJpb3JpdHkgKyAwLjUpIDogKHN0eWxlLnByaW9yaXR5ICsgMC41KTtcblxuICAgICAgICAgICAgLy8gVGV4dCBsYWJlbHMgYXR0YWNoZWQgdG8gcG9pbnRzIHNob3VsZCBub3QgYmUgbW92ZWQgaW50byB0aWxlXG4gICAgICAgICAgICAvLyAodGhleSBzaG91bGQgc3RheSBmaXhlZCByZWxhdGl2ZSB0byB0aGUgcG9pbnQpXG4gICAgICAgICAgICB0Zi5sYXlvdXQubW92ZV9pbnRvX3RpbGUgPSBmYWxzZTtcblxuICAgICAgICAgICAgQ29sbGlzaW9uLmFkZFN0eWxlKHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQsIHRpbGUua2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFF1ZXVlIHRoZSBmZWF0dXJlIGZvciBwcm9jZXNzaW5nXG4gICAgICAgIGlmICghdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0YSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVldWVzW3RpbGUua2V5XS5wdXNoKHtcbiAgICAgICAgICAgIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHN0eWxlLFxuICAgICAgICAgICAgdGV4dF9mZWF0dXJlOiB0ZlxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZWdpc3RlciB3aXRoIGNvbGxpc2lvbiBtYW5hZ2VyXG4gICAgICAgIENvbGxpc2lvbi5hZGRTdHlsZSh0aGlzLmNvbGxpc2lvbl9ncm91cF9wb2ludHMsIHRpbGUua2V5KTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGVcbiAgICBzdGFydERhdGEgKHRpbGUpIHtcbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldID0gW107XG4gICAgICAgIHJldHVybiBTdHlsZS5zdGFydERhdGEuY2FsbCh0aGlzLCB0aWxlKTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGVcbiAgICBlbmREYXRhICh0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlLmNhbmNlbGVkKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYFN0eWxlICR7dGhpcy5uYW1lfTogc3RvcCB0aWxlIGJ1aWxkIGJlY2F1c2UgdGlsZSB3YXMgY2FuY2VsZWQ6ICR7dGlsZS5rZXl9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcXVldWUgPSB0aGlzLnF1ZXVlc1t0aWxlLmtleV07XG4gICAgICAgIHRoaXMucXVldWVzW3RpbGUua2V5XSA9IFtdO1xuXG4gICAgICAgIC8vIEZvciBlYWNoIHBvaW50IGZlYXR1cmUsIGNyZWF0ZSBvbmUgb3IgbW9yZSBsYWJlbHNcbiAgICAgICAgbGV0IHRleHRfb2JqcyA9IFtdO1xuICAgICAgICBsZXQgcG9pbnRfb2JqcyA9IFtdO1xuXG4gICAgICAgIHF1ZXVlLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSBxLnN0eWxlO1xuICAgICAgICAgICAgbGV0IGZlYXR1cmUgPSBxLmZlYXR1cmU7XG4gICAgICAgICAgICBsZXQgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5O1xuXG4gICAgICAgICAgICBsZXQgZmVhdHVyZV9sYWJlbHMgPSB0aGlzLmJ1aWxkTGFiZWxzKHN0eWxlLnNpemUsIGdlb21ldHJ5LCBzdHlsZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVfbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gZmVhdHVyZV9sYWJlbHNbaV07XG4gICAgICAgICAgICAgICAgbGV0IHBvaW50X29iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgZHJhdzogcS5kcmF3LFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBxLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcG9pbnRfb2Jqcy5wdXNoKHBvaW50X29iaik7XG5cbiAgICAgICAgICAgICAgICBpZiAocS50ZXh0X2ZlYXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfb2JqID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYXc6IHEudGV4dF9mZWF0dXJlLmRyYXcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBxLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBxLnRleHRfZmVhdHVyZS50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9zZXR0aW5nc19rZXk6IHEudGV4dF9mZWF0dXJlLnRleHRfc2V0dGluZ3Nfa2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0OiBxLnRleHRfZmVhdHVyZS5sYXlvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9sYWJlbDogbGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rZWQ6IHBvaW50X29iaiAgIC8vIGxpbmsgc28gdGV4dCBvbmx5IHJlbmRlcnMgd2hlbiBwYXJlbnQgcG9pbnQgaXMgcGxhY2VkXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRleHRfb2Jqcy5wdXNoKHRleHRfb2JqKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVbmxlc3MgdGV4dCBmZWF0dXJlIGlzIG9wdGlvbmFsLCBjcmVhdGUgYSB0d28td2F5IGxpbmsgc28gdGhhdCBwYXJlbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgd2lsbCBvbmx5IHJlbmRlciB3aGVuIHRleHQgaXMgYWxzbyBwbGFjZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFxLmRyYXcudGV4dC5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfb2JqLmxpbmtlZCA9IHRleHRfb2JqOyAvLyB0d28td2F5IGxpbmtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ29sbGlkZSBib3RoIHBvaW50cyBhbmQgdGV4dCwgdGhlbiBidWlsZCBmZWF0dXJlc1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5cbiAgICAgICAgICAgIGFsbChbXG4gICAgICAgICAgICAgICAgLy8gUG9pbnRzXG4gICAgICAgICAgICAgICAgQ29sbGlzaW9uLmNvbGxpZGUocG9pbnRfb2JqcywgdGhpcy5jb2xsaXNpb25fZ3JvdXBfcG9pbnRzLCB0aWxlLmtleSkudGhlbihwb2ludF9vYmpzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRfb2Jqcy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlID0gcS5zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZS5sYWJlbCA9IHEubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBTdHlsZS5hZGRGZWF0dXJlLmNhbGwodGhpcywgcS5mZWF0dXJlLCBxLmRyYXcsIHEuY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC8vIExhYmVsc1xuICAgICAgICAgICAgICAgIHRoaXMucHJlcGFyZVRleHRMYWJlbHModGlsZSwgdGhpcy5jb2xsaXNpb25fZ3JvdXBfdGV4dCwgdGV4dF9vYmpzKS5cbiAgICAgICAgICAgICAgICAgICAgdGhlbihsYWJlbHMgPT4gdGhpcy5jb2xsaWRlQW5kUmVuZGVyVGV4dExhYmVscyh0aWxlLCB0aGlzLmNvbGxpc2lvbl9ncm91cF90ZXh0LCBsYWJlbHMpKVxuICAgICAgICAgICAgXSkudGhlbigoWywgeyBsYWJlbHMsIHRleHRzLCB0ZXh0dXJlIH1dKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBsYWJlbHNcbiAgICAgICAgICAgICAgICBpZiAobGFiZWxzICYmIHRleHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJ1aWxkIHF1ZXVlZCBmZWF0dXJlc1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzX2tleSA9IHEudGV4dF9zZXR0aW5nc19rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dHNbdGV4dF9zZXR0aW5nc19rZXldICYmIHRleHRzW3RleHRfc2V0dGluZ3Nfa2V5XVtxLnRleHRdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBzdHlsaW5nIG9iamVjdCBleHBlY3RlZCBieSBTdHlsZSBjbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUubGFiZWwgPSBxLmxhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHRleHRfaW5mby5zaXplLmxvZ2ljYWxfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHRleHRfaW5mby5hbGlnbltxLmxhYmVsLmFsaWduXS50ZXhjb29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5hbmdsZSA9IHEubGFiZWwuYW5nbGUgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnNhbXBsZXIgPSAxOyAvLyBub24tMCA9IGxhYmVsc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBTdHlsZS5hZGRGZWF0dXJlLmNhbGwodGhpcywgcS5mZWF0dXJlLCBxLmRyYXcsIHEuY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZyZWVUZXh0KHRpbGUpO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluaXNoIHRpbGUgbWVzaFxuICAgICAgICAgICAgICAgIHJldHVybiBTdHlsZS5lbmREYXRhLmNhbGwodGhpcywgdGlsZSkudGhlbih0aWxlX2RhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2ggdGlsZS1zcGVjaWZpYyBsYWJlbCBhdGxhcyB0byBtZXNoIGFzIGEgdGV4dHVyZSB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlICYmIHRpbGVfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnVuaWZvcm1zID0gdGlsZV9kYXRhLnVuaWZvcm1zIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnRleHR1cmVzID0gdGlsZV9kYXRhLnRleHR1cmVzIHx8IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudW5pZm9ybXMudV9sYWJlbF90ZXh0dXJlID0gdGV4dHVyZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcy5wdXNoKHRleHR1cmUpOyAvLyBhc3NpZ24gdGV4dHVyZSBvd25lcnNoaXAgdG8gdGlsZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aWxlX2RhdGE7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgZHJhdy5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZUNvbG9yUHJvcGVydHlDYWNoZShkcmF3LmNvbG9yKTtcbiAgICAgICAgZHJhdy56ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnosIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuXG4gICAgICAgIC8vIFNpemUgKDFkIHZhbHVlIG9yIDJkIGFycmF5KVxuICAgICAgICBkcmF3LnNpemUgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuc2l6ZSwgdiA9PiBBcnJheS5pc0FycmF5KHYpID8gdi5tYXAocGFyc2VGbG9hdCkgOiBwYXJzZUZsb2F0KHYpKTtcblxuICAgICAgICAvLyBPZmZzZXQgKDJkIGFycmF5KVxuICAgICAgICBkcmF3Lm9mZnNldCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5vZmZzZXQsIHYgPT4gKEFycmF5LmlzQXJyYXkodikgJiYgdi5tYXAocGFyc2VGbG9hdCkpIHx8IDApO1xuXG4gICAgICAgIC8vIEJ1ZmZlciAoMWQgdmFsdWUgb3IgMmQgYXJyYXksIGV4cGFuZCAxZCB0byAyZClcbiAgICAgICAgZHJhdy5idWZmZXIgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuYnVmZmVyLCB2ID0+IChBcnJheS5pc0FycmF5KHYpID8gdiA6IFt2LCB2XSkubWFwKHBhcnNlRmxvYXQpIHx8IDApO1xuXG4gICAgICAgIC8vIFJlcGVhdCBydWxlcyAtIG5vIHJlcGVhdCBsaW1pdGF0aW9uIGZvciBwb2ludHMgYnkgZGVmYXVsdFxuICAgICAgICBkcmF3LnJlcGVhdF9kaXN0YW5jZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5yZXBlYXRfZGlzdGFuY2UsIHBhcnNlRmxvYXQpO1xuXG4gICAgICAgIC8vIFBsYWNlbWVudCBzdHJhdGVnaWVzXG4gICAgICAgIGRyYXcucGxhY2VtZW50ID0gUExBQ0VNRU5UW2RyYXcucGxhY2VtZW50ICYmIGRyYXcucGxhY2VtZW50LnRvVXBwZXJDYXNlKCldO1xuICAgICAgICBpZiAoZHJhdy5wbGFjZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgZHJhdy5wbGFjZW1lbnQgPSBQTEFDRU1FTlQuVkVSVEVYO1xuICAgICAgICB9XG5cbiAgICAgICAgZHJhdy5wbGFjZW1lbnRfc3BhY2luZyA9IGRyYXcucGxhY2VtZW50X3NwYWNpbmcgIT0gbnVsbCA/IGRyYXcucGxhY2VtZW50X3NwYWNpbmcgOiA4MDsgLy8gZGVmYXVsdCBzcGFjaW5nXG4gICAgICAgIGRyYXcucGxhY2VtZW50X3NwYWNpbmcgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcucGxhY2VtZW50X3NwYWNpbmcsIHBhcnNlRmxvYXQpO1xuXG4gICAgICAgIGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gPSBkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvICE9IG51bGwgPyBkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvIDogMTtcbiAgICAgICAgZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbywgcGFyc2VGbG9hdCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkcmF3LmFuZ2xlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgZHJhdy5hbmdsZSA9IGRyYXcuYW5nbGUgKiBNYXRoLlBJIC8gMTgwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZHJhdy5hbmdsZSA9IGRyYXcuYW5nbGUgfHwgMDsgLy8gYW5nbGUgY2FuIGJlIGEgc3RyaW5nIGxpa2UgXCJhdXRvXCIgKHVzZSBhbmdsZSBvZiBnZW9tZXRyeSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIHRleHQgc3R5bGluZ1xuICAgICAgICBkcmF3LnRleHQgPSB0aGlzLnByZXByb2Nlc3NUZXh0KGRyYXcudGV4dCk7IC8vIHdpbGwgcmV0dXJuIG51bGwgaWYgdmFsaWQgdGV4dCBzdHlsaW5nIHdhc24ndCBwcm92aWRlZFxuICAgICAgICBpZiAoZHJhdy50ZXh0KSB7XG4gICAgICAgICAgICBkcmF3LnRleHQua2V5ID0gZHJhdy5rZXk7IC8vIGNvcHkgbGF5ZXIga2V5IGZvciB1c2UgYXMgbGFiZWwgcmVwZWF0IGdyb3VwXG4gICAgICAgICAgICBkcmF3LnRleHQucmVwZWF0X2dyb3VwID0gZHJhdy50ZXh0LnJlcGVhdF9ncm91cCB8fCBkcmF3LnJlcGVhdF9ncm91cDsgLy8gaW5oZXJpdCByZXBlYXQgZ3JvdXAgYnkgZGVmYXVsdFxuICAgICAgICAgICAgZHJhdy50ZXh0LmFuY2hvciA9IGRyYXcudGV4dC5hbmNob3IgfHwgdGhpcy5kZWZhdWx0X2FuY2hvcjtcbiAgICAgICAgICAgIGRyYXcudGV4dC5vcHRpb25hbCA9ICh0eXBlb2YgZHJhdy50ZXh0Lm9wdGlvbmFsID09PSAnYm9vbGVhbicpID8gZHJhdy50ZXh0Lm9wdGlvbmFsIDogZmFsc2U7IC8vIGRlZmF1bHQgdGV4dCB0byByZXF1aXJlZFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIERlZmF1bHQgdG8gdHJ5aW5nIGFsbCBhbmNob3IgcGxhY2VtZW50c1xuICAgIGRlZmF1bHRfYW5jaG9yOiBbJ2JvdHRvbScsICd0b3AnLCAncmlnaHQnLCAnbGVmdCddLFxuXG4gICAgLy8gQ29tcHV0ZSBsYWJlbCBsYXlvdXQtcmVsYXRlZCBwcm9wZXJ0aWVzXG4gICAgY29tcHV0ZUxheW91dCAodGFyZ2V0LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKSB7XG4gICAgICAgIGxldCBsYXlvdXQgPSB0YXJnZXQgfHwge307XG4gICAgICAgIGxheW91dC5pZCA9IGZlYXR1cmU7XG4gICAgICAgIGxheW91dC51bml0c19wZXJfcGl4ZWwgPSB0aWxlLnVuaXRzX3Blcl9waXhlbCB8fCAxO1xuXG4gICAgICAgIC8vIGNvbGxpc2lvbiBmbGFnXG4gICAgICAgIGxheW91dC5jb2xsaWRlID0gKGRyYXcuY29sbGlkZSA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlO1xuXG4gICAgICAgIC8vIHRpbGUgYm91bmRhcnkgaGFuZGxpbmdcbiAgICAgICAgbGF5b3V0LmN1bGxfZnJvbV90aWxlID0gKGRyYXcuY3VsbF9mcm9tX3RpbGUgIT0gbnVsbCkgPyBkcmF3LmN1bGxfZnJvbV90aWxlIDogZmFsc2U7XG5cbiAgICAgICAgLy8gcG9pbnRzIHNob3VsZCBub3QgbW92ZSBpbnRvIHRpbGUgaWYgb3ZlciB0aWxlIGJvdW5kYXJ5XG4gICAgICAgIGxheW91dC5tb3ZlX2ludG9fdGlsZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGxhYmVsIGFuY2hvcnMgKHBvaW50IGxhYmVscyBvbmx5KVxuICAgICAgICAvLyBsYWJlbCBwb3NpdGlvbiB3aWxsIGJlIGFkanVzdGVkIGluIHRoZSBnaXZlbiBkaXJlY3Rpb24sIHJlbGF0aXZlIHRvIGl0cyBvcmlnaW5hbCBwb2ludFxuICAgICAgICAvLyBvbmUgb2Y6IGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgdG9wLWxlZnQsIHRvcC1yaWdodCwgYm90dG9tLWxlZnQsIGJvdHRvbS1yaWdodFxuICAgICAgICBsYXlvdXQuYW5jaG9yID0gZHJhdy5hbmNob3I7XG5cbiAgICAgICAgLy8gbGFiZWwgb2Zmc2V0IGFuZCBidWZmZXIgaW4gcGl4ZWwgKGFwcGxpZWQgaW4gc2NyZWVuIHNwYWNlKVxuICAgICAgICBsYXlvdXQub2Zmc2V0ID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcub2Zmc2V0LCBjb250ZXh0KSB8fCBTdHlsZVBhcnNlci56ZXJvUGFpcjtcbiAgICAgICAgbGF5b3V0LmJ1ZmZlciA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LmJ1ZmZlciwgY29udGV4dCkgfHwgU3R5bGVQYXJzZXIuemVyb1BhaXI7XG5cbiAgICAgICAgLy8gcmVwZWF0IHJ1bGVzXG4gICAgICAgIGxheW91dC5yZXBlYXRfZGlzdGFuY2UgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5yZXBlYXRfZGlzdGFuY2UsIGNvbnRleHQpO1xuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSkge1xuICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9kaXN0YW5jZSAqPSBsYXlvdXQudW5pdHNfcGVyX3BpeGVsO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGRyYXcucmVwZWF0X2dyb3VwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9ncm91cCA9IGRyYXcucmVwZWF0X2dyb3VwKGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRyYXcucmVwZWF0X2dyb3VwID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZ3JvdXAgPSBkcmF3LnJlcGVhdF9ncm91cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZ3JvdXAgPSBkcmF3LmtleTsgLy8gZGVmYXVsdCB0byB1bmlxdWUgc2V0IG9mIG1hdGNoaW5nIGxheWVyc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGFiZWwgcHJpb3JpdHkgKGxvd2VyIGlzIGhpZ2hlcilcbiAgICAgICAgbGV0IHByaW9yaXR5ID0gZHJhdy5wcmlvcml0eTtcbiAgICAgICAgaWYgKHByaW9yaXR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJpb3JpdHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwcmlvcml0eSA9IHByaW9yaXR5KGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJpb3JpdHkgPSAtMSA+Pj4gMDsgLy8gZGVmYXVsdCB0byBtYXggcHJpb3JpdHkgdmFsdWUgaWYgbm9uZSBzZXRcbiAgICAgICAgfVxuICAgICAgICBsYXlvdXQucHJpb3JpdHkgPSBwcmlvcml0eTtcblxuICAgICAgICByZXR1cm4gbGF5b3V0O1xuICAgIH0sXG5cbiAgICAvLyBJbXBsZW1lbnRzIGxhYmVsIGJ1aWxkaW5nIGZvciBUZXh0TGFiZWxzIG1peGluXG4gICAgYnVpbGRUZXh0TGFiZWxzICh0aWxlX2tleSwgZmVhdHVyZV9xdWV1ZSkge1xuICAgICAgICBsZXQgbGFiZWxzID0gW107XG4gICAgICAgIGZvciAobGV0IGY9MDsgZiA8IGZlYXR1cmVfcXVldWUubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgIGxldCBmcSA9IGZlYXR1cmVfcXVldWVbZl07XG4gICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGhpcy50ZXh0c1t0aWxlX2tleV1bZnEudGV4dF9zZXR0aW5nc19rZXldW2ZxLnRleHRdO1xuICAgICAgICAgICAgbGV0IHNpemUgPSB0ZXh0X2luZm8uc2l6ZS5jb2xsaXNpb25fc2l6ZTtcbiAgICAgICAgICAgIGZxLmxhYmVsID0gbmV3IExhYmVsUG9pbnQoZnEucG9pbnRfbGFiZWwucG9zaXRpb24sIHNpemUsIGZxLmxheW91dCk7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChmcSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhYmVscztcbiAgICB9LFxuXG4gICAgLy8gQnVpbGRzIG9uZSBvciBtb3JlIHBvaW50IGxhYmVscyBmb3IgYSBnZW9tZXRyeVxuICAgIGJ1aWxkTGFiZWxzIChzaXplLCBnZW9tZXRyeSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgbGFiZWxzID0gW107XG5cbiAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiUG9pbnRcIikge1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHNpemUsIG9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9pbnRcIikge1xuICAgICAgICAgICAgbGV0IHBvaW50cyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsZXQgcG9pbnQgPSBwb2ludHNbaV07XG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQocG9pbnQsIHNpemUsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIkxpbmVTdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgIGxldCBwb2ludF9sYWJlbHMgPSBwbGFjZVBvaW50c09uTGluZShsaW5lLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRfbGFiZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gocG9pbnRfbGFiZWxzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpTGluZVN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsZXQgbGluZXMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgIGZvciAobGV0IGxuID0gMDsgbG4gPCBsaW5lcy5sZW5ndGg7IGxuKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2xuXTtcbiAgICAgICAgICAgICAgICBsZXQgcG9pbnRfbGFiZWxzID0gcGxhY2VQb2ludHNPbkxpbmUobGluZSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludF9sYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gocG9pbnRfbGFiZWxzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2x5Z29uXCIpIHtcbiAgICAgICAgICAgIC8vIFBvaW50IGF0IHBvbHlnb24gY2VudHJvaWQgKG9mIG91dGVyIHJpbmcpXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5wbGFjZW1lbnQgPT09IFBMQUNFTUVOVC5DRU5UUk9JRCkge1xuICAgICAgICAgICAgICAgIGxldCBjZW50cm9pZCA9IEdlby5jZW50cm9pZChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoY2VudHJvaWQsIHNpemUsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFBvaW50IGF0IGVhY2ggcG9seWdvbiB2ZXJ0ZXggKGFsbCByaW5ncylcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByaW5ncyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGxuID0gMDsgbG4gPCByaW5ncy5sZW5ndGg7IGxuKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvaW50X2xhYmVscyA9IHBsYWNlUG9pbnRzT25MaW5lKHJpbmdzW2xuXSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRfbGFiZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChwb2ludF9sYWJlbHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlQb2x5Z29uXCIpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnBsYWNlbWVudCA9PT0gUExBQ0VNRU5ULkNFTlRST0lEKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNlbnRyb2lkID0gR2VvLm11bHRpQ2VudHJvaWQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcG9seXMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHBvbHlzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByaW5ncyA9IHBvbHlzW3BdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBsbiA9IDA7IGxuIDwgcmluZ3MubGVuZ3RoOyBsbisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcG9pbnRfbGFiZWxzID0gcGxhY2VQb2ludHNPbkxpbmUocmluZ3NbbG5dLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRfbGFiZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gocG9pbnRfbGFiZWxzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgXCJ0ZW1wbGF0ZVwiIHRoYXQgc2V0cyBjb25zdGFudCBhdHRpYnV0ZXMgZm9yIGVhY2ggdmVydGV4LCB3aGljaCBpcyB0aGVuIG1vZGlmaWVkIHBlciB2ZXJ0ZXggb3IgcGVyIGZlYXR1cmUuXG4gICAgICogQSBwbGFpbiBKUyBhcnJheSBtYXRjaGluZyB0aGUgb3JkZXIgb2YgdGhlIHZlcnRleCBsYXlvdXQuXG4gICAgICovXG4gICAgbWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKSB7XG4gICAgICAgIGxldCBjb2xvciA9IHN0eWxlLmNvbG9yIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLmNvbG9yO1xuXG4gICAgICAgIC8vIHBvc2l0aW9uIC0geCAmIHkgY29vcmRzIHdpbGwgYmUgZmlsbGVkIGluIHBlci12ZXJ0ZXggYmVsb3dcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfcG9zaXRpb24nLCAwLCB7IHNpemU6IDIgfSk7XG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3Bvc2l0aW9uJywgc3R5bGUueiB8fCAwLCB7IHNpemU6IDEsIG9mZnNldDogMiB9KTtcbiAgICAgICAgLy8gbGF5ZXIgb3JkZXIgLSB3IGNvb3JkIG9mICdwb3NpdGlvbicgYXR0cmlidXRlIChmb3IgcGFja2luZyBlZmZpY2llbmN5KVxuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9wb3NpdGlvbicsIHRoaXMuc2NhbGVPcmRlcihzdHlsZS5vcmRlciksIHsgc2l6ZTogMSwgb2Zmc2V0OiAzIH0pO1xuXG4gICAgICAgIC8vIHNjYWxpbmcgdmVjdG9yIC0gKHgsIHkpIGNvbXBvbmVudHMgcGVyIHBpeGVsLCB6ID0gYW5nbGUsIHcgPSBzY2FsaW5nIGZhY3RvclxuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9zaGFwZScsIDAsIHsgc2l6ZTogNCB9KTtcblxuICAgICAgICAvLyB0ZXh0dXJlIGNvb3Jkc1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV90ZXhjb29yZCcsIDAsIHsgc2l6ZTogMiB9KTtcblxuICAgICAgICAvLyBvZmZzZXRzXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX29mZnNldCcsIDAsIHsgc2l6ZTogMiB9KTtcblxuICAgICAgICAvLyBjb2xvclxuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9jb2xvcicsIFZlY3Rvci5tdWx0KGNvbG9yLCAyNTUpLCB7IHNpemU6IDQgfSk7XG5cbiAgICAgICAgLy8gc2VsZWN0aW9uIGNvbG9yXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2Ffc2VsZWN0aW9uX2NvbG9yJywgVmVjdG9yLm11bHQoc3R5bGUuc2VsZWN0aW9uX2NvbG9yLCAyNTUpLCB7IHNpemU6IDQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy52ZXJ0ZXhfdGVtcGxhdGU7XG4gICAgfSxcblxuICAgIGJ1aWxkUXVhZChwb2ludHMsIHNpemUsIGFuZ2xlLCBzYW1wbGVyLCBvZmZzZXQsIHRleGNvb3JkX3NjYWxlLCB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlKSB7XG4gICAgICAgIGJ1aWxkUXVhZHNGb3JQb2ludHMoXG4gICAgICAgICAgICBwb2ludHMsXG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YSxcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXhjb29yZF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfdGV4Y29vcmQsXG4gICAgICAgICAgICAgICAgcG9zaXRpb25faW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHNoYXBlX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9zaGFwZSxcbiAgICAgICAgICAgICAgICBvZmZzZXRfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX29mZnNldFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBxdWFkOiBzaXplLFxuICAgICAgICAgICAgICAgIHF1YWRfbm9ybWFsaXplOiAyNTYsICAgIC8vIHZhbHVlcyBoYXZlIGFuIDgtYml0IGZyYWN0aW9uXG4gICAgICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgICAgIGFuZ2xlOiBhbmdsZSAqIDQwOTYsICAgIC8vIHZhbHVlcyBoYXZlIGEgMTItYml0IGZyYWN0aW9uXG4gICAgICAgICAgICAgICAgc2hhcGVfdzogc2FtcGxlcixcbiAgICAgICAgICAgICAgICB0ZXhjb29yZF9zY2FsZSxcbiAgICAgICAgICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemU6IDY1NTM1XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIHF1YWQgZm9yIHBvaW50IHNwcml0ZVxuICAgIGJ1aWxkIChzdHlsZSwgdmVydGV4X2RhdGEpIHtcbiAgICAgICAgbGV0IGxhYmVsID0gc3R5bGUubGFiZWw7XG4gICAgICAgIGlmIChsYWJlbC5udW1fc2VnbWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRBcnRpY3VsYXRlZExhYmVsKGxhYmVsLCBzdHlsZSwgdmVydGV4X2RhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWlsZExhYmVsKGxhYmVsLCBzdHlsZSwgdmVydGV4X2RhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGJ1aWxkTGFiZWwgKGxhYmVsLCBzdHlsZSwgdmVydGV4X2RhdGEpIHtcbiAgICAgICAgbGV0IHZlcnRleF90ZW1wbGF0ZSA9IHRoaXMubWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKTtcbiAgICAgICAgbGV0IGFuZ2xlID0gbGFiZWwuYW5nbGUgfHwgc3R5bGUuYW5nbGU7XG5cbiAgICAgICAgdGhpcy5idWlsZFF1YWQoXG4gICAgICAgICAgICBbbGFiZWwucG9zaXRpb25dLCAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uXG4gICAgICAgICAgICBzdHlsZS5zaXplLCAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgaW4gcGl4ZWxzXG4gICAgICAgICAgICBhbmdsZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZ2xlIGluIHJhZGlhbnNcbiAgICAgICAgICAgIHN0eWxlLnNhbXBsZXIsICAgICAgICAgICAgICAgICAgLy8gdGV4dHVyZSBzYW1wbGVyIHRvIHVzZVxuICAgICAgICAgICAgbGFiZWwub2Zmc2V0LCAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgZnJvbSBjZW50ZXIgaW4gcGl4ZWxzXG4gICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMsICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgVVZzXG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlICAgIC8vIFZCTyBhbmQgZGF0YSBmb3IgY3VycmVudCB2ZXJ0ZXhcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgYnVpbGRBcnRpY3VsYXRlZExhYmVsIChsYWJlbCwgc3R5bGUsIHZlcnRleF9kYXRhKSB7XG4gICAgICAgIGxldCB2ZXJ0ZXhfdGVtcGxhdGUgPSB0aGlzLm1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYWJlbC5udW1fc2VnbWVudHM7IGkrKyl7XG4gICAgICAgICAgICBsZXQgYW5nbGUgPSBsYWJlbC5hbmdsZVtpXTtcbiAgICAgICAgICAgIGxldCBzaXplID0gc3R5bGUuc2l6ZVtpXTtcbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSBsYWJlbC5vZmZzZXRzW2ldO1xuICAgICAgICAgICAgbGV0IHRleGNvb3JkID0gc3R5bGUudGV4Y29vcmRzW2ldO1xuXG4gICAgICAgICAgICB0aGlzLmJ1aWxkUXVhZChcbiAgICAgICAgICAgICAgICBbbGFiZWwucG9zaXRpb25dLCAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplIGluIHBpeGVsc1xuICAgICAgICAgICAgICAgIGFuZ2xlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5nbGUgaW4gZGVncmVlc1xuICAgICAgICAgICAgICAgIHN0eWxlLnNhbXBsZXIsICAgICAgICAgICAgICAgICAgLy8gdGV4dHVyZSBzYW1wbGVyIHRvIHVzZVxuICAgICAgICAgICAgICAgIG9mZnNldCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGZyb20gY2VudGVyIGluIHBpeGVsc1xuICAgICAgICAgICAgICAgIHRleGNvb3JkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gdGV4dHVyZSBVVnNcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlICAgIC8vIFZCTyBhbmQgZGF0YSBmb3IgY3VycmVudCB2ZXJ0ZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGUgdG8gcGFzcy10aHJvdWdoIHRvIGdlbmVyaWMgcG9pbnQgYnVpbGRlclxuICAgIGJ1aWxkTGluZXMgKGxpbmVzLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5idWlsZChzdHlsZSwgdmVydGV4X2RhdGEpO1xuICAgIH0sXG5cbiAgICBidWlsZFBvaW50cyAocG9pbnRzLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5idWlsZChzdHlsZSwgdmVydGV4X2RhdGEpO1xuICAgIH0sXG5cbiAgICBidWlsZFBvbHlnb25zIChwb2ludHMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICB0aGlzLmJ1aWxkKHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgfSxcblxuICAgIG1ha2VNZXNoICh2ZXJ0ZXhfZGF0YSwgdmVydGV4X2VsZW1lbnRzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgLy8gQWRkIGxhYmVsIGZhZGUgdGltZVxuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgeyBmYWRlX2luX3RpbWU6IHRoaXMuZmFkZV9pbl90aW1lIH0pO1xuICAgICAgICByZXR1cm4gU3R5bGUubWFrZU1lc2guY2FsbCh0aGlzLCB2ZXJ0ZXhfZGF0YSwgdmVydGV4X2VsZW1lbnRzLCBvcHRpb25zKTtcbiAgICB9XG5cbn0pO1xuIiwiLy8gUG9seWdvbiByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IHtTdHlsZX0gZnJvbSAnLi4vc3R5bGUnO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBnbCBmcm9tICcuLi8uLi9nbC9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IFZlcnRleExheW91dCBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfbGF5b3V0JztcbmltcG9ydCB7YnVpbGRQb2x5Z29ucywgYnVpbGRFeHRydWRlZFBvbHlnb25zfSBmcm9tICcuLi8uLi9idWlsZGVycy9wb2x5Z29ucyc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXggPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2x5Z29uc192ZXJ0ZXguZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL3BvbHlnb25zX2ZyYWdtZW50Lmdsc2wnLCAndXRmOCcpO1xuXG5leHBvcnQgdmFyIFBvbHlnb25zID0gT2JqZWN0LmNyZWF0ZShTdHlsZSk7XG5cbi8vIGV4cG9ydCBzaGFkZXJzIGZvciB1c2UgaW4gbGluZXMuanNcbmV4cG9ydCB7XG4gICAgc2hhZGVyU3JjX3BvbHlnb25zVmVydGV4LFxuICAgIHNoYWRlclNyY19wb2x5Z29uc0ZyYWdtZW50XG59O1xuXG5PYmplY3QuYXNzaWduKFBvbHlnb25zLCB7XG4gICAgbmFtZTogJ3BvbHlnb25zJyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcbiAgICB2ZXJ0ZXhfc2hhZGVyX3NyYzogc2hhZGVyU3JjX3BvbHlnb25zVmVydGV4LFxuICAgIGZyYWdtZW50X3NoYWRlcl9zcmM6IHNoYWRlclNyY19wb2x5Z29uc0ZyYWdtZW50LFxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgU3R5bGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIEJhc2ljIGF0dHJpYnV0ZXMsIG90aGVycyBjYW4gYmUgYWRkZWQgKHNlZSB0ZXh0dXJlIFVWcyBiZWxvdylcbiAgICAgICAgdmFyIGF0dHJpYnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3Bvc2l0aW9uJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX25vcm1hbCcsIHNpemU6IDMsIHR5cGU6IGdsLkJZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfSwgLy8gZ2V0cyBwYWRkZWQgdG8gNC1ieXRlc1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFRlbGwgdGhlIHNoYWRlciB3ZSBoYXZlIGEgbm9ybWFsIGFuZCBvcmRlciBhdHRyaWJ1dGVzXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX05PUk1BTF9BVFRSSUJVVEUgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9MQVlFUl9PUkRFUiA9IHRydWU7XG5cbiAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV9zZWxlY3Rpb25fY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsIHRleHR1cmUgVVZzXG4gICAgICAgIGlmICh0aGlzLnRleGNvb3Jkcykge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVEVYVFVSRV9DT09SRFMgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBBZGQgdmVydGV4IGF0dHJpYnV0ZSBmb3IgVVZzIG9ubHkgd2hlbiBuZWVkZWRcbiAgICAgICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3RleGNvb3JkJywgc2l6ZTogMiwgdHlwZTogZ2wuVU5TSUdORURfU0hPUlQsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQgPSBuZXcgVmVydGV4TGF5b3V0KGF0dHJpYnMpO1xuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICBzdHlsZS5jb2xvciA9IHRoaXMucGFyc2VDb2xvcihkcmF3LmNvbG9yLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzdHlsZS5jb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS56ID0gKGRyYXcueiAmJiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkRGlzdGFuY2VQcm9wZXJ0eShkcmF3LnosIGNvbnRleHQpKSB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy56O1xuICAgICAgICBzdHlsZS56ICo9IEdlby5oZWlnaHRfc2NhbGU7IC8vIHByb3ZpZGUgc3ViLW1ldGVyIHByZWNpc2lvbiBvZiBoZWlnaHQgdmFsdWVzXG5cbiAgICAgICAgc3R5bGUuZXh0cnVkZSA9IFN0eWxlUGFyc2VyLmV2YWxQcm9wZXJ0eShkcmF3LmV4dHJ1ZGUsIGNvbnRleHQpO1xuICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSkge1xuICAgICAgICAgICAgLy8gdXNlIGZlYXR1cmUncyBoZWlnaHQgYW5kIG1pbl9oZWlnaHQgcHJvcGVydGllc1xuICAgICAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBmZWF0dXJlLnByb3BlcnRpZXMuaGVpZ2h0IHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLmhlaWdodDtcbiAgICAgICAgICAgICAgICBzdHlsZS5taW5faGVpZ2h0ID0gZmVhdHVyZS5wcm9wZXJ0aWVzLm1pbl9oZWlnaHQgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMubWluX2hlaWdodDtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXhwbGljaXQgaGVpZ2h0LCBubyBtaW5faGVpZ2h0XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc3R5bGUuZXh0cnVkZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlO1xuICAgICAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXhwbGljaXQgaGVpZ2h0IGFuZCBtaW5faGVpZ2h0XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHN0eWxlLmV4dHJ1ZGUpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUubWluX2hlaWdodCA9IHN0eWxlLmV4dHJ1ZGVbMF07XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc3R5bGUuZXh0cnVkZVsxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ICo9IEdlby5oZWlnaHRfc2NhbGU7ICAgICAgIC8vIHByb3ZpZGUgc3ViLW1ldGVyIHByZWNpc2lvbiBvZiBoZWlnaHQgdmFsdWVzXG4gICAgICAgICAgICBzdHlsZS5taW5faGVpZ2h0ICo9IEdlby5oZWlnaHRfc2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS50aWxlX2VkZ2VzID0gZHJhdy50aWxlX2VkZ2VzOyAvLyB1c3VhbGx5IGFjdGl2YXRlZCBmb3IgZGVidWdnaW5nLCBvciByYXJlIHZpc3VhbGl6YXRpb24gbmVlZHNcblxuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgfSxcblxuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIGRyYXcuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5jb2xvcik7XG4gICAgICAgIGRyYXcueiA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy56LCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgXCJ0ZW1wbGF0ZVwiIHRoYXQgc2V0cyBjb25zdGFudCBhdHRpYnV0ZXMgZm9yIGVhY2ggdmVydGV4LCB3aGljaCBpcyB0aGVuIG1vZGlmaWVkIHBlciB2ZXJ0ZXggb3IgcGVyIGZlYXR1cmUuXG4gICAgICogQSBwbGFpbiBKUyBhcnJheSBtYXRjaGluZyB0aGUgb3JkZXIgb2YgdGhlIHZlcnRleCBsYXlvdXQuXG4gICAgICovXG4gICAgbWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKSB7XG4gICAgICAgIGxldCBpID0gMDtcblxuICAgICAgICAvLyBwb3NpdGlvbiAtIHggJiB5IGNvb3JkcyB3aWxsIGJlIGZpbGxlZCBpbiBwZXItdmVydGV4IGJlbG93XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnogfHwgMDtcblxuICAgICAgICAvLyBsYXllciBvcmRlciAtIHcgY29vcmQgb2YgJ3Bvc2l0aW9uJyBhdHRyaWJ1dGUgKGZvciBwYWNraW5nIGVmZmljaWVuY3kpXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSB0aGlzLnNjYWxlT3JkZXIoc3R5bGUub3JkZXIpO1xuXG4gICAgICAgIC8vIG5vcm1hbFxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAxICogMTI3O1xuXG4gICAgICAgIC8vIGNvbG9yXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclswXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzFdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMl0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclszXSAqIDI1NTtcblxuICAgICAgICAvLyBzZWxlY3Rpb24gY29sb3JcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzBdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclsxXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMl0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzNdICogMjU1O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRleHR1cmUgVVZzIHRvIHRlbXBsYXRlIG9ubHkgaWYgbmVlZGVkXG4gICAgICAgIGlmICh0aGlzLnRleGNvb3Jkcykge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRleF90ZW1wbGF0ZTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2x5Z29ucyhwb2x5Z29ucywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB2ZXJ0ZXhfdGVtcGxhdGUgPSB0aGlzLm1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSk7XG4gICAgICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICAgICAgdGV4Y29vcmRfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3RleGNvb3JkLFxuICAgICAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplOiA2NTUzNSwgLy8gc2NhbGUgVVZzIHRvIHVuc2lnbmVkIHNob3J0c1xuICAgICAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXM6ICFzdHlsZS50aWxlX2VkZ2VzLFxuICAgICAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZTogR2VvLnRpbGVfc2NhbGUgKiBjb250ZXh0LnRpbGUucGFkX3NjYWxlICogNCxcbiAgICAgICAgICAgIHdpbmRpbmc6IGNvbnRleHQud2luZGluZ1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEV4dHJ1ZGVkIHBvbHlnb25zIChlLmcuIDNEIGJ1aWxkaW5ncylcbiAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUgJiYgc3R5bGUuaGVpZ2h0KSB7XG4gICAgICAgICAgICBidWlsZEV4dHJ1ZGVkUG9seWdvbnMoXG4gICAgICAgICAgICAgICAgcG9seWdvbnMsXG4gICAgICAgICAgICAgICAgc3R5bGUueiwgc3R5bGUuaGVpZ2h0LCBzdHlsZS5taW5faGVpZ2h0LFxuICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfbm9ybWFsLFxuICAgICAgICAgICAgICAgIDEyNywgLy8gc2NhbGUgbm9ybWFscyB0byBzaWduZWQgYnl0ZXNcbiAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZ3VsYXIgcG9seWdvbnNcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWlsZFBvbHlnb25zKFxuICAgICAgICAgICAgICAgIHBvbHlnb25zLFxuICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxufSk7XG4iLCIvLyBSYXN0ZXIgdGlsZSByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCB7UG9seWdvbnN9IGZyb20gJy4uL3BvbHlnb25zL3BvbHlnb25zJztcblxuZXhwb3J0IGxldCBSYXN0ZXJTdHlsZSA9IE9iamVjdC5jcmVhdGUoUG9seWdvbnMpO1xuXG5PYmplY3QuYXNzaWduKFJhc3RlclN0eWxlLCB7XG4gICAgbmFtZTogJ3Jhc3RlcicsXG4gICAgc3VwZXI6IFBvbHlnb25zLFxuICAgIGJ1aWx0X2luOiB0cnVlLFxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgLy8gUmVxdWlyZWQgZm9yIHJhc3RlciB0aWxlc1xuICAgICAgICB0aGlzLnJhc3RlciA9IHRoaXMucmFzdGVyIHx8ICdjb2xvcic7XG5cbiAgICAgICAgdGhpcy5zdXBlci5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBmYWxzZTsgLy8gcmFzdGVyIHN0eWxlcyBjYW4ndCBzdXBwb3J0IGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgfSxcblxuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIC8vIFJhc3RlciB0aWxlcyBkZWZhdWx0IHRvIHdoaXRlIHZlcnRleCBjb2xvciwgYXMgdGhpcyBjb2xvciB3aWxsIHRpbnQgdGhlIHVuZGVybHlpbmcgdGV4dHVyZVxuICAgICAgICBkcmF3LmNvbG9yID0gZHJhdy5jb2xvciB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5jb2xvcjtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VwZXIuX3ByZXByb2Nlc3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbn0pO1xuIiwiLy8gUmVuZGVyaW5nIHN0eWxlc1xuXG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgRmVhdHVyZVNlbGVjdGlvbiBmcm9tICcuLi9zZWxlY3Rpb24nO1xuaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZCT01lc2ggZnJvbSAnLi4vZ2wvdmJvX21lc2gnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi4vbWF0ZXJpYWwnO1xuaW1wb3J0IExpZ2h0IGZyb20gJy4uL2xpZ2h0JztcbmltcG9ydCB7UmFzdGVyVGlsZVNvdXJjZX0gZnJvbSAnLi4vc291cmNlcy9yYXN0ZXInO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IFRocmVhZCBmcm9tICcuLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuLi91dGlscy93b3JrZXJfYnJva2VyJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoYWRlclNyY19zZWxlY3Rpb25GcmFnbWVudCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvc2VsZWN0aW9uX2ZyYWdtZW50Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3Jhc3RlcnMgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9nbC9zaGFkZXJzL3Jhc3RlcnMuZ2xzbCcsICd1dGY4Jyk7XG5cbi8vIEJhc2UgY2xhc3NcblxuZXhwb3J0IHZhciBTdHlsZSA9IHtcbiAgICBpbml0ICh7IGdlbmVyYXRpb24sIHN0eWxlcywgc291cmNlcyA9IHt9LCBpbnRyb3NwZWN0aW9uIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOyAgICAgICAgICAgICAgIC8vIHNjZW5lIGdlbmVyYXRpb24gaWQgdGhpcyBzdHlsZSB3YXMgY3JlYXRlZCBmb3JcbiAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7ICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHlsZXMgZm9yIHNjZW5lXG4gICAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7ICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBzb3VyY2VzIGZvciBzY2VuZVxuICAgICAgICB0aGlzLmRlZmluZXMgPSAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnZGVmaW5lcycpICYmIHRoaXMuZGVmaW5lcykgfHwge307IC8vICNkZWZpbmVzIHRvIGJlIGluamVjdGVkIGludG8gdGhlIHNoYWRlcnNcbiAgICAgICAgdGhpcy5zaGFkZXJzID0gKHRoaXMuaGFzT3duUHJvcGVydHkoJ3NoYWRlcnMnKSAmJiB0aGlzLnNoYWRlcnMpIHx8IHt9OyAvLyBzaGFkZXIgY3VzdG9taXphdGlvbiAodW5pZm9ybXMsIGRlZmluZXMsIGJsb2NrcywgZXRjLilcbiAgICAgICAgdGhpcy5pbnRyb3NwZWN0aW9uID0gaW50cm9zcGVjdGlvbiB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbiB8fCB0aGlzLmludHJvc3BlY3Rpb24gfHwgZmFsc2U7ICAgLy8gZmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgc3R5bGUgc3VwcG9ydHMgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5jb21waWxlX3NldHVwID0gZmFsc2U7ICAgICAgICAgICAgICAgICAvLyBvbmUtdGltZSBzZXR1cCBzdGVwcyBmb3IgcHJvZ3JhbSBjb21waWxhdGlvblxuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdMIHByb2dyYW0gcmVmZXJlbmNlIChmb3IgbWFpbiByZW5kZXIgcGFzcylcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbSA9IG51bGw7ICAgICAgICAgICAgICAvLyBHTCBwcm9ncmFtIHJlZmVyZW5jZSBmb3IgZmVhdHVyZSBzZWxlY3Rpb24gcmVuZGVyIHBhc3NcbiAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlID0ge307ICAgICAgICAgICAgICAgICAgICAvLyBzdHlsZSBmb3IgZmVhdHVyZSBjdXJyZW50bHkgYmVpbmcgcGFyc2VkLCBzaGFyZWQgdG8gbGVzc2VuIEdDL21lbW9yeSB0aHJhc2hcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGUgPSBbXTsgICAgICAgICAgICAgICAgICAvLyBzaGFyZWQgc2luZ2xlLXZlcnRleCB0ZW1wbGF0ZSwgZmlsbGVkIG91dCBieSBlYWNoIHN0eWxlXG4gICAgICAgIHRoaXMudGlsZV9kYXRhID0ge307XG5cbiAgICAgICAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHRoaXMgb2JqZWN0IHRvIGJlIGNhbGxlZCBmcm9tIHdvcmtlciB0aHJlYWRzXG4gICAgICAgIHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0ID0gWydTdHlsZScsIHRoaXMubmFtZSwgdGhpcy5nZW5lcmF0aW9uXS5qb2luKCcvJyk7XG4gICAgICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgICAgICAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCwgdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0IHdvcmxkIGNvb3JkcyB0byB3cmFwIGV2ZXJ5IDEwMCwwMDAgbWV0ZXJzLCBjYW4gdHVybiBvZmYgYnkgc2V0dGluZyB0aGlzIHRvICdmYWxzZSdcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fV09STERfUE9TSVRJT05fV1JBUCA9IDEwMDAwMDtcblxuICAgICAgICAvLyBCbGVuZGluZ1xuICAgICAgICB0aGlzLmJsZW5kID0gdGhpcy5ibGVuZCB8fCAnb3BhcXVlJzsgICAgICAgIC8vIGRlZmF1bHQ6IG9wYXF1ZSBzdHlsZXMgYXJlIGRyYXduIGZpcnN0LCB3aXRob3V0IGJsZW5kaW5nXG4gICAgICAgIHRoaXMuZGVmaW5lc1tgVEFOR1JBTV9CTEVORF8ke3RoaXMuYmxlbmQudG9VcHBlckNhc2UoKX1gXSA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmJsZW5kX29yZGVyID09IG51bGwpIHsgLy8gY29udHJvbHMgb3JkZXIgb2YgcmVuZGVyaW5nIGZvciBzdHlsZXMgdy9ub24tb3BhcXVlIGJsZW5kaW5nXG4gICAgICAgICAgICB0aGlzLmJsZW5kX29yZGVyID0gLTE7IC8vIGRlZmF1bHRzIHRvIGZpcnN0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgc3R5bGUgZGVmaW5lcyBpdHMgb3duIG1hdGVyaWFsLCByZXBsYWNlIHRoZSBpbmhlcml0ZWQgbWF0ZXJpYWwgaW5zdGFuY2VcbiAgICAgICAgaWYgKCEodGhpcy5tYXRlcmlhbCBpbnN0YW5jZW9mIE1hdGVyaWFsKSkge1xuICAgICAgICAgICAgaWYgKCFNYXRlcmlhbC5pc1ZhbGlkKHRoaXMubWF0ZXJpYWwpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRlcmlhbCA9IFN0eWxlUGFyc2VyLmRlZmF1bHRzLm1hdGVyaWFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tYXRlcmlhbCA9IG5ldyBNYXRlcmlhbCh0aGlzLm1hdGVyaWFsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hdGVyaWFsLmluamVjdCh0aGlzKTtcblxuICAgICAgICAvLyBTZXQgbGlnaHRpbmcgbW9kZTogZnJhZ21lbnQsIHZlcnRleCwgb3Igbm9uZSAoc3BlY2lmaWVkIGFzICdmYWxzZScpXG4gICAgICAgIExpZ2h0LnNldE1vZGUodGhpcy5saWdodGluZywgdGhpcyk7XG5cbiAgICAgICAgLy8gU2V0dXAgcmFzdGVyIHNhbXBsZXJzIGlmIG5lZWRlZFxuICAgICAgICB0aGlzLnNldHVwUmFzdGVycygpO1xuXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0sXG5cbiAgICBkZXN0cm95ICgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvZ3JhbSkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25fcHJvZ3JhbSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbS5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2wgPSBudWxsO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgfSxcblxuICAgIHJlc2V0ICgpIHtcbiAgICB9LFxuXG4gICAgYmFzZVN0eWxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSB8fCB0aGlzLm5hbWU7XG4gICAgfSxcblxuICAgIGZpbGxWZXJ0ZXhUZW1wbGF0ZShhdHRyaWJ1dGUsIHZhbHVlLCB7IHNpemUsIG9mZnNldCB9KSB7XG4gICAgICAgIG9mZnNldCA9IChvZmZzZXQgPT09IHVuZGVmaW5lZCkgPyAwIDogb2Zmc2V0O1xuXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMudmVydGV4X2xheW91dC5pbmRleFthdHRyaWJ1dGVdO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYFN0eWxlOiBpbiBzdHlsZSAnJHt0aGlzLm5hbWV9Jywgbm8gaW5kZXggZm91bmQgaW4gdmVydGV4IGxheW91dCBmb3IgYXR0cmlidXRlICcke2F0dHJpYnV0ZX0nYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgICAgICAgbGV0IHYgPSB2YWx1ZS5sZW5ndGggPiBpID8gdmFsdWVbaV0gOiB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2luZGV4ICsgaSArIG9mZnNldF0gPSB2O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKiogU3R5bGUgcGFyc2luZyBhbmQgZ2VvbWV0cnkgY29uc3RydWN0aW9uICoqKi9cblxuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHRvIGhvbGQgZmVhdHVyZSBkYXRhIChmb3IgYSB0aWxlIG9yIG90aGVyIG9iamVjdClcbiAgICBzdGFydERhdGEgKHRpbGUpIHtcbiAgICAgICAgdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldID0ge1xuICAgICAgICAgICAgdmVydGV4X2RhdGE6IG51bGwsXG4gICAgICAgICAgICB1bmlmb3Jtczoge30sXG4gICAgICAgICAgICB0ZXh0dXJlczogW11cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XTtcbiAgICB9LFxuXG4gICAgLy8gRmluYWxpemVzIGFuIG9iamVjdCBob2xkaW5nIGZlYXR1cmUgZGF0YSAoZm9yIGEgdGlsZSBvciBvdGhlciBvYmplY3QpXG4gICAgZW5kRGF0YSAodGlsZSkge1xuICAgICAgICB2YXIgdGlsZV9kYXRhID0gdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldO1xuICAgICAgICB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0gPSBudWxsO1xuXG4gICAgICAgIGlmICh0aWxlX2RhdGEgJiYgdGlsZV9kYXRhLnZlcnRleF9kYXRhICYmIHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBPbmx5IGtlZXAgZmluYWwgYnl0ZSBidWZmZXJcbiAgICAgICAgICAgIHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS5lbmQoKTtcbiAgICAgICAgICAgIHRpbGVfZGF0YS52ZXJ0ZXhfZWxlbWVudHMgPSB0aWxlX2RhdGEudmVydGV4X2RhdGEuZWxlbWVudF9idWZmZXI7XG4gICAgICAgICAgICB0aWxlX2RhdGEudmVydGV4X2RhdGEgPSB0aWxlX2RhdGEudmVydGV4X2RhdGEudmVydGV4X2J1ZmZlcjsgLy8gY29udmVydCBmcm9tIGluc3RhbmNlIHRvIHJhdyB0eXBlZCBhcnJheVxuXG4gICAgICAgICAgICAvLyBMb2FkIHJhc3RlciB0aWxlcyBwYXNzZWQgZnJvbSBkYXRhIHNvdXJjZVxuICAgICAgICAgICAgLy8gQmxvY2tzIG1lc2ggY29tcGxldGlvbiB0byBhdm9pZCBmbGlja2VyaW5nXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFJhc3RlclRleHR1cmVzKHRpbGUsIHRpbGVfZGF0YSkudGhlbigoKSA9PiB0aWxlX2RhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsgLy8gZG9uJ3Qgc2VuZCB0aWxlIGRhdGEgYmFjayBpZiBkb2Vzbid0IGhhdmUgZ2VvbWV0cnlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBIYXMgbWVzaCBkYXRhIGZvciBhIGdpdmVuIHRpbGU/XG4gICAgaGFzRGF0YUZvclRpbGUgKHRpbGVfa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbGVfZGF0YVt0aWxlX2tleV0gIT0gbnVsbDtcbiAgICB9LFxuXG4gICAgYWRkRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgdGlsZSA9IGNvbnRleHQudGlsZTtcbiAgICAgICAgaWYgKHRpbGUuZ2VuZXJhdGlvbiAhPT0gdGhpcy5nZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGEodGlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLnBhcnNlRmVhdHVyZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0KTtcblxuICAgICAgICAvLyBTa2lwIGZlYXR1cmU/XG4gICAgICAgIGlmICghc3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpcnN0IGZlYXR1cmUgaW4gdGhpcyByZW5kZXIgc3R5bGU/XG4gICAgICAgIGlmICghdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldLnZlcnRleF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0udmVydGV4X2RhdGEgPSB0aGlzLnZlcnRleF9sYXlvdXQuY3JlYXRlVmVydGV4RGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5idWlsZEdlb21ldHJ5KGZlYXR1cmUuZ2VvbWV0cnksIHN0eWxlLCB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0udmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICBidWlsZEdlb21ldHJ5IChnZW9tZXRyeSwgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChnZW9tZXRyeS50eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQb2x5Z29ucyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkUG9seWdvbnMoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZXMoW2dlb21ldHJ5LmNvb3JkaW5hdGVzXSwgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5idWlsZExpbmVzKGdlb21ldHJ5LmNvb3JkaW5hdGVzLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQb2ludHMoW2dlb21ldHJ5LmNvb3JkaW5hdGVzXSwgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQb2ludHMoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG5cbiAgICAgICAgICAgIGRyYXcgPSB0aGlzLnByZXByb2Nlc3MoZHJhdyk7XG4gICAgICAgICAgICBpZiAoIWRyYXcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBvcmRlciBpZiBpdCB3YXMgbm90IGNhY2hlZFxuICAgICAgICAgICAgc3R5bGUub3JkZXIgPSB0aGlzLnBhcnNlT3JkZXIoZHJhdy5vcmRlciwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uIChvbmx5IGlmIHN0eWxlIHN1cHBvcnRzIGl0KVxuICAgICAgICAgICAgdmFyIHNlbGVjdGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHN0eWxlLmludGVyYWN0aXZlID0gdGhpcy5pbnRyb3NwZWN0aW9uIHx8IGRyYXcuaW50ZXJhY3RpdmU7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KHN0eWxlLmludGVyYWN0aXZlLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgZmVhdHVyZSBpcyBtYXJrZWQgYXMgc2VsZWN0YWJsZVxuICAgICAgICAgICAgaWYgKHNlbGVjdGFibGUpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zZWxlY3Rpb25fY29sb3IgPSBGZWF0dXJlU2VsZWN0aW9uLm1ha2VDb2xvcihmZWF0dXJlLCBjb250ZXh0LnRpbGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuc2VsZWN0aW9uX2NvbG9yID0gRmVhdHVyZVNlbGVjdGlvbi5kZWZhdWx0Q29sb3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN1YmNsYXNzIGltcGxlbWVudGF0aW9uXG4gICAgICAgICAgICBzdHlsZSA9IHRoaXMuX3BhcnNlRmVhdHVyZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0KTtcblxuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgJ1N0eWxlLnBhcnNlRmVhdHVyZTogc3R5bGUgcGFyc2luZyBlcnJvcicsIGZlYXR1cmUsIHN0eWxlLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3BhcnNlRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlX3N0eWxlO1xuICAgIH0sXG5cbiAgICBwcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIC8vIFByZXByb2Nlc3MgZmlyc3QgdGltZVxuICAgICAgICBpZiAoIWRyYXcucHJlcHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICBkcmF3ID0gdGhpcy5fcHJlcHJvY2VzcyhkcmF3KTsgLy8gb3B0aW9uYWwgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRyYXcucHJlcHJvY2Vzc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLy8gb3B0aW9uYWxseSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc1xuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBQYXJzZSBhbiBvcmRlciB2YWx1ZVxuICAgIHBhcnNlT3JkZXIgKG9yZGVyLCBjb250ZXh0KSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBvcmRlciBpZiBpdCB3YXMgbm90IGNhY2hlZFxuICAgICAgICBpZiAodHlwZW9mIG9yZGVyICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmNhbGN1bGF0ZU9yZGVyKG9yZGVyLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3JkZXI7XG4gICAgfSxcblxuICAgIC8vIEV4cGFuZCBmaW5hbCBwcmVjaXNpb24gZm9yIGhhbGYtbGF5ZXJzIChmb3Igb3V0bGluZXMpXG4gICAgc2NhbGVPcmRlciAob3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIG9yZGVyICogMjtcbiAgICB9LFxuXG4gICAgLy8gUGFyc2UgYSBjb2xvciBvZiBjaG9vc2UgYSBkZWZhdWx0IGlmIGFjY2VwdGFibGUsIHJldHVybiB1bmRlZmluZWQgaWYgY29sb3IgbWlzc2luZ1xuICAgIHBhcnNlQ29sb3IoY29sb3IsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gTmVlZCBlaXRoZXIgYSBjb2xvciwgb3IgYSBzaGFkZXIgYmxvY2sgZm9yICdjb2xvcicgb3IgJ2ZpbHRlcidcbiAgICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gU3R5bGVQYXJzZXIuZXZhbENhY2hlZENvbG9yUHJvcGVydHkoY29sb3IsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc2hhZGVycy5ibG9ja3MuY29sb3IgfHwgdGhpcy5zaGFkZXJzLmJsb2Nrcy5maWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5kZWZhdWx0cy5jb2xvcjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBmdW5jdGlvbnMgYXJlIG5vLW9wcyB1bnRpbCBvdmVycmlkZW5cbiAgICBidWlsZFBvbHlnb25zICgpIHt9LFxuICAgIGJ1aWxkTGluZXMgKCkge30sXG4gICAgYnVpbGRQb2ludHMgKCkge30sXG5cblxuICAgIC8qKiogR0wgc3RhdGUgYW5kIHJlbmRlcmluZyAqKiovXG5cbiAgICBzZXRHTCAoZ2wpIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLm1heF90ZXh0dXJlX3NpemUgPSBUZXh0dXJlLmdldE1heFRleHR1cmVTaXplKHRoaXMuZ2wpO1xuICAgIH0sXG5cbiAgICBtYWtlTWVzaCAodmVydGV4X2RhdGEsIHZlcnRleF9lbGVtZW50cywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgVkJPTWVzaCh0aGlzLmdsLCB2ZXJ0ZXhfZGF0YSwgdmVydGV4X2VsZW1lbnRzLCB0aGlzLnZlcnRleF9sYXlvdXQsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICByZW5kZXIgKG1lc2gpIHtcbiAgICAgICAgcmV0dXJuIG1lc2gucmVuZGVyKCk7XG4gICAgfSxcblxuICAgIC8vIEdldCBhIHNwZWNpZmljIHByb2dyYW0sIGNvbXBpbGluZyBpZiBuZWNlc3NhcnlcbiAgICBnZXRQcm9ncmFtIChrZXkgPSAncHJvZ3JhbScpIHtcbiAgICAgICAgdGhpcy5jb21waWxlU2V0dXAoKTtcblxuICAgICAgICBjb25zdCBwcm9ncmFtID0gdGhpc1trZXldO1xuICAgICAgICBpZiAoIXByb2dyYW0gfHwgcHJvZ3JhbS5lcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwcm9ncmFtLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgYENvbXBpbGluZyBzdHlsZSAnJHt0aGlzLm5hbWV9JywgcHJvZ3JhbSBrZXkgJyR7a2V5fSdgKTtcbiAgICAgICAgICAgIHByb2dyYW0uY29tcGlsZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH0sXG5cbiAgICAvLyBPbmUtdGltZSBzZXR1cCBmb3IgY29tcGlsaW5nIHN0eWxlJ3MgcHJvZ3JhbXNcbiAgICBjb21waWxlU2V0dXAgKCkge1xuICAgICAgICBpZiAodGhpcy5jb21waWxlX3NldHVwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZ2wpIHtcbiAgICAgICAgICAgIHRocm93KG5ldyBFcnJvcihgc3R5bGUuY29tcGlsZSgpOiBza2lwcGluZyBmb3IgJHt0aGlzLm5hbWV9IGJlY2F1c2Ugbm8gR0wgY29udGV4dGApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ1aWxkIGRlZmluZXMgJiBmb3Igc2VsZWN0aW9uIChuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgc2luY2UgdGhlIGZpcnN0IGlzIHN0b3JlZCBhcyBhIHJlZmVyZW5jZSBieSB0aGUgcHJvZ3JhbSlcbiAgICAgICAgdmFyIGRlZmluZXMgPSB0aGlzLmJ1aWxkRGVmaW5lTGlzdCgpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb25fZGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmluZXMpO1xuICAgICAgICAgICAgc2VsZWN0aW9uX2RlZmluZXMuVEFOR1JBTV9GRUFUVVJFX1NFTEVDVElPTiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgYW55IGN1c3RvbSBjb2RlIGJsb2NrcywgdW5pZm9ybSBkZXBlbmRlbmNpZXMsIGV0Yy5cbiAgICAgICAgdmFyIGJsb2NrcyA9ICh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLmJsb2Nrcyk7XG4gICAgICAgIHZhciBibG9ja19zY29wZXMgPSAodGhpcy5zaGFkZXJzICYmIHRoaXMuc2hhZGVycy5ibG9ja19zY29wZXMpO1xuICAgICAgICB2YXIgdW5pZm9ybXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLnVuaWZvcm1zKTtcblxuICAgICAgICAvLyBBY2NlcHQgYSBzaW5nbGUgZXh0ZW5zaW9uLCBvciBhbiBhcnJheSBvZiBleHRlbnNpb25zXG4gICAgICAgIHZhciBleHRlbnNpb25zID0gKHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMuZXh0ZW5zaW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgZXh0ZW5zaW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBbZXh0ZW5zaW9uc107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgc2hhZGVyc1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBuZXcgU2hhZGVyUHJvZ3JhbShcbiAgICAgICAgICAgIHRoaXMuZ2wsXG4gICAgICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjLFxuICAgICAgICAgICAgdGhpcy5mcmFnbWVudF9zaGFkZXJfc3JjLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBkZWZpbmVzLFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zLFxuICAgICAgICAgICAgICAgIGJsb2NrcyxcbiAgICAgICAgICAgICAgICBibG9ja19zY29wZXMsXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbSA9IG5ldyBTaGFkZXJQcm9ncmFtKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2wsXG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfc2hhZGVyX3NyYyxcbiAgICAgICAgICAgICAgICBzaGFkZXJTcmNfc2VsZWN0aW9uRnJhZ21lbnQsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAodGhpcy5uYW1lICsgJyAoc2VsZWN0aW9uKScpLFxuICAgICAgICAgICAgICAgICAgICBkZWZpbmVzOiBzZWxlY3Rpb25fZGVmaW5lcyxcbiAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrcyxcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tfc2NvcGVzLFxuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21waWxlX3NldHVwID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLy8gQWRkIGEgc2hhZGVyIGJsb2NrXG4gICAgYWRkU2hhZGVyQmxvY2sgKGtleSwgYmxvY2ssIHNjb3BlID0gbnVsbCkge1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tzID0gdGhpcy5zaGFkZXJzLmJsb2NrcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2Nrc1trZXldID0gdGhpcy5zaGFkZXJzLmJsb2Nrc1trZXldIHx8IFtdO1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0ucHVzaChibG9jayk7XG5cbiAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHRoaXMuc2hhZGVycy5ibG9ja19zY29wZXMgfHwge307XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja19zY29wZXNba2V5XSA9IHRoaXMuc2hhZGVycy5ibG9ja19zY29wZXNba2V5XSB8fCBbXTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldLnB1c2goc2NvcGUpO1xuICAgIH0sXG5cbiAgICAvLyBSZW1vdmUgYWxsIHNoYWRlciBibG9ja3MgZm9yIGtleVxuICAgIHJlbW92ZVNoYWRlckJsb2NrIChrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hhZGVycy5ibG9ja3MpIHtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3Nba2V5XSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVwbGFjZVNoYWRlckJsb2NrIChrZXksIGJsb2NrLCBzY29wZSA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVTaGFkZXJCbG9jayhrZXkpO1xuICAgICAgICB0aGlzLmFkZFNoYWRlckJsb2NrKGtleSwgYmxvY2ssIHNjb3BlKTtcbiAgICB9LFxuXG4gICAgLyoqIFRPRE86IGNvdWxkIHByb2JhYmx5IGNvbWJpbmUgYW5kIGdlbmVyYWxpemUgdGhpcyB3aXRoIHNpbWlsYXIgbWV0aG9kIGluIFNoYWRlclByb2dyYW1cbiAgICAgKiAobGlzdCBvZiBkZWZpbmUgb2JqZWN0cyB0aGF0IGluaGVyaXQgZnJvbSBlYWNoIG90aGVyKVxuICAgICAqL1xuICAgIGJ1aWxkRGVmaW5lTGlzdCAoKSB7XG4gICAgICAgIC8vIEFkZCBhbnkgY3VzdG9tIGRlZmluZXMgdG8gYnVpbHQtaW4gc3R5bGUgZGVmaW5lc1xuICAgICAgICB2YXIgZGVmaW5lcyA9IHt9OyAvLyBjcmVhdGUgYSBuZXcgb2JqZWN0IHRvIGF2b2lkIG11dGF0aW5nIGEgcHJvdG90eXBlIHZhbHVlIHRoYXQgbWF5IGJlIHNoYXJlZCB3aXRoIG90aGVyIHN0eWxlc1xuICAgICAgICBpZiAodGhpcy5kZWZpbmVzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGQgaW4gdGhpcy5kZWZpbmVzKSB7XG4gICAgICAgICAgICAgICAgZGVmaW5lc1tkXSA9IHRoaXMuZGVmaW5lc1tkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaGFkZXJzICE9IG51bGwgJiYgdGhpcy5zaGFkZXJzLmRlZmluZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yIChkIGluIHRoaXMuc2hhZGVycy5kZWZpbmVzKSB7XG4gICAgICAgICAgICAgICAgZGVmaW5lc1tkXSA9IHRoaXMuc2hhZGVycy5kZWZpbmVzW2RdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVzO1xuXG4gICAgfSxcblxuICAgIC8vIERldGVybWluZXMgaWYgJ3Jhc3RlcicgcGFyYW1ldGVyIGlzIHNldCB0byBhIHZhbGlkIHZhbHVlXG4gICAgaGFzUmFzdGVycyAoKSB7XG4gICAgICAgIHJldHVybiAoWydjb2xvcicsICdub3JtYWwnLCAnY3VzdG9tJ10uaW5kZXhPZih0aGlzLnJhc3RlcikgPiAtMSk7XG4gICAgfSxcblxuICAgIC8vIFNldHVwIHJhc3RlciBhY2Nlc3MgaW4gc2hhZGVyc1xuICAgIHNldHVwUmFzdGVycyAoKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNSYXN0ZXJzKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuYWJsZSByYXN0ZXIgdGV4dHVyZXMgYW5kIGNvbmZpZ3VyZSBob3cgZmlyc3QgcmFzdGVyIGlzIGFwcGxpZWRcbiAgICAgICAgaWYgKHRoaXMucmFzdGVyID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9SQVNURVJfVEVYVFVSRV9DT0xPUiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5yYXN0ZXIgPT09ICdub3JtYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9SQVNURVJfVEVYVFVSRV9OT1JNQUwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVsc2UgY3VzdG9tIHJhc3RlciAoc2FtcGxlcnMgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBidXQgbm90IGF1dG9tYXRpY2FsbHkgYXBwbGllZClcblxuICAgICAgICAvLyBBIGdpdmVuIHN0eWxlIG1heSBiZSBidWlsdCB3aXRoIG11bHRpcGxlIGRhdGEgc291cmNlcywgZWFjaCBvZiB3aGljaCBtYXkgYXR0YWNoXG4gICAgICAgIC8vIGEgdmFyaWFibGUgbnVtYmVyIG9mIHJhc3RlciBzb3VyY2VzICgwIHRvIE4sIHdoZXJlIE4gaXMgdGhlIG1heCBudW1iZXIgb2YgcmFzdGVyIHNvdXJjZXNcbiAgICAgICAgLy8gZGVmaW5lZCBmb3IgdGhlIHNjZW5lKS4gVGhpcyBtZWFucyB3ZSBkb24ndCBrbm93ICp3aGljaCogb3IgKmhvdyBtYW55KiByYXN0ZXJzIHdpbGwgYmVcbiAgICAgICAgLy8gYm91bmQgbm93LCBhdCBpbml0aWFsIGNvbXBpbGUtdGltZTsgd2Ugb25seSBrbm93IHRoaXMgYXQgZ2VvbWV0cnkgYnVpbGQtdGltZS4gVG8gZW5zdXJlXG4gICAgICAgIC8vIHRoYXQgd2UgY2FuIGJpbmQgYXMgbWFueSByYXN0ZXIgc291cmNlcyBhcyBuZWVkZWQsIHdlIGRlY2xhcmUgb3VyIHVuaWZvcm0gYXJyYXlzIHRvIGhvbGRcbiAgICAgICAgLy8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHBvc3NpYmxlIHNvdXJjZXMuIEF0IHJlbmRlciB0aW1lLCBvbmx5IHRoZSBuZWNlc3NhcnkgbnVtYmVyIG9mIHJhc3RlcnNcbiAgICAgICAgLy8gYXJlIGJvdW5kICh0aGUgcmVtYWluaW5nIHNsb3RzIGFyZW4ndCBpbnRlbmRlZCB0byBiZSBhY2Nlc3NlZCkuXG4gICAgICAgIGxldCBudW1fcmFzdGVyX3NvdXJjZXMgPVxuICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKVxuICAgICAgICAgICAgLmZpbHRlcihzID0+IHRoaXMuc291cmNlc1tzXSBpbnN0YW5jZW9mIFJhc3RlclRpbGVTb3VyY2UpXG4gICAgICAgICAgICAubGVuZ3RoO1xuXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX05VTV9SQVNURVJfU09VUkNFUyA9IGBpbnQoJHtudW1fcmFzdGVyX3NvdXJjZXN9KWA7XG4gICAgICAgIGlmIChudW1fcmFzdGVyX3NvdXJjZXMgPiAwKSB7XG4gICAgICAgICAgICAvLyBVc2UgbW9kZWwgcG9zaXRpb24gb2YgdGlsZSdzIGNvb3JkaW5hdGUgem9vbSBmb3IgcmFzdGVyIHRpbGUgdGV4dHVyZSBVVnNcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX01PREVMX1BPU0lUSU9OX0JBU0VfWk9PTV9WQVJZSU5HID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gVW5pZm9ybXMgYW5kIG1hY3JvcyBmb3IgcmFzdGVyIHNhbXBsZXJzXG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VTaGFkZXJCbG9jaygncmFzdGVyJywgc2hhZGVyU3JjX3Jhc3RlcnMsICdSYXN0ZXInKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBMb2FkIHJhc3RlciB0aWxlIHRleHR1cmVzIGFuZCBzZXQgdW5pZm9ybXNcbiAgICBidWlsZFJhc3RlclRleHR1cmVzICh0aWxlLCB0aWxlX2RhdGEpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Jhc3RlcnMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aWxlX2RhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbmZpZ3MgPSB7fTsgLy8gdGV4dHVyZSBjb25maWdzIHRvIHBhc3MgdG8gdGV4dHVyZSBidWlsZGVyLCBrZXllZCBieSB0ZXh0dXJlIG5hbWVcbiAgICAgICAgbGV0IGluZGV4ID0ge307ICAgLy8gaW5kZXggaW50byByYXN0ZXIgc2FtcGxlciBhcnJheSwga2V5ZWQgYnkgdGV4dHVyZSBuYW1lXG5cbiAgICAgICAgLy8gVE9ETzogZGF0YSBzb3VyY2UgY291bGQgcmV0cmlldmUgcmFzdGVyIHRleHR1cmUgVVJMc1xuICAgICAgICB0aWxlLnJhc3RlcnMubWFwKHIgPT4gdGhpcy5zb3VyY2VzW3JdKS5maWx0ZXIoeCA9PiB4KS5mb3JFYWNoKChzb3VyY2UsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBSYXN0ZXJUaWxlU291cmNlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IHNvdXJjZS50aWxlVGV4dHVyZSh0aWxlKTtcbiAgICAgICAgICAgICAgICBjb25maWdzW2NvbmZpZy51cmxdID0gY29uZmlnO1xuICAgICAgICAgICAgICAgIGluZGV4W2NvbmZpZy51cmxdID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbmZpZ3MpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aWxlX2RhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9hZCB0ZXh0dXJlcyBvbiBtYWluIHRocmVhZCBhbmQgcmV0dXJuIHdoZW4gZG9uZVxuICAgICAgICAvLyBXZSB3YW50IHRvIGJsb2NrIHRoZSBidWlsZGluZyBvZiBhIHJhc3RlciB0aWxlIG1lc2ggdW50aWwgaXRzIHRleHR1cmUgaXMgbG9hZGVkLFxuICAgICAgICAvLyB0byBhdm9pZCBmbGlja2VyaW5nIHdoaWxlIGxvYWRpbmcgKHRleHR1cmUgd2lsbCByZW5kZXIgYXMgYmxhY2spXG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy5tYWluX3RocmVhZF90YXJnZXQrJy5sb2FkVGV4dHVyZXMnLCBjb25maWdzKVxuICAgICAgICAgICAgLnRoZW4odGV4dHVyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGV4dHVyZXMgfHwgdGV4dHVyZXMubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB3YXJuaW5nXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aWxlX2RhdGE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2V0IHRleHR1cmUgdW5pZm9ybXMgKHJldHVybmVkIGFmdGVyIGxvYWRpbmcgZnJvbSBtYWluIHRocmVhZClcbiAgICAgICAgICAgICAgICB0aWxlX2RhdGEudW5pZm9ybXMgPSB0aWxlX2RhdGEudW5pZm9ybXMgfHwge307XG4gICAgICAgICAgICAgICAgdGlsZV9kYXRhLnRleHR1cmVzID0gdGlsZV9kYXRhLnRleHR1cmVzIHx8IFtdO1xuXG4gICAgICAgICAgICAgICAgbGV0IHVfc2FtcGxlcnMgPSB0aWxlX2RhdGEudW5pZm9ybXNbJ3VfcmFzdGVycyddID0gW107XG4gICAgICAgICAgICAgICAgbGV0IHVfc2l6ZXMgPSB0aWxlX2RhdGEudW5pZm9ybXNbJ3VfcmFzdGVyX3NpemVzJ10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdV9vZmZzZXRzID0gdGlsZV9kYXRhLnVuaWZvcm1zWyd1X3Jhc3Rlcl9vZmZzZXRzJ10gPSBbXTtcblxuICAgICAgICAgICAgICAgIHRleHR1cmVzLmZvckVhY2goKFt0bmFtZSwgdHdpZHRoLCB0aGVpZ2h0XSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IGluZGV4W3RuYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhc3Rlcl9jb29yZHMgPSBjb25maWdzW3RuYW1lXS5jb29yZHM7IC8vIHRpbGUgY29vcmRzIG9mIHJhc3RlciB0aWxlXG5cbiAgICAgICAgICAgICAgICAgICAgdV9zYW1wbGVyc1tpXSA9IHRuYW1lO1xuICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMucHVzaCh0bmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdV9zaXplc1tpXSA9IFt0d2lkdGgsIHRoZWlnaHRdO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRpbGUgZ2VvbWV0cnkgbWF5IGJlIGF0IGEgaGlnaGVyIHpvb20gdGhhbiB0aGUgcmFzdGVyIHRpbGUgdGV4dHVyZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gYW4gb3Zlcnpvb21lZCByYXN0ZXIgdGlsZSksIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBhZGp1c3QgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJhc3RlciB0ZXh0dXJlIFVWcyB0byBvZmZzZXQgdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXJ0aW5nIHBvaW50IGZvclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGdlb21ldHJ5IHRpbGUuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlLmNvb3Jkcy56ID4gcmFzdGVyX2Nvb3Jkcy56KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZHogPSB0aWxlLmNvb3Jkcy56IC0gcmFzdGVyX2Nvb3Jkcy56OyAvLyAjIG9mIGxldmVscyByYXN0ZXIgc291cmNlIGlzIG92ZXJ6b29tZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkejIgPSBNYXRoLnBvdygyLCBkeik7XG4gICAgICAgICAgICAgICAgICAgICAgICB1X29mZnNldHNbaV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbGUuY29vcmRzLnggJSBkejIpIC8gZHoyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkejIgLSAxIC0gKHRpbGUuY29vcmRzLnkgJSBkejIpKSAvIGR6MiwgLy8gR0wgdGV4dHVyZSBjb29yZHMgYXJlICtZIHVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvIGR6MlxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVfb2Zmc2V0c1tpXSA9IFswLCAwLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkXG4gICAgbG9hZFRleHR1cmVzICh0ZXh0dXJlcykge1xuICAgICAgICAvLyBOQjogb25seSByZXR1cm4gbmFtZSBhbmQgc2l6ZSBvZiB0ZXh0dXJlcyBsb2FkZWQsIGJlY2F1c2Ugd2UgY2FuJ3Qgc2VuZCBhY3R1YWwgdGV4dHVyZSBvYmplY3RzIHRvIHdvcmtlclxuICAgICAgICByZXR1cm4gVGV4dHVyZS5jcmVhdGVGcm9tT2JqZWN0KHRoaXMuZ2wsIHRleHR1cmVzKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChPYmplY3Qua2V5cyh0ZXh0dXJlcykubWFwKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGV4dHVyZS50ZXh0dXJlc1t0XSAmJiBUZXh0dXJlLnRleHR1cmVzW3RdLmxvYWQoKTtcbiAgICAgICAgICAgICAgICB9KS5maWx0ZXIoeCA9PiB4KSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4odGV4dHVyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRleHR1cmVzLmZvckVhY2godCA9PiB0LnJldGFpbigpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dHVyZXMubWFwKHQgPT4gW3QubmFtZSwgdC53aWR0aCwgdC5oZWlnaHRdKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBTZXR1cCBhbnkgR0wgc3RhdGUgZm9yIHJlbmRlcmluZ1xuICAgIHNldHVwICgpIHtcbiAgICAgICAgdGhpcy5zZXRVbmlmb3JtcygpO1xuICAgICAgICB0aGlzLm1hdGVyaWFsLnNldHVwUHJvZ3JhbShTaGFkZXJQcm9ncmFtLmN1cnJlbnQpO1xuICAgIH0sXG5cbiAgICAvLyBTZXQgc3R5bGUgdW5pZm9ybXMgb24gY3VycmVudGx5IGJvdW5kIHByb2dyYW1cbiAgICBzZXRVbmlmb3JtcyAoKSB7XG4gICAgICAgIHZhciBwcm9ncmFtID0gU2hhZGVyUHJvZ3JhbS5jdXJyZW50O1xuICAgICAgICBpZiAoIXByb2dyYW0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybXModGhpcy5zaGFkZXJzICYmIHRoaXMuc2hhZGVycy51bmlmb3JtcywgdHJ1ZSk7IC8vIHJlc2V0IHRleHR1cmUgdW5pdCB0byAwXG4gICAgfSxcblxuICAgIC8vIFJlbmRlciBzdGF0ZSBzZXR0aW5ncyBieSBibGVuZCBtb2RlXG4gICAgcmVuZGVyX3N0YXRlczoge1xuICAgICAgICBvcGFxdWU6IHsgZGVwdGhfdGVzdDogdHJ1ZSwgZGVwdGhfd3JpdGU6IHRydWUgfSxcbiAgICAgICAgYWRkOiB7IGRlcHRoX3Rlc3Q6IHRydWUsIGRlcHRoX3dyaXRlOiBmYWxzZSB9LFxuICAgICAgICBtdWx0aXBseTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogZmFsc2UgfSxcbiAgICAgICAgaW5sYXk6IHsgZGVwdGhfdGVzdDogdHJ1ZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH0sXG4gICAgICAgIG92ZXJsYXk6IHsgZGVwdGhfdGVzdDogZmFsc2UsIGRlcHRoX3dyaXRlOiBmYWxzZSB9XG4gICAgfSxcblxuICAgIC8vIERlZmF1bHQgc29ydCBvcmRlciBmb3IgYmxlbmQgbW9kZXNcbiAgICBkZWZhdWx0X2JsZW5kX29yZGVyczoge1xuICAgICAgICBvcGFxdWU6IDAsXG4gICAgICAgIGFkZDogMSxcbiAgICAgICAgbXVsdGlwbHk6IDIsXG4gICAgICAgIGlubGF5OiAzLFxuICAgICAgICBvdmVybGF5OiA0XG4gICAgfSxcblxuICAgIC8vIENvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHNvcnRpbmcgc3R5bGVzIGJ5IGJsZW5kXG4gICAgYmxlbmRPcmRlclNvcnQgKGEsIGIpIHtcbiAgICAgICAgLy8gb3BhcXVlIGFsd2F5cyBjb21lcyBmaXJzdFxuICAgICAgICBpZiAoYS5ibGVuZCA9PT0gJ29wYXF1ZScgfHwgYi5ibGVuZCA9PT0gJ29wYXF1ZScpIHtcbiAgICAgICAgICAgIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJyAmJiBiLmJsZW5kID09PSAnb3BhcXVlJykgeyAvLyBpZiBib3RoIGFyZSBvcGFxdWVcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxOyAvLyB1c2UgbmFtZSBhcyB0aWUgYnJlYWtlclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYS5ibGVuZCA9PT0gJ29wYXF1ZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7IC8vIG9ubHkgYGFgIHdhcyBvcGFxdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAxOyAvLyBvbmx5IGBiYCB3YXMgb3BhcXVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1c2UgZXhwbGljaXQgYmxlbmQgb3JkZXIgaWYgcG9zc2libGVcbiAgICAgICAgaWYgKGEuYmxlbmRfb3JkZXIgPCBiLmJsZW5kX29yZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYS5ibGVuZF9vcmRlciA+IGIuYmxlbmRfb3JkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgYmxlbmQgb3JkZXJzIGFyZSBlcXVhbCwgdXNlIGRlZmF1bHQgb3JkZXIgYnkgYmxlbmQgbW9kZVxuICAgICAgICBpZiAoU3R5bGUuZGVmYXVsdF9ibGVuZF9vcmRlcnNbYS5ibGVuZF0gPCBTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1tiLmJsZW5kXSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFN0eWxlLmRlZmF1bHRfYmxlbmRfb3JkZXJzW2EuYmxlbmRdID4gU3R5bGUuZGVmYXVsdF9ibGVuZF9vcmRlcnNbYi5ibGVuZF0pIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGEubmFtZSA8IGIubmFtZSA/IC0xIDogMTsgLy8gdXNlIG5hbWUgYXMgdGllIGJyZWFrZXJcbiAgICB9XG5cbn07XG4iLCIvLyBNYW5hZ2UgcmVuZGVyaW5nIHN0eWxlc1xuaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tICcuLi91dGlscy9tZXJnZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5cbmltcG9ydCB7UG9seWdvbnN9IGZyb20gJy4vcG9seWdvbnMvcG9seWdvbnMnO1xuaW1wb3J0IHtMaW5lc30gZnJvbSAnLi9saW5lcy9saW5lcyc7XG5pbXBvcnQge1BvaW50c30gZnJvbSAnLi9wb2ludHMvcG9pbnRzJztcbmltcG9ydCB7VGV4dFN0eWxlfSBmcm9tICcuL3RleHQvdGV4dCc7XG5pbXBvcnQge1Jhc3RlclN0eWxlfSBmcm9tICcuL3Jhc3Rlci9yYXN0ZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX2FjY2Vzc29ycyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvYWNjZXNzb3JzLmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX2xheWVyT3JkZXIgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9nbC9zaGFkZXJzL2xheWVyX29yZGVyLmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3NlbGVjdGlvbkdsb2JhbHMgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9nbC9zaGFkZXJzL3NlbGVjdGlvbl9nbG9iYWxzLmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3NlbGVjdGlvblZlcnRleCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvc2VsZWN0aW9uX3ZlcnRleC5nbHNsJywgJ3V0ZjgnKTtcblxuZXhwb3J0IGNsYXNzIFN0eWxlTWFuYWdlciB7XG5cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuc3R5bGVzID0ge307XG4gICAgICAgIHRoaXMuYmFzZV9zdHlsZXMgPSB7fTtcblxuICAgICAgICAvLyBBZGQgYnVpbHQtaW4gcmVuZGVyaW5nIHN0eWxlc1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoUG9seWdvbnMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihPYmplY3QuY3JlYXRlKExpbmVzKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShQb2ludHMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihPYmplY3QuY3JlYXRlKFRleHRTdHlsZSkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoUmFzdGVyU3R5bGUpKTtcbiAgICB9XG5cbiAgICAvLyBHbG9iYWwgY29uZmlndXJhdGlvbiBmb3IgYWxsIHN0eWxlc1xuICAgIGluaXQgKCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKCdnbG9iYWwnKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZW1vdmVCbG9jaygnc2V0dXAnKTtcblxuICAgICAgICAvLyBNb2RlbCBhbmQgd29ybGQgcG9zaXRpb24gYWNjZXNzb3JzXG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soJ2dsb2JhbCcsIHNoYWRlclNyY19hY2Nlc3NvcnMpO1xuXG4gICAgICAgIC8vIExheWVyIHJlLW9yZGVyaW5nIGZ1bmN0aW9uXG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soJ2dsb2JhbCcsIHNoYWRlclNyY19sYXllck9yZGVyKTtcblxuICAgICAgICAvLyBGZWF0dXJlIHNlbGVjdGlvbiBnbG9iYWxcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX3NlbGVjdGlvbkdsb2JhbHMpO1xuXG4gICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uIHZlcnRleCBzaGFkZXIgc3VwcG9ydFxuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlcGxhY2VCbG9jaygnc2V0dXAnLCBzaGFkZXJTcmNfc2VsZWN0aW9uVmVydGV4KTtcblxuICAgICAgICAvLyBNaW5pbXVtIHZhbHVlIGZvciBmbG9hdCBjb21wYXJpc29uc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXMuVEFOR1JBTV9FUFNJTE9OID0gMC4wMDAwMTtcblxuICAgICAgICAvLyBNaW5pbXVtIGRlcHRoIGJ1ZmZlciB2YWx1ZSBzZXBhcmF0aW5nIGVhY2ggYG9yZGVyYCB1bml0XG4gICAgICAgIC8vIEFzc3VtZSBtaW4gMTYtYml0IGRlcHRoIGJ1ZmZlciwgaW4gcHJhY3RpY2UgdXNlcyAxNC1iaXRzLCAxIGV4dHJhIGJpdCB0byBoYW5kbGUgdmlydHVhbCBoYWxmLWxheWVyc1xuICAgICAgICAvLyBmb3Igb3V0bGluZXMgKGluc2VydGVkIGluIGJldHdlZW4gbGF5ZXJzKSwgYW5vdGhlciBleHRyYSBiaXQgdG8gcHJldmVudCBwcmVjaXNpb24gbG9zc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXMuVEFOR1JBTV9MQVlFUl9ERUxUQSA9IDEgLyAoMSA8PCAxNCk7XG5cbiAgICAgICAgLy8gSW50ZXJuYWwgdGlsZSBzY2FsZVxuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXMuVEFOR1JBTV9USUxFX1NDQUxFID1cbiAgICAgICAgICAgIGB2ZWMzKCR7R2VvLnRpbGVfc2NhbGV9LiwgJHtHZW8udGlsZV9zY2FsZX0uLCB1X21ldGVyc19wZXJfcGl4ZWwgKiAke0dlby50aWxlX3NpemV9LilgO1xuXG4gICAgICAgIC8vIEluY3JlYXNlcyBwcmVjaXNpb24gZm9yIGhlaWdodCB2YWx1ZXNcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzLlRBTkdSQU1fSEVJR0hUX1NDQUxFID0gR2VvLmhlaWdodF9zY2FsZTtcbiAgICB9XG5cbiAgICAvLyBEZXN0cm95IGFsbCBzdHlsZXMgZm9yIGEgZ2l2ZW4gR0wgY29udGV4dFxuICAgIGRlc3Ryb3kgKGdsKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3R5bGVzKS5mb3JFYWNoKChfbmFtZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gdGhpcy5zdHlsZXNbX25hbWVdO1xuICAgICAgICAgICAgaWYgKHN0eWxlLmdsID09PSBnbCkge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU3R5bGVNYW5hZ2VyLmRlc3Ryb3k6IGRlc3Ryb3lpbmcgcmVuZGVyIHN0eWxlICR7c3R5bGUubmFtZX1gKTtcblxuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5iYXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHN0eWxlLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHlsZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVyIGEgc3R5bGVcbiAgICByZWdpc3RlciAoc3R5bGUpIHtcbiAgICAgICAgdGhpcy5zdHlsZXNbc3R5bGUubmFtZV0gPSBzdHlsZTtcbiAgICAgICAgdGhpcy5iYXNlX3N0eWxlc1tzdHlsZS5uYW1lXSA9IHN0eWxlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhIHN0eWxlXG4gICAgcmVtb3ZlIChuYW1lKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0eWxlc1tuYW1lXTtcbiAgICB9XG5cbiAgICBtaXggKHN0eWxlLCBzdHlsZXMpIHtcbiAgICAgICAgLy8gRXhpdCBlYXJseSBpZiB3ZSBoYXZlIGFscmVhZHkgYXBwbGllZCBtaXhpbnMgdG8gdGhpcyBzdHlsZVxuICAgICAgICBpZiAoc3R5bGUubWl4ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZS5taXhlZCA9IHt9O1xuXG4gICAgICAgIC8vIE1peGluIHNvdXJjZXMsIGluIG9yZGVyXG4gICAgICAgIGxldCBzb3VyY2VzID0gW107XG4gICAgICAgIGlmIChzdHlsZS5taXgpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlLm1peCkpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VzLnB1c2goLi4uc3R5bGUubWl4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaChzdHlsZS5taXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc291cmNlcyA9IHNvdXJjZXMubWFwKHggPT4gc3R5bGVzW3hdKS5maWx0ZXIoeCA9PiB4ICYmIHggIT09IHN0eWxlKTsgLy8gVE9ETzogd2FybmluZyBvbiB0cnlpbmcgdG8gbWl4IGludG8gc2VsZlxuXG4gICAgICAgICAgICAvLyBUcmFjayB3aGljaCBzdHlsZXMgd2VyZSBtaXhlZCBpbnRvIHRoaXMgb25lXG4gICAgICAgICAgICBzb3VyY2VzLmZvckVhY2gocyA9PiBzdHlsZS5taXhlZFtzLm5hbWVdID0gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgc291cmNlcy5wdXNoKHN0eWxlKTtcblxuICAgICAgICAvLyBGbGFncyAtIE9SJ2QsIHRydWUgaWYgYW55IHN0eWxlIGhhcyBpdCBzZXRcbiAgICAgICAgc3R5bGUuYW5pbWF0ZWQgPSBzb3VyY2VzLnNvbWUoeCA9PiB4ICYmIHguYW5pbWF0ZWQpO1xuICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBzb3VyY2VzLnNvbWUoeCA9PiB4ICYmIHgudGV4Y29vcmRzKTtcblxuICAgICAgICAvLyBPdmVyd3JpdGVzIC0gbGFzdCBkZWZpbml0aW9uIHdpbnNcbiAgICAgICAgc3R5bGUuYmFzZSA9IHNvdXJjZXMubWFwKHggPT4geC5iYXNlKS5maWx0ZXIoeCA9PiB4KS5wb3AoKTtcbiAgICAgICAgc3R5bGUubGlnaHRpbmcgPSBzb3VyY2VzLm1hcCh4ID0+IHgubGlnaHRpbmcpLmZpbHRlcih4ID0+IHggIT0gbnVsbCkucG9wKCk7XG4gICAgICAgIHN0eWxlLnRleHR1cmUgPSBzb3VyY2VzLm1hcCh4ID0+IHgudGV4dHVyZSkuZmlsdGVyKHggPT4geCkucG9wKCk7XG4gICAgICAgIHN0eWxlLnJhc3RlciA9IHNvdXJjZXMubWFwKHggPT4geC5yYXN0ZXIpLmZpbHRlcih4ID0+IHggIT0gbnVsbCkucG9wKCk7XG4gICAgICAgIHN0eWxlLmRhc2ggPSBzb3VyY2VzLm1hcCh4ID0+IHguZGFzaCkuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUuZGFzaF9iYWNrZ3JvdW5kX2NvbG9yID0gc291cmNlcy5tYXAoeCA9PiB4LmRhc2hfYmFja2dyb3VuZF9jb2xvcikuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgaWYgKHNvdXJjZXMuc29tZSh4ID0+IHguaGFzT3duUHJvcGVydHkoJ2JsZW5kJykgJiYgeC5ibGVuZCkpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgbWl4IGJsZW5kIGlmIGV4cGxpY2l0bHkgc2V0LCBvdGhlcndpc2UgbGV0IGJhc2Ugc3R5bGUgY2hvb3NlIGJsZW5kaW5nIG1vZGVcbiAgICAgICAgICAgIC8vIGhhc093blByb3BlcnR5IGNoZWNrIGdpdmVzIHByZWZlcmVuY2UgdG8gYmFzZSBzdHlsZSBwcm90b3R5cGVcbiAgICAgICAgICAgIHN0eWxlLmJsZW5kID0gc291cmNlcy5tYXAoeCA9PiB4Lmhhc093blByb3BlcnR5KCdibGVuZCcpICYmIHguYmxlbmQpLmZpbHRlcih4ID0+IHgpLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLmJsZW5kX29yZGVyID0gc291cmNlcy5tYXAoeCA9PiB4LmJsZW5kX29yZGVyKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuXG4gICAgICAgIC8vIE1lcmdlcyAtIHByb3BlcnR5LXNwZWNpZmljIHJ1bGVzIGZvciBtZXJnaW5nIHZhbHVlc1xuICAgICAgICBzdHlsZS5kZWZpbmVzID0gT2JqZWN0LmFzc2lnbih7fSwgLi4uc291cmNlcy5tYXAoeCA9PiB4LmRlZmluZXMpLmZpbHRlcih4ID0+IHgpKTsgLy8gaW50ZXJuYWwgZGVmaW5lcyAobm90IHVzZXItZGVmaW5lZClcbiAgICAgICAgc3R5bGUubWF0ZXJpYWwgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zb3VyY2VzLm1hcCh4ID0+IHgubWF0ZXJpYWwpLmZpbHRlcih4ID0+IHgpKTtcblxuICAgICAgICAvLyBNaXggc2hhZGVyIHByb3BlcnRpZXNcbiAgICAgICAgdGhpcy5taXhTaGFkZXJzKHN0eWxlLCBzdHlsZXMsIHNvdXJjZXMpO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgfVxuXG4gICAgLy8gTWl4IHRoZSBwcm9wZXJ0ZXMgaW4gdGhlIFwic2hhZGVyc1wiIGJsb2NrXG4gICAgbWl4U2hhZGVycyAoc3R5bGUsIHN0eWxlcywgc291cmNlcykge1xuICAgICAgICBsZXQgc2hhZGVycyA9IHt9OyAvLyBuZXdseSBtaXhlZCBzaGFkZXJzIHByb3BlcnRpZXNcbiAgICAgICAgbGV0IHNoYWRlcl9tZXJnZXMgPSBzb3VyY2VzLm1hcCh4ID0+IHguc2hhZGVycykuZmlsdGVyKHggPT4geCk7IC8vIGp1c3QgdGhlIHNvdXJjZSBzdHlsZXMgd2l0aCBzaGFkZXIgcHJvcGVydGllc1xuXG4gICAgICAgIC8vIERlZmluZXNcbiAgICAgICAgc2hhZGVycy5kZWZpbmVzID0gT2JqZWN0LmFzc2lnbih7fSwgLi4uc2hhZGVyX21lcmdlcy5tYXAoeCA9PiB4LmRlZmluZXMpLmZpbHRlcih4ID0+IHgpKTtcblxuICAgICAgICAvLyBVbmlmb3Jtc1xuICAgICAgICBzaGFkZXJzLnVuaWZvcm1zID0ge307ICAvLyB1bmlmb3JtcyBmb3IgdGhpcyBzdHlsZSwgYm90aCBleHBsaWNpdGx5IGRlZmluZWQsIGFuZCBtaXhlZCBmcm9tIG90aGVyIHN0eWxlc1xuICAgICAgICBzaGFkZXJzLl91bmlmb3JtcyA9IChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMudW5pZm9ybXMpIHx8IHt9OyAvLyB1bmlmb3JtcyBleHBsaWNpdGx5IGRlZmluZWQgYnkgKnRoaXMqIHN0eWxlXG4gICAgICAgIHNoYWRlcnMuX3VuaWZvcm1fc2NvcGVzID0ge307IC8vIHRyYWNrcyB3aGljaCBzdHlsZSBlYWNoIHVuaWZvcm0gb3JpZ2luYXRlZCBmcm9tICh0aGlzIG9uZSwgb3IgYW5jZXN0b3IpXG5cbiAgICAgICAgLy8gTWl4IGluIHVuaWZvcm1zIGZyb20gYW5jZXN0b3JzLCBwcm92aWRpbmcgbWVhbnMgdG8gYWNjZXNzXG4gICAgICAgIHNvdXJjZXNcbiAgICAgICAgICAgIC5maWx0ZXIoeCA9PiB4LnNoYWRlcnMgJiYgeC5zaGFkZXJzLnVuaWZvcm1zKVxuICAgICAgICAgICAgLmZvckVhY2goeCA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdSBpbiB4LnNoYWRlcnMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhZGVycy5fdW5pZm9ybV9zY29wZXNbdV0gPSB4Lm5hbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRGVmaW5lIGdldHRlciBhbmQgc2V0dGVyIGZvciB0aGlzIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0dGVyIHJldHVybnMgdmFsdWUgZm9yIHRoaXMgc3R5bGUgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGFza3MgYXBwcm9wcmlhdGUgYW5jZXN0b3IgZm9yIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldHRlciBzZXRzIHRoZSB2YWx1ZSBmb3IgdGhpcyBzdHlsZSAod2hldGhlciBwcmV2aW91c2x5IHByZXNlbnQgaW4gdGhpcyBzdHlsZSBvciBub3QpXG4gICAgICAgICAgICAgICAgICAgIC8vIE1pbWljcyBKUyBwcm90b3R5cGUvaGFzT3duUHJvcGVydHkgYmVoYXZpb3IsIGJ1dCB3aXRoIG11bHRpcGxlIGFuY2VzdG9ycyAodmlhIG1peGlucylcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNoYWRlcnMudW5pZm9ybXMsIHUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmlmb3JtIGlzIGV4cGxpY2l0bHkgZGVmaW5lZCBvbiB0aGlzIHN0eWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoYWRlcnMuX3VuaWZvcm1zW3VdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNoYWRlcnMuX3VuaWZvcm1zW3VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmlmb3JtIHdhcyBtaXhlZCBmcm9tIGFub3RoZXIgc3R5bGUsIGZvcndhcmQgcmVxdWVzdCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElkZW50aWZ5IGNoZWNrIGlzIG5lZWRlZCB0byBwcmV2ZW50IGluZmluaXRlIHJlY3Vyc2lvbiBpZiBhIHByZXZpb3VzbHkgZGVmaW5lZCB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc2V0IHRvIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlc1tzaGFkZXJzLl91bmlmb3JtX3Njb3Blc1t1XV0uc2hhZGVycy51bmlmb3JtcyAhPT0gc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzW3NoYWRlcnMuX3VuaWZvcm1fc2NvcGVzW3VdXS5zaGFkZXJzLnVuaWZvcm1zW3VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVycy5fdW5pZm9ybXNbdV0gPSB2O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBFeHRlbnNpb25zOiBidWlsZCBhIGxpc3Qgb2YgdW5pcXVlIGV4dGVuc2lvbnNcbiAgICAgICAgc2hhZGVycy5leHRlbnNpb25zID0gT2JqZWN0LmtleXMoc2hhZGVyX21lcmdlc1xuICAgICAgICAgICAgLm1hcCh4ID0+IHguZXh0ZW5zaW9ucylcbiAgICAgICAgICAgIC5maWx0ZXIoeCA9PiB4KVxuICAgICAgICAgICAgLnJlZHVjZSgocHJldiwgY3VyKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gc2luZ2xlIGV4dGVuc2lvblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VyID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBwcmV2W2N1cl0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBhcnJheSBvZiBleHRlbnNpb25zXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ci5mb3JFYWNoKHggPT4gcHJldlt4XSA9IHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgICAgIH0sIHt9KSB8fCB7fVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNoYWRlciBibG9ja3NcbiAgICAgICAgLy8gTWFyayBhbGwgc2hhZGVyIGJsb2NrcyBmb3IgdGhlIHRhcmdldCBzdHlsZSBhcyBvcmlnaW5hdGluZyB3aXRoIGl0cyBvd24gbmFtZVxuICAgICAgICBpZiAoc3R5bGUuc2hhZGVycyAmJiBzdHlsZS5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgc3R5bGUuc2hhZGVycy5ibG9ja19zY29wZXMgPSBzdHlsZS5zaGFkZXJzLmJsb2NrX3Njb3BlcyB8fCB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGsgaW4gc3R5bGUuc2hhZGVycy5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgYmxvY2sgPSBzdHlsZS5zaGFkZXJzLmJsb2Nrc1trXTtcbiAgICAgICAgICAgICAgICBzdHlsZS5zaGFkZXJzLmJsb2NrX3Njb3Blc1trXSA9IHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdIHx8IFtdO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJsb2NrKSkge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5zaGFkZXJzLmJsb2NrX3Njb3Blc1trXS5wdXNoKC4uLmJsb2NrLm1hcCgoKSA9PiBzdHlsZS5uYW1lKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5zaGFkZXJzLmJsb2NrX3Njb3Blc1trXS5wdXNoKHN0eWxlLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1lcmdlIHNoYWRlciBibG9ja3MsIGtlZXBpbmcgdHJhY2sgb2Ygd2hpY2ggc3R5bGUgZWFjaCBibG9jayBvcmlnaW5hdGVkIGZyb21cbiAgICAgICAgbGV0IG1peGVkID0ge307IC8vIGFsbCBzY29wZXMgbWl4ZWQgc28gZmFyXG4gICAgICAgIHNoYWRlcl9tZXJnZXMuZm9yRWFjaChzb3VyY2UgPT4ge1xuICAgICAgICAgICAgaWYgKCFzb3VyY2UuYmxvY2tzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaGFkZXJzLmJsb2NrcyA9IHNoYWRlcnMuYmxvY2tzIHx8IHt9O1xuICAgICAgICAgICAgc2hhZGVycy5ibG9ja19zY29wZXMgPSBzaGFkZXJzLmJsb2NrX3Njb3BlcyB8fCB7fTtcbiAgICAgICAgICAgIGxldCBtaXhlZF9zb3VyY2UgPSB7fTsgLy8gc2NvcGVzIG1peGVkIGZvciB0aGlzIHNvdXJjZSBzdHlsZVxuXG4gICAgICAgICAgICBmb3IgKGxldCB0IGluIHNvdXJjZS5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgYmxvY2sgPSBzb3VyY2UuYmxvY2tzW3RdO1xuICAgICAgICAgICAgICAgIGxldCBibG9ja19zY29wZSA9IHNvdXJjZS5ibG9ja19zY29wZXNbdF07XG5cbiAgICAgICAgICAgICAgICBzaGFkZXJzLmJsb2Nrc1t0XSA9IHNoYWRlcnMuYmxvY2tzW3RdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tfc2NvcGVzW3RdID0gc2hhZGVycy5ibG9ja19zY29wZXNbdF0gfHwgW107XG5cbiAgICAgICAgICAgICAgICAvLyBzdGFuZGFyZGl6ZSBvbiBhcnJheXMgKGJsb2NrIGNhbiBiZSBzaW5nbGUgb3IgbXVsdGktdmFsdWUpXG4gICAgICAgICAgICAgICAgYmxvY2sgPSBBcnJheS5pc0FycmF5KGJsb2NrKSA/IGJsb2NrIDogW2Jsb2NrXTtcbiAgICAgICAgICAgICAgICBibG9ja19zY29wZSA9IEFycmF5LmlzQXJyYXkoYmxvY2tfc2NvcGUpID8gYmxvY2tfc2NvcGUgOiBbYmxvY2tfc2NvcGVdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYj0wOyBiIDwgYmxvY2subGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBibG9ja3Mgd2UndmUgYWxyZWFkeSBtaXhlZCBpbiBmcm9tIHRoZSBzYW1lIHNjb3BlXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGVhdGluZyBzY29wZSBpbmRpY2F0ZXMgYSBkaWFtb25kIHBhdHRlcm4gd2hlcmUgYSBzdHlsZSBpcyBiZWluZyBtaXhlZCBtdWx0aXBsZSB0aW1lc1xuICAgICAgICAgICAgICAgICAgICBpZiAobWl4ZWRbYmxvY2tfc2NvcGVbYl1dKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtaXhlZF9zb3VyY2VbYmxvY2tfc2NvcGVbYl1dID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLmJsb2Nrc1t0XS5wdXNoKGJsb2NrW2JdKTtcbiAgICAgICAgICAgICAgICAgICAgc2hhZGVycy5ibG9ja19zY29wZXNbdF0ucHVzaChibG9ja19zY29wZVtiXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgc3R5bGVzIG1peGVkIGluIGZyb20gdGhpcyBzb3VyY2UgLSB0aGV5IGNvdWxkIGJlIG11bHRpLWxldmVsIGFuY2VzdG9ycyxcbiAgICAgICAgICAgIC8vIGJleW9uZCB0aGUgZmlyc3QtbGV2ZWwgXCJwYXJlbnRzXCIgZGVmaW5lZCBpbiB0aGlzIHN0eWxlJ3MgYG1peGAgbGlzdFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtaXhlZCwgbWl4ZWRfc291cmNlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZS5taXhlZCwgbWl4ZWQpOyAvLyBhZGQgYWxsIG5ld2x5IG1peGVkIHN0eWxlc1xuXG4gICAgICAgIHN0eWxlLnNoYWRlcnMgPSBzaGFkZXJzOyAvLyBhc3NpZ24gYmFjayB0byBzdHlsZVxuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHN0eWxlXG4gICAgLy8gbmFtZTogbmFtZSBvZiBuZXcgc3R5bGVcbiAgICAvLyBjb25maWc6IHByb3BlcnRpZXMgb2YgbmV3IHN0eWxlXG4gICAgLy8gc3R5bGVzOiB3b3JraW5nIHNldCBvZiBzdHlsZXMgYmVpbmcgYnVpbHQgKHVzZWQgZm9yIG1peGluZyBpbiBleGlzdGluZyBzdHlsZXMpXG4gICAgY3JlYXRlIChuYW1lLCBjb25maWcsIHN0eWxlcyA9IHt9KSB7XG4gICAgICAgIGxldCBzdHlsZSA9IG1lcmdlT2JqZWN0cyh7fSwgY29uZmlnKTsgLy8gZGVlcCBjb3B5XG4gICAgICAgIHN0eWxlLm5hbWUgPSBuYW1lO1xuXG4gICAgICAgIC8vIFN0eWxlIG1peGluc1xuICAgICAgICBzdHlsZSA9IHRoaXMubWl4KHN0eWxlLCBzdHlsZXMpO1xuXG4gICAgICAgIC8vIEhhcyBiYXNlIHN0eWxlP1xuICAgICAgICAvLyBPbmx5IHJlbmRlcmFibGUgKGluc3RhbnRpYXRlZCkgc3R5bGVzIHNob3VsZCBiZSBpbmNsdWRlZCBmb3IgcnVuLXRpbWUgdXNlXG4gICAgICAgIC8vIE90aGVycyBhcmUgaW50ZXJtZWRpYXJ5L2Fic3RyYWN0LCB1c2VkIGR1cmluZyBzdHlsZSBjb21wb3NpdGlvbiBidXQgbm90IGV4ZWN1dGlvblxuICAgICAgICBpZiAoc3R5bGUuYmFzZSAmJiB0aGlzLmJhc2Vfc3R5bGVzW3N0eWxlLmJhc2VdKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlc1tuYW1lXSA9IHN0eWxlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHRoaXMuYmFzZV9zdHlsZXNbc3R5bGUuYmFzZV0pLCBzdHlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS5iYXNlID0gbnVsbDsgLy8gbnVsbCBvdXQgaW52YWxpZCBiYXNlIHN0eWxlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIHRvIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBzdHlsZXNcbiAgICBidWlsZCAoc3R5bGVzKSB7XG4gICAgICAgIC8vIFNvcnQgc3R5bGVzIGJ5IGRlcGVuZGVuY3ksIHRoZW4gYnVpbGQgdGhlbVxuICAgICAgICBsZXQgc3R5bGVfZGVwcyA9IE9iamVjdC5rZXlzKHN0eWxlcykuc29ydChcbiAgICAgICAgICAgIChhLCBiKSA9PiB0aGlzLmluaGVyaXRhbmNlRGVwdGgoYSwgc3R5bGVzKSAtIHRoaXMuaW5oZXJpdGFuY2VEZXB0aChiLCBzdHlsZXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gT25seSBrZWVwIGJ1aWx0LWluIGJhc2Ugc3R5bGVzXG4gICAgICAgIGZvciAobGV0IHNuYW1lIGluIHRoaXMuc3R5bGVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYmFzZV9zdHlsZXNbc25hbWVdKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGVzW3NuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGVzW3NuYW1lXS5yZXNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV29ya2luZyBzZXQgb2Ygc3R5bGVzIGJlaW5nIGJ1aWx0XG4gICAgICAgIGxldCB3cyA9IHt9O1xuICAgICAgICBzdHlsZV9kZXBzLmZvckVhY2goc25hbWUgPT4ge1xuICAgICAgICAgICAgd3Nbc25hbWVdID0gdGhpcy5jcmVhdGUoc25hbWUsIHN0eWxlc1tzbmFtZV0sIHdzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgYWxsIHN0eWxlc1xuICAgIGluaXRTdHlsZXMgKHNjZW5lID0ge30pIHtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBhbGxcbiAgICAgICAgZm9yIChsZXQgc25hbWUgaW4gdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzW3NuYW1lXS5pbml0KHNjZW5lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdpdmVuIGEgc3R5bGUga2V5IGluIGEgc2V0IG9mIHN0eWxlcyB0byBhZGQsIGNvdW50IHRoZSBsZW5ndGggb2YgdGhlIGluaGVyaXRhbmNlIGNoYWluXG4gICAgaW5oZXJpdGFuY2VEZXB0aCAoa2V5LCBzdHlsZXMpIHtcbiAgICAgICAgbGV0IHBhcmVudHMgPSAwO1xuXG4gICAgICAgIHdoaWxlKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHN0eWxlc1trZXldO1xuICAgICAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzY2VuZSBkZWYgZXJyb3IsIHRyeWluZyB0byBleHRlbmQgYSBzdHlsZSB0aGF0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGVwZW5kZW5jeSBjaGFpbiBlbmRzIHdoZW4gdGhpcyBzdHlsZSBpc24ndCBtaXhpbmcgaW4gYW55IG90aGVyc1xuICAgICAgICAgICAgaWYgKCFzdHlsZS5taXgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJhdmVyc2UgbmV4dCBwYXJlbnQgc3R5bGVcbiAgICAgICAgICAgIHBhcmVudHMrKztcblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUubWl4KSkge1xuICAgICAgICAgICAgICAgIC8vIElmIG11bHRpcGxlIG1peGlucywgZmluZCB0aGUgZGVlcGVzdCBvbmVcbiAgICAgICAgICAgICAgICBwYXJlbnRzICs9IE1hdGgubWF4KC4uLnN0eWxlLm1peC5tYXAocyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRyeWluZyB0byBtaXggaW50byBpdHNlbGYhXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluaGVyaXRhbmNlRGVwdGgocywgc3R5bGVzKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUcnlpbmcgdG8gbWl4IGludG8gaXRzZWxmIVxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IHN0eWxlLm1peCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBzaW5nbGUgbWl4aW4sIGNvbnRpbnVlIGxvb3AgdXAgdGhlIHRyZWVcbiAgICAgICAgICAgICAgICBrZXkgPSBzdHlsZS5taXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmVudHM7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5pbXBvcnQgcGFyc2VDU1NDb2xvciBmcm9tICdjc3Njb2xvcnBhcnNlcic7XG5cbmV4cG9ydCB2YXIgU3R5bGVQYXJzZXIgPSB7fTtcblxuLy8gV3JhcHMgc3R5bGUgZnVuY3Rpb25zIGFuZCBwcm92aWRlcyBhIHNjb3BlIG9mIGNvbW1vbmx5IGFjY2Vzc2libGUgZGF0YTpcbi8vIC0gZmVhdHVyZTogdGhlICdwcm9wZXJ0aWVzJyBvZiB0aGUgZmVhdHVyZSwgZS5nLiBhY2Nlc3NlZCBhcyAnZmVhdHVyZS5uYW1lJ1xuLy8gLSBnbG9iYWw6IHVzZXItZGVmaW5lZCBwcm9wZXJ0aWVzIG9uIHRoZSBgZ2xvYmFsYCBvYmplY3QgaW4gdGhlIHNjZW5lIGZpbGVcbi8vIC0gJHpvb206IHRoZSBjdXJyZW50IG1hcCB6b29tIGxldmVsXG4vLyAtICRnZW9tZXRyeTogdGhlIHR5cGUgb2YgZ2VvbWV0cnksICdwb2ludCcsICdsaW5lJywgb3IgJ3BvbHlnb24nXG4vLyAtICRtZXRlcnNfcGVyX3BpeGVsOiBjb252ZXJzaW9uIGZvciBtZXRlcnMvcGl4ZWxzIGF0IGN1cnJlbnQgbWFwIHpvb21cblN0eWxlUGFyc2VyLndyYXBGdW5jdGlvbiA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgdmFyIGYgPSBgXG4gICAgICAgIHZhciBmZWF0dXJlID0gY29udGV4dC5mZWF0dXJlLnByb3BlcnRpZXM7XG4gICAgICAgIHZhciBnbG9iYWwgPSBjb250ZXh0Lmdsb2JhbDtcbiAgICAgICAgdmFyICR6b29tID0gY29udGV4dC56b29tO1xuICAgICAgICB2YXIgJGxheWVyID0gY29udGV4dC5sYXllcjtcbiAgICAgICAgdmFyICRnZW9tZXRyeSA9IGNvbnRleHQuZ2VvbWV0cnk7XG4gICAgICAgIHZhciAkbWV0ZXJzX3Blcl9waXhlbCA9IGNvbnRleHQubWV0ZXJzX3Blcl9waXhlbDtcblxuICAgICAgICB2YXIgdmFsID0gKGZ1bmN0aW9uKCl7ICR7ZnVuY30gfSgpKTtcblxuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsKSkge1xuICAgICAgICAgICAgdmFsID0gbnVsbDsgLy8gY29udmVydCBOYU5zIHRvIG51bGxzXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIGA7XG4gICAgcmV0dXJuIGY7XG59O1xuXG5cbi8vIFN0eWxlIHBhcnNpbmdcblxuU3R5bGVQYXJzZXIuemVyb1BhaXIgPSBPYmplY3QuZnJlZXplKFswLCAwXSk7IC8vIHNpbmdsZSBhbGxvY2F0aW9uIGZvciB6ZXJvIHZhbHVlcyB0aGF0IHdvbid0IGJlIG1vZGlmaWVkXG5cbi8vIFN0eWxlIGRlZmF1bHRzXG5TdHlsZVBhcnNlci5kZWZhdWx0cyA9IHtcbiAgICBjb2xvcjogWzEsIDEsIDEsIDFdLFxuICAgIHdpZHRoOiAxLFxuICAgIHNpemU6IDEsXG4gICAgZXh0cnVkZTogZmFsc2UsXG4gICAgaGVpZ2h0OiAyMCxcbiAgICBtaW5faGVpZ2h0OiAwLFxuICAgIG9yZGVyOiAwLFxuICAgIHo6IDAsXG4gICAgbWF0ZXJpYWw6IHtcbiAgICAgICAgYW1iaWVudDogMSxcbiAgICAgICAgZGlmZnVzZTogMVxuICAgIH1cbn07XG5cbi8vIFN0eWxlIG1hY3Jvc1xuU3R5bGVQYXJzZXIubWFjcm9zID0ge1xuICAgIC8vIHBzZXVkby1yYW5kb20gY29sb3IgYnkgZ2VvbWV0cnkgaWRcbiAgICAnU3R5bGUuY29sb3IucHNldWRvUmFuZG9tQ29sb3InOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIDAuNyAqIChwYXJzZUludChmZWF0dXJlLmlkLCAxNikgLyAxMDAgJSAxKSwgICAgIC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgMC43ICogKHBhcnNlSW50KGZlYXR1cmUuaWQsIDE2KSAvIDEwMDAwICUgMSksICAgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICAwLjcgKiAocGFyc2VJbnQoZmVhdHVyZS5pZCwgMTYpIC8gMTAwMDAwMCAlIDEpLCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIDFcbiAgICAgICAgXTtcbiAgICB9LFxuXG4gICAgLy8gcmFuZG9tIGNvbG9yXG4gICAgJ1N0eWxlLmNvbG9yLnJhbmRvbUNvbG9yJzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBbMC43ICogTWF0aC5yYW5kb20oKSwgMC43ICogTWF0aC5yYW5kb20oKSwgMC43ICogTWF0aC5yYW5kb20oKSwgMV07XG4gICAgfVxufTtcblxuLy8gQSBjb250ZXh0IG9iamVjdCB0aGF0IGlzIHBhc3NlZCB0byBzdHlsZSBwYXJzaW5nIGZ1bmN0aW9ucyB0byBwcm92aWRlIGEgc2NvcGUgb2YgY29tbW9ubHkgdXNlZCB2YWx1ZXNcblN0eWxlUGFyc2VyLmdldEZlYXR1cmVQYXJzZUNvbnRleHQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgdGlsZSwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmVhdHVyZSxcbiAgICAgICAgdGlsZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICB6b29tOiB0aWxlLnN0eWxlX3pvb20sXG4gICAgICAgIGdlb21ldHJ5OiBHZW8uZ2VvbWV0cnlUeXBlKGZlYXR1cmUuZ2VvbWV0cnkudHlwZSksXG4gICAgICAgIG1ldGVyc19wZXJfcGl4ZWw6IHRpbGUubWV0ZXJzX3Blcl9waXhlbCxcbiAgICAgICAgbWV0ZXJzX3Blcl9waXhlbF9zcTogdGlsZS5tZXRlcnNfcGVyX3BpeGVsX3NxLFxuICAgICAgICB1bml0c19wZXJfbWV0ZXJfb3Zlcnpvb206IHRpbGUudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tXG4gICAgfTtcbn07XG5cbi8vIEJ1aWxkIGEgc3R5bGUgcGFyYW0gY2FjaGUgb2JqZWN0XG4vLyBgdmFsdWVgIGlzIHJhdyB2YWx1ZSwgY2FjaGUgbWV0aG9kcyB3aWxsIGFkZCBvdGhlciBwcm9wZXJ0aWVzIGFzIG5lZWRlZFxuLy8gYHRyYW5zZm9ybWAgaXMgb3B0aW9uYWwgdHJhbnNmb3JtIGZ1bmN0aW9uIHRvIHJ1biBvbiB2YWx1ZXMgKGV4Y2VwdCBmdW5jdGlvbiB2YWx1ZXMpXG5TdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlID0gZnVuY3Rpb24gKG9iaiwgdHJhbnNmb3JtID0gbnVsbCkge1xuICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG9iai52YWx1ZSkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogb2JqLnZhbHVlLCB6b29tOiAob2JqLnpvb20gPyB7fSA6IG51bGwpIH07IC8vIGNsb25lIGV4aXN0aW5nIGNhY2hlIG9iamVjdFxuICAgIH1cblxuICAgIGxldCBjID0geyB2YWx1ZTogb2JqIH07XG5cbiAgICAvLyBkb2VzIHZhbHVlIGNvbnRhaW4gem9vbSBzdG9wcyB0byBiZSBpbnRlcnBvbGF0ZWQ/XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYy52YWx1ZSkgJiYgQXJyYXkuaXNBcnJheShjLnZhbHVlWzBdKSkge1xuICAgICAgICBjLnpvb20gPSB7fTsgLy8gd2lsbCBob2xkIHZhbHVlcyBpbnRlcnBvbGF0ZWQgYnkgem9vbVxuICAgIH1cblxuICAgIC8vIGFwcGx5IG9wdGlvbmFsIHRyYW5zZm9ybSBmdW5jdGlvblxuICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChjLnpvb20pIHsgLy8gYXBwbHkgdG8gZWFjaCB6b29tIHN0b3AgdmFsdWVcbiAgICAgICAgICAgIGMudmFsdWUgPSBjLnZhbHVlLm1hcCh2ID0+IFt2WzBdLCB0cmFuc2Zvcm0odlsxXSldKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgYy52YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgeyAvLyBkb24ndCB0cmFuc2Zvcm0gZnVuY3Rpb25zXG4gICAgICAgICAgICBjLnZhbHVlID0gdHJhbnNmb3JtKGMudmFsdWUpOyAvLyBzaW5nbGUgdmFsdWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjO1xufTtcblxuLy8gQ29udmVydCBvbGQtc3R5bGUgY29sb3IgbWFjcm8gaW50byBhIGZ1bmN0aW9uXG4vLyBUT0RPOiBkZXByZWNhdGUgdGhpcyBtYWNybyBzeW50YXhcblN0eWxlUGFyc2VyLmNyZWF0ZUNvbG9yUHJvcGVydHlDYWNoZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShvYmosIHYgPT4ge1xuICAgICAgICBpZiAodiA9PT0gJ1N0eWxlLmNvbG9yLnBzZXVkb1JhbmRvbUNvbG9yJykge1xuICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnN0cmluZ1RvRnVuY3Rpb24oU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uKFN0eWxlUGFyc2VyLm1hY3Jvc1snU3R5bGUuY29sb3IucHNldWRvUmFuZG9tQ29sb3InXSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHYgPT09ICdTdHlsZS5jb2xvci5yYW5kb21Db2xvcicpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5tYWNyb3NbJ1N0eWxlLmNvbG9yLnJhbmRvbUNvbG9yJ107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdjtcbiAgICB9KTtcbn07XG5cbi8vIEludGVycG9sYXRpb24gYW5kIGNhY2hpbmcgZm9yIGEgZ2VuZXJpYyBwcm9wZXJ0eSAobm90IGEgY29sb3Igb3IgZGlzdGFuY2UpXG4vLyB7IHZhbHVlOiBvcmlnaW5hbCwgc3RhdGljOiB2YWwsIHpvb206IHsgMTogdmFsMSwgMjogdmFsMiwgLi4uIH0sIGR5bmFtaWM6IGZ1bmN0aW9uKCl7Li4ufSB9XG5TdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkgPSBmdW5jdGlvbih2YWwsIGNvbnRleHQpIHtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWwuZHluYW1pYykgeyAvLyBmdW5jdGlvbiwgY29tcHV0ZSBlYWNoIHRpbWUgKG5vIGNhY2hpbmcpXG4gICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgIHJldHVybiB2O1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWwuc3RhdGljKSB7IC8vIHNpbmdsZSBzdGF0aWMgdmFsdWVcbiAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHsgLy8gaW50ZXJwb2xhdGVkLCBjYWNoZWRcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2UgeyAvLyBub3QgeWV0IGV2YXVsYXRlZCBmb3IgY2FjaGVcbiAgICAgICAgLy8gRHluYW1pYyBmdW5jdGlvbi1iYXNlZFxuICAgICAgICBpZiAodHlwZW9mIHZhbC52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFsLmR5bmFtaWMgPSB2YWwudmFsdWU7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbC5keW5hbWljKGNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2Ygem9vbS1pbnRlcnBvbGF0ZWQgc3RvcHMsIGUuZy4gW3pvb20sIHZhbHVlXSBwYWlyc1xuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbC52YWx1ZSkgJiYgQXJyYXkuaXNBcnJheSh2YWwudmFsdWVbMF0pKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdmFsdWUgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgdmFsLnpvb20gPSB2YWwuem9vbSB8fCB7fTtcbiAgICAgICAgICAgIHZhbC56b29tID0ge307XG4gICAgICAgICAgICB2YWwuem9vbVtjb250ZXh0Lnpvb21dID0gVXRpbHMuaW50ZXJwb2xhdGUoY29udGV4dC56b29tLCB2YWwudmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2luZ2xlIHN0YXRpYyB2YWx1ZVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhbC5zdGF0aWMgPSB2YWwudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnN0YXRpYztcbiAgICAgICAgfVxuICAgIH1cbn07XG5cblN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyA9IGZ1bmN0aW9uKHZhbCwgY29udGV4dCkge1xuICAgIC8vIHByZS1wYXJzZWQgdW5pdHNcbiAgICBpZiAodmFsLnZhbCAhPSBudWxsKSB7XG4gICAgICAgIGlmICh2YWwudW5pdHMgPT09ICdweCcpIHsgLy8gY29udmVydCBmcm9tIHBpeGVsc1xuICAgICAgICAgICAgcmV0dXJuIHZhbC52YWwgKiBHZW8ubWV0ZXJzUGVyUGl4ZWwoY29udGV4dC56b29tKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsLnZhbDtcbiAgICB9XG4gICAgLy8gdW4tcGFyc2VkIHVuaXQgc3RyaW5nXG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIHVuaXRzID0gdmFsLm1hdGNoKC8oWzAtOS4tXSspKFthLXpdKykvKTtcbiAgICAgICAgaWYgKHVuaXRzICYmIHVuaXRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgdmFsID0gcGFyc2VGbG9hdCh1bml0c1sxXSk7XG4gICAgICAgICAgICB1bml0cyA9IHVuaXRzWzJdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVuaXRzID09PSAncHgnKSB7IC8vIGNvbnZlcnQgZnJvbSBwaXhlbHNcbiAgICAgICAgICAgIHZhbCAqPSBHZW8ubWV0ZXJzUGVyUGl4ZWwoY29udGV4dC56b29tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBtdWx0aXBsZSB2YWx1ZXMgb3Igc3RvcHNcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgLy8gQXJyYXkgb2YgYXJyYXlzLCBlLmcuIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbFswXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwubWFwKHYgPT4gW3ZbMF0sIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2WzFdLCBjb250ZXh0KV0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5IG9mIHZhbHVlc1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwubWFwKHYgPT4gU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHYsIGNvbnRleHQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufTtcblxuLy8gUHJlLXBhcnNlIHVuaXRzIGZyb20gc3RyaW5nIHZhbHVlc1xuU3R5bGVQYXJzZXIucGFyc2VVbml0cyA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YXIgb2JqID0geyB2YWw6IHBhcnNlRmxvYXQodmFsKSB9O1xuICAgIGlmIChvYmoudmFsICE9PSAwICYmIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIHZhbC50cmltKCkuc2xpY2UoLTIpID09PSAncHgnKSB7XG4gICAgICAgIG9iai51bml0cyA9ICdweCc7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59O1xuXG4vLyBUYWtlcyBhIGRpc3RhbmNlIGNhY2hlIG9iamVjdCBhbmQgcmV0dXJucyBhIGRpc3RhbmNlIHZhbHVlIGZvciB0aGlzIHpvb21cbi8vIChjYWNoaW5nIHRoZSByZXN1bHQgZm9yIGZ1dHVyZSB1c2UpXG4vLyB7IHZhbHVlOiBvcmlnaW5hbCwgem9vbTogeyB6OiBtZXRlcnMgfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5ID0gZnVuY3Rpb24odmFsLCBjb250ZXh0KSB7XG4gICAgaWYgKHZhbC5keW5hbWljKSB7XG4gICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgIHJldHVybiB2O1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWwuem9vbSAmJiB2YWwuem9vbVtjb250ZXh0Lnpvb21dKSB7XG4gICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gRHluYW1pYyBmdW5jdGlvbi1iYXNlZFxuICAgICAgICBpZiAodHlwZW9mIHZhbC52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFsLmR5bmFtaWMgPSB2YWwudmFsdWU7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbC5keW5hbWljKGNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2Ygem9vbS1pbnRlcnBvbGF0ZWQgc3RvcHMsIGUuZy4gW3pvb20sIHZhbHVlXSBwYWlyc1xuICAgICAgICBlbHNlIGlmICh2YWwuem9vbSkge1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHZhbHVlIGZvciBjdXJyZW50IHpvb21cbiAgICAgICAgICAgIC8vIERvIGZpbmFsIHVuaXQgY29udmVyc2lvbiBhcyBsYXRlIGFzIHBvc3NpYmxlLCB3aGVuIGludGVycG9sYXRpb24gdmFsdWVzIGhhdmUgYmVlbiBkZXRlcm1pbmVkXG4gICAgICAgICAgICB2YWwuem9vbVtjb250ZXh0Lnpvb21dID0gVXRpbHMuaW50ZXJwb2xhdGUoY29udGV4dC56b29tLCB2YWwudmFsdWUsXG4gICAgICAgICAgICAgICAgdiA9PiBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModiwgY29udGV4dCkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModmFsLnZhbHVlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8vIENhY2hlIHByZXZpb3VzbHkgcGFyc2VkIGNvbG9yIHN0cmluZ3NcblN0eWxlUGFyc2VyLnN0cmluZ19jb2xvcnMgPSB7fTtcblN0eWxlUGFyc2VyLmNvbG9yRm9yU3RyaW5nID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgLy8gQ2FjaGVkXG4gICAgaWYgKFN0eWxlUGFyc2VyLnN0cmluZ19jb2xvcnNbc3RyaW5nXSkge1xuICAgICAgICByZXR1cm4gU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9yc1tzdHJpbmddO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgY2FjaGVcbiAgICBsZXQgY29sb3IgPSBwYXJzZUNTU0NvbG9yLnBhcnNlQ1NTQ29sb3Ioc3RyaW5nKTtcbiAgICBpZiAoY29sb3IgJiYgY29sb3IubGVuZ3RoID09PSA0KSB7XG4gICAgICAgIGNvbG9yWzBdIC89IDI1NTtcbiAgICAgICAgY29sb3JbMV0gLz0gMjU1O1xuICAgICAgICBjb2xvclsyXSAvPSAyNTU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb2xvciA9IFN0eWxlUGFyc2VyLmRlZmF1bHRzLmNvbG9yO1xuICAgIH1cbiAgICBTdHlsZVBhcnNlci5zdHJpbmdfY29sb3JzW3N0cmluZ10gPSBjb2xvcjtcbiAgICByZXR1cm4gY29sb3I7XG59O1xuXG4vLyBUYWtlcyBhIGNvbG9yIGNhY2hlIG9iamVjdCBhbmQgcmV0dXJucyBhIGNvbG9yIHZhbHVlIGZvciB0aGlzIHpvb21cbi8vIChjYWNoaW5nIHRoZSByZXN1bHQgZm9yIGZ1dHVyZSB1c2UpXG4vLyB7IHZhbHVlOiBvcmlnaW5hbCwgc3RhdGljOiBbcixnLGIsYV0sIHpvb206IHsgejogW3IsZyxiLGFdIH0sIGR5bmFtaWM6IGZ1bmN0aW9uKCl7Li4ufSB9XG5TdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eSA9IGZ1bmN0aW9uKHZhbCwgY29udGV4dCA9IHt9KSB7XG4gICAgaWYgKHZhbC5keW5hbWljKSB7XG4gICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdiA9IFN0eWxlUGFyc2VyLmNvbG9yRm9yU3RyaW5nKHYpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHYgJiYgdlszXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2WzNdID0gMTsgLy8gZGVmYXVsdCBhbHBoYVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2O1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWwuc3RhdGljKSB7XG4gICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWwuem9vbSAmJiB2YWwuem9vbVtjb250ZXh0Lnpvb21dKSB7XG4gICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gRHluYW1pYyBmdW5jdGlvbi1iYXNlZCBjb2xvclxuICAgICAgICBpZiAodHlwZW9mIHZhbC52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFsLmR5bmFtaWMgPSB2YWwudmFsdWU7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbC5keW5hbWljKGNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdiA9IFN0eWxlUGFyc2VyLmNvbG9yRm9yU3RyaW5nKHYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodiAmJiB2WzNdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2WzNdID0gMTsgLy8gZGVmYXVsdCBhbHBoYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2luZ2xlIHN0cmluZyBjb2xvclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsLnN0YXRpYyA9IFN0eWxlUGFyc2VyLmNvbG9yRm9yU3RyaW5nKHZhbC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnN0YXRpYztcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgY29sb3JdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKHZhbC56b29tKSB7XG4gICAgICAgICAgICAvLyBQYXJzZSBhbnkgc3RyaW5nIGNvbG9ycyBpbnNpZGUgc3RvcHMsIHRoZSBmaXJzdCB0aW1lIHdlIGVuY291bnRlciB0aGlzIHByb3BlcnR5XG4gICAgICAgICAgICBpZiAoIXZhbC56b29tX3ByZXByb2Nlc3NlZCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IHZhbC52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdiA9IHZhbC52YWx1ZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHZbMV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2WzFdID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodlsxXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsLnpvb21fcHJlcHJvY2Vzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGNvbG9yIGZvciBjdXJyZW50IHpvb21cbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSk7XG4gICAgICAgICAgICB2YWwuem9vbVtjb250ZXh0Lnpvb21dWzNdID0gdmFsLnpvb21bY29udGV4dC56b29tXVszXSB8fCAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgYXJyYXkgY29sb3JcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWwuc3RhdGljID0gdmFsLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbC5zdGF0aWMgJiYgdmFsLnN0YXRpY1szXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFsLnN0YXRpY1szXSA9IDE7IC8vIGRlZmF1bHQgYWxwaGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuU3R5bGVQYXJzZXIucGFyc2VDb2xvciA9IGZ1bmN0aW9uKHZhbCwgY29udGV4dCA9IHt9KSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsID0gdmFsKGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIENTUy1zdHlsZSBjb2xvcnNcbiAgICAvLyBUT0RPOiBjaGFuZ2UgYWxsIGNvbG9ycyB0byB1c2UgMC0yNTUgcmFuZ2UgaW50ZXJuYWxseSB0byBhdm9pZCBkaXZpZGluZyBhbmQgdGhlbiByZS1tdWx0aXBseWluZyBpbiBnZW9tIGJ1aWxkZXJcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodmFsKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpICYmIEFycmF5LmlzQXJyYXkodmFsWzBdKSkge1xuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgY29sb3JdIHBhaXJzXG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHYgPSB2YWxbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZbMV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdlsxXSA9IFN0eWxlUGFyc2VyLmNvbG9yRm9yU3RyaW5nKHZbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQuem9vbSkge1xuICAgICAgICAgICAgdmFsID0gVXRpbHMuaW50ZXJwb2xhdGUoY29udGV4dC56b29tLCB2YWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdHNcbiAgICBpZiAodmFsKSB7XG4gICAgICAgIC8vIGFscGhhXG4gICAgICAgIGlmICh2YWxbM10gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsWzNdID0gMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFsID0gWzAsIDAsIDAsIDFdO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG59O1xuXG5TdHlsZVBhcnNlci5jYWxjdWxhdGVPcmRlciA9IGZ1bmN0aW9uKG9yZGVyLCBjb250ZXh0KSB7XG4gICAgLy8gQ29tcHV0ZWQgb3JkZXJcbiAgICBpZiAodHlwZW9mIG9yZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9yZGVyID0gb3JkZXIoY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBvcmRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gT3JkZXIgdGllZCB0byBmZWF0dXJlIHByb3BlcnR5XG4gICAgICAgIGlmIChjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1tvcmRlcl0pIHtcbiAgICAgICAgICAgIG9yZGVyID0gY29udGV4dC5mZWF0dXJlLnByb3BlcnRpZXNbb3JkZXJdO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4cGxpY2l0IG9yZGVyIHZhbHVlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3JkZXIgPSBwYXJzZUZsb2F0KG9yZGVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvcmRlcjtcbn07XG5cbi8vIEV2YWx1YXRlIGEgZnVuY3Rpb24tYmFzZWQgcHJvcGVydHksIG9yIHBhc3MtdGhyb3VnaCBzdGF0aWMgdmFsdWVcblN0eWxlUGFyc2VyLmV2YWxQcm9wZXJ0eSA9IGZ1bmN0aW9uKHByb3AsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIHByb3AgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHByb3AoY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBwcm9wO1xufTtcbiIsImltcG9ydCBVdGlscyBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi8uLi9nbC90ZXh0dXJlJztcbmltcG9ydCBGb250TWFuYWdlciBmcm9tICcuL2ZvbnRfbWFuYWdlcic7XG5pbXBvcnQgZGVidWdTZXR0aW5ncyBmcm9tICcuLi8uLi91dGlscy9kZWJ1Z19zZXR0aW5ncyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbnZhc1RleHQge1xuXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndHJhbnNwYXJlbnQnOyAvLyByZW5kZXIgdGV4dCBvbiB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kXG4gICAgICAgIHRoaXMuY29udGV4dCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIHRoaXMudmVydGljYWxfdGV4dF9idWZmZXIgPSA4OyAvLyB2ZXJ0aWNhbCBwaXhlbCBwYWRkaW5nIGFyb3VuZCB0ZXh0XG4gICAgICAgIHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlciA9IDQ7IC8vIHRleHQgc3R5bGluZyBzdWNoIGFzIGl0YWxpYyBlbXBoYXNpcyBpcyBub3QgbWVhc3VyZWQgYnkgdGhlIENhbnZhcyBBUEksIHNvIHBhZGRpbmcgaXMgbmVjZXNzYXJ5XG4gICAgfVxuXG4gICAgcmVzaXplICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy5jb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZm9udCBzdHlsZSBwYXJhbXMgZm9yIGNhbnZhcyBkcmF3aW5nXG4gICAgc2V0Rm9udCAoeyBmb250X2NzcywgZmlsbCwgc3Ryb2tlLCBzdHJva2Vfd2lkdGgsIHB4X3NpemUgfSkge1xuICAgICAgICB0aGlzLnB4X3NpemUgPSBweF9zaXplO1xuICAgICAgICBsZXQgY3R4ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuXG4gICAgICAgIGlmIChzdHJva2UgJiYgc3Ryb2tlX3dpZHRoID4gMCkge1xuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gc3Ryb2tlO1xuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHN0cm9rZV93aWR0aCAqIGRwcjtcbiAgICAgICAgfVxuICAgICAgICBjdHguZmlsbFN0eWxlID0gZmlsbDtcblxuICAgICAgICBjdHguZm9udCA9IGZvbnRfY3NzO1xuICAgICAgICBjdHgubWl0ZXJMaW1pdCA9IDI7XG4gICAgfVxuXG4gICAgdGV4dFNpemVzICh0ZXh0cykge1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICByZXR1cm4gRm9udE1hbmFnZXIubG9hZEZvbnRzKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV0gPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdIHx8IHt9O1xuXG4gICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mb3MgPSB0ZXh0c1tzdHlsZV07XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgc3BhY2Vfd2lkdGg7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRfaW5mb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRfaW5mb3NbdGV4dF07XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzID0gdGV4dF9pbmZvLnRleHRfc2V0dGluZ3M7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEZvbnQodGV4dF9zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZV93aWR0aCA9IHRoaXMuY29udGV4dC5tZWFzdXJlVGV4dCgnICcpLndpZHRoIC8gZHByO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zcGFjZV93aWR0aCA9IHNwYWNlX3dpZHRoO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWdtZW50cyA9IHNwbGl0TGFiZWxUZXh0KHRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uc2VnbWVudHMgPSBzZWdtZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWdtZW50ID0gc2VnbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3NlZ21lbnRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bc2VnbWVudF0gPSB0aGlzLnRleHRTaXplKHNlZ21lbnQsIHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLm1pc3NlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC5jYWNoZV9zdGF0cy5oaXRzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplLnB1c2goQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVtzZWdtZW50XS5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0gPSB0aGlzLnRleHRTaXplKHRleHQsIHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMubWlzc2VzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLmhpdHMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc2VuZCB0ZXh0IHNpemVzIGJhY2sgdG8gd29ya2VyIChrZWVwIGNvbXB1dGVkIHRleHQgbGluZSBpbmZvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBtYWluIHRocmVhZCwgZm9yIGZ1dHVyZSByZW5kZXJpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uc2l6ZSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0uc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRleHRzO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlcyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRleHQgYmFzZWQgb24gY3VycmVudCBmb250IHN0eWxlXG4gICAgLy8gSW5jbHVkZXMgd29yZCB3cmFwcGluZywgcmV0dXJucyBzaXplIGluZm8gZm9yIHdob2xlIHRleHQgYmxvY2sgYW5kIGluZGl2aWR1YWwgbGluZXNcbiAgICB0ZXh0U2l6ZSAodGV4dCwge3RyYW5zZm9ybSwgdGV4dF93cmFwLCBtYXhfbGluZXMsIHN0cm9rZV93aWR0aCA9IDB9KSB7XG4gICAgICAgIGxldCBkcHIgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIGxldCBzdHIgPSB0aGlzLmFwcGx5VGV4dFRyYW5zZm9ybSh0ZXh0LCB0cmFuc2Zvcm0pO1xuICAgICAgICBsZXQgY3R4ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgdmVydGljYWxfYnVmZmVyID0gdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciAqIGRwcjtcbiAgICAgICAgbGV0IGhvcml6b250YWxfYnVmZmVyID0gZHByICogKHN0cm9rZV93aWR0aCArIHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlcik7XG4gICAgICAgIGxldCBsZWFkaW5nID0gMiAqIGRwcjsgLy8gbWFrZSBjb25maWd1cmFibGUgYW5kL29yIHVzZSBDYW52YXMgVGV4dE1ldHJpY3Mgd2hlbiBhdmFpbGFibGVcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gdGhpcy5weF9zaXplICsgbGVhZGluZzsgLy8gcHhfc2l6ZSBhbHJlYWR5IGluIGRldmljZSBwaXhlbHNcblxuICAgICAgICAvLyBQYXJzZSBzdHJpbmcgaW50byBzZXJpZXMgb2YgbGluZXMgaWYgaXQgZXhjZWVkcyB0aGUgdGV4dCB3cmFwcGluZyB2YWx1ZSBvciBjb250YWlucyBsaW5lIGJyZWFrc1xuICAgICAgICBsZXQgbXVsdGlsaW5lID0gTXVsdGlMaW5lLnBhcnNlKHN0ciwgdGV4dF93cmFwLCBtYXhfbGluZXMsIGxpbmVfaGVpZ2h0LCBjdHgpO1xuXG4gICAgICAgIC8vIEZpbmFsIGRpbWVuc2lvbnMgb2YgdGV4dFxuICAgICAgICBsZXQgaGVpZ2h0ID0gbXVsdGlsaW5lLmhlaWdodDtcbiAgICAgICAgbGV0IHdpZHRoID0gbXVsdGlsaW5lLndpZHRoO1xuICAgICAgICBsZXQgbGluZXMgPSBtdWx0aWxpbmUubGluZXM7XG5cbiAgICAgICAgbGV0IGNvbGxpc2lvbl9zaXplID0gW1xuICAgICAgICAgICAgd2lkdGggLyBkcHIsXG4gICAgICAgICAgICBoZWlnaHQgLyBkcHJcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gW1xuICAgICAgICAgICAgd2lkdGggKyAyICogaG9yaXpvbnRhbF9idWZmZXIsXG4gICAgICAgICAgICBoZWlnaHQgKyAyICogdmVydGljYWxfYnVmZmVyXG4gICAgICAgIF07XG5cbiAgICAgICAgbGV0IGxvZ2ljYWxfc2l6ZSA9IFtcbiAgICAgICAgICAgIHRleHR1cmVfc2l6ZVswXSAvIGRwcixcbiAgICAgICAgICAgIHRleHR1cmVfc2l6ZVsxXSAvIGRwcixcbiAgICAgICAgXTtcblxuICAgICAgICAvLyBSZXR1cm5zIGxpbmVzICh3L3Blci1saW5lIGluZm8gZm9yIGRyYXdpbmcpIGFuZCB0ZXh0J3Mgb3ZlcmFsbCBib3VuZGluZyBib3ggKyBjYW52YXMgc2l6ZVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGluZXMsXG4gICAgICAgICAgICBzaXplOiB7IGNvbGxpc2lvbl9zaXplLCB0ZXh0dXJlX3NpemUsIGxvZ2ljYWxfc2l6ZSwgbGluZV9oZWlnaHQgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIERyYXcgbXVsdGlwbGUgbGluZXMgb2YgdGV4dFxuICAgIGRyYXdUZXh0TXVsdGlMaW5lIChsaW5lcywgW3gsIHldLCBzaXplLCB7IHN0cm9rZSwgc3Ryb2tlX3dpZHRoID0gMCwgdHJhbnNmb3JtLCBhbGlnbiB9KSB7XG4gICAgICAgIGxldCBsaW5lX2hlaWdodCA9IHNpemUubGluZV9oZWlnaHQ7XG4gICAgICAgIGxldCBoZWlnaHQgPSB5O1xuICAgICAgICBmb3IgKGxldCBsaW5lX251bT0wOyBsaW5lX251bSA8IGxpbmVzLmxlbmd0aDsgbGluZV9udW0rKykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tsaW5lX251bV07XG4gICAgICAgICAgICB0aGlzLmRyYXdUZXh0TGluZShsaW5lLCBbeCwgaGVpZ2h0XSwgc2l6ZSwgeyBzdHJva2UsIHN0cm9rZV93aWR0aCwgdHJhbnNmb3JtLCBhbGlnbiB9KTtcbiAgICAgICAgICAgIGhlaWdodCArPSBsaW5lX2hlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERyYXcgYm91bmRpbmcgYm94ZXMgZm9yIGRlYnVnZ2luZ1xuICAgICAgICBpZiAoZGVidWdTZXR0aW5ncy5kcmF3X2xhYmVsX2NvbGxpc2lvbl9ib3hlcykge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnNhdmUoKTtcblxuICAgICAgICAgICAgbGV0IGRwciA9IFV0aWxzLmRldmljZV9waXhlbF9yYXRpbztcbiAgICAgICAgICAgIGxldCBob3Jpem9udGFsX2J1ZmZlciA9IGRwciAqICh0aGlzLmhvcml6b250YWxfdGV4dF9idWZmZXIgKyBzdHJva2Vfd2lkdGgpO1xuICAgICAgICAgICAgbGV0IHZlcnRpY2FsX2J1ZmZlciA9IGRwciAqIHRoaXMudmVydGljYWxfdGV4dF9idWZmZXI7XG4gICAgICAgICAgICBsZXQgY29sbGlzaW9uX3NpemUgPSBzaXplLmNvbGxpc2lvbl9zaXplO1xuICAgICAgICAgICAgbGV0IGxpbmVXaWR0aCA9IDI7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJva2VTdHlsZSA9ICdibHVlJztcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlUmVjdCh4ICsgaG9yaXpvbnRhbF9idWZmZXIsIHkgKyB2ZXJ0aWNhbF9idWZmZXIsIGRwciAqIGNvbGxpc2lvbl9zaXplWzBdLCBkcHIgKiBjb2xsaXNpb25fc2l6ZVsxXSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVidWdTZXR0aW5ncy5kcmF3X2xhYmVsX3RleHR1cmVfYm94ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zYXZlKCk7XG5cbiAgICAgICAgICAgIGxldCB0ZXh0dXJlX3NpemUgPSBzaXplLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgICAgIGxldCBsaW5lV2lkdGggPSAyO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnZ3JlZW4nO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgICAgICAgIC8vIHN0cm9rZSBpcyBhcHBsaWVkIGludGVybmFsbHksIHNvIHRoZSBvdXRlciBib3JkZXIgaXMgdGhlIGVkZ2Ugb2YgdGhlIHRleHR1cmVcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJva2VSZWN0KHggKyBsaW5lV2lkdGgsIHkgKyBsaW5lV2lkdGgsIHRleHR1cmVfc2l6ZVswXSAtIDIgKiBsaW5lV2lkdGgsIHRleHR1cmVfc2l6ZVsxXSAtIDIgKiBsaW5lV2lkdGgpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRHJhdyBzaW5nbGUgbGluZSBvZiB0ZXh0IGF0IHNwZWNpZmllZCBsb2NhdGlvbiwgYWRqdXN0aW5nIGZvciBidWZmZXIgYW5kIGJhc2VsaW5lXG4gICAgZHJhd1RleHRMaW5lIChsaW5lLCBbeCwgeV0sIHNpemUsIHsgc3Ryb2tlLCBzdHJva2Vfd2lkdGggPSAwLCB0cmFuc2Zvcm0sIGFsaWduIH0pIHtcbiAgICAgICAgbGV0IGRwciA9IFV0aWxzLmRldmljZV9waXhlbF9yYXRpbztcbiAgICAgICAgYWxpZ24gPSBhbGlnbiB8fCAnY2VudGVyJztcblxuICAgICAgICBsZXQgdmVydGljYWxfYnVmZmVyID0gdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciAqIGRwcjtcbiAgICAgICAgbGV0IHRleHR1cmVfc2l6ZSA9IHNpemUudGV4dHVyZV9zaXplO1xuICAgICAgICBsZXQgbGluZV9oZWlnaHQgPSBzaXplLmxpbmVfaGVpZ2h0O1xuICAgICAgICBsZXQgaG9yaXpvbnRhbF9idWZmZXIgPSBkcHIgKiAoc3Ryb2tlX3dpZHRoICsgdGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyKTtcblxuICAgICAgICBsZXQgc3RyID0gdGhpcy5hcHBseVRleHRUcmFuc2Zvcm0obGluZS50ZXh0LCB0cmFuc2Zvcm0pO1xuXG4gICAgICAgIC8vIFRleHQgYWxpZ25tZW50XG4gICAgICAgIGxldCB0eDtcbiAgICAgICAgaWYgKGFsaWduID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIHR4ID0geCArIGhvcml6b250YWxfYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgdHggPSB4ICsgdGV4dHVyZV9zaXplWzBdLzIgLSBsaW5lLndpZHRoLzI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIHR4ID0geCArIHRleHR1cmVfc2l6ZVswXSAtIGxpbmUud2lkdGggLSBob3Jpem9udGFsX2J1ZmZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluIHRoZSBhYnNlbmNlIG9mIGJldHRlciBDYW52YXMgVGV4dE1ldHJpY3MgKG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3NlcnMgeWV0KSxcbiAgICAgICAgLy8gMC43NSBidWZmZXIgcHJvZHVjZXMgYSBiZXR0ZXIgYXBwcm94aW1hdGUgdmVydGljYWwgY2VudGVyaW5nIG9mIHRleHRcbiAgICAgICAgbGV0IHR5ID0geSArIHZlcnRpY2FsX2J1ZmZlciAqIDAuNzUgKyBsaW5lX2hlaWdodDtcblxuICAgICAgICBpZiAoc3Ryb2tlICYmIHN0cm9rZV93aWR0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJva2VUZXh0KHN0ciwgdHgsIHR5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRleHQuZmlsbFRleHQoc3RyLCB0eCwgdHkpO1xuICAgIH1cblxuICAgIHJhc3Rlcml6ZSAodGV4dHMsIHRleHR1cmVfc2l6ZSwgdGlsZV9rZXkpIHtcbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGV4dHMpIHtcbiAgICAgICAgICAgIGxldCB0ZXh0X2luZm9zID0gdGV4dHNbc3R5bGVdO1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yIChsZXQgdGV4dCBpbiB0ZXh0X2luZm9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRfaW5mb3NbdGV4dF07XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSB0ZXh0X2luZm8udGV4dF9zZXR0aW5ncztcblxuICAgICAgICAgICAgICAgIC8vIHNldCBmb250IG9uIGZpcnN0IG9jY3VyZW5jZSBvZiBuZXcgZm9udCBzdHlsZVxuICAgICAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEZvbnQodGV4dF9zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgd29yZHMgPSB0ZXh0X2luZm8uc2VnbWVudHM7XG4gICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby50ZXhjb29yZHMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3b3JkID0gd29yZHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4Y29vcmQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV1bd29yZF0udGV4Y29vcmQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleGNvb3JkID0gQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdLnRleGNvb3JkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHR1cmVfcG9zaXRpb24gPSBDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV1bd29yZF0udGV4dHVyZV9wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bd29yZF0uc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bd29yZF0ubGluZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdUZXh0TXVsdGlMaW5lKGxpbmUsIHRleHR1cmVfcG9zaXRpb24sIHNpemUsIHRleHRfc2V0dGluZ3MpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4Y29vcmQgPSBUZXh0dXJlLmdldFRleGNvb3Jkc0ZvclNwcml0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9wb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS50ZXh0dXJlX3NpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVfc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV1bd29yZF0udGV4Y29vcmQgPSB0ZXhjb29yZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnRleGNvb3Jkcy5wdXNoKHRleGNvb3JkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVzID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XS5saW5lczsgLy8gZ2V0IHByZXZpb3VzbHkgY29tcHV0ZWQgbGluZXMgb2YgdGV4dFxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBhbGlnbiBpbiB0ZXh0X2luZm8uYWxpZ24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd1RleHRNdWx0aUxpbmUobGluZXMsIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4dHVyZV9wb3NpdGlvbiwgdGV4dF9pbmZvLnNpemUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6IHRleHRfc2V0dGluZ3Muc3Ryb2tlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZV93aWR0aDogdGV4dF9zZXR0aW5ncy5zdHJva2Vfd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0ZXh0X3NldHRpbmdzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogYWxpZ25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ25bYWxpZ25dLnRleGNvb3JkcyA9IFRleHR1cmUuZ2V0VGV4Y29vcmRzRm9yU3ByaXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4dHVyZV9wb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uc2l6ZS50ZXh0dXJlX3NpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9zaXplXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUGxhY2UgdGV4dCBsYWJlbHMgd2l0aGluIGFuIGF0bGFzIG9mIHRoZSBnaXZlbiBtYXggc2l6ZVxuICAgIHNldFRleHR1cmVUZXh0UG9zaXRpb25zICh0ZXh0cywgbWF4X3RleHR1cmVfc2l6ZSwgdGlsZV9rZXkpIHtcbiAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XSkge1xuICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV0gPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgY29sdW1uIHdpZHRoXG4gICAgICAgIGxldCBjb2x1bW5fd2lkdGggPSAwO1xuXG4gICAgICAgIC8vIExheW91dCBsYWJlbHMsIHN0YWNrZWQgaW4gY29sdW1uc1xuICAgICAgICBsZXQgY3ggPSAwLCBjeSA9IDA7IC8vIGN1cnJlbnQgeC95IHBvc2l0aW9uIGluIGF0bGFzXG4gICAgICAgIGxldCBoZWlnaHQgPSAwOyAgICAgLy8gb3ZlcmFsbCBhdGxhcyBoZWlnaHRcbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGV4dHMpIHtcbiAgICAgICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdKSB7XG4gICAgICAgICAgICAgICBDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV0gPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRleHRfaW5mb3MgPSB0ZXh0c1tzdHlsZV07XG5cbiAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0X2luZm9zW3RleHRdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRleHRfaW5mby50ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHR1cmVfcG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dF9pbmZvLnNpemUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3b3JkID0gdGV4dF9pbmZvLnNlZ21lbnRzW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gdGV4dF9pbmZvLnNpemVbaV0udGV4dHVyZV9zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplWzBdID4gY29sdW1uX3dpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl93aWR0aCA9IHNpemVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSArIHNpemVbMV0gPCBtYXhfdGV4dHVyZV9zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVfcG9zaXRpb24gPSBbY3gsIGN5XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeSArPSBzaXplWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3kgPiBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGN5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBzdGFydCBuZXcgY29sdW1uIGlmIHRhbGxlciB0aGFuIHRleHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ggKz0gY29sdW1uX3dpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5fd2lkdGggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVfcG9zaXRpb24gPSBbY3gsIGN5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV1bd29yZF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVfcG9zaXRpb246IHRleHR1cmVfcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXJlZCBzaXplIGlzIHNhbWUgZm9yIGFsbCBhbGlnbm1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gdGV4dF9pbmZvLnNpemUudGV4dHVyZV9zaXplO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZVswXSA+IGNvbHVtbl93aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoID0gc2l6ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBlYWNoIGFsaWdubWVudCBuZWVkcyB0byBiZSByZW5kZXJlZCBzZXBhcmF0ZWx5XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGFsaWduIGluIHRleHRfaW5mby5hbGlnbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ICsgc2l6ZVsxXSA8IG1heF90ZXh0dXJlX3NpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ25bYWxpZ25dLnRleHR1cmVfcG9zaXRpb24gPSBbY3gsIGN5XTsgLy8gYWRkIGxhYmVsIHRvIGN1cnJlbnQgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgKz0gc2l6ZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3kgPiBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gY3k7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vIHN0YXJ0IG5ldyBjb2x1bW4gaWYgdGFsbGVyIHRoYW4gdGV4dHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4ICs9IGNvbHVtbl93aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5fd2lkdGggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ25bYWxpZ25dLnRleHR1cmVfcG9zaXRpb24gPSBbY3gsIGN5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbY3ggKyBjb2x1bW5fd2lkdGgsIGhlaWdodF07IC8vIG92ZXJhbGwgYXRsYXMgc2l6ZVxuICAgIH1cblxuICAgIC8vIENhbGxlZCBiZWZvcmUgcmFzdGVyaXphdGlvblxuICAgIGFwcGx5VGV4dFRyYW5zZm9ybSAodGV4dCwgdHJhbnNmb3JtKSB7XG4gICAgICAgIGlmICh0cmFuc2Zvcm0gPT09ICdjYXBpdGFsaXplJykge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFx3XFxTKi9nLCBmdW5jdGlvbiAodHh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR4dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHR4dC5zdWJzdHIoMSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm0gPT09ICd1cHBlcmNhc2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybSA9PT0gJ2xvd2VyY2FzZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBmb250IENTUy1zdHlsZSBzaXplICgnMTJweCcsICcxNHB0JywgJzEuNWVtJywgZXRjLikgdG8gcGl4ZWwgc2l6ZSAoYWRqdXN0ZWQgZm9yIGRldmljZSBwaXhlbCByYXRpbylcbiAgICAvLyBEZWZhdWx0cyB1bml0cyB0byBwaXhlbHMgaWYgbm90IHNwZWNpZmllZFxuICAgIHN0YXRpYyBmb250UGl4ZWxTaXplIChzaXplKSB7XG4gICAgICAgIGlmIChzaXplID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzaXplID0gKHR5cGVvZiBzaXplID09PSAnc3RyaW5nJykgPyBzaXplIDogU3RyaW5nKHNpemUpOyAvLyBuZWVkIGEgc3RyaW5nIGZvciByZWdleFxuXG4gICAgICAgIGxldCBbLCBweF9zaXplLCB1bml0c10gPSBzaXplLm1hdGNoKENhbnZhc1RleHQuZm9udF9zaXplX3JlKSB8fCBbXTtcbiAgICAgICAgdW5pdHMgPSB1bml0cyB8fCAncHgnO1xuXG4gICAgICAgIGlmICh1bml0cyA9PT0gXCJlbVwiKSB7XG4gICAgICAgICAgICBweF9zaXplICo9IDE2O1xuICAgICAgICB9IGVsc2UgaWYgKHVuaXRzID09PSBcInB0XCIpIHtcbiAgICAgICAgICAgIHB4X3NpemUgLz0gMC43NTtcbiAgICAgICAgfSBlbHNlIGlmICh1bml0cyA9PT0gXCIlXCIpIHtcbiAgICAgICAgICAgIHB4X3NpemUgLz0gNi4yNTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB4X3NpemUgPSBwYXJzZUZsb2F0KHB4X3NpemUpO1xuICAgICAgICBweF9zaXplICo9IFV0aWxzLmRldmljZV9waXhlbF9yYXRpbztcbiAgICAgICAgcmV0dXJuIHB4X3NpemU7XG4gICAgfVxuXG4gICAgY2xlYXJUZXhjb29yZENhY2hlICh0aWxlX2tleSkge1xuICAgICAgICBDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XSA9IHt9O1xuICAgIH1cblxufVxuXG4vLyBFeHRyYWN0IGZvbnQgc2l6ZSBhbmQgdW5pdHNcbkNhbnZhc1RleHQuZm9udF9zaXplX3JlID0gLygoPzpbMC05XSpcXC4pP1swLTldKylcXHMqKHB4fHB0fGVtfCUpPy87XG5cbi8vIENhY2hlIHNpemVzIG9mIHJlbmRlcmVkIHRleHRcbkNhbnZhc1RleHQudGV4dF9jYWNoZSA9IHt9OyAvLyBieSB0ZXh0IHN0eWxlLCB0aGVuIHRleHQgc3RyaW5nXG5DYW52YXNUZXh0LmNhY2hlX3N0YXRzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcbkNhbnZhc1RleHQudGV4Y29vcmRfY2FjaGUgPSB7fTtcblxuLy8gUmlnaHQtdG8tbGVmdCAvIGJpLWRpcmVjdGlvbmFsIHRleHQgaGFuZGxpbmdcbi8vIFRha2VuIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjAwNjA5NS9qYXZhc2NyaXB0LWhvdy10by1jaGVjay1pZi1jaGFyYWN0ZXItaXMtcnRsI2Fuc3dlci0xOTE0MzI1NFxubGV0IHJ0bFJlZ0V4ID0gL15bXlxcdTA1OTEtXFx1MDdGRlxcdTIwMEZcXHUyMDJCXFx1MjAyRVxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ10qP1tcXHUwNTkxLVxcdTA3RkZcXHUyMDBGXFx1MjAyQlxcdTIwMkVcXHVGQjFELVxcdUZERkRcXHVGRTcwLVxcdUZFRkNdLztcbmZ1bmN0aW9uIGlzUlRMKHMpe1xuICAgIHJldHVybiBydGxSZWdFeC50ZXN0KHMpO1xufVxuXG5mdW5jdGlvbiByZW9yZGVyV29yZHNMVFIod29yZHMpIHtcbiAgICBsZXQgd29yZHNfTFRSID0gW107XG4gICAgbGV0IHdvcmRzX1JUTCA9IFtdO1xuXG4gICAgLy8gbG9vcCB0aHJvdWdoIHdvcmRzIGFuZCByZS1vcmRlciBSVEwgZ3JvdXBzIGluIHJldmVyc2Ugb3JkZXIgKGJ1dCBpbiBMVFIgdmlzdWFsIG9yZGVyKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgc3RyID0gd29yZHNbaV07XG4gICAgICAgIHZhciBydGwgPSBpc1JUTChzdHIpO1xuICAgICAgICBpZiAocnRsKXtcbiAgICAgICAgICAgIHdvcmRzX1JUTC5wdXNoKHN0cik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aGlsZSAod29yZHNfUlRMLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgIHdvcmRzX0xUUi5wdXNoKHdvcmRzX1JUTC5wb3AoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3b3Jkc19MVFIucHVzaChzdHIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2hpbGUgKHdvcmRzX1JUTC5sZW5ndGggPiAwKXtcbiAgICAgICAgd29yZHNfTFRSLnB1c2god29yZHNfUlRMLnBvcCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29yZHNfTFRSO1xufVxuXG4vLyBTcGxpdHRpbmcgc3RyYXRlZ3kgZm9yIGNob3BwaW5nIGEgbGFiZWwgaW50byBzZWdtZW50c1xuZnVuY3Rpb24gc3BsaXRMYWJlbFRleHQodGV4dCl7XG4gICAgbGV0IHdvcmRzID0gdGV4dC5zcGxpdCgnICcpO1xuICAgIHJldHVybiByZW9yZGVyV29yZHNMVFIod29yZHMpO1xufVxuXG4vLyBQcml2YXRlIGNsYXNzIHRvIGFycmFuZ2UgdGV4dCBsYWJlbHMgaW50byBtdWx0aXBsZSBsaW5lcyBiYXNlZCBvblxuLy8gXCJ0ZXh0IHdyYXBcIiBhbmQgXCJtYXggbGluZVwiIHZhbHVlc1xuY2xhc3MgTXVsdGlMaW5lIHtcbiAgICBjb25zdHJ1Y3RvciAoY29udGV4dCwgbWF4X2xpbmVzID0gSW5maW5pdHksIHRleHRfd3JhcCA9IEluZmluaXR5KSB7XG4gICAgICAgIHRoaXMud2lkdGggPSAwO1xuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMubGluZXMgPSBbXTtcblxuICAgICAgICB0aGlzLmVsbGlwc2lzID0gJy4uLic7XG4gICAgICAgIHRoaXMuZWxsaXBzaXNfd2lkdGggPSBNYXRoLmNlaWwoY29udGV4dC5tZWFzdXJlVGV4dCh0aGlzLmVsbGlwc2lzKS53aWR0aCk7XG5cbiAgICAgICAgdGhpcy5tYXhfbGluZXMgPSBtYXhfbGluZXM7XG4gICAgICAgIHRoaXMudGV4dF93cmFwID0gdGV4dF93cmFwO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIH1cblxuICAgIGNyZWF0ZUxpbmUgKGxpbmVfaGVpZ2h0KXtcbiAgICAgICAgaWYgKHRoaXMubGluZXMubGVuZ3RoIDwgdGhpcy5tYXhfbGluZXMpe1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5lKGxpbmVfaGVpZ2h0LCB0aGlzLnRleHRfd3JhcCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoIChsaW5lKXtcbiAgICAgICAgaWYgKHRoaXMubGluZXMubGVuZ3RoIDwgdGhpcy5tYXhfbGluZXMpe1xuICAgICAgICAgICAgLy8gbWVhc3VyZSBsaW5lIHdpZHRoXG4gICAgICAgICAgICBsZXQgbGluZV93aWR0aCA9IHRoaXMuY29udGV4dC5tZWFzdXJlVGV4dChsaW5lLnRleHQpLndpZHRoO1xuICAgICAgICAgICAgbGluZS53aWR0aCA9IGxpbmVfd2lkdGg7XG5cbiAgICAgICAgICAgIGlmIChsaW5lX3dpZHRoID4gdGhpcy53aWR0aCl7XG4gICAgICAgICAgICAgICAgdGhpcy53aWR0aCA9IE1hdGguY2VpbChsaW5lX3dpZHRoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWRkIHRvIGxpbmVzIGFuZCBpbmNyZW1lbnQgaGVpZ2h0XG4gICAgICAgICAgICB0aGlzLmxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCArPSBsaW5lLmhlaWdodDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGRFbGxpcHNpcygpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcHVzaGVzIHRvIHRoZSBsaW5lcyBhcnJheSBhbmQgcmV0dXJucyBhIG5ldyBsaW5lIGlmIHBvc3NpYmxlIChmYWxzZSBvdGhlcndpc2UpXG4gICAgYWR2YW5jZSAobGluZSwgbGluZV9oZWlnaHQpIHtcbiAgICAgICAgbGV0IGNhbl9wdXNoID0gdGhpcy5wdXNoKGxpbmUpO1xuICAgICAgICBpZiAoY2FuX3B1c2gpe1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTGluZShsaW5lX2hlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRFbGxpcHNpcyAoKXtcbiAgICAgICAgbGV0IGxhc3RfbGluZSA9IHRoaXMubGluZXNbdGhpcy5saW5lcy5sZW5ndGggLSAxXTtcblxuICAgICAgICBsYXN0X2xpbmUuYXBwZW5kKHRoaXMuZWxsaXBzaXMpO1xuICAgICAgICBsYXN0X2xpbmUud2lkdGggKz0gdGhpcy5lbGxpcHNpc193aWR0aDtcblxuICAgICAgICBpZiAobGFzdF9saW5lLndpZHRoID4gdGhpcy53aWR0aCkge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IGxhc3RfbGluZS53aWR0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZpbmlzaCAobGluZSl7XG4gICAgICAgIGlmIChsaW5lKXtcbiAgICAgICAgICAgIHRoaXMucHVzaChsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRWxsaXBzaXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZSAoc3RyLCB0ZXh0X3dyYXAsIG1heF9saW5lcywgbGluZV9oZWlnaHQsIGN0eCkge1xuICAgICAgICAvLyBXb3JkIHdyYXBwaW5nXG4gICAgICAgIC8vIExpbmUgYnJlYWtzIGNhbiBiZSBjYXVzZWQgYnk6XG4gICAgICAgIC8vICAtIGltcGxpY2l0IGxpbmUgYnJlYWsgd2hlbiBhIG1heGltdW0gY2hhcmFjdGVyIHRocmVzaG9sZCBpcyBleGNlZWRlZCBwZXIgbGluZSAodGV4dF93cmFwKVxuICAgICAgICAvLyAgLSBleHBsaWNpdCBsaW5lIGJyZWFrIGluIHRoZSBsYWJlbCB0ZXh0IChcXG4pXG4gICAgICAgIGxldCB3b3JkcztcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0X3dyYXAgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB3b3JkcyA9IHN0ci5zcGxpdCgnICcpOyAvLyBzcGxpdCB3b3JkcyBvbiBzcGFjZXNcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdvcmRzID0gW3N0cl07IC8vIG5vIG1heCBsaW5lIHdvcmQgd3JhcHBpbmcgKGJ1dCBuZXcgbGluZXMgd2lsbCBzdGlsbCBiZSBpbiBlZmZlY3QpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbXVsdGlsaW5lID0gbmV3IE11bHRpTGluZShjdHgsIG1heF9saW5lcywgdGV4dF93cmFwKTtcbiAgICAgICAgbGV0IGxpbmUgPSBtdWx0aWxpbmUuY3JlYXRlTGluZShsaW5lX2hlaWdodCk7XG5cbiAgICAgICAgLy8gRmlyc3QgaXRlcmF0ZSBvbiBzcGFjZS1icmVhayBncm91cHMgKHdpbGwgYmUgb25lIGlmIG1heCBsaW5lIGxlbmd0aCBvZmYpLCB0aGVuIGl0ZXJhdGUgb24gbGluZS1icmVhayBncm91cHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGJyZWFrcyA9IHdvcmRzW2ldLnNwbGl0KCdcXG4nKTsgLy8gc3BsaXQgb24gbGluZSBicmVha3NcbiAgICAgICAgICAgIGxldCBuZXdfbGluZSA9IChpID09PSAwKSA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAgICAgZm9yIChsZXQgbj0wOyBuIDwgYnJlYWtzLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsaW5lKXtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHdvcmQgPSBicmVha3Nbbl0udHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBzcGFjZWRfd29yZCA9IChuZXdfbGluZSkgPyB3b3JkIDogJyAnICsgd29yZDtcblxuICAgICAgICAgICAgICAgIC8vIGlmIGFkZGluZyBjdXJyZW50IHdvcmQgd291bGQgb3ZlcmZsb3csIGFkZCBhIG5ldyBsaW5lIGluc3RlYWRcbiAgICAgICAgICAgICAgICAvLyBmaXJzdCB3b3JkIChpID09PSAwKSBhbHdheXMgYXBwZW5kc1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0X3dyYXAgJiYgaSA+IDAgJiYgbGluZS5leGNlZWRzVGV4dHdyYXAoc3BhY2VkX3dvcmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBtdWx0aWxpbmUuYWR2YW5jZShsaW5lLCBsaW5lX2hlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbGluZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCh3b3JkKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3X2xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQoc3BhY2VkX3dvcmQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGlmIGxpbmUgYnJlYWtzIHByZXNlbnQsIGFkZCBuZXcgbGluZSAodW5sZXNzIG9uIGxhc3QgbGluZSlcbiAgICAgICAgICAgICAgICBpZiAobiA8IGJyZWFrcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBtdWx0aWxpbmUuYWR2YW5jZShsaW5lLCBsaW5lX2hlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld19saW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpID09PSB3b3Jkcy5sZW5ndGggLSAxKXtcbiAgICAgICAgICAgICAgICBtdWx0aWxpbmUuZmluaXNoKGxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtdWx0aWxpbmU7XG4gICAgfVxufVxuXG4vLyBBIFByaXZhdGUgY2xhc3MgdXNlZCBieSBNdWx0aUxpbmUgdG8gY29udGFpbiB0aGUgbG9naWMgZm9yIGEgc2luZ2xlIGxpbmVcbi8vIGluY2x1ZGluZyBjaGFyYWN0ZXIgY291bnQsIHdpZHRoLCBoZWlnaHQgYW5kIHRleHRcbmNsYXNzIExpbmUge1xuICAgIGNvbnN0cnVjdG9yIChoZWlnaHQgPSAwLCB0ZXh0X3dyYXAgPSAwKXtcbiAgICAgICAgdGhpcy5jaGFycyA9IDA7XG4gICAgICAgIHRoaXMudGV4dCA9ICcnO1xuXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5jZWlsKGhlaWdodCk7XG4gICAgICAgIHRoaXMudGV4dF93cmFwID0gdGV4dF93cmFwO1xuICAgIH1cblxuICAgIGFwcGVuZCAodGV4dCl7XG4gICAgICAgIHRoaXMuY2hhcnMgKz0gdGV4dC5sZW5ndGg7XG4gICAgICAgIHRoaXMudGV4dCArPSB0ZXh0O1xuICAgIH1cblxuICAgIGV4Y2VlZHNUZXh0d3JhcCAodGV4dCl7XG4gICAgICAgIHJldHVybiB0ZXh0Lmxlbmd0aCArIHRoaXMuY2hhcnMgPiB0aGlzLnRleHRfd3JhcDtcbiAgICB9XG59XG4iLCIvKiBnbG9iYWwgRm9udEZhY2UgKi9cbmltcG9ydCBsb2cgZnJvbSAnLi4vLi4vdXRpbHMvbG9nJztcbmltcG9ydCBVdGlscyBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XG5pbXBvcnQgRm9udEZhY2VPYnNlcnZlciBmcm9tICdmb250ZmFjZW9ic2VydmVyJztcblxuY29uc3QgRm9udE1hbmFnZXIgPSB7XG5cbiAgICAvLyBGb250IGRldGVjdGlvblxuICAgIGZvbnRzX2xvYWRlZDogUHJvbWlzZS5yZXNvbHZlKCksIC8vIHJlc29sdmVzIHdoZW4gYWxsIHJlcXVlc3RlZCBmb250cyBoYXZlIGJlZW4gZGV0ZWN0ZWRcblxuICAgIC8vIExvYWQgc2V0IG9mIGN1c3RvbSBmb250IGZhY2VzXG4gICAgLy8gYGZvbnRzYCBpcyBhbiBvYmplY3Qgd2hlcmUgdGhlIGtleSBpcyBhIGZvbnQgZmFtaWx5IG5hbWUsIGFuZCB0aGUgdmFsdWUgaXMgb25lIG9yIG1vcmUgZm9udCBmYWNlXG4gICAgLy8gZGVmaW5pdGlvbnMuIFRoZSB2YWx1ZSBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIG9iamVjdCwgb3IgYW4gYXJyYXkgb2Ygc3VjaCBvYmplY3RzLlxuICAgIC8vIElmIHRoZSBzcGVjaWFsIHN0cmluZyB2YWx1ZSAnZXh0ZXJuYWwnIGlzIHVzZWQsIGl0IGluZGljYXRlcyB0aGUgdGhlIGZvbnQgd2lsbCBiZSBsb2FkZWQgdmlhIGV4dGVybmFsIENTUy5cbiAgICBsb2FkRm9udHMgKGZvbnRzKSB7XG4gICAgICAgIGlmIChmb250cykge1xuICAgICAgICAgICAgbGV0IHF1ZXVlID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBmYW1pbHkgaW4gZm9udHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmb250c1tmYW1pbHldKSkge1xuICAgICAgICAgICAgICAgICAgICBmb250c1tmYW1pbHldLmZvckVhY2goZmFjZSA9PiBxdWV1ZS5wdXNoKHRoaXMubG9hZEZvbnRGYWNlKGZhbWlseSwgZmFjZSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2godGhpcy5sb2FkRm9udEZhY2UoZmFtaWx5LCBmb250c1tmYW1pbHldKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZvbnRzX2xvYWRlZCA9IFByb21pc2UuYWxsKHF1ZXVlLmZpbHRlcih4ID0+IHgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5mb250c19sb2FkZWQ7XG4gICAgfSxcblxuICAgIC8vIExvYWQgYSBzaW5nbGUgZm9udCBmYWNlXG4gICAgLy8gYGZhY2VgIGNvbnRhaW5zIHRoZSBmb250IGZhY2UgZGVmaW5pdGlvbiwgd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBgd2VpZ2h0YCwgYHN0eWxlYCwgYW5kIGB1cmxgLlxuICAgIC8vIElmIHRoZSBgdXJsYCBpcyBkZWZpbmVkLCB0aGUgZm9udCBpcyBpbmplY3RlZCBpbnRvIHRoZSBkb2N1bWVudCBhcyBhIENTUyBmb250LWZhY2UuXG4gICAgLy8gSWYgdGhlIG9iamVjdCdzIHZhbHVlIGlzIHRoZSBzcGVjaWFsIHN0cmluZyAnZXh0ZXJuYWwnLCBvciBpZiBubyBgdXJsYCBpcyBkZWZpbmVkLCB0aGVuIHRoZSBmb250IGZhY2VcbiAgICAvLyBpcyBhc3N1bWVkIGlzIGFzc3VtZWQgdG8gYmVlbiBsb2FkZWQgdmlhIGV4dGVybmFsIENTUy4gSW4gZWl0aGVyIGNhc2UsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZVxuICAgIC8vIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZm9udCBmYWNlIGhhcyBsb2FkZWQsIG9yIHRpbWVzIG91dC5cbiAgICBsb2FkRm9udEZhY2UgKGZhbWlseSwgZmFjZSkge1xuICAgICAgICBpZiAoZmFjZSA9PSBudWxsIHx8ICh0eXBlb2YgZmFjZSAhPT0gJ29iamVjdCcgJiYgZmFjZSAhPT0gJ2V4dGVybmFsJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcHRpb25zID0geyBmYW1pbHkgfTtcbiAgICAgICAgbGV0IGluamVjdCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZmFjZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgZmFjZSk7XG5cbiAgICAgICAgICAgIC8vIElmIFVSTCBpcyBkZWZpbmVkLCBpbmplY3QgZm9udCBpbnRvIGRvY3VtZW50XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZhY2UudXJsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGluamVjdCA9IHRoaXMuaW5qZWN0Rm9udEZhY2Uob3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXYWl0IGZvciBmb250IHRvIGxvYWRcbiAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IEZvbnRGYWNlT2JzZXJ2ZXIoZmFtaWx5LCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIGluamVjdC50aGVuKCgpID0+IG9ic2VydmVyLmxvYWQoKSkudGhlbihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQcm9taXNlIHJlc29sdmVzLCBmb250IGlzIGF2YWlsYWJsZVxuICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgRm9udCBmYWNlICcke2ZhbWlseX0nIGlzIGF2YWlsYWJsZWAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQcm9taXNlIHJlamVjdHMsIGZvbnQgaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgRm9udCBmYWNlICcke2ZhbWlseX0nIGlzIE5PVCBhdmFpbGFibGVgLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLy8gTG9hZHMgYSBmb250IGZhY2UgdmlhIGVpdGhlciB0aGUgbmF0aXZlIEZvbnRGYWNlIEFQSSwgb3IgQ1NTIGluamVjdGlvblxuICAgIC8vIFRPRE86IGNvbnNpZGVyIHN1cHBvcnQgZm9yIG11bHRpcGxlIGZvcm1hdCBVUkxzIHBlciBmYWNlLCB1bmljb2RlIHJhbmdlc1xuICAgIGluamVjdEZvbnRGYWNlICh7IGZhbWlseSwgdXJsLCB3ZWlnaHQsIHN0eWxlIH0pIHtcbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNfbmF0aXZlX2ZvbnRfbG9hZGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnN1cHBvcnRzX25hdGl2ZV9mb250X2xvYWRpbmcgPSAod2luZG93LkZvbnRGYWNlICE9PSB1bmRlZmluZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBibG9iIFVSTHMsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuYXRpdmUgRm9udEZhY2UgQVBJIHdpbGwgYmUgdXNlZCBvciBub3QuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdoZW4gdGhlIEZvbnRGYWNlIEFQSSAqaXMqIHN1cHBvcnRlZCwgdGhlIGJsb2IgVVJMIGlzIHJlYWQgaW50byBhIHJhdyBkYXRhIGFycmF5LlxuICAgICAgICAvLyBOQjogaXQncyBpbmVmZmljaWVudCB0byBiZSBjb252ZXJ0aW5nIGJsb2IgVVJMcyBpbnRvIHR5cGVkIGFycmF5cyBoZXJlLCBzaW5jZSB0aGV5IG9yaWdpbmF0ZWRcbiAgICAgICAgLy8gYXMgcmF3IGRhdGEgKmJlZm9yZSogdGhleSB3ZXJlIGNvbnZlcnRlZCBpbnRvIGJsb2IgVVJMcy4gSG93ZXZlciwgdGhpcyBwcm9jZXNzIHNob3VsZCBiZSBmYXN0IHNpbmNlXG4gICAgICAgIC8vIHRoZXNlIGFyZSBuYXRpdmUgYnJvd3NlciBmdW5jdGlvbnMgYW5kIGFsbCBkYXRhIGlzIGxvY2FsIChubyBuZXR3b3JrIHJlcXVlc3QpLCBhbmQgaXQga2VlcHMgdGhlXG4gICAgICAgIC8vIGxvZ2ljIHN0cmVhbWxpbmVkIGJ5IGFsbG93aW5nIHVzIHRvIGNvbnRpbnVlIHRvIHVzZSBhIFVSTC1iYXNlZCBpbnRlcmZhY2UgZm9yIGFsbCBzY2VuZSByZXNvdXJjZXMuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdoZW4gdGhlIEZvbnRGYWNlIEFQSSBpcyAqbm90KiBzdXBwb3J0ZWQsIHRoZSBibG9iIFVSTCBkYXRhIGlzIGNvbnZlcnRlZCB0byBhIGJhc2U2NCBkYXRhIFVSTC5cbiAgICAgICAgLy8gVGhpcyBhdm9pZHMgc2VjdXJpdHkgcmVzdHJpY2lvbnMgaW4gc29tZSBicm93c2Vycy5cbiAgICAgICAgLy8gQWxzbyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2JyYW1zdGVpbi9mb250bG9hZGVyL2Jsb2IvNTk4ZTkzOTkxMTdiZGM5NDZmZjc4NmZhMmM1MDA3YTZiZDdkM2I5ZS9zcmMvZm9udGZhY2UuanMjTDE0NS1MMTUzXG4gICAgICAgIGxldCBwcmVwcm9jZXNzID0gUHJvbWlzZS5yZXNvbHZlKHVybCk7XG4gICAgICAgIGlmICh1cmwuc2xpY2UoMCwgNSkgPT09ICdibG9iOicpIHtcbiAgICAgICAgICAgIHByZXByb2Nlc3MgPSBVdGlscy5pbyh1cmwsIDYwMDAwLCAnYXJyYXlidWZmZXInKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1cHBvcnRzX25hdGl2ZV9mb250X2xvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzOyAvLyB1c2UgcmF3IGJpbmFyeSBkYXRhXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RyID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RhdGE6Zm9udC9vcGVudHlwZTtiYXNlNjQsJyArIGJ0b2Eoc3RyKTsgLy8gYmFzZTY0IGVuY29kZSBhcyBkYXRhIFVSTFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByZXByb2Nlc3MudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN1cHBvcnRzX25hdGl2ZV9mb250X2xvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgbmF0aXZlIEZvbnRGYWNlIEFQSVxuICAgICAgICAgICAgICAgIGxldCBmYWNlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHsgLy8gYWRkIGFzIFVSTFxuICAgICAgICAgICAgICAgICAgICBmYWNlID0gbmV3IEZvbnRGYWNlKGZhbWlseSwgYHVybCgke2VuY29kZVVSSShkYXRhKX0pYCwgeyB3ZWlnaHQsIHN0eWxlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkgeyAvLyBhZGQgYXMgYmluYXJ5IGRhdGFcbiAgICAgICAgICAgICAgICAgICAgZmFjZSA9IG5ldyBGb250RmFjZShmYW1pbHksIGRhdGEsIHsgd2VpZ2h0LCBzdHlsZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKGZhY2UpO1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCAnQWRkaW5nIEZvbnRGYWNlIHRvIGRvY3VtZW50LmZvbnRzOicsIGZhY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIENTUyBpbmplY3Rpb25cbiAgICAgICAgICAgICAgICBsZXQgY3NzID0gYFxuICAgICAgICAgICAgICAgICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAnJHtmYW1pbHl9JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiAke3dlaWdodCB8fCAnbm9ybWFsJ307XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250LXN0eWxlOiAke3N0eWxlIHx8ICdub3JtYWwnfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogdXJsKCR7ZW5jb2RlVVJJKGRhdGEpfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlX2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICBzdHlsZV9lbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKSk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZV9lbCk7XG4gICAgICAgICAgICAgICAgc3R5bGVfZWwuc2hlZXQuaW5zZXJ0UnVsZShjc3MsIDApO1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCAnSW5qZWN0aW5nIENTUyBmb250IGZhY2U6JywgY3NzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG59O1xuXG5leHBvcnQgZGVmYXVsdCBGb250TWFuYWdlcjtcbiIsIi8vIFRleHQgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7UG9pbnRzfSBmcm9tICcuLi9wb2ludHMvcG9pbnRzJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi4vLi4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgTGFiZWxQb2ludCBmcm9tICcuLi8uLi9sYWJlbHMvbGFiZWxfcG9pbnQnO1xuaW1wb3J0IExhYmVsTGluZSBmcm9tICcuLi8uLi9sYWJlbHMvbGFiZWxfbGluZSc7XG5cbmV4cG9ydCBsZXQgVGV4dFN0eWxlID0gT2JqZWN0LmNyZWF0ZShQb2ludHMpO1xuXG5PYmplY3QuYXNzaWduKFRleHRTdHlsZSwge1xuICAgIG5hbWU6ICd0ZXh0JyxcbiAgICBzdXBlcjogUG9pbnRzLFxuICAgIGJ1aWx0X2luOiB0cnVlLFxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5zdXBlci5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgLy8gUG9pbnQgc3R5bGUgKHBhcmVudCBjbGFzcykgcmVxdWlyZXMgdGV4dHVyaW5nIHRvIGJlIHR1cm5lZCBvblxuICAgICAgICAvLyAobGFiZWxzIGFyZSBhbHdheXMgZHJhd24gd2l0aCB0ZXh0dXJlcylcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fUE9JTlRfVEVYVFVSRSA9IHRydWU7XG5cbiAgICAgICAgLy8gRGlzYWJsZSBkdWFsIHBvaW50L3RleHQgbW9kZVxuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9NVUxUSV9TQU1QTEVSID0gZmFsc2U7XG5cbiAgICAgICAgLy8gTWFudWFsbHkgdW4tbXVsdGlwbHkgYWxwaGEsIGJlY2F1c2UgQ2FudmFzIHRleHQgcmFzdGVyaXphdGlvbiBpcyBwcmUtbXVsdGlwbGllZFxuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9VTk1VTFRJUExZX0FMUEhBID0gdHJ1ZTtcblxuICAgICAgICAvLyBGYWRlIG91dCB0ZXh0IHdoZW4gdGlsZSBpcyB6b29taW5nIG91dCwgZS5nLiBhY3RpbmcgYXMgcHJveHkgdGlsZXNcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9PTl9aT09NX09VVCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfT05fWk9PTV9PVVRfUkFURSA9IDI7IC8vIGZhZGUgYXQgMngsIGUuZy4gZnVsbHkgdHJhbnNwYXJlbnQgYXQgMC41IHpvb20gbGV2ZWwgYXdheVxuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9LFxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMucXVldWVzID0ge307XG4gICAgICAgIHRoaXMucmVzZXRUZXh0KCk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlIHRvIHF1ZXVlIGZlYXR1cmVzIGluc3RlYWQgb2YgcHJvY2Vzc2luZyBpbW1lZGlhdGVseVxuICAgIGFkZEZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRpbGUgPSBjb250ZXh0LnRpbGU7XG4gICAgICAgIGlmICh0aWxlLmdlbmVyYXRpb24gIT09IHRoaXMuZ2VuZXJhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbGVkIGhlcmUgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBkZWxheWVkIHVudGlsIHRoZSBmZWF0dXJlIHF1ZXVlIGlzIHBhcnNlZCxcbiAgICAgICAgLy8gYW5kIHdlIHdhbnQgdGhlIHByZXByb2Nlc3NpbmcgZG9uZSBiZWZvcmUgd2UgZXZhbHVhdGUgdGV4dCBzdHlsZSBiZWxvd1xuICAgICAgICBkcmF3ID0gdGhpcy5wcmVwcm9jZXNzKGRyYXcpO1xuICAgICAgICBpZiAoIWRyYXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0eXBlID0gZmVhdHVyZS5nZW9tZXRyeS50eXBlO1xuICAgICAgICBkcmF3LmNhbl9hcnRpY3VsYXRlID0gKHR5cGUgPT09IFwiTGluZVN0cmluZ1wiIHx8IHR5cGUgPT09IFwiTXVsdGlMaW5lU3RyaW5nXCIpO1xuXG4gICAgICAgIGxldCBxID0gdGhpcy5wYXJzZVRleHRGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpO1xuICAgICAgICBpZiAoIXEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHEuZmVhdHVyZSA9IGZlYXR1cmU7XG4gICAgICAgIHEuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHEubGF5b3V0LnZlcnRleCA9IGZhbHNlOyAvLyB2ZXJ0ZXggcGxhY2VtZW50IG9wdGlvbiBub3QgYXBwbGljYWJsZSB0byBzdGFuZGFsb25lIGxhYmVsc1xuXG4gICAgICAgIC8vIFF1ZXVlIHRoZSBmZWF0dXJlIGZvciBwcm9jZXNzaW5nXG4gICAgICAgIGlmICghdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0YSh0aWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0ucHVzaChxKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB3aXRoIGNvbGxpc2lvbiBtYW5hZ2VyXG4gICAgICAgIENvbGxpc2lvbi5hZGRTdHlsZSh0aGlzLm5hbWUsIHRpbGUua2V5KTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGVcbiAgICBzdGFydERhdGEgKHRpbGUpIHtcbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldID0gW107XG4gICAgICAgIHJldHVybiBTdHlsZS5zdGFydERhdGEuY2FsbCh0aGlzLCB0aWxlKTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGVcbiAgICBlbmREYXRhICh0aWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVUZXh0TGFiZWxzKHRpbGUsIHRoaXMubmFtZSwgdGhpcy5xdWV1ZXNbdGlsZS5rZXldKS5cbiAgICAgICAgICAgIHRoZW4obGFiZWxzID0+IHRoaXMuY29sbGlkZUFuZFJlbmRlclRleHRMYWJlbHModGlsZSwgdGhpcy5uYW1lLCBsYWJlbHMpKS5cbiAgICAgICAgICAgIHRoZW4oKHsgbGFiZWxzLCB0ZXh0cywgdGV4dHVyZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldID0gdGV4dHM7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgcXVldWVkIGZlYXR1cmVzXG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gcS50ZXh0X3NldHRpbmdzX2tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XVtxLnRleHRdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBzdHlsaW5nIG9iamVjdCBleHBlY3RlZCBieSBTdHlsZSBjbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUubGFiZWwgPSBxLmxhYmVsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dF9pbmZvLnRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVucGFjayBsb2dpY2FsIHNpemVzIG9mIGVhY2ggc2VnbWVudCBpbnRvIGFuIGFycmF5IGZvciB0aGUgc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gdGV4dF9pbmZvLnNpemUubWFwKGZ1bmN0aW9uKHNpemUpeyByZXR1cm4gc2l6ZS5sb2dpY2FsX3NpemU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHRleHRfaW5mby50ZXhjb29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gdGV4dF9pbmZvLnNpemUubG9naWNhbF9zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFuZ2xlID0gcS5sYWJlbC5hbmdsZSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHRleHRfaW5mby5hbGlnbltxLmxhYmVsLmFsaWduXS50ZXhjb29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlLmFkZEZlYXR1cmUuY2FsbCh0aGlzLCBxLmZlYXR1cmUsIHEuZHJhdywgcS5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZnJlZVRleHQodGlsZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBGaW5pc2ggdGlsZSBtZXNoXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlLmVuZERhdGEuY2FsbCh0aGlzLCB0aWxlKS50aGVuKHRpbGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCB0aWxlLXNwZWNpZmljIGxhYmVsIGF0bGFzIHRvIG1lc2ggYXMgYSB0ZXh0dXJlIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHR1cmUgJiYgdGlsZV9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudW5pZm9ybXMudV90ZXh0dXJlID0gdGV4dHVyZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcy5wdXNoKHRleHR1cmUpOyAvLyBhc3NpZ24gdGV4dHVyZSBvd25lcnNoaXAgdG8gdGlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFNldHMgdXAgY2FjaGluZyBmb3IgZHJhdyBwcm9wZXJ0aWVzXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlcHJvY2Vzc1RleHQoZHJhdyk7XG4gICAgfSxcblxuICAgIC8vIEltcGxlbWVudHMgbGFiZWwgYnVpbGRpbmcgZm9yIFRleHRMYWJlbHMgbWl4aW5cbiAgICBidWlsZFRleHRMYWJlbHMgKHRpbGVfa2V5LCBmZWF0dXJlX3F1ZXVlKSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZj0wOyBmIDwgZmVhdHVyZV9xdWV1ZS5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgbGV0IGZxID0gZmVhdHVyZV9xdWV1ZVtmXTtcbiAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0aGlzLnRleHRzW3RpbGVfa2V5XVtmcS50ZXh0X3NldHRpbmdzX2tleV1bZnEudGV4dF07XG4gICAgICAgICAgICBsZXQgZmVhdHVyZV9sYWJlbHM7XG4gICAgICAgICAgICBpZiAodGV4dF9pbmZvLnRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgIHZhciBzaXplcyA9IHRleHRfaW5mby5zaXplLm1hcChmdW5jdGlvbihzaXplKXsgcmV0dXJuIHNpemUuY29sbGlzaW9uX3NpemU7IH0pO1xuICAgICAgICAgICAgICAgIGZxLmxheW91dC5zcGFjZV93aWR0aCA9IHRleHRfaW5mby5zcGFjZV93aWR0aDtcbiAgICAgICAgICAgICAgICBmZWF0dXJlX2xhYmVscyA9IHRoaXMuYnVpbGRMYWJlbHMoc2l6ZXMsIGZxLmZlYXR1cmUuZ2VvbWV0cnksIGZxLmxheW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmZWF0dXJlX2xhYmVscyA9IHRoaXMuYnVpbGRMYWJlbHModGV4dF9pbmZvLnNpemUuY29sbGlzaW9uX3NpemUsIGZxLmZlYXR1cmUuZ2VvbWV0cnksIGZxLmxheW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVfbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZxbCA9IE9iamVjdC5jcmVhdGUoZnEpO1xuICAgICAgICAgICAgICAgIGZxbC5sYWJlbCA9IGZlYXR1cmVfbGFiZWxzW2ldO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGZxbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhYmVscztcbiAgICB9LFxuXG4gICAgLy8gQnVpbGRzIG9uZSBvciBtb3JlIGxhYmVscyBmb3IgYSBnZW9tZXRyeVxuICAgIGJ1aWxkTGFiZWxzIChzaXplLCBnZW9tZXRyeSwgbGF5b3V0KSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcblxuICAgICAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lTGFiZWxzKGdlb21ldHJ5LmNvb3JkaW5hdGVzLCBzaXplLCBsYXlvdXQsIGxhYmVscyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aUxpbmVTdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IGxpbmVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZExpbmVMYWJlbHMobGluZXNbaV0sIHNpemUsIGxheW91dCwgbGFiZWxzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvaW50XCIpIHtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGdlb21ldHJ5LmNvb3JkaW5hdGVzLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9pbnRcIikge1xuICAgICAgICAgICAgbGV0IHBvaW50cyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChwb2ludHNbaV0sIHNpemUsIGxheW91dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiUG9seWdvblwiKSB7XG4gICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8uY2VudHJvaWQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoY2VudHJvaWQsIHNpemUsIGxheW91dCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlQb2x5Z29uXCIpIHtcbiAgICAgICAgICAgIGxldCBjZW50cm9pZCA9IEdlby5tdWx0aUNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIG9uZSBvciBtb3JlIGxhYmVscyBmb3IgYSBsaW5lIGdlb21ldHJ5XG4gICAgYnVpbGRMaW5lTGFiZWxzIChsaW5lLCBzaXplLCBsYXlvdXQsIGxhYmVscykge1xuICAgICAgICBsZXQgc3ViZGl2ID0gTWF0aC5taW4obGF5b3V0LnN1YmRpdiwgbGluZS5sZW5ndGggLSAxKTtcbiAgICAgICAgaWYgKHN1YmRpdiA+IDEpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBtdWx0aXBsZSBsYWJlbHMgZm9yIGxpbmUsIHdpdGggZWFjaCBhbGxvdHRlZCBhIHJhbmdlIG9mIHNlZ21lbnRzXG4gICAgICAgICAgICAvLyBpbiB3aGljaCBpdCB3aWxsIGF0dGVtcHQgdG8gcGxhY2VcbiAgICAgICAgICAgIGxldCBzZWdfcGVyX2RpdiA9IChsaW5lLmxlbmd0aCAtIDEpIC8gc3ViZGl2O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJkaXY7IGkrKykge1xuICAgICAgICAgICAgICAgIGxheW91dC5zZWdtZW50X3N0YXJ0ID0gTWF0aC5mbG9vcihpICogc2VnX3Blcl9kaXYpO1xuICAgICAgICAgICAgICAgIGxheW91dC5zZWdtZW50X2VuZCA9IE1hdGguZmxvb3IoKGkgKyAxKSAqIHNlZ19wZXJfZGl2KTtcblxuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbExpbmUoc2l6ZSwgbGluZSwgbGF5b3V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9zdGFydCA9IG51bGw7XG4gICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9lbmQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxhYmVsID0gbmV3IExhYmVsTGluZShzaXplLCBsaW5lLCBsYXlvdXQpO1xuICAgICAgICAgICAgaWYgKCFsYWJlbC50aHJvd19hd2F5KXtcbiAgICAgICAgICAgICAgICBsZXQgY2hvc2VuX2xhYmVsID0gcGxhY2VtZW50U3RyYXRlZ3kobGFiZWwpO1xuICAgICAgICAgICAgICAgIGlmIChjaG9zZW5fbGFiZWwpe1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChjaG9zZW5fbGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufSk7XG5cbmNvbnN0IFRBUkdFVF9TVFJBSUdIVCA9IDAuNDsgLy8gT3B0aW1pc3RpYyB0YXJnZXQgcmF0aW8gZm9yIHN0cmFpZ2h0IGxhYmVscyAobGFiZWwgbGVuZ3RoIC8gbGluZSBsZW5ndGgpXG5jb25zdCBUQVJHRVRfS0lOS0VEID0gMC41OyAvLyBPcHRpbWlzdGljIHRhcmdldCByYXRpbyBmb3Iga2lua2VkIGxhYmVscyAobGFiZWwgbGVuZ3RoIC8gbGluZSBsZW5ndGgpXG5cbi8vIFBsYWNlIGxhYmVscyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBzdHJhdGVneTpcbi8vIC0gY2hvb3NlIHRoZSBiZXN0IHN0cmFpZ2h0IGxhYmVsIHRoYXQgc2F0aXNmaWVzIHRoZSBvcHRpbWlzdGljIHN0cmFpZ2h0IGN1dG9mZiAoaWYgYW55KVxuLy8gLSBlbHNlIGNob29zZSB0aGUgYmVzdCBraW5rZWQgbGFiZWwgdGhhdCBzYXRpc2ZpZXMgdGhlIG9wdGltaXN0aWMga2lua2VkIGN1dG9mZiAoaWYgYW55KVxuLy8gLSBlbHNlIGNob29zZSB0aGUgYmVzdCBzdHJhaWdodCBsYWJlbCB0aGF0IHNhdGlzZmllcyBpdHMgaW50ZXJuYWwgKGxlc3Mgb3B0aW1pc3RpYykgY3V0b2ZmIChpZiBhbnkpXG4vLyAtIGVsc2UgY2hvb3NlIHRoZSBiZXN0IGtpbmtlZCBsYWJlbHMgdGhhdCBzYXRpc2ZpZXMgaXRzIGludGVybmFsIChsZXNzIG9wdGltaXN0aWMpIGN1dG9mZiAoaWYgYW55KVxuLy8gLSBlbHNlIGRvbid0IHBsYWNlIGEgbGFiZWxcbmZ1bmN0aW9uIHBsYWNlbWVudFN0cmF0ZWd5KGxhYmVsKXtcbiAgICBsZXQgbGFiZWxzX3N0cmFpZ2h0ID0gW107XG4gICAgbGV0IGxhYmVsc19raW5rZWQgPSBbXTtcbiAgICBsZXQgYmVzdF9zdHJhaWdodF9maXRuZXNzID0gSW5maW5pdHk7XG4gICAgbGV0IGJlc3Rfa2lua2VkX2ZpdG5lc3MgPSBJbmZpbml0eTtcblxuICAgIC8vIGxvb3AgdGhyb3VnaCBhbGwgbGFiZWxzXG4gICAgd2hpbGUgKGxhYmVsICYmICFsYWJlbC50aHJvd19hd2F5KSB7XG4gICAgICAgIGlmIChsYWJlbC5raW5rX2luZGV4ID4gMCl7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBhcnRpY3VsYXRlZCBsYWJlbCBpcyBhYm92ZSBsb3dlc3QgY3V0b2ZmXG4gICAgICAgICAgICBpZiAobGFiZWwuZml0bmVzcyA8IGJlc3Rfa2lua2VkX2ZpdG5lc3Mpe1xuICAgICAgICAgICAgICAgIGJlc3Rfa2lua2VkX2ZpdG5lc3MgPSBsYWJlbC5maXRuZXNzO1xuICAgICAgICAgICAgICAgIGxhYmVsc19raW5rZWQudW5zaGlmdChsYWJlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBzdHJhaWdodCBsYWJlbCBpcyBhYm92ZSBsb3dlc3Qgc3RyYWlnaHQgY3V0b2ZmXG4gICAgICAgICAgICBpZiAobGFiZWwuZml0bmVzcyA8IGJlc3Rfc3RyYWlnaHRfZml0bmVzcyl7XG4gICAgICAgICAgICAgICAgYmVzdF9zdHJhaWdodF9maXRuZXNzID0gbGFiZWwuZml0bmVzcztcbiAgICAgICAgICAgICAgICBsYWJlbHNfc3RyYWlnaHQudW5zaGlmdChsYWJlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYWJlbCA9IExhYmVsTGluZS5uZXh0TGFiZWwobGFiZWwpO1xuICAgIH1cblxuICAgIGxldCBiZXN0X3N0cmFpZ2h0ID0gbGFiZWxzX3N0cmFpZ2h0WzBdO1xuICAgIGxldCBiZXN0X2tpbmtlZCA9IGxhYmVsc19raW5rZWRbMF07XG5cbiAgICBpZiAobGFiZWxzX3N0cmFpZ2h0Lmxlbmd0aCAmJiBiZXN0X3N0cmFpZ2h0LmZpdG5lc3MgPCBUQVJHRVRfU1RSQUlHSFQpe1xuICAgICAgICAvLyByZXR1cm4gdGhlIGJlc3Qgc3RyYWlnaHQgc2VnbWVudCBpZiBpdCBpcyBhYm92ZSB0aGUgc3RyaWN0ZXIgc3RyYWlnaHQgY3V0b2ZmXG4gICAgICAgIHJldHVybiBiZXN0X3N0cmFpZ2h0O1xuICAgIH1cbiAgICBlbHNlIGlmIChsYWJlbHNfa2lua2VkLmxlbmd0aCAmJiBiZXN0X2tpbmtlZC5maXRuZXNzIDwgVEFSR0VUX0tJTktFRCl7XG4gICAgICAgIC8vIHJldHVybiB0aGUgYmVzdCBraW5rZWQgc2VnbWVudCBpZiBpdCBpcyBhYm92ZSB0aGUgc3RyaWN0ZXIga2lua2VkIGN1dG9mZlxuICAgICAgICByZXR1cm4gYmVzdF9raW5rZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBvdGhlcndpc2UgcmV0dXJuIGJlc3Qgb2Ygd2hhdCdzIGxlZnQgKGlmIGFueSlcbiAgICAgICAgcmV0dXJuIGJlc3Rfc3RyYWlnaHQgfHwgYmVzdF9raW5rZWQ7XG4gICAgfVxufVxuXG5UZXh0U3R5bGUudGV4dHVyZV9pZCA9IDA7IC8vIG5hbWVzcGFjZXMgcGVyLXRpbGUgbGFiZWwgdGV4dHVyZXNcbiIsIi8vIFRleHQgbGFiZWwgcmVuZGVyaW5nIG1ldGhvZHMsIGNhbiBiZSBtaXhlZCBpbnRvIGEgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi8uLi9nbC90ZXh0dXJlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vLi4vdXRpbHMvbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi4vLi4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi4vLi4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4uLy4uL2xhYmVscy9jb2xsaXNpb24nO1xuaW1wb3J0IFRleHRTZXR0aW5ncyBmcm9tICcuLi90ZXh0L3RleHRfc2V0dGluZ3MnO1xuaW1wb3J0IENhbnZhc1RleHQgZnJvbSAnLi4vdGV4dC9jYW52YXNfdGV4dCc7XG5cbi8vIG5hbWVzcGFjZXMgbGFiZWwgdGV4dHVyZXMgKGVuc3VyZXMgbmV3IHRleHR1cmUgbmFtZSB3aGVuIGEgdGlsZSBpcyBidWlsdCBtdWx0aXBsZSB0aW1lcylcbmxldCB0ZXh0X3RleHR1cmVfaWQgPSAwO1xuXG5leHBvcnQgY29uc3QgVGV4dExhYmVscyA9IHtcblxuICAgIHJlc2V0VGV4dCAoKSB7XG4gICAgICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBuZXcgQ2FudmFzVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFRocmVhZC5pc193b3JrZXIpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHMgPSB7fTsgLy8gdW5pcXVlIHRleHRzLCBncm91cGVkIGJ5IHRpbGUsIGJ5IHN0eWxlXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZnJlZVRleHQgKHRpbGUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMudGV4dHNbdGlsZS5rZXldO1xuICAgIH0sXG5cbiAgICBwYXJzZVRleHRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKSB7XG4gICAgICAgIC8vIENvbXB1dGUgbGFiZWwgdGV4dFxuICAgICAgICBsZXQgdGV4dCA9IHRoaXMucGFyc2VUZXh0U291cmNlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIG5vIHRleHQgZm9yIHRoaXMgZmVhdHVyZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0ZXh0IHN0eWxlIGFuZCBsYXlvdXQgc2V0dGluZ3MgZm9yIHRoaXMgZmVhdHVyZSBsYWJlbFxuICAgICAgICBsZXQgdGV4dF9zZXR0aW5ncyA9IFRleHRTZXR0aW5ncy5jb21wdXRlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuICAgICAgICBsZXQgdGV4dF9zZXR0aW5nc19rZXkgPSBUZXh0U2V0dGluZ3Mua2V5KHRleHRfc2V0dGluZ3MpO1xuICAgICAgICBsZXQgbGF5b3V0ID0gdGhpcy5jb21wdXRlVGV4dExheW91dCh7fSwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSwgdGV4dCwgdGV4dF9zZXR0aW5ncyk7XG5cbiAgICAgICAgLy8gZmlyc3QgbGFiZWwgaW4gdGlsZSwgb3Igd2l0aCB0aGlzIHN0eWxlP1xuICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XSA9IHRoaXMudGV4dHNbdGlsZS5rZXldIHx8IHt9O1xuICAgICAgICBsZXQgc2l6ZXMgPSB0aGlzLnRleHRzW3RpbGUua2V5XVt0ZXh0X3NldHRpbmdzX2tleV0gPSB0aGlzLnRleHRzW3RpbGUua2V5XVt0ZXh0X3NldHRpbmdzX2tleV0gfHwge307XG5cbiAgICAgICAgLy8gdW5pcXVlIHRleHQgc3RyaW5ncywgZ3JvdXBlZCBieSB0ZXh0IGRyYXdpbmcgc3R5bGVcbiAgICAgICAgaWYgKCFzaXplc1t0ZXh0XSkge1xuICAgICAgICAgICAgLy8gZmlyc3QgbGFiZWwgd2l0aCB0aGlzIHRleHQvc3R5bGUvdGlsZSBjb21iaW5hdGlvbiwgbWFrZSBhIG5ldyBsYWJlbCBlbnRyeVxuICAgICAgICAgICAgc2l6ZXNbdGV4dF0gPSB7XG4gICAgICAgICAgICAgICAgdGV4dF9zZXR0aW5ncyxcbiAgICAgICAgICAgICAgICByZWY6IDAgLy8gIyBvZiB0aW1lcyB0aGlzIHRleHQvc3R5bGUgY29tYm8gYXBwZWFycyBpbiB0aWxlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRyYXcsIHRleHQsIHRleHRfc2V0dGluZ3Nfa2V5LCBsYXlvdXRcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgLy8gQ29tcHV0ZSB0aGUgbGFiZWwgdGV4dCwgZGVmYXVsdCBpcyB2YWx1ZSBvZiBmZWF0dXJlLnByb3BlcnRpZXMubmFtZVxuICAgIC8vIC0gU3RyaW5nIHZhbHVlIGluZGljYXRlcyBhIGZlYXR1cmUgcHJvcGVydHkgbG9vay11cCwgZS5nLiBgc2hvcnRfbmFtZWAgbWVhbnMgdXNlIGZlYXR1cmUucHJvcGVydGllcy5zaG9ydF9uYW1lXG4gICAgLy8gLSBGdW5jdGlvbiB3aWxsIHVzZSB0aGUgcmV0dXJuIHZhbHVlIGFzIHRoZSBsYWJlbCB0ZXh0IChmb3IgY3VzdG9tIGxhYmVscylcbiAgICAvLyAtIEFycmF5IChvZiBzdHJpbmdzIGFuZC9vciBmdW5jdGlvbnMpIGRlZmluZXMgYSBsaXN0IG9mIGZhbGxiYWNrcywgZXZhbHVhdGVkIGFjY29yZGluZyB0byB0aGUgYWJvdmUgcnVsZXMsXG4gICAgLy8gICB3aXRoIHRoZSBmaXJzdCBub24tbnVsbCB2YWx1ZSB1c2VkIGFzIHRoZSBsYWJlbCB0ZXh0XG4gICAgLy8gICBlLmcuIGBbbmFtZTplcywgbmFtZTplbiwgbmFtZV1gIHByZWZlcnMgU3BhbmlzaCBuYW1lcywgZm9sbG93ZWQgYnkgRW5nbGlzaCwgYW5kIGxhc3QgdGhlIGRlZmF1bHQgbG9jYWwgbmFtZVxuICAgIHBhcnNlVGV4dFNvdXJjZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgdGV4dDtcbiAgICAgICAgbGV0IHNvdXJjZSA9IGRyYXcudGV4dF9zb3VyY2UgfHwgJ25hbWUnO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHNvdXJjZS5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlW3NdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gZmVhdHVyZS5wcm9wZXJ0aWVzW3NvdXJjZVtzXV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlW3NdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBzb3VyY2Vbc10oY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIHN0b3AgaWYgd2UgZm91bmQgYSB0ZXh0IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0ZXh0ID0gZmVhdHVyZS5wcm9wZXJ0aWVzW3NvdXJjZV07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGV4dCA9IHNvdXJjZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuXG4gICAgcHJlcGFyZVRleHRMYWJlbHMgKHRpbGUsIGNvbGxpc2lvbl9ncm91cCwgcXVldWUpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudGV4dHNbdGlsZS5rZXldfHx7fSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpcnN0IGNhbGwgdG8gbWFpbiB0aHJlYWQsIGFzayBmb3IgdGV4dCBwaXhlbCBzaXplc1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0KycuY2FsY1RleHRTaXplcycsIHRoaXMudGV4dHNbdGlsZS5rZXldKS50aGVuKHRleHRzID0+IHtcblxuICAgICAgICAgICAgaWYgKHRpbGUuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFN0eWxlICR7dGhpcy5uYW1lfTogc3RvcCB0aWxlIGJ1aWxkIGJlY2F1c2UgdGlsZSB3YXMgY2FuY2VsZWQ6ICR7dGlsZS5rZXl9LCBwb3N0LWNhbGNUZXh0U2l6ZXMoKWApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV0gPSB0ZXh0cztcbiAgICAgICAgICAgIGlmICghdGV4dHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVGV4dExhYmVscyh0aWxlLmtleSwgcXVldWUpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgY29sbGlkZUFuZFJlbmRlclRleHRMYWJlbHMgKHRpbGUsIGNvbGxpc2lvbl9ncm91cCwgbGFiZWxzKSB7XG4gICAgICAgIGlmICghbGFiZWxzKSB7XG4gICAgICAgICAgICBDb2xsaXNpb24uY29sbGlkZSh7fSwgY29sbGlzaW9uX2dyb3VwLCB0aWxlLmtleSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBDb2xsaXNpb24uY29sbGlkZShsYWJlbHMsIGNvbGxpc2lvbl9ncm91cCwgdGlsZS5rZXkpLnRoZW4obGFiZWxzID0+IHtcbiAgICAgICAgICAgIGlmICh0aWxlLmNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBzdG9wIHRpbGUgYnVpbGQgYmVjYXVzZSB0aWxlIHdhcyBjYW5jZWxlZDogJHt0aWxlLmtleX0sIHBvc3QtY29sbGlkZSgpYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRleHRzID0gdGhpcy50ZXh0c1t0aWxlLmtleV07XG4gICAgICAgICAgICB0aGlzLmN1bGxUZXh0U3R5bGVzKHRleHRzLCBsYWJlbHMpO1xuXG4gICAgICAgICAgICAvLyBzZXQgYWxpZ25tZW50c1xuICAgICAgICAgICAgbGFiZWxzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gcS50ZXh0X3NldHRpbmdzX2tleTtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dHNbdGV4dF9zZXR0aW5nc19rZXldICYmIHRleHRzW3RleHRfc2V0dGluZ3Nfa2V5XVtxLnRleHRdO1xuICAgICAgICAgICAgICAgIGlmICghdGV4dF9pbmZvLnRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ24gPSB0ZXh0X2luZm8uYWxpZ24gfHwge307XG4gICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnbltxLmxhYmVsLmFsaWduXSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBzZWNvbmQgY2FsbCB0byBtYWluIHRocmVhZCwgZm9yIHJhc3Rlcml6aW5nIHRoZSBzZXQgb2YgdGV4dHNcbiAgICAgICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy5tYWluX3RocmVhZF90YXJnZXQrJy5yYXN0ZXJpemVUZXh0cycsIHRpbGUua2V5LCB0ZXh0cykudGhlbigoeyB0ZXh0cywgdGV4dHVyZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGUuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBzdG9wIHRpbGUgYnVpbGQgYmVjYXVzZSB0aWxlIHdhcyBjYW5jZWxlZDogJHt0aWxlLmtleX0sIHBvc3QtcmFzdGVyaXplVGV4dHMoKWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWxzLCB0ZXh0cywgdGV4dHVyZSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBSZW1vdmUgdW51c2VkIHRleHQvc3R5bGUgY29tYmluYXRpb25zIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHJhc3Rlcml6YXRpb25cbiAgICBjdWxsVGV4dFN0eWxlcyh0ZXh0cywgbGFiZWxzKSB7XG4gICAgICAgIC8vIENvdW50IGhvdyBtYW55IHRpbWVzIGVhY2ggdGV4dC9zdHlsZSBjb21iaW5hdGlvbiBpcyB1c2VkXG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxhYmVsID0gbGFiZWxzW2ldO1xuICAgICAgICAgICAgdGV4dHNbbGFiZWwudGV4dF9zZXR0aW5nc19rZXldW2xhYmVsLnRleHRdLnJlZisrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRleHQvc3R5bGUgY29tYmluYXRpb25zIHRoYXQgaGF2ZSBubyB2aXNpYmxlIGxhYmVsc1xuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgZm9yIChsZXQgdGV4dCBpbiB0ZXh0c1tzdHlsZV0pIHtcbiAgICAgICAgICAgICAgICAvLyBubyBsYWJlbHMgZm9yIHRoaXMgdGV4dFxuICAgICAgICAgICAgICAgIGlmICh0ZXh0c1tzdHlsZV1bdGV4dF0ucmVmIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGV4dHNbc3R5bGVdW3RleHRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICAvLyBubyBsYWJlbHMgZm9yIHRoaXMgc3R5bGVcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0ZXh0c1tzdHlsZV0pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0ZXh0c1tzdHlsZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIGZyb20gd29ya2VyLCB0byBjb21wdXRlIHRoZSBzaXplIG9mIGVhY2ggdGV4dCBzdHJpbmcsXG4gICAgLy8gd2VyZSBpdCB0byBiZSByZW5kZXJlZC4gVGhpcyBpbmZvIGlzIHRoZW4gdXNlZCB0byBwZXJmb3JtIGluaXRpYWwgbGFiZWwgY3VsbGluZywgKmJlZm9yZSpcbiAgICAvLyBsYWJlbHMgYXJlIGFjdHVhbGx5IHJlbmRlcmVkLlxuICAgIGNhbGNUZXh0U2l6ZXMgKHRleHRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbnZhcy50ZXh0U2l6ZXModGV4dHMpO1xuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWQgZnJvbSB3b3JrZXIsIHRvIGNyZWF0ZSBhdGxhcyBvZiBsYWJlbHMgZm9yIGEgdGlsZVxuICAgIHJhc3Rlcml6ZVRleHRzICh0aWxlX2tleSwgdGV4dHMpIHtcbiAgICAgICAgbGV0IGNhbnZhcyA9IG5ldyBDYW52YXNUZXh0KCk7XG4gICAgICAgIGNhbnZhcy5jbGVhclRleGNvb3JkQ2FjaGUodGlsZV9rZXkpO1xuXG4gICAgICAgIGxldCB0ZXh0dXJlX3NpemUgPSBjYW52YXMuc2V0VGV4dHVyZVRleHRQb3NpdGlvbnModGV4dHMsIHRoaXMubWF4X3RleHR1cmVfc2l6ZSwgdGlsZV9rZXkpO1xuICAgICAgICBsb2coJ3RyYWNlJywgYHRleHQgc3VtbWFyeSBmb3IgdGlsZSAke3RpbGVfa2V5fTogZml0cyBpbiAke3RleHR1cmVfc2l6ZVswXX14JHt0ZXh0dXJlX3NpemVbMV19cHhgKTtcblxuICAgICAgICAvLyBmaXRzIGluIG1heCB0ZXh0dXJlIHNpemU/XG4gICAgICAgIGlmICh0ZXh0dXJlX3NpemVbMF0gPCB0aGlzLm1heF90ZXh0dXJlX3NpemUgJiYgdGV4dHVyZV9zaXplWzFdIDwgdGhpcy5tYXhfdGV4dHVyZV9zaXplKSB7XG4gICAgICAgICAgICAvLyB1cGRhdGUgY2FudmFzIHNpemUgJiByYXN0ZXJpemUgYWxsIHRoZSB0ZXh0IHN0cmluZ3Mgd2UgbmVlZFxuICAgICAgICAgICAgY2FudmFzLnJlc2l6ZSguLi50ZXh0dXJlX3NpemUpO1xuICAgICAgICAgICAgY2FudmFzLnJhc3Rlcml6ZSh0ZXh0cywgdGV4dHVyZV9zaXplLCB0aWxlX2tleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgW1xuICAgICAgICAgICAgICAgIGBMYWJlbCBhdGxhcyBmb3IgdGlsZSAke3RpbGVfa2V5fSBpcyAke3RleHR1cmVfc2l6ZVswXX14JHt0ZXh0dXJlX3NpemVbMV19cHgsIGAsXG4gICAgICAgICAgICAgICAgYGJ1dCBtYXggR0wgdGV4dHVyZSBzaXplIGlzICR7dGhpcy5tYXhfdGV4dHVyZV9zaXplfXgke3RoaXMubWF4X3RleHR1cmVfc2l6ZX1weGBdLmpvaW4oJycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNyZWF0ZSBhIHRleHR1cmVcbiAgICAgICAgbGV0IHQgPSAnbGFiZWxzLScgKyB0aWxlX2tleSArICctJyArICh0ZXh0X3RleHR1cmVfaWQrKyk7XG4gICAgICAgIFRleHR1cmUuY3JlYXRlKHRoaXMuZ2wsIHQsIHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGNhbnZhcy5jYW52YXMsXG4gICAgICAgICAgICBmaWx0ZXJpbmc6ICdsaW5lYXInLFxuICAgICAgICAgICAgVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBUZXh0dXJlLnJldGFpbih0KTtcblxuICAgICAgICByZXR1cm4geyB0ZXh0cywgdGV4dHVyZTogdCB9OyAvLyB0ZXh0dXJlIGlzIHJldHVybmVkIGJ5IG5hbWUgKG5vdCBpbnN0YW5jZSlcbiAgICB9LFxuXG4gICAgcHJlcHJvY2Vzc1RleHQgKGRyYXcpIHtcbiAgICAgICAgLy8gRm9udCBzZXR0aW5ncyBhcmUgcmVxdWlyZWRcbiAgICAgICAgaWYgKCFkcmF3IHx8ICFkcmF3LmZvbnQgfHwgdHlwZW9mIGRyYXcuZm9udCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbG9yc1xuICAgICAgICBkcmF3LmZvbnQuZmlsbCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LmZpbGwpO1xuICAgICAgICBpZiAoZHJhdy5mb250LnN0cm9rZSkge1xuICAgICAgICAgICAgZHJhdy5mb250LnN0cm9rZS5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LnN0cm9rZS5jb2xvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IGZvbnQgYW5kIHRleHQgc3Ryb2tlIHNpemVzXG4gICAgICAgIGRyYXcuZm9udC5weF9zaXplID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmZvbnQuc2l6ZSB8fCBUZXh0U2V0dGluZ3MuZGVmYXVsdHMuc2l6ZSwgQ2FudmFzVGV4dC5mb250UGl4ZWxTaXplKTtcbiAgICAgICAgaWYgKGRyYXcuZm9udC5zdHJva2UgJiYgZHJhdy5mb250LnN0cm9rZS53aWR0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBkcmF3LmZvbnQuc3Ryb2tlLndpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmZvbnQuc3Ryb2tlLndpZHRoLCBwYXJzZUZsb2F0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9mZnNldCAoMmQgYXJyYXkpXG4gICAgICAgIGRyYXcub2Zmc2V0ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm9mZnNldCwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lm1hcChwYXJzZUZsb2F0KSkgfHwgMCk7XG5cbiAgICAgICAgLy8gQnVmZmVyICgxZCB2YWx1ZSBvciBvciAyZCBhcnJheSlcbiAgICAgICAgZHJhdy5idWZmZXIgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuYnVmZmVyLCB2ID0+IChBcnJheS5pc0FycmF5KHYpID8gdiA6IFt2LCB2XSkubWFwKHBhcnNlRmxvYXQpIHx8IDApO1xuXG4gICAgICAgIC8vIFJlcGVhdCBydWxlcyAtIGZvciB0ZXh0IGxhYmVscywgZGVmYXVsdHMgdG8gdGlsZSBzaXplXG4gICAgICAgIGRyYXcucmVwZWF0X2Rpc3RhbmNlID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnJlcGVhdF9kaXN0YW5jZSB8fCBHZW8udGlsZV9zaXplLCBwYXJzZUZsb2F0KTtcblxuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLy8gQWRkaXRpb25hbCB0ZXh0LXNwZWNpZmljIGxheW91dCBzZXR0aW5nc1xuICAgIGNvbXB1dGVUZXh0TGF5b3V0ICh0YXJnZXQsIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUsIHRleHQsIHRleHRfc2V0dGluZ3MpIHtcbiAgICAgICAgbGV0IGxheW91dCA9IHRhcmdldCB8fCB7fTtcblxuICAgICAgICAvLyBjb21tb24gc2V0dGluZ3Mgdy9wb2ludHNcbiAgICAgICAgbGF5b3V0ID0gdGhpcy5jb21wdXRlTGF5b3V0KGxheW91dCwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSk7XG5cbiAgICAgICAgLy8gdGlsZSBib3VuZGFyeSBoYW5kbGluZ1xuICAgICAgICBsYXlvdXQuY3VsbF9mcm9tX3RpbGUgPSAoZHJhdy5jdWxsX2Zyb21fdGlsZSAhPSBudWxsKSA/IGRyYXcuY3VsbF9mcm9tX3RpbGUgOiB0cnVlO1xuXG4gICAgICAgIC8vIHN0YW5kYWxvbmUgdGV4dCBjYW4gbW92ZSBpbnRvIHRpbGUgaWYgc3BlY2lmaWVkXG4gICAgICAgIGxheW91dC5tb3ZlX2ludG9fdGlsZSA9IChkcmF3Lm1vdmVfaW50b190aWxlICE9IG51bGwpID8gZHJhdy5tb3ZlX2ludG9fdGlsZSA6IHRydWU7XG5cbiAgICAgICAgLy8gcmVwZWF0IHJ1bGVzIGluY2x1ZGUgdGhlIHRleHRcbiAgICAgICAgaWYgKGxheW91dC5yZXBlYXRfZGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZ3JvdXAgKz0gJy8nICsgdGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1heCBudW1iZXIgb2Ygc3ViZGl2aXNpb25zIHRvIHRyeVxuICAgICAgICBsYXlvdXQuc3ViZGl2ID0gdGlsZS5vdmVyem9vbTI7XG5cbiAgICAgICAgbGF5b3V0LmFsaWduID0gZHJhdy5hbGlnbjtcblxuICAgICAgICAvLyB1c2VkIHRvIGZ1ZGdlIHdpZHRoIHZhbHVlIGFzIHRleHQgbWF5IG92ZXJmbG93IGJvdW5kaW5nIGJveCBpZiBpdCBoYXMgaXRhbGljLCBib2xkLCBldGMgc3R5bGVcbiAgICAgICAgbGF5b3V0Lml0YWxpYyA9ICh0ZXh0X3NldHRpbmdzLnN0eWxlICE9PSAnbm9ybWFsJyk7XG5cbiAgICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9XG5cbn07XG4iLCJpbXBvcnQgVXRpbHMgZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcblxudmFyIFRleHRTZXR0aW5ncztcblxuZXhwb3J0IGRlZmF1bHQgVGV4dFNldHRpbmdzID0ge1xuXG4gICAgLy8gQSBrZXkgZm9yIGdyb3VwaW5nIGFsbCBsYWJlbHMgb2YgdGhlIHNhbWUgdGV4dCBzdHlsZSAoZS5nLiBzYW1lIENhbnZhcyBzdGF0ZSwgdG8gbWluaW1pemUgc3RhdGUgY2hhbmdlcylcbiAgICBrZXkgKHNldHRpbmdzKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBzZXR0aW5ncy5zdHlsZSxcbiAgICAgICAgICAgIHNldHRpbmdzLndlaWdodCxcbiAgICAgICAgICAgIHNldHRpbmdzLmZhbWlseSxcbiAgICAgICAgICAgIHNldHRpbmdzLnB4X3NpemUsXG4gICAgICAgICAgICBzZXR0aW5ncy5maWxsLFxuICAgICAgICAgICAgc2V0dGluZ3Muc3Ryb2tlLFxuICAgICAgICAgICAgc2V0dGluZ3Muc3Ryb2tlX3dpZHRoLFxuICAgICAgICAgICAgc2V0dGluZ3MudHJhbnNmb3JtLFxuICAgICAgICAgICAgc2V0dGluZ3MudGV4dF93cmFwLFxuICAgICAgICAgICAgc2V0dGluZ3MubWF4X2xpbmVzLFxuICAgICAgICAgICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvXG4gICAgICAgIF0uam9pbignLycpO1xuICAgIH0sXG5cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBzdHlsZTogJ25vcm1hbCcsXG4gICAgICAgIHdlaWdodDogbnVsbCxcbiAgICAgICAgc2l6ZTogJzEycHgnLFxuICAgICAgICBweF9zaXplOiAxMixcbiAgICAgICAgZmFtaWx5OiAnSGVsdmV0aWNhJyxcbiAgICAgICAgZmlsbDogJ3doaXRlJyxcbiAgICAgICAgdGV4dF93cmFwOiAxNSxcbiAgICAgICAgbWF4X2xpbmVzOiA1LFxuICAgICAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIHN0cm9rZTogbnVsbCxcbiAgICAgICAgc3Ryb2tlX3dpZHRoOiAwXG4gICAgfSxcblxuICAgIGNvbXB1dGUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHN0eWxlID0ge307XG5cbiAgICAgICAgZHJhdy5mb250ID0gZHJhdy5mb250IHx8IHRoaXMuZGVmYXVsdHM7XG5cbiAgICAgICAgLy8gTGluZVN0cmluZyBsYWJlbHMgY2FuIGFydGljdWxhdGUgd2hpbGUgcG9pbnQgbGFiZWxzIGNhbm5vdC4gTmVlZGVkIGZvciBmdXR1cmUgdGV4dHVyZSBjb29yZGluYXRlIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgc3R5bGUuY2FuX2FydGljdWxhdGUgPSBkcmF3LmNhbl9hcnRpY3VsYXRlO1xuXG4gICAgICAgIC8vIFVzZSBmaWxsIGlmIHNwZWNpZmllZCwgb3IgZGVmYXVsdFxuICAgICAgICBzdHlsZS5maWxsID0gKGRyYXcuZm9udC5maWxsICYmIFV0aWxzLnRvQ1NTQ29sb3IoU3R5bGVQYXJzZXIuZXZhbENhY2hlZENvbG9yUHJvcGVydHkoZHJhdy5mb250LmZpbGwsIGNvbnRleHQpKSkgfHwgdGhpcy5kZWZhdWx0cy5maWxsO1xuXG4gICAgICAgIC8vIEZvbnQgcHJvcGVydGllcyBhcmUgbW9kZWxlZCBhZnRlciBDU1MgbmFtZXM6XG4gICAgICAgIC8vIC0gZmFtaWx5OiBIZWx2ZXRpY2EsIEZ1dHVyYSwgZXRjLlxuICAgICAgICAvLyAtIHNpemU6IGluIHB0LCBweCwgb3IgZW1cbiAgICAgICAgLy8gLSBzdHlsZTogbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcbiAgICAgICAgLy8gLSB3ZWlnaHQ6IG5vcm1hbCwgYm9sZCwgZXRjLlxuICAgICAgICAvLyAtIHRyYW5zZm9ybTogY2FwaXRhbGl6ZSwgdXBwZXJjYXNlLCBsb3dlcmNhc2VcbiAgICAgICAgc3R5bGUuc3R5bGUgPSBkcmF3LmZvbnQuc3R5bGUgfHwgdGhpcy5kZWZhdWx0cy5zdHlsZTtcbiAgICAgICAgc3R5bGUud2VpZ2h0ID0gZHJhdy5mb250LndlaWdodCB8fCB0aGlzLmRlZmF1bHRzLndlaWdodDtcbiAgICAgICAgaWYgKGRyYXcuZm9udC5mYW1pbHkpIHtcbiAgICAgICAgICAgIHN0eWxlLmZhbWlseSA9IGRyYXcuZm9udC5mYW1pbHk7XG4gICAgICAgICAgICBpZiAoc3R5bGUuZmFtaWx5ICE9PSB0aGlzLmRlZmF1bHRzLmZhbWlseSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmZhbWlseSArPSAnLCAnICsgdGhpcy5kZWZhdWx0cy5mYW1pbHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS5mYW1pbHkgPSB0aGlzLmRlZmF1bHRzLmZhbWlseTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IGRyYXcuZm9udC50cmFuc2Zvcm07XG5cbiAgICAgICAgLy8gb3JpZ2luYWwgc2l6ZSAobm90IGN1cnJlbnRseSB1c2VkLCBidXQgdXNlZnVsIGZvciBkZWJ1Z2dpbmcpXG4gICAgICAgIHN0eWxlLnNpemUgPSBkcmF3LmZvbnQuc2l6ZSB8fCB0aGlzLmRlZmF1bHRzLnNpemU7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlZCBwaXhlbCBzaXplXG4gICAgICAgIHN0eWxlLnB4X3NpemUgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5mb250LnB4X3NpemUsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFVzZSBzdHJva2UgaWYgc3BlY2lmaWVkXG4gICAgICAgIGlmIChkcmF3LmZvbnQuc3Ryb2tlICYmIGRyYXcuZm9udC5zdHJva2UuY29sb3IpIHtcbiAgICAgICAgICAgIHN0eWxlLnN0cm9rZSA9IFV0aWxzLnRvQ1NTQ29sb3IoU3R5bGVQYXJzZXIuZXZhbENhY2hlZENvbG9yUHJvcGVydHkoZHJhdy5mb250LnN0cm9rZS5jb2xvciwgY29udGV4dCkgfHwgdGhpcy5kZWZhdWx0cy5zdHJva2UpO1xuICAgICAgICAgICAgc3R5bGUuc3Ryb2tlX3dpZHRoID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuZm9udC5zdHJva2Uud2lkdGgsIGNvbnRleHQpIHx8IHRoaXMuZGVmYXVsdHMuc3Ryb2tlX3dpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUuZm9udF9jc3MgPSB0aGlzLmZvbnRDU1Moc3R5bGUpO1xuXG4gICAgICAgIC8vIFdvcmQgd3JhcCBhbmQgdGV4dCBhbGlnbm1lbnRcbiAgICAgICAgLy8gTm90IGEgZm9udCBwcm9wZXJ0aWVzLCBidXQgYWZmZWN0IGF0bGFzIG9mIHVuaXF1ZSB0ZXh0IHRleHR1cmVzXG4gICAgICAgIGxldCB0ZXh0X3dyYXAgPSBkcmF3LnRleHRfd3JhcDsgLy8gdXNlIGV4cGxpY2l0bHkgc2V0IHZhbHVlXG5cbiAgICAgICAgaWYgKHRleHRfd3JhcCA9PSBudWxsICYmIEdlby5nZW9tZXRyeVR5cGUoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSAhPT0gJ2xpbmUnKSB7XG4gICAgICAgICAgICAvLyBwb2ludCBsYWJlbHMgKGZvciBwb2ludCBhbmQgcG9seWdvbiBmZWF0dXJlcykgaGF2ZSB3b3JkIHdyYXAgb24gdy9kZWZhdWx0IG1heCBsZW5ndGgsXG4gICAgICAgICAgICAvLyBsaW5lIGxhYmVscyBkZWZhdWx0IG9mZlxuICAgICAgICAgICAgdGV4dF93cmFwID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldHRpbmcgdG8gJ3RydWUnIGNhdXNlcyBkZWZhdWx0IHdyYXAgdmFsdWUgdG8gYmUgdXNlZFxuICAgICAgICBpZiAodGV4dF93cmFwID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0ZXh0X3dyYXAgPSB0aGlzLmRlZmF1bHRzLnRleHRfd3JhcDtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZS50ZXh0X3dyYXAgPSB0ZXh0X3dyYXA7XG5cbiAgICAgICAgLy8gbWF4X2xpbmVzIHNldHRpbmcgdG8gdHJ1bmNhdGUgdmVyeSBsb25nIGxhYmVscyB3aXRoIGFuIGVsbGlwc2lzXG4gICAgICAgIHN0eWxlLm1heF9saW5lcyA9IGRyYXcubWF4X2xpbmVzIHx8IHRoaXMuZGVmYXVsdHMubWF4X2xpbmVzO1xuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgQ1NTLXN0eWxlIGZvbnQgc3RyaW5nICh0byBzZXQgQ2FudmFzIGRyYXcgc3RhdGUpXG4gICAgZm9udENTUyAoeyBzdHlsZSwgd2VpZ2h0LCBweF9zaXplLCBmYW1pbHkgfSkge1xuICAgICAgICByZXR1cm4gW3N0eWxlLCB3ZWlnaHQsIHB4X3NpemUgKyAncHgnLCBmYW1pbHldXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geCkgLy8gcmVtb3ZlIG51bGwgcHJvcHNcbiAgICAgICAgICAgIC5qb2luKCcgJyk7XG4gICAgfVxuXG59O1xuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuXG5pbXBvcnQge21hdDQsIHZlYzN9IGZyb20gJy4vdXRpbHMvZ2wtbWF0cml4JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZSB7XG5cbiAgICAvKipcbiAgICAgICAgVGlsZVxuICAgICAgICBAY29uc3RydWN0b3JcbiAgICAgICAgUmVxdWlyZWQgcHJvcGVydGllczpcbiAgICAgICAgY29vcmRzOiBvYmplY3Qgd2l0aCB7eCwgeSwgen0gcHJvcGVydGllcyBpZGVudGlmeWluZyB0aWxlIGNvb3JkaW5hdGUgbG9jYXRpb25cbiAgICAgICAgd29ya2VyOiB3ZWIgd29ya2VyIHRvIGhhbmRsZSB0aWxlIGNvbnN0cnVjdGlvblxuICAgICovXG4gICAgY29uc3RydWN0b3IoeyBjb29yZHMsIHN0eWxlX3pvb20sIHNvdXJjZSwgd29ya2VyLCB2aWV3IH0pIHtcbiAgICAgICAgdGhpcy53b3JrZXIgPSB3b3JrZXI7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBudWxsO1xuXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb3h5X2ZvciA9IG51bGw7XG4gICAgICAgIHRoaXMucHJveHlfZGVwdGggPSAwO1xuICAgICAgICB0aGlzLnByb3hpZWRfYXMgPSBudWxsO1xuICAgICAgICB0aGlzLmZhZGVfaW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idWlsdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IHt9O1xuXG4gICAgICAgIHRoaXMuY29vcmRzID0gVGlsZS5jb29yZGluYXRlV2l0aE1heFpvb20oY29vcmRzLCB0aGlzLnNvdXJjZS5tYXhfem9vbSk7XG4gICAgICAgIHRoaXMuc3R5bGVfem9vbSA9IHN0eWxlX3pvb207IC8vIHpvb20gbGV2ZWwgdG8gYmUgdXNlZCBmb3Igc3R5bGluZ1xuICAgICAgICB0aGlzLm92ZXJ6b29tID0gTWF0aC5tYXgodGhpcy5zdHlsZV96b29tIC0gdGhpcy5jb29yZHMueiwgMCk7IC8vIG51bWJlciBvZiBsZXZlbHMgb2Ygb3Zlcnpvb21pbmdcbiAgICAgICAgdGhpcy5vdmVyem9vbTIgPSBNYXRoLnBvdygyLCB0aGlzLm92ZXJ6b29tKTtcbiAgICAgICAgdGhpcy5rZXkgPSBUaWxlLmtleSh0aGlzLmNvb3JkcywgdGhpcy5zb3VyY2UsIHRoaXMuc3R5bGVfem9vbSk7XG4gICAgICAgIHRoaXMubWluID0gR2VvLm1ldGVyc0ZvclRpbGUodGhpcy5jb29yZHMpO1xuICAgICAgICB0aGlzLm1heCA9IEdlby5tZXRlcnNGb3JUaWxlKHt4OiB0aGlzLmNvb3Jkcy54ICsgMSwgeTogdGhpcy5jb29yZHMueSArIDEsIHo6IHRoaXMuY29vcmRzLnogfSksXG4gICAgICAgIHRoaXMuc3BhbiA9IHsgeDogKHRoaXMubWF4LnggLSB0aGlzLm1pbi54KSwgeTogKHRoaXMubWF4LnkgLSB0aGlzLm1pbi55KSB9O1xuICAgICAgICB0aGlzLmJvdW5kcyA9IHsgc3c6IHsgeDogdGhpcy5taW4ueCwgeTogdGhpcy5tYXgueSB9LCBuZTogeyB4OiB0aGlzLm1heC54LCB5OiB0aGlzLm1pbi55IH0gfTtcbiAgICAgICAgdGhpcy5jZW50ZXJfZGlzdCA9IDA7XG5cbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsID0gR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMuc3R5bGVfem9vbSk7XG4gICAgICAgIHRoaXMubWV0ZXJzX3Blcl9waXhlbF9zcSA9IHRoaXMubWV0ZXJzX3Blcl9waXhlbCAqIHRoaXMubWV0ZXJzX3Blcl9waXhlbDtcbiAgICAgICAgdGhpcy51bml0c19wZXJfcGl4ZWwgPSBHZW8udW5pdHNfcGVyX3BpeGVsIC8gdGhpcy5vdmVyem9vbTI7IC8vIGFkanVzdGVkIGZvciBvdmVyem9vbVxuICAgICAgICB0aGlzLnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbSA9IEdlby51bml0c1Blck1ldGVyKHRoaXMuY29vcmRzLnopICogdGhpcy5vdmVyem9vbTI7IC8vIGFkanVzdGVkIGZvciBvdmVyem9vbVxuXG4gICAgICAgIHRoaXMubWVzaGVzID0ge307IC8vIHJlbmRlcmFibGUgVkJPIG1lc2hlcyBrZXllZCBieSBzdHlsZVxuICAgICAgICB0aGlzLnRleHR1cmVzID0gW107IC8vIHRleHR1cmVzIHRoYXQgdGhlIHRpbGUgb3ducyAobGFiZWxzLCBldGMuKVxuICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzID0gW107IC8vIHRleHR1cmVzIHJldGFpbmVkIGJ5IHRoZSB0aWxlIGluIHRoZSBwcmV2aW91cyBidWlsZCBnZW5lcmF0aW9uXG4gICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzID0gW107IC8vIG1lc2hlcyB0aGF0IGhhdmUgYmVlbiBidWlsdCBzbyBmYXIgaW4gY3VycmVudCBidWlsZCBnZW5lcmF0aW9uXG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGlsZShzcGVjKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmQoYykge1xuICAgICAgICByZXR1cm4ge3g6IGMueCwgeTogYy55LCB6OiBjLnosIGtleTogVGlsZS5jb29yZEtleShjKX07XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkS2V5KHt4LCB5LCB6fSkge1xuICAgICAgICByZXR1cm4geCArICcvJyArIHkgKyAnLycgKyB6O1xuICAgIH1cblxuICAgIHN0YXRpYyBrZXkgKGNvb3Jkcywgc291cmNlLCBzdHlsZV96b29tKSB7XG4gICAgICAgIGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZVdpdGhNYXhab29tKGNvb3Jkcywgc291cmNlLm1heF96b29tKTtcbiAgICAgICAgaWYgKGNvb3Jkcy55IDwgMCB8fCBjb29yZHMueSA+PSAoMSA8PCBjb29yZHMueikgfHwgY29vcmRzLnogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIGN1bGwgdGlsZXMgb3V0IG9mIHJhbmdlICh4IHdpbGwgd3JhcClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3NvdXJjZS5uYW1lLCBzdHlsZV96b29tLCBjb29yZHMueCwgY29vcmRzLnksIGNvb3Jkcy56XS5qb2luKCcvJyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkaW5hdGVBdFpvb20oe3gsIHksIHosIGtleX0sIHpvb20pIHtcbiAgICAgICAgaWYgKHogIT09IHpvb20pIHtcbiAgICAgICAgICAgIGxldCB6c2NhbGUgPSBNYXRoLnBvdygyLCB6IC0gem9vbSk7XG4gICAgICAgICAgICB4ID0gTWF0aC5mbG9vcih4IC8genNjYWxlKTtcbiAgICAgICAgICAgIHkgPSBNYXRoLmZsb29yKHkgLyB6c2NhbGUpO1xuICAgICAgICAgICAgeiA9IHpvb207XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGUuY29vcmQoe3gsIHksIHp9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmRpbmF0ZVdpdGhNYXhab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pIHtcbiAgICAgICAgaWYgKG1heF96b29tICE9PSB1bmRlZmluZWQgJiYgeiA+IG1heF96b29tKSB7XG4gICAgICAgICAgICByZXR1cm4gVGlsZS5jb29yZGluYXRlQXRab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkKHt4LCB5LCB6fSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNoaWxkcmVuRm9yQ29vcmRpbmF0ZSh7eCwgeSwgeiwga2V5fSkge1xuICAgICAgICBpZiAoIVRpbGUuY29vcmRfY2hpbGRyZW5ba2V5XSkge1xuICAgICAgICAgICAgeisrO1xuICAgICAgICAgICAgeCAqPSAyO1xuICAgICAgICAgICAgeSAqPSAyO1xuICAgICAgICAgICAgVGlsZS5jb29yZF9jaGlsZHJlbltrZXldID0gW1xuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHksICAgICAgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHksICAgICAgen0pLFxuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHk6IHkrMSwgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHk6IHkrMSwgen0pXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkX2NoaWxkcmVuW2tleV07XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRGVzY2VuZGFudChwYXJlbnQsIGRlc2NlbmRhbnQpIHtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnQueiA+IHBhcmVudC56KSB7XG4gICAgICAgICAgICBsZXQge3gsIHl9ID0gVGlsZS5jb29yZGluYXRlQXRab29tKGRlc2NlbmRhbnQsIHBhcmVudC56KTtcbiAgICAgICAgICAgIHJldHVybiAocGFyZW50LnggPT09IHggJiYgcGFyZW50LnkgPT09IHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGEgc2V0IG9mIHRpbGUgaW5zdGFuY2VzICh3aGljaCBhbHJlYWR5IGhhdmUgYSBkaXN0YW5jZSBmcm9tIGNlbnRlciB0aWxlIGNvbXB1dGVkKVxuICAgIHN0YXRpYyBzb3J0KHRpbGVzKSB7XG4gICAgICAgIHJldHVybiB0aWxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWQgPSBhLmNlbnRlcl9kaXN0O1xuICAgICAgICAgICAgbGV0IGJkID0gYi5jZW50ZXJfZGlzdDtcbiAgICAgICAgICAgIHJldHVybiAoYmQgPiBhZCA/IC0xIDogKGJkID09PSBhZCA/IDAgOiAxKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZyZWUgcmVzb3VyY2VzIG93bmVkIGJ5IHRpbGVcbiAgICBmcmVlUmVzb3VyY2VzICgpIHtcbiAgICAgICAgZm9yIChsZXQgbSBpbiB0aGlzLm1lc2hlcykge1xuICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzaGVzID0ge307XG5cbiAgICAgICAgdGhpcy50ZXh0dXJlcy5mb3JFYWNoKHQgPT4gVGV4dHVyZS5yZWxlYXNlKHQpKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMuZm9yRWFjaCh0ID0+IFRleHR1cmUucmVsZWFzZSh0KSk7XG4gICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMgPSBbXTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLndvcmtlck1lc3NhZ2UoJ3NlbGYucmVtb3ZlVGlsZScsIHRoaXMua2V5KTtcbiAgICAgICAgdGhpcy5mcmVlUmVzb3VyY2VzKCk7XG4gICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcbiAgICB9XG5cbiAgICBidWlsZEFzTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogdGhpcy5rZXksXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLm5hbWUsXG4gICAgICAgICAgICBjb29yZHM6IHRoaXMuY29vcmRzLFxuICAgICAgICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgICAgICAgIG1heDogdGhpcy5tYXgsXG4gICAgICAgICAgICB1bml0c19wZXJfcGl4ZWw6IHRoaXMudW5pdHNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGhpcy5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgbWV0ZXJzX3Blcl9waXhlbF9zcTogdGhpcy5tZXRlcnNfcGVyX3BpeGVsX3NxLFxuICAgICAgICAgICAgdW5pdHNfcGVyX21ldGVyX292ZXJ6b29tOiB0aGlzLnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbSxcbiAgICAgICAgICAgIHN0eWxlX3pvb206IHRoaXMuc3R5bGVfem9vbSxcbiAgICAgICAgICAgIG92ZXJ6b29tOiB0aGlzLm92ZXJ6b29tLFxuICAgICAgICAgICAgb3Zlcnpvb20yOiB0aGlzLm92ZXJ6b29tMixcbiAgICAgICAgICAgIGdlbmVyYXRpb246IHRoaXMuZ2VuZXJhdGlvbixcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLmRlYnVnXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgd29ya2VyTWVzc2FnZSAoLi4ubWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VyLCAuLi5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICBidWlsZChnZW5lcmF0aW9uLCB7IGZhZGVfaW4gPSB0cnVlIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuICAgICAgICB0aGlzLmZhZGVfaW4gPSBmYWRlX2luO1xuICAgICAgICBpZiAoIXRoaXMubG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5idWlsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLndvcmtlck1lc3NhZ2UoJ3NlbGYuYnVpbGRUaWxlJywgeyB0aWxlOiB0aGlzLmJ1aWxkQXNNZXNzYWdlKCkgfSkuY2F0Y2goZSA9PiB7IHRocm93IGU7IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICBDYWxsZWQgb24gd29ya2VyIHRvIGNhbmNlbCBsb2FkaW5nXG4gICAgICAgIFN0YXRpYyBtZXRob2QgYmVjYXVzZSB0aGUgd29ya2VyIG9ubHkgaGFzIG9iamVjdCByZXByZXNlbnRhdGlvbnMgb2YgdGlsZSBkYXRhLCB0aGVyZSBpcyBub1xuICAgICAgICB0aWxlIGluc3RhbmNlIGNyZWF0ZWQgeWV0LlxuICAgICovXG4gICAgc3RhdGljIGNhbmNlbCh0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aWxlLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aWxlLnNvdXJjZV9kYXRhICYmIHRpbGUuc291cmNlX2RhdGEucmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHRpbGUuc291cmNlX2RhdGEucmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBnZW9tZXRyeSBmb3IgdGlsZSAtIGNhbGxlZCBieSB3ZWIgd29ya2VyXG4gICAgLy8gUmV0dXJucyBhIHNldCBvZiB0aWxlIGtleXMgdGhhdCBzaG91bGQgYmUgc2VudCB0byB0aGUgbWFpbiB0aHJlYWQgKHNvIHRoYXQgd2UgY2FuIG1pbmltaXplIGRhdGEgZXhjaGFuZ2UgYmV0d2VlbiB3b3JrZXIgYW5kIG1haW4gdGhyZWFkKVxuICAgIHN0YXRpYyBidWlsZEdlb21ldHJ5ICh0aWxlLCB7IHNjZW5lX2lkLCBsYXllcnMsIHN0eWxlcywgZ2xvYmFsIH0pIHtcbiAgICAgICAgdGlsZS5kZWJ1Zy5yZW5kZXJpbmcgPSArbmV3IERhdGUoKTtcbiAgICAgICAgdGlsZS5kZWJ1Zy5mZWF0dXJlcyA9IDA7XG5cbiAgICAgICAgbGV0IGRhdGEgPSB0aWxlLnNvdXJjZV9kYXRhO1xuXG4gICAgICAgIENvbGxpc2lvbi5zdGFydFRpbGUodGlsZS5rZXkpO1xuXG4gICAgICAgIC8vIFByb2Nlc3MgZWFjaCB0b3AtbGV2ZWwgbGF5ZXJcbiAgICAgICAgZm9yIChsZXQgbGF5ZXJfbmFtZSBpbiBsYXllcnMpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IGxheWVyc1tsYXllcl9uYW1lXTtcbiAgICAgICAgICAgIC8vIFNraXAgbGF5ZXJzIHdpdGggbm8gZGF0YSBzb3VyY2UgZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFsYXllciB8fCAhbGF5ZXIuY29uZmlnLmRhdGEpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgTGF5ZXIgJHtsYXllcl9uYW1lfSB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2VvbWV0cnkgZGF0YSBzb3VyY2UgYW5kIHdpbGwgbm90IGJlIHJlbmRlcmVkLmApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTb3VyY2UgbmFtZXMgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgIGlmIChsYXllci5jb25maWcuZGF0YS5zb3VyY2UgIT09IHRpbGUuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCBkYXRhIGZvciBvbmUgb3IgbW9yZSBsYXllcnMgZnJvbSBzb3VyY2VcbiAgICAgICAgICAgIGxldCBzb3VyY2VfbGF5ZXJzID0gVGlsZS5nZXREYXRhRm9yU291cmNlKGRhdGEsIGxheWVyLmNvbmZpZy5kYXRhLCBsYXllcl9uYW1lKTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIGZlYXR1cmVzIGluIGxheWVyXG4gICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzb3VyY2VfbGF5ZXJzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZV9sYXllciA9IHNvdXJjZV9sYXllcnNbc107XG4gICAgICAgICAgICAgICAgbGV0IGdlb20gPSBzb3VyY2VfbGF5ZXIuZ2VvbTtcbiAgICAgICAgICAgICAgICBpZiAoIWdlb20pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZiA9IDA7IGYgPCBnZW9tLmZlYXR1cmVzLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmZWF0dXJlID0gZ2VvbS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgZmVhdHVyZXMgdy9vIGdlb21ldHJ5ICh2YWxpZCBHZW9KU09OKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRleHQgPSBTdHlsZVBhcnNlci5nZXRGZWF0dXJlUGFyc2VDb250ZXh0KGZlYXR1cmUsIHRpbGUsIGdsb2JhbCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud2luZGluZyA9IHRpbGUuZGVmYXVsdF93aW5kaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNvdXJjZSA9IHRpbGUuc291cmNlOyAgICAgICAgLy8gYWRkIGRhdGEgc291cmNlIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5sYXllciA9IHNvdXJjZV9sYXllci5sYXllcjsgIC8vIGFkZCBkYXRhIHNvdXJjZSBsYXllciBuYW1lXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGRyYXcgZ3JvdXBzIGZvciB0aGlzIGZlYXR1cmVcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRyYXdfZ3JvdXBzID0gbGF5ZXIuYnVpbGREcmF3R3JvdXBzKGNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRyYXdfZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbmRlciBkcmF3IGdyb3Vwc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBncm91cF9uYW1lIGluIGRyYXdfZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXAgPSBkcmF3X2dyb3Vwc1tncm91cF9uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JvdXAudmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdG8gc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZV9uYW1lID0gZ3JvdXAuc3R5bGUgfHwgZ3JvdXBfbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHN0eWxlc1tzdHlsZV9uYW1lXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTdHlsZSAnJHtzdHlsZV9uYW1lfScgbm90IGZvdW5kLCBza2lwcGluZyBsYXllciAnJHtsYXllcl9uYW1lfSc6YCwgZ3JvdXAsIGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxheWVycyA9IGdyb3VwLmxheWVyczsgIC8vIGFkZCBtYXRjaGluZyBkcmF3IGxheWVyc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5hZGRGZWF0dXJlKGZlYXR1cmUsIGdyb3VwLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRpbGUuZGVidWcuZmVhdHVyZXMrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGlsZS5kZWJ1Zy5yZW5kZXJpbmcgPSArbmV3IERhdGUoKSAtIHRpbGUuZGVidWcucmVuZGVyaW5nO1xuXG4gICAgICAgIC8vIFNlbmQgc3R5bGVzIGJhY2sgdG8gbWFpbiB0aHJlYWQgYXMgdGhleSBmaW5pc2ggYnVpbGRpbmcsIGluIHR3byBncm91cHM6IGNvbGxpc2lvbiB2cy4gbm9uLWNvbGxpc2lvblxuICAgICAgICBsZXQgdGlsZV9zdHlsZXMgPSB0aGlzLnN0eWxlc0ZvclRpbGUodGlsZS5rZXksIHN0eWxlcykubWFwKHMgPT4gc3R5bGVzW3NdKTtcbiAgICAgICAgVGlsZS5zZW5kU3R5bGVHcm91cHModGlsZSwgdGlsZV9zdHlsZXMsIHsgc2NlbmVfaWQgfSwgc3R5bGUgPT4gc3R5bGUuY29sbGlzaW9uID8gJ2NvbGxpc2lvbicgOiAnbm9uLWNvbGxpc2lvbicpO1xuICAgICAgICAvLyBUaWxlLnNlbmRTdHlsZUdyb3Vwcyh0aWxlLCB0aWxlX3N0eWxlcywgeyBzY2VuZV9pZCB9LCBzdHlsZSA9PiBzdHlsZS5uYW1lKTsgLy8gY2FsbCBmb3IgZWFjaCBzdHlsZVxuICAgICAgICAvLyBUaWxlLnNlbmRTdHlsZUdyb3Vwcyh0aWxlLCB0aWxlX3N0eWxlcywgeyBzY2VuZV9pZCB9LCBzdHlsZSA9PiAnc3R5bGVzJyk7IC8vIGFsbCBzdHlsZXMgaW4gc2luZ2xlIGNhbGwgKHByZXZpb3VzIGJlaGF2aW9yKVxuICAgIH1cblxuICAgIHN0YXRpYyBzdHlsZXNGb3JUaWxlICh0aWxlX2tleSwgc3R5bGVzKSB7XG4gICAgICAgIGxldCB0aWxlX3N0eWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzIGluIHN0eWxlcykge1xuICAgICAgICAgICAgaWYgKHN0eWxlc1tzXS5oYXNEYXRhRm9yVGlsZSh0aWxlX2tleSkpIHtcbiAgICAgICAgICAgICAgICB0aWxlX3N0eWxlcy5wdXNoKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWxlX3N0eWxlcztcbiAgICB9XG5cbiAgICAvLyBTZW5kIGdyb3VwcyBvZiBzdHlsZXMgYmFjayB0byBtYWluIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgKGFzIHRoZXkgZmluaXNoIGJ1aWxkaW5nKSxcbiAgICAvLyBncm91cGVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgIHN0YXRpYyBzZW5kU3R5bGVHcm91cHModGlsZSwgc3R5bGVzLCB7IHNjZW5lX2lkIH0sIGdyb3VwX2J5KSB7XG4gICAgICAgIC8vIEdyb3VwIHN0eWxlc1xuICAgICAgICBsZXQgZ3JvdXBzID0ge307XG4gICAgICAgIHN0eWxlcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgbGV0IGdyb3VwX25hbWUgPSBncm91cF9ieShzKTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IGdyb3Vwc1tncm91cF9uYW1lXSB8fCBbXTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXS5wdXNoKHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJvZ3Jlc3MgPSB7IHN0YXJ0OiB0cnVlIH07XG4gICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBncm91cF9uYW1lIGluIGdyb3Vwcykge1xuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGdyb3Vwc1tncm91cF9uYW1lXTtcblxuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGdyb3VwLm1hcChzdHlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZS5lbmREYXRhKHRpbGUpLnRoZW4oc3R5bGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUubWVzaF9kYXRhW3N0eWxlLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogc3R5bGVfZGF0YS52ZXJ0ZXhfZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzOiBzdHlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHN0eWxlX2RhdGEudW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVzOiBzdHlsZV9kYXRhLnRleHR1cmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYEZpbmlzaGVkIHN0eWxlIGdyb3VwICcke2dyb3VwX25hbWV9JyBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIGdyb3VwIGFuZCBjaGVjayBpZiBhbGwgZ3JvdXBzIGZpbmlzaGVkXG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5ldmVyeShnID0+IGdyb3Vwc1tnXS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgbWVzaGVzIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaWxlTWFuYWdlcl8ke3NjZW5lX2lkfS5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKHsgdGlsZTogVGlsZS5zbGljZSh0aWxlLCBbJ21lc2hfZGF0YSddKSwgcHJvZ3Jlc3MgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc3RhcnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9OyAvLyByZXNldCBzbyBlYWNoIGdyb3VwIHNlbmRzIHNlcGFyYXRlIHNldCBvZiBzdHlsZSBtZXNoZXNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90aGluZyB0byBidWlsZCwgcmV0dXJuIGVtcHR5IHRpbGUgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICBgVGlsZU1hbmFnZXJfJHtzY2VuZV9pZH0uYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkYCxcbiAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMoeyB0aWxlOiBUaWxlLnNsaWNlKHRpbGUpLCBwcm9ncmVzczogeyBzdGFydDogdHJ1ZSwgZG9uZTogdHJ1ZSB9IH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAgICBSZXRyaWV2ZXMgZ2VvbWV0cnkgZnJvbSBhIHRpbGUgYWNjb3JkaW5nIHRvIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvblxuICAgICAgICBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aDpcbiAgICAgICAgICAgIGxheWVyOiBzb3VyY2UgbGF5ZXIgbmFtZVxuICAgICAgICAgICAgZ2VvbTogR2VvSlNPTiBGZWF0dXJlQ29sbGVjdGlvblxuICAgICovXG4gICAgc3RhdGljIGdldERhdGFGb3JTb3VyY2UgKHNvdXJjZV9kYXRhLCBzb3VyY2VfY29uZmlnLCBkZWZhdWx0X2xheWVyID0gbnVsbCkge1xuICAgICAgICB2YXIgbGF5ZXJzID0gW107XG5cbiAgICAgICAgaWYgKHNvdXJjZV9jb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHNvdXJjZSBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGlmICghc291cmNlX2NvbmZpZy5sYXllciAmJiBzb3VyY2VfZGF0YS5sYXllcnMuX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGdlb206IHNvdXJjZV9kYXRhLmxheWVycy5fZGVmYXVsdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHJlcXVlc3RlZCBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGVsc2UgaWYgKCFzb3VyY2VfY29uZmlnLmxheWVyICYmIGRlZmF1bHRfbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyOiBkZWZhdWx0X2xheWVyLFxuICAgICAgICAgICAgICAgICAgICBnZW9tOiBzb3VyY2VfZGF0YS5sYXllcnNbZGVmYXVsdF9sYXllcl1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGEgbGF5ZXIgaXMgc3BlY2lmaWVkIGJ5IG5hbWUsIHVzZSBpdFxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZV9jb25maWcubGF5ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsYXllcjogc291cmNlX2NvbmZpZy5sYXllcixcbiAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW3NvdXJjZV9jb25maWcubGF5ZXJdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBtdWx0aXBsZSBsYXllcnMgYXJlIHNwZWNpZmllZCBieSBuYW1lLCBjb21iaW5lIHRoZW1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlX2NvbmZpZy5sYXllcikpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfY29uZmlnLmxheWVyLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXSAmJiBzb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdLmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGNvbXBsZXRlcyBwcm9jZXNzaW5nXG4gICAgICAgZm9yIGEgc2luZ2xlIHRpbGUuXG4gICAgKi9cbiAgICBidWlsZE1lc2hlcyhzdHlsZXMsIHByb2dyZXNzKSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWJ1Z1xuICAgICAgICB0aGlzLmRlYnVnLmdlb21ldHJpZXMgPSAwO1xuICAgICAgICB0aGlzLmRlYnVnLmJ1ZmZlcl9zaXplID0gMDtcblxuICAgICAgICAvLyBDcmVhdGUgVkJPc1xuICAgICAgICBsZXQgbWVzaGVzID0ge30sIHRleHR1cmVzID0gW107IC8vIG5ldyBkYXRhIHRvIGJlIGFkZGVkIHRvIHRpbGVcbiAgICAgICAgbGV0IG1lc2hfZGF0YSA9IHRoaXMubWVzaF9kYXRhO1xuICAgICAgICBpZiAobWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzIGluIG1lc2hfZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5idWZmZXJfc2l6ZSArPSBtZXNoX2RhdGFbc10udmVydGV4X2RhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuYnVmZmVyX3NpemUgKz0gbWVzaF9kYXRhW3NdLnZlcnRleF9lbGVtZW50cy5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3R5bGVzW3NdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgQ291bGQgbm90IGNyZWF0ZSBtZXNoIGJlY2F1c2Ugc3R5bGUgJyR7c30nIG5vdCBmb3VuZCwgZm9yIHRpbGUgJHt0aGlzLmtleX0sIGFib3J0aW5nIHRpbGVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc2hlc1tzXSA9IHN0eWxlc1tzXS5tYWtlTWVzaChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEsIG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMsIG1lc2hfZGF0YVtzXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuZ2VvbWV0cmllcyArPSBtZXNoZXNbc10uZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVzXG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgdmFsaWQgZm9yIGEgc2luZ2xlIHRleHR1cmUgdG8gYmUgcmVmZXJlbmNlZCBmcm9tIG11bHRpcGxlIHN0eWxlc1xuICAgICAgICAgICAgICAgIC8vIChlLmcuIHNhbWUgcmFzdGVyIHRleHR1cmUgYXR0YWNoZWQgdG8gbXVsdGlwbGUgc291cmNlcykuIFRoaXMgbWVhbnMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIG1heSBiZSBhZGRlZCB0byB0aGUgdGlsZSdzIHRleHR1cmUgbGlzdCBtb3JlIHRoYW4gb25jZSwgd2hpY2ggZW5zdXJlc1xuICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgaXMgcHJvcGVybHkgcmVsZWFzZWQgKHRvIG1hdGNoIGl0cyByZXRhaW4gY291bnQpLlxuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXMucHVzaCguLi5tZXNoX2RhdGFbc10udGV4dHVyZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5tZXNoX2RhdGE7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0cmFja2luZyBmb3IgdGhpcyB0aWxlIGdlbmVyYXRpb25cbiAgICAgICAgaWYgKHByb2dyZXNzLnN0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLm5ld19tZXNoX3N0eWxlcyA9IFtdOyAvLyBrZWVwIHRyYWNrIG9mIHdoaWNoIG1lc2hlcyB3ZXJlIGJ1aWx0IGFzIHBhcnQgb2YgY3VycmVudCBnZW5lcmF0aW9uXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzID0gWy4uLnRoaXMudGV4dHVyZXNdOyAvLyBjb3B5IG9sZCBsaXN0IG9mIHRleHR1cmVzXG4gICAgICAgICAgICB0aGlzLnRleHR1cmVzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXcgbWVzaGVzXG4gICAgICAgIGZvciAobGV0IG0gaW4gbWVzaGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNoZXNbbV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc2hlc1ttXS5kZXN0cm95KCk7IC8vIGZyZWUgb2xkIG1lc2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWVzaGVzW21dID0gbWVzaGVzW21dOyAvLyBzZXQgbmV3IG1lc2hcbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzLnB1c2gobSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXcgdGV4dHVyZXNcbiAgICAgICAgdGhpcy50ZXh0dXJlcy5wdXNoKC4uLnRleHR1cmVzKTtcblxuICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgLy8gUmVsZWFzZSB1bi1yZXBsYWNlZCBtZXNoZXMgKGV4aXN0aW5nIGluIHByZXZpb3VzIGdlbmVyYXRpb24sIGJ1dCB3ZXJlbid0IGJ1aWx0IGZvciB0aGlzIG9uZSlcbiAgICAgICAgICAgIGZvciAobGV0IG0gaW4gdGhpcy5tZXNoZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXdfbWVzaF9zdHlsZXMuaW5kZXhPZihtKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzID0gW107XG5cbiAgICAgICAgICAgIC8vIFJlbGVhc2Ugb2xkIHRleHR1cmVzXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzLmZvckVhY2godCA9PiBUZXh0dXJlLnJlbGVhc2UodCkpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c190ZXh0dXJlcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmRlYnVnLmdlb21fcmF0aW8gPSAodGhpcy5kZWJ1Zy5nZW9tZXRyaWVzIC8gdGhpcy5kZWJ1Zy5mZWF0dXJlcykudG9GaXhlZCgxKTtcbiAgICAgICAgICAgIHRoaXMucHJpbnREZWJ1ZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgY29tcGxldGVzIHByb2Nlc3NpbmcsIGJ1dCB0aWxlIGhhcyBzaW5jZSBiZWVuIGRpc2NhcmRlZFxuICAgICAgICBGcmVlcyByZXNvdXJjZXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIHRpbGUgb2JqZWN0LlxuICAgICAgICBTdGF0aWMgbWV0aG9kIGJlY2F1c2UgdGhlIHRpbGUgb2JqZWN0IG5vIGxvbmdlciBleGlzdHMgKHRoZSB0aWxlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdvcmtlciBpcyBwYXNzZWQgaW5zdGVhZCkuXG4gICAgKi9cbiAgICBzdGF0aWMgYWJvcnRCdWlsZCAodGlsZSkge1xuICAgICAgICAvLyBSZWxlYXNlcyBtZXNoZXNcbiAgICAgICAgaWYgKHRpbGUubWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzIGluIHRpbGUubWVzaF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHR1cmVzID0gdGlsZS5tZXNoX2RhdGFbc10udGV4dHVyZXM7XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmVzLmZvckVhY2godCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgcmVsZWFzaW5nIHRleHR1cmUgJHt0fSBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUucmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcmVsYXRpdmUgdG8gdmlld1xuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSB0aGlzLmNvb3JkcztcbiAgICAgICAgaWYgKGNvb3Jkcy56ICE9PSB0aGlzLnZpZXcuY2VudGVyLnRpbGUueikge1xuICAgICAgICAgICAgY29vcmRzID0gVGlsZS5jb29yZGluYXRlQXRab29tKGNvb3JkcywgdGhpcy52aWV3LmNlbnRlci50aWxlLnopO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2VudGVyX2Rpc3QgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGNvb3Jkcy54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gY29vcmRzLnkpO1xuICAgIH1cblxuICAgIC8vIFNldCBhcyBhIHByb3h5IHRpbGUgZm9yIGFub3RoZXIgdGlsZVxuICAgIHNldFByb3h5Rm9yICh0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IgPSB0aGlzLnByb3h5X2ZvciB8fCBbXTtcbiAgICAgICAgICAgIHRoaXMucHJveHlfZm9yLnB1c2godGlsZSk7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2RlcHRoID0gMTsgLy8gZHJhdyBwcm94aWVzIGEgaGFsZi1sYXllciBiYWNrIChvcmRlciBpcyBzY2FsZWQgMnggdG8gYXZvaWQgaW50ZWdlciB0cnVuY2F0aW9uKVxuICAgICAgICAgICAgdGlsZS5wcm94aWVkX2FzID0gKHRpbGUuc3R5bGVfem9vbSA+IHRoaXMuc3R5bGVfem9vbSA/ICdjaGlsZCcgOiAncGFyZW50Jyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9kZXB0aCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm94eSB0aWxlcyBvbmx5IG5lZWQgdG8gcmVuZGVyIGEgc3BlY2lmaWMgc3R5bGUgaWYgYW55IG9mIHRoZSB0aWxlcyB0aGV5IGFyZSBwcm94eWluZyAqZm9yKlxuICAgIC8vIGhhdmVuJ3QgZmluaXNoZWQgbG9hZGluZyB0aGF0IHN0eWxlIHlldC4gSWYgYWxsIHByb3hpZWQgdGlsZXMgKmhhdmUqIGRhdGEgZm9yIHRoYXQgc3R5bGUsIHRoZW4gaXQnc1xuICAgIC8vIHNhZmUgdG8gaGlkZSB0aGUgcHJveHkgdGlsZSdzIHZlcnNpb24uXG4gICAgc2hvdWxkUHJveHlGb3JTdHlsZSAoc3R5bGUpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnByb3h5X2ZvciB8fCB0aGlzLnByb3h5X2Zvci5zb21lKHQgPT4gdC5tZXNoZXNbc3R5bGVdID09IG51bGwpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtb2RlbCBtYXRyaXggYW5kIHRpbGUgdW5pZm9ybXNcbiAgICBzZXR1cFByb2dyYW0gKHsgbW9kZWwsIG1vZGVsMzIgfSwgcHJvZ3JhbSkge1xuICAgICAgICAvLyBUaWxlIG9yaWdpblxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzRmdicsICd1X3RpbGVfb3JpZ2luJywgW3RoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMuc3R5bGVfem9vbSwgdGhpcy5jb29yZHMuel0pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfdGlsZV9wcm94eV9kZXB0aCcsIHRoaXMucHJveHlfZGVwdGgpO1xuXG4gICAgICAgIC8vIE1vZGVsIC0gdHJhbnNmb3JtIHRpbGUgc3BhY2UgaW50byB3b3JsZCBzcGFjZSAobWV0ZXJzLCBhYnNvbHV0ZSBtZXJjYXRvciBwb3NpdGlvbilcbiAgICAgICAgbWF0NC5pZGVudGl0eShtb2RlbCk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG1vZGVsLCBtb2RlbCwgdmVjMy5mcm9tVmFsdWVzKHRoaXMubWluLngsIHRoaXMubWluLnksIDApKTtcbiAgICAgICAgbWF0NC5zY2FsZShtb2RlbCwgbW9kZWwsIHZlYzMuZnJvbVZhbHVlcyh0aGlzLnNwYW4ueCAvIEdlby50aWxlX3NjYWxlLCAtMSAqIHRoaXMuc3Bhbi55IC8gR2VvLnRpbGVfc2NhbGUsIDEpKTsgLy8gc2NhbGUgdGlsZSBsb2NhbCBjb29yZHMgdG8gbWV0ZXJzXG4gICAgICAgIG1hdDQuY29weShtb2RlbDMyLCBtb2RlbCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfbW9kZWwnLCBtb2RlbDMyKTtcblxuICAgICAgICAvLyBGYWRlIGluIGxhYmVscyBhY2NvcmRpbmcgdG8gcHJveHkgc3RhdHVzLCBhdm9pZGluZyBcImZsaWNrZXJpbmdcIiB3aGVyZVxuICAgICAgICAvLyBsYWJlbHMgcXVpY2tseSBnbyBmcm9tIGludmlzaWJsZSBiYWNrIHRvIHZpc2libGVcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxaScsICd1X3RpbGVfZmFkZV9pbicsIHRoaXMuZmFkZV9pbiAmJiB0aGlzLnByb3hpZWRfYXMgIT09ICdjaGlsZCcpO1xuICAgIH1cblxuICAgIC8vIFNsaWNlIGEgc3Vic2V0IG9mIGtleXMgb3V0IG9mIGEgdGlsZVxuICAgIC8vIEluY2x1ZGVzIGEgbWluaW11bSBzZXQgb2YgcHJlLWRlZmluZWQga2V5cyBmb3IgbG9hZCBzdGF0ZSwgZGVidWcuIGV0Yy5cbiAgICAvLyBXZSB1c2UgdGhpcyB0byBzZW5kIGEgc3Vic2V0IG9mIHRoZSB0aWxlIGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkLCB0byBtaW5pbWl6ZSB1bm5lY2Vzc2FyeSBkYXRhIHRyYW5zZmVyXG4gICAgLy8gKGUuZy4gdmVyeSBsYXJnZSBpdGVtcyBsaWtlIGZlYXR1cmUgZ2VvbWV0cnkgYXJlIG5vdCBuZWVkZWQgb24gdGhlIG1haW4gdGhyZWFkKVxuICAgIHN0YXRpYyBzbGljZSAodGlsZSwga2V5cykge1xuICAgICAgICBsZXQga2VlcCA9IFtcbiAgICAgICAgICAgICdrZXknLFxuICAgICAgICAgICAgJ2xvYWRpbmcnLFxuICAgICAgICAgICAgJ2xvYWRlZCcsXG4gICAgICAgICAgICAnZ2VuZXJhdGlvbicsXG4gICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgJ2RlYnVnJ1xuICAgICAgICBdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgICAgICAgICAga2VlcC5wdXNoKC4uLmtleXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIHRpbGUgc3Vic2V0XG4gICAgICAgIHZhciB0aWxlX3N1YnNldCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBrPTA7IGsgPCBrZWVwLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBrZWVwW2tdO1xuICAgICAgICAgICAgdGlsZV9zdWJzZXRba2V5XSA9IHRpbGVba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aWxlX3N1YnNldDtcbiAgICB9XG5cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb3RoZXIpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdrZXknKSB7XG4gICAgICAgICAgICAgICAgdGhpc1trZXldID0gb3RoZXJba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcmludERlYnVnICgpIHtcbiAgICAgICAgbG9nKCdkZWJ1ZycsIGBUaWxlOiBkZWJ1ZyBmb3IgJHt0aGlzLmtleX06IFsgICR7SlNPTi5zdHJpbmdpZnkodGhpcy5kZWJ1Zyl9IF1gKTtcbiAgICB9XG5cbn1cblxuVGlsZS5jb29yZF9jaGlsZHJlbiA9IHt9OyAvLyBvbmx5IGFsbG9jYXRlIGNoaWxkcmVuIGNvb3JkaW5hdGVzIG9uY2UgcGVyIGNvb3JkaW5hdGVcbiIsImltcG9ydCBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgVGlsZVB5cmFtaWQgZnJvbSAnLi90aWxlX3B5cmFtaWQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yKHsgc2NlbmUsIHZpZXcgfSkge1xuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMudGlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5weXJhbWlkID0gbmV3IFRpbGVQeXJhbWlkKCk7XG4gICAgICAgIHRoaXMudmlzaWJsZV9jb29yZHMgPSB7fTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzID0gW107XG4gICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0gW107XG5cbiAgICAgICAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHRoaXMgb2JqZWN0IHRvIGJlIGNhbGxlZCBmcm9tIHdvcmtlciB0aHJlYWRzXG4gICAgICAgIHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0ID0gWydUaWxlTWFuYWdlcicsIHRoaXMuc2NlbmUuaWRdLmpvaW4oJ18nKTtcbiAgICAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCwgdGhpcyk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHRpbGUuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLnB5cmFtaWQgPSBudWxsO1xuICAgICAgICB0aGlzLnZpc2libGVfY29vcmRzID0ge307XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3JkcyA9IFtdO1xuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3ID0gbnVsbDtcbiAgICB9XG5cbiAgICBrZWVwVGlsZSh0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZXNbdGlsZS5rZXldID0gdGlsZTtcbiAgICAgICAgdGhpcy5weXJhbWlkLmFkZFRpbGUodGlsZSk7XG4gICAgfVxuXG4gICAgaGFzVGlsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZXNba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZvcmdldFRpbGUoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1RpbGUoa2V5KSkge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgICAgICB0aGlzLnB5cmFtaWQucmVtb3ZlVGlsZSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgIHRoaXMudGlsZUJ1aWxkU3RvcChrZXkpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhIHNpbmdsZSB0aWxlXG4gICAgcmVtb3ZlVGlsZShrZXkpIHtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0aWxlIHVubG9hZCBmb3IgJHtrZXl9YCk7XG5cbiAgICAgICAgdmFyIHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG5cbiAgICAgICAgaWYgKHRpbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGlsZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcmdldFRpbGUodGlsZS5rZXkpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG5cbiAgICAvLyBSdW4gYSBmdW5jdGlvbiBvbiBlYWNoIHRpbGVcbiAgICBmb3JFYWNoVGlsZShmdW5jKSB7XG4gICAgICAgIGZvciAobGV0IHQgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgZnVuYyh0aGlzLnRpbGVzW3RdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IHBhc3MgYSBmaWx0ZXIgY29uZGl0aW9uXG4gICAgcmVtb3ZlVGlsZXMoZmlsdGVyKSB7XG4gICAgICAgIGxldCByZW1vdmVfdGlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNbdF07XG4gICAgICAgICAgICBpZiAoZmlsdGVyKHRpbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlX3RpbGVzLnB1c2godCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgcmVtb3ZlX3RpbGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gcmVtb3ZlX3RpbGVzW3JdO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaWxlKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVUaWxlc0ZvclZpZXcoKSB7XG4gICAgICAgIC8vIEZpbmQgdmlzaWJsZSB0aWxlcyBhbmQgbG9hZCBuZXcgb25lc1xuICAgICAgICBsZXQgcHJldl9jb29yZHMgPSBPYmplY3Qua2V5cyh0aGlzLnZpc2libGVfY29vcmRzKTtcbiAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3JkcyA9IHt9O1xuICAgICAgICBsZXQgdGlsZV9jb29yZHMgPSB0aGlzLnZpZXcuZmluZFZpc2libGVUaWxlQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgdGlsZV9jb29yZHMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IHRpbGVfY29vcmRzW2NdO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZUNvb3JkaW5hdGUoY29vcmRzKTtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZV9jb29yZHNbY29vcmRzLmtleV0gPSBjb29yZHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB2aXNpYmxlIGNvb3JkcyBjaGFuZ2VkXG4gICAgICAgIC8vIFRPRE86IG1vdmUgdG8gYSBuZXcgdmlldyBtYW5hZ2VyIG9iamVjdFxuICAgICAgICBsZXQgbmV3X2Nvb3JkcyA9IE9iamVjdC5rZXlzKHRoaXMudmlzaWJsZV9jb29yZHMpO1xuICAgICAgICBsZXQgY29vcmRzX2NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHByZXZfY29vcmRzLmxlbmd0aCAhPT0gbmV3X2Nvb3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvb3Jkc19jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByZXZfY29vcmRzLnNvcnQoKTtcbiAgICAgICAgICAgIG5ld19jb29yZHMuc29ydCgpO1xuICAgICAgICAgICAgaWYgKCFwcmV2X2Nvb3Jkcy5ldmVyeSgoYywgaSkgPT4gbmV3X2Nvb3Jkc1tpXSA9PT0gYykpIHtcbiAgICAgICAgICAgICAgICBjb29yZHNfY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVRpbGVTdGF0ZXMoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVUaWxlU3RhdGVzICgpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSh0aWxlKTtcbiAgICAgICAgICAgIHRpbGUudXBkYXRlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubG9hZFF1ZXVlZENvb3JkaW5hdGVzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUHJveHlUaWxlcygpO1xuICAgICAgICB0aGlzLnZpZXcucHJ1bmVUaWxlc0ZvclZpZXcoKTtcbiAgICAgICAgdGhpcy51cGRhdGVSZW5kZXJhYmxlVGlsZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVTdHlsZXMoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQcm94eVRpbGVzICgpIHtcbiAgICAgICAgaWYgKHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgcHJveGllc1xuICAgICAgICB0aGlzLmZvckVhY2hUaWxlKHRpbGUgPT4gdGlsZS5zZXRQcm94eUZvcihudWxsKSk7XG5cbiAgICAgICAgbGV0IHByb3h5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9yRWFjaFRpbGUodGlsZSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGUudmlzaWJsZSAmJiAhdGlsZS5idWlsdCAmJiB0aWxlLmNvb3Jkcy56ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnB5cmFtaWQuZ2V0QW5jZXN0b3IodGlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5zZXRQcm94eUZvcih0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmICF0aWxlLmJ1aWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy5weXJhbWlkLmdldERlc2NlbmRhbnRzKHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBkZXNjZW5kYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHNbaV0uc2V0UHJveHlGb3IodGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm94eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcHJveHkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVWaXNpYmlsaXR5KHRpbGUpIHtcbiAgICAgICAgdGlsZS52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aWxlLnN0eWxlX3pvb20gPT09IHRoaXMudmlldy50aWxlX3pvb20pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpc2libGVfY29vcmRzW3RpbGUuY29vcmRzLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aWxlLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYnJ1dGUgZm9yY2VcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy52aXNpYmxlX2Nvb3Jkcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGlsZS5pc0Rlc2NlbmRhbnQodGlsZS5jb29yZHMsIHRoaXMudmlzaWJsZV9jb29yZHNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IGFyZW4ndCB2aXNpYmxlLCBhbmQgZmxhZyByZW1haW5pbmcgdmlzaWJsZSBvbmVzIHRvIGJlIHVwZGF0ZWQgKGZvciBsb2FkaW5nLCBwcm94eSwgZXRjLilcbiAgICBwcnVuZVRvVmlzaWJsZVRpbGVzICgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVUaWxlcyh0aWxlID0+ICF0aWxlLnZpc2libGUpO1xuICAgIH1cblxuICAgIGdldFJlbmRlcmFibGVUaWxlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmFibGVfdGlsZXM7XG4gICAgfVxuXG4gICAgdXBkYXRlUmVuZGVyYWJsZVRpbGVzKCkge1xuICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNbdF07XG4gICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmIHRpbGUubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJhYmxlX3RpbGVzLnB1c2godGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyYWJsZV90aWxlcztcbiAgICB9XG5cbiAgICBnZXRBY3RpdmVTdHlsZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVfc3R5bGVzO1xuICAgIH1cblxuICAgIHVwZGF0ZUFjdGl2ZVN0eWxlcyAoKSB7XG4gICAgICAgIGxldCB0aWxlcyA9IHRoaXMucmVuZGVyYWJsZV90aWxlcztcbiAgICAgICAgbGV0IGFjdGl2ZSA9IHt9O1xuICAgICAgICBmb3IgKGxldCB0PTA7IHQgPCB0aWxlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aWxlc1t0XTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRpbGUubWVzaGVzKS5mb3JFYWNoKHMgPT4gYWN0aXZlW3NdID0gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0gT2JqZWN0LmtleXMoYWN0aXZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlX3N0eWxlcztcbiAgICB9XG5cbiAgICBpc0xvYWRpbmdWaXNpYmxlVGlsZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnRpbGVzKS5zb21lKGsgPT4gdGhpcy50aWxlc1trXS52aXNpYmxlICYmICF0aGlzLnRpbGVzW2tdLmJ1aWx0KTtcbiAgICB9XG5cbiAgICAvLyBRdWV1ZSBhIHRpbGUgZm9yIGxvYWRcbiAgICBxdWV1ZUNvb3JkaW5hdGUoY29vcmRzKSB7XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3Jkc1t0aGlzLnF1ZXVlZF9jb29yZHMubGVuZ3RoXSA9IGNvb3JkcztcbiAgICB9XG5cbiAgICAvLyBMb2FkIGFsbCBxdWV1ZWQgdGlsZXNcbiAgICBsb2FkUXVldWVkQ29vcmRpbmF0ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlZF9jb29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IHF1ZXVlZCB0aWxlcyBmcm9tIGNlbnRlciB0aWxlXG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3Jkcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWQgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGEueCkgKyBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueSAtIGEueSk7XG4gICAgICAgICAgICBsZXQgYmQgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGIueCkgKyBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueSAtIGIueSk7XG4gICAgICAgICAgICByZXR1cm4gKGJkID4gYWQgPyAtMSA6IChiZCA9PT0gYWQgPyAwIDogMSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzLmZvckVhY2goY29vcmRzID0+IHRoaXMubG9hZENvb3JkaW5hdGUoY29vcmRzKSk7XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3JkcyA9IFtdO1xuICAgIH1cblxuICAgIC8vIExvYWQgYWxsIHRpbGVzIHRvIGNvdmVyIGEgZ2l2ZW4gbG9naWNhbCB0aWxlIGNvb3JkaW5hdGVcbiAgICBsb2FkQ29vcmRpbmF0ZShjb29yZHMpIHtcbiAgICAgICAgLy8gU2tpcCBpZiBub3QgYXQgY3VycmVudCBzY2VuZSB6b29tXG4gICAgICAgIGlmIChjb29yZHMueiAhPT0gdGhpcy52aWV3LmNlbnRlci50aWxlLnopIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSBuZWNlc3NhcnkgdGlsZXMgZm9yIGVhY2ggc291cmNlXG4gICAgICAgIGZvciAobGV0IHMgaW4gdGhpcy5zY2VuZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zY2VuZS5zb3VyY2VzW3NdO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBzb3VyY2Ugc2hvdWxkIGJ1aWxkIHRoaXMgdGlsZVxuICAgICAgICAgICAgaWYgKCFzb3VyY2UuYnVpbGRzX2dlb21ldHJ5X3RpbGVzIHx8ICFzb3VyY2UuaW5jbHVkZXNUaWxlKGNvb3JkcywgdGhpcy52aWV3LnRpbGVfem9vbSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGtleSA9IFRpbGUua2V5KGNvb3Jkcywgc291cmNlLCB0aGlzLnZpZXcudGlsZV96b29tKTtcbiAgICAgICAgICAgIGlmIChrZXkgJiYgIXRoaXMuaGFzVGlsZShrZXkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRpbGUgPSBUaWxlLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgY29vcmRzLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZXI6IHRoaXMuc2NlbmUuZ2V0V29ya2VyRm9yRGF0YVNvdXJjZShzb3VyY2UpLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZV96b29tOiB0aGlzLnZpZXcuc3R5bGVab29tKGNvb3Jkcy56KSxcbiAgICAgICAgICAgICAgICAgICAgdmlldzogdGhpcy52aWV3XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmtlZXBUaWxlKHRpbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRUaWxlKHRpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU29ydCBhbmQgYnVpbGQgYSBsaXN0IG9mIHRpbGVzXG4gICAgYnVpbGRUaWxlcyh0aWxlcykge1xuICAgICAgICBUaWxlLnNvcnQodGlsZXMpLmZvckVhY2godGlsZSA9PiB0aGlzLmJ1aWxkVGlsZSh0aWxlKSk7XG4gICAgICAgIHRoaXMuY2hlY2tCdWlsZFF1ZXVlKCk7XG4gICAgfVxuXG4gICAgYnVpbGRUaWxlKHRpbGUsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50aWxlQnVpbGRTdGFydCh0aWxlLmtleSk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSh0aWxlKTtcbiAgICAgICAgdGlsZS51cGRhdGUoKTtcbiAgICAgICAgdGlsZS5idWlsZCh0aGlzLnNjZW5lLmdlbmVyYXRpb24sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIGEgd2ViIHdvcmtlciBjb21wbGV0ZXMgcHJvY2Vzc2luZyBmb3IgYSBzaW5nbGUgdGlsZSAoaW5pdGlhbCBsb2FkLCBvciByZWJ1aWxkKVxuICAgIGJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZCh7IHRpbGUsIHByb2dyZXNzIH0pIHtcbiAgICAgICAgLy8gUmVtb3ZlZCB0aGlzIHRpbGUgZHVyaW5nIGxvYWQ/XG4gICAgICAgIGlmICh0aGlzLnRpbGVzW3RpbGUua2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYGRpc2NhcmRlZCB0aWxlICR7dGlsZS5rZXl9IGluIFRpbGVNYW5hZ2VyLmJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZCBiZWNhdXNlIHByZXZpb3VzbHkgcmVtb3ZlZGApO1xuICAgICAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaWxlU3RhdGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnVpbHQgd2l0aCBhbiBvdXRkYXRlZCBzY2VuZSBjb25maWd1cmF0aW9uP1xuICAgICAgICBlbHNlIGlmICh0aWxlLmdlbmVyYXRpb24gIT09IHRoaXMuc2NlbmUuZ2VuZXJhdGlvbikge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBkaXNjYXJkZWQgdGlsZSAke3RpbGUua2V5fSBpbiBUaWxlTWFuYWdlci5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWQgYmVjYXVzZSBidWlsdCB3aXRoIGAgK1xuICAgICAgICAgICAgICAgIGBzY2VuZSBjb25maWcgZ2VuICR7dGlsZS5nZW5lcmF0aW9ufSwgY3VycmVudCAke3RoaXMuc2NlbmUuZ2VuZXJhdGlvbn1gKTtcbiAgICAgICAgICAgIFRpbGUuYWJvcnRCdWlsZCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRpbGUgd2l0aCBwcm9wZXJ0aWVzIGZyb20gd29ya2VyXG4gICAgICAgICAgICBpZiAodGhpcy50aWxlc1t0aWxlLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1t0aWxlLmtleV0ubWVyZ2UodGlsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5idWlsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRpbGUuYnVpbGRNZXNoZXModGhpcy5zY2VuZS5zdHlsZXMsIHByb2dyZXNzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgdGhpcy50aWxlQnVpbGRTdG9wKHRpbGUua2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgZW5jb3VudGVycyBhbiBlcnJvciBidWlsZGluZyBhIHRpbGVcbiAgICBidWlsZFRpbGVFcnJvcih0aWxlKSB7XG4gICAgICAgIGxvZygnZXJyb3InLCBgRXJyb3IgYnVpbGRpbmcgdGlsZSAke3RpbGUua2V5fTpgLCB0aWxlLmVycm9yKTtcbiAgICAgICAgdGhpcy5mb3JnZXRUaWxlKHRpbGUua2V5KTtcbiAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgIH1cblxuICAgIC8vIFRyYWNrIHRpbGUgYnVpbGQgc3RhdGVcbiAgICB0aWxlQnVpbGRTdGFydChrZXkpIHtcbiAgICAgICAgdGhpcy5idWlsZGluZ190aWxlcyA9IHRoaXMuYnVpbGRpbmdfdGlsZXMgfHwge307XG4gICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXNba2V5XSA9IHRydWU7XG4gICAgICAgIGxvZygndHJhY2UnLCBgdGlsZUJ1aWxkU3RhcnQgZm9yICR7a2V5fTogJHtPYmplY3Qua2V5cyh0aGlzLmJ1aWxkaW5nX3RpbGVzKS5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgdGlsZUJ1aWxkU3RvcChrZXkpIHtcbiAgICAgICAgLy8gRG9uZSBidWlsZGluZz9cbiAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmdfdGlsZXMpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgdGlsZUJ1aWxkU3RvcCBmb3IgJHtrZXl9OiAke09iamVjdC5rZXlzKHRoaXMuYnVpbGRpbmdfdGlsZXMpLmxlbmd0aH1gKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1aWxkaW5nX3RpbGVzW2tleV07XG4gICAgICAgICAgICB0aGlzLmNoZWNrQnVpbGRRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgc3RhdHVzIG9mIHRpbGUgYnVpbGRpbmcgcXVldWUgYW5kIG5vdGlmeSBzY2VuZSB3aGVuIHdlJ3JlIGRvbmVcbiAgICBjaGVja0J1aWxkUXVldWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5idWlsZGluZ190aWxlcyB8fCBPYmplY3Qua2V5cyh0aGlzLmJ1aWxkaW5nX3RpbGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zY2VuZS50aWxlTWFuYWdlckJ1aWxkRG9uZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VtIG9mIGEgZGVidWcgcHJvcGVydHkgYWNyb3NzIHRpbGVzXG4gICAgZ2V0RGVidWdTdW0ocHJvcCwgZmlsdGVyKSB7XG4gICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICBmb3IgKHZhciB0IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbGVzW3RdLmRlYnVnW3Byb3BdICE9IG51bGwgJiYgKHR5cGVvZiBmaWx0ZXIgIT09ICdmdW5jdGlvbicgfHwgZmlsdGVyKHRoaXMudGlsZXNbdF0pID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgIHN1bSArPSB0aGlzLnRpbGVzW3RdLmRlYnVnW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgLy8gQXZlcmFnZSBvZiBhIGRlYnVnIHByb3BlcnR5IGFjcm9zcyB0aWxlc1xuICAgIGdldERlYnVnQXZlcmFnZShwcm9wLCBmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVidWdTdW0ocHJvcCwgZmlsdGVyKSAvIE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aDtcbiAgICB9XG5cbn1cbiIsImltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZVB5cmFtaWQge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29vcmRzID0ge307XG4gICAgICAgIHRoaXMubWF4X3Byb3h5X2Rlc2NlbmRhbnRfZGVwdGggPSAzOyAvLyAjIG9mIGxldmVscyBkZWVwIHRvIHNlYXJjaCBmb3IgZGVzY2VuZGFudCBwcm94eSB0aWxlc1xuICAgIH1cblxuICAgIHNvdXJjZVRpbGVzKGNvb3JkLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuY29vcmRzW2Nvb3JkLmtleV0gJiZcbiAgICAgICAgICAgIHRoaXMuY29vcmRzW2Nvb3JkLmtleV0uc291cmNlcyAmJlxuICAgICAgICAgICAgdGhpcy5jb29yZHNbY29vcmQua2V5XS5zb3VyY2VzW3NvdXJjZS5uYW1lXSk7XG4gICAgfVxuXG4gICAgYWRkVGlsZSh0aWxlKSB7XG4gICAgICAgIC8vIEFkZCB0YXJnZXQgdGlsZVxuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuICAgICAgICBsZXQgY29vcmQgPSB0aGlzLmNvb3Jkc1trZXldO1xuICAgICAgICBpZiAoIWNvb3JkKSB7XG4gICAgICAgICAgICBjb29yZCA9IHRoaXMuY29vcmRzW2tleV0gPSB7IGRlc2NlbmRhbnRzOiAwIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvb3JkLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvb3JkLnNvdXJjZXMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29vcmQuc291cmNlc1t0aWxlLnNvdXJjZS5uYW1lXSkge1xuICAgICAgICAgICAgY29vcmQuc291cmNlc1t0aWxlLnNvdXJjZS5uYW1lXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvb3JkLnNvdXJjZXNbdGlsZS5zb3VyY2UubmFtZV1bdGlsZS5zdHlsZV96b29tXSA9IHRpbGU7XG5cbiAgICAgICAgLy8gSW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudCB1cCB0aGUgdGlsZSBweXJhbWlkXG4gICAgICAgIGZvciAobGV0IHogPSB0aWxlLmNvb3Jkcy56IC0gMTsgeiA+PSAwOyB6LS0pIHtcbiAgICAgICAgICAgIGxldCB1cCA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbSh0aWxlLmNvb3Jkcywgeik7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29vcmRzW3VwLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvb3Jkc1t1cC5rZXldID0geyBkZXNjZW5kYW50czogMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb29yZHNbdXAua2V5XS5kZXNjZW5kYW50cysrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlVGlsZSh0aWxlKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0YXJnZXQgdGlsZVxuICAgICAgICBsZXQgc291cmNlX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyh0aWxlLmNvb3JkcywgdGlsZS5zb3VyY2UpO1xuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuXG4gICAgICAgIGlmIChzb3VyY2VfdGlsZXMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzb3VyY2VfdGlsZXNbdGlsZS5zdHlsZV96b29tXTtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzb3VyY2VfdGlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzb3VyY2VcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNba2V5XS5zb3VyY2VzW3RpbGUuc291cmNlLm5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmNvb3Jkc1trZXldLnNvdXJjZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNba2V5XS5zb3VyY2VzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1trZXldLmRlc2NlbmRhbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgd2hvbGUgY29vcmRcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1trZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCB1cCB0aGUgdGlsZSBweXJhbWlkXG4gICAgICAgIGZvciAobGV0IHogPSB0aWxlLmNvb3Jkcy56IC0gMTsgeiA+PSAwOyB6LS0pIHtcbiAgICAgICAgICAgIGxldCBkb3duID0gVGlsZS5jb29yZGluYXRlQXRab29tKHRpbGUuY29vcmRzLCB6KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1tkb3duLmtleV0gJiYgdGhpcy5jb29yZHNbZG93bi5rZXldLmRlc2NlbmRhbnRzID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzW2Rvd24ua2V5XS5kZXNjZW5kYW50cy0tO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1tkb3duLmtleV0uZGVzY2VuZGFudHMgPT09IDAgJiYgIXRoaXMuY29vcmRzW2Rvd24ua2V5XS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1tkb3duLmtleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0QW5jZXN0b3IgKHsgY29vcmRzLCBzdHlsZV96b29tLCBzb3VyY2UgfSkge1xuICAgICAgICAvLyBGaXJzdCBjaGVjayBvdmVyem9vbWVkIHRpbGVzIGF0IHNhbWUgY29vcmRpbmF0ZSB6b29tXG4gICAgICAgIGlmIChzdHlsZV96b29tID4gc291cmNlLm1heF96b29tKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhjb29yZHMsIHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IHN0eWxlX3pvb20gLSAxOyB6ID49IHNvdXJjZS5tYXhfem9vbTsgei0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXNbel0gJiYgc291cmNlX3RpbGVzW3pdLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZV90aWxlc1t6XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0eWxlX3pvb20gPSBzb3VyY2UubWF4X3pvb207XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aWxlcyBhdCBuZXh0IHpvb20gdXBcbiAgICAgICAgc3R5bGVfem9vbS0tO1xuICAgICAgICBsZXQgcGFyZW50ID0gVGlsZS5jb29yZGluYXRlQXRab29tKGNvb3JkcywgY29vcmRzLnogLSAxKTtcbiAgICAgICAgbGV0IHBhcmVudF90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMocGFyZW50LCBzb3VyY2UpO1xuICAgICAgICBpZiAocGFyZW50X3RpbGVzICYmIHBhcmVudF90aWxlc1tzdHlsZV96b29tXSAmJiBwYXJlbnRfdGlsZXNbc3R5bGVfem9vbV0ubG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50X3RpbGVzW3N0eWxlX3pvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRpZG4ndCBmaW5kIGFuY2VzdG9yLCB0cnkgbmV4dCBsZXZlbFxuICAgICAgICAvLyBUT0RPOiBtYXggZGVwdGggbGV2ZWxzIHRvIGNoZWNrXG4gICAgICAgIGlmIChwYXJlbnQueiA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEFuY2VzdG9yKHsgY29vcmRzOiBwYXJlbnQsIHN0eWxlX3pvb20sIHNvdXJjZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldERlc2NlbmRhbnRzICh7IGNvb3Jkcywgc3R5bGVfem9vbSwgc291cmNlIH0sIGxldmVsID0gMSkge1xuICAgICAgICBsZXQgZGVzY2VuZGFudHMgPSBbXTtcblxuICAgICAgICAvLyBGaXJzdCBjaGVjayBvdmVyem9vbWVkIHRpbGVzIGF0IHNhbWUgY29vcmRpbmF0ZSB6b29tXG4gICAgICAgIGlmIChzdHlsZV96b29tID49IHNvdXJjZS5tYXhfem9vbSkge1xuICAgICAgICAgICAgbGV0IHNvdXJjZV90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMoY29vcmRzLCBzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlcykge1xuICAgICAgICAgICAgICAgIGxldCBzZWFyY2hfbWF4X3pvb20gPSBNYXRoLm1heChHZW8uZGVmYXVsdF92aWV3X21heF96b29tLCBzdHlsZV96b29tICsgdGhpcy5tYXhfcHJveHlfZGVzY2VuZGFudF9kZXB0aCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IHN0eWxlX3pvb20gKyAxOyB6IDw9IHNlYXJjaF9tYXhfem9vbTsgeisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXNbel0gJiYgc291cmNlX3RpbGVzW3pdLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChzb3VyY2VfdGlsZXNbel0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGlsZXMgYXQgbmV4dCB6b29tIGRvd25cbiAgICAgICAgaWYgKHRoaXMuY29vcmRzW2Nvb3Jkcy5rZXldICYmIHRoaXMuY29vcmRzW2Nvb3Jkcy5rZXldLmRlc2NlbmRhbnRzID4gMCkge1xuICAgICAgICAgICAgc3R5bGVfem9vbSsrO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBUaWxlLmNoaWxkcmVuRm9yQ29vcmRpbmF0ZShjb29yZHMpO1xuICAgICAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgY2hpbGRyZW4ubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2NdO1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZF90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMoY2hpbGQsIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkX3RpbGVzICYmIGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dICYmIGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgY2hpbGQsIHRyeSBuZXh0IGxldmVsXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPD0gdGhpcy5tYXhfcHJveHlfZGVzY2VuZGFudF9kZXB0aCAmJiBjaGlsZC56IDw9IHNvdXJjZS5tYXhfem9vbSkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKC4uLnRoaXMuZ2V0RGVzY2VuZGFudHMoeyBjb29yZHM6IGNoaWxkLCBzb3VyY2UsIHN0eWxlX3pvb20gfSwgbGV2ZWwgKyAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgIH1cblxufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIGRyYXdzIGEgYmx1ZSByZWN0YW5nbGUgYm9yZGVyIGFyb3VuZCB0aGUgY29sbGlzaW9uIGJveCBvZiBhIGxhYmVsXG4gICAgZHJhd19sYWJlbF9jb2xsaXNpb25fYm94ZXM6IGZhbHNlLFxuICAgIC8vIGRyYXdzIGEgZ3JlZW4gcmVjdGFuZ2xlIGJvcmRlciB3aXRoaW4gdGhlIHRleHR1cmUgYm94IG9mIGEgbGFiZWxcbiAgICBkcmF3X2xhYmVsX3RleHR1cmVfYm94ZXM6IGZhbHNlLFxuICAgIC8vIHN1cHByZXNlcyBmYWRlLWluIG9mIGxhYmVsc1xuICAgIHN1cHByZXNzX2xhYmVsX2ZhZGVfaW46IGZhbHNlLFxuICAgIC8vIHN1cHByZXNzIGFuaW1hdG9uIG9mIGxhYmVsIHNuYXAgdG8gcGl4ZWwgZ3JpZFxuICAgIHN1cHByZXNzX2xhYmVsX3NuYXBfYW5pbWF0aW9uOiBmYWxzZVxufTtcbiIsIlxuXG5leHBvcnQgY2xhc3MgTWV0aG9kTm90SW1wbGVtZW50ZWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kTmFtZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm5hbWUgICAgPSAnTWV0aG9kTm90SW1wbGVtZW50ZWQnO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnTWV0aG9kICcgKyBtZXRob2ROYW1lICsgJyBtdXN0IGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzJztcbiAgICB9XG59XG4iLCIvLyBQYXJ0aWFsIGltcG9ydCBvZiBnbC1tYXRyaXggdmlhIG1vZHVsYXJpemVkIHN0YWNrLWdsIGZvcmtzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdG9qaS9nbC1tYXRyaXhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFja2dsXG5cbi8vIHZlYzNcblxuLy8gU3Vic3RpdHV0ZSA2NC1iaXQgdmVyc2lvblxuLy8gV2UgbmVlZCB0aGUgZXh0cmEgcHJlY2lzaW9uIHdoZW4gbXVsdGlwbHlpbmcgbWF0cmljZXMgdy9tZXJjYXRvciBwcm9qZWN0ZWQgdmFsdWVzXG5jb25zdCB2ZWMzID0ge1xuICAgIGZyb21WYWx1ZXMgKHgsIHksIHopIHtcbiAgICAgICAgdmFyIG91dCA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XG4gICAgICAgIG91dFswXSA9IHg7XG4gICAgICAgIG91dFsxXSA9IHk7XG4gICAgICAgIG91dFsyXSA9IHo7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxufTtcblxuXG4vLyBtYXQzXG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQzX25vcm1hbEZyb21NYXQ0fSBmcm9tICdnbC1tYXQzL25vcm1hbC1mcm9tLW1hdDQnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDNfaW52ZXJ0fSBmcm9tICdnbC1tYXQzL2ludmVydCc7XG5cbmNvbnN0IG1hdDMgPSB7XG4gICAgbm9ybWFsRnJvbU1hdDQ6IG1hdDNfbm9ybWFsRnJvbU1hdDQsXG4gICAgaW52ZXJ0OiBtYXQzX2ludmVydFxufTtcblxuXG4vLyBtYXQ0XG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X211bHRpcGx5fSBmcm9tICdnbC1tYXQ0L211bHRpcGx5JztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X3RyYW5zbGF0ZX0gZnJvbSAnZ2wtbWF0NC90cmFuc2xhdGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfc2NhbGV9IGZyb20gJ2dsLW1hdDQvc2NhbGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfcGVyc3BlY3RpdmV9IGZyb20gJ2dsLW1hdDQvcGVyc3BlY3RpdmUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfbG9va0F0fSBmcm9tICdnbC1tYXQ0L2xvb2tBdCc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9pZGVudGl0eX0gZnJvbSAnZ2wtbWF0NC9pZGVudGl0eSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9jb3B5fSBmcm9tICdnbC1tYXQ0L2NvcHknO1xuXG5jb25zdCBtYXQ0ID0ge1xuICAgIG11bHRpcGx5OiBtYXQ0X211bHRpcGx5LFxuICAgIHRyYW5zbGF0ZTogbWF0NF90cmFuc2xhdGUsXG4gICAgc2NhbGU6IG1hdDRfc2NhbGUsXG4gICAgcGVyc3BlY3RpdmU6IG1hdDRfcGVyc3BlY3RpdmUsXG4gICAgbG9va0F0OiBtYXQ0X2xvb2tBdCxcbiAgICBpZGVudGl0eTogbWF0NF9pZGVudGl0eSxcbiAgICBjb3B5OiBtYXQ0X2NvcHlcbn07XG5cblxuZXhwb3J0IHt2ZWMzLCBtYXQzLCBtYXQ0fTtcbiIsImltcG9ydCB2ZXJzaW9uIGZyb20gJy4vdmVyc2lvbic7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi93b3JrZXJfYnJva2VyJztcblxuY29uc3QgTEVWRUxTID0ge1xuICAgIHNpbGVudDogLTEsXG4gICAgZXJyb3I6IDAsXG4gICAgd2FybjogMSxcbiAgICBpbmZvOiAyLFxuICAgIGRlYnVnOiAzLFxuICAgIHRyYWNlOiA0XG59O1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbmZ1bmN0aW9uIG1ldGhvZEZvckxldmVsIChsZXZlbCkge1xuICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgICAgICBtZXRob2RzW2xldmVsXSA9IG1ldGhvZHNbbGV2ZWxdIHx8IChjb25zb2xlW2xldmVsXSA/IGNvbnNvbGVbbGV2ZWxdIDogY29uc29sZS5sb2cpLmJpbmQoY29uc29sZSk7XG4gICAgICAgIHJldHVybiBtZXRob2RzW2xldmVsXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvZyAobXNnX2xldmVsLCAuLi5tc2cpIHtcbiAgICBpZiAoTEVWRUxTW21zZ19sZXZlbF0gPD0gTEVWRUxTW2xvZy5sZXZlbF0pIHtcbiAgICAgICAgaWYgKFRocmVhZC5pc193b3JrZXIpIHtcbiAgICAgICAgICAgIC8vIFByb3h5IHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ19sb2dQcm94eScsIG1zZ19sZXZlbCwgLi4ubXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsb2dnZXIgPSBtZXRob2RGb3JMZXZlbChtc2dfbGV2ZWwpO1xuXG4gICAgICAgICAgICAvLyBXcml0ZSB0byBjb25zb2xlIChvbiBtYWluIHRocmVhZClcbiAgICAgICAgICAgIGlmIChtc2cubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlcihgVGFuZ3JhbSAke3ZlcnNpb259IFske21zZ19sZXZlbH1dOiAke21zZ1swXX1gLCAuLi5tc2cuc2xpY2UoMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyKGBUYW5ncmFtICR7dmVyc2lvbn0gWyR7bXNnX2xldmVsfV06ICR7bXNnWzBdfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5sb2cubGV2ZWwgPSAnaW5mbyc7XG5sb2cud29ya2VycyA9IG51bGw7XG5cbmxvZy5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkge1xuICAgIGxvZy5sZXZlbCA9IGxldmVsO1xuXG4gICAgaWYgKFRocmVhZC5pc19tYWluICYmIEFycmF5LmlzQXJyYXkobG9nLndvcmtlcnMpKSB7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShsb2cud29ya2VycywgJ19sb2dTZXRMZXZlbFByb3h5JywgbGV2ZWwpO1xuICAgIH1cbn07XG5cbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIGxvZy5zZXRXb3JrZXJzID0gZnVuY3Rpb24gKHdvcmtlcnMpIHtcbiAgICAgICAgbG9nLndvcmtlcnMgPSB3b3JrZXJzO1xuICAgIH07XG5cblxufVxuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdfbG9nUHJveHknLCBsb2cpOyAgICAgICAgICAgICAgICAgICAvLyBwcm94eSBsb2cgbWVzc2FnZXMgZnJvbSB3b3JrZXIgdG8gbWFpbiB0aHJlYWRcbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ19sb2dTZXRMZXZlbFByb3h5JywgbG9nLnNldExldmVsKTsgIC8vIHByb3h5IGxvZyBsZXZlbCBzZXR0aW5nIGZyb20gbWFpbiB0byB3b3JrZXIgdGhyZWFkXG4iLCIvKiBnbG9iYWwgTWVkaWFSZWNvcmRlciAqL1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQge2NyZWF0ZU9iamVjdFVSTH0gZnJvbSAnLi91cmxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVkaWFDYXB0dXJlIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUgPSBudWxsO1xuICAgIH1cblxuICAgIHNldENhbnZhcyAoY2FudmFzKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuICAgIH1cblxuICAgIC8vIFRha2UgYSBzY3JlZW5zaG90LCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNjcmVlbnNob3QgZGF0YSB3aGVuIGF2YWlsYWJsZVxuICAgIHNjcmVlbnNob3QgKCkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZV9zY3JlZW5zaG90ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZTsgLy8gb25seSBjYXB0dXJlIG9uZSBzY3JlZW5zaG90IGF0IGEgdGltZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2lsbCByZXNvbHZlIG9uY2UgcmVuZGVyaW5nIGlzIGNvbXBsZXRlIGFuZCByZW5kZXIgYnVmZmVyIGlzIGNhcHR1cmVkXG4gICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdCA9IHt9O1xuICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnByb21pc2U7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIGFmdGVyIHJlbmRlcmluZywgY2FwdHVyZXMgcmVuZGVyIGJ1ZmZlciBhbmQgcmVzb2x2ZXMgcHJvbWlzZSB3aXRoIHRoZSBpbWFnZSBkYXRhXG4gICAgY29tcGxldGVTY3JlZW5zaG90ICgpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWVfc2NyZWVuc2hvdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBHZXQgZGF0YSBVUkwsIGNvbnZlcnQgdG8gYmxvYlxuICAgICAgICAgICAgLy8gU3RyaXAgaG9zdC9taW1ldHlwZS9ldGMuLCBjb252ZXJ0IGJhc2U2NCB0byBiaW5hcnkgd2l0aG91dCBVVEYtOCBtYW5nbGluZ1xuICAgICAgICAgICAgLy8gQWRhcHRlZCBmcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS91bmNvbmVkLzQzNzA4MjJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXRvYih1cmwuc2xpY2UoMjIpKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiAnaW1hZ2UvcG5nJyB9KTtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSB3aXRoIHNjcmVlbnNob3QgZGF0YVxuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlc29sdmUoeyB1cmwsIGJsb2IsIHR5cGU6ICdwbmcnIH0pO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0YXJ0cyBjYXB0dXJpbmcgYSB2aWRlbyBzdHJlYW0gZnJvbSB0aGUgY2FudmFzXG4gICAgc3RhcnRWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5NZWRpYVJlY29yZGVyICE9PSAnZnVuY3Rpb24nIHx8ICF0aGlzLmNhbnZhcyB8fCB0eXBlb2YgdGhpcy5jYW52YXMuY2FwdHVyZVN0cmVhbSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZpZGVvIGNhcHR1cmUgKENhbnZhcy5jYXB0dXJlU3RyZWFtIGFuZC9vciBNZWRpYVJlY29yZGVyIEFQSXMpIG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3NlcicpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmlkZW9fY2FwdHVyZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZpZGVvIGNhcHR1cmUgYWxyZWFkeSBpbiBwcm9ncmVzcywgY2FsbCBTY2VuZS5zdG9wVmlkZW9DYXB0dXJlKCkgZmlyc3QnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IGEgbmV3IGNhcHR1cmVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjYXAgPSB0aGlzLnZpZGVvX2NhcHR1cmUgPSB7fTtcbiAgICAgICAgICAgIGNhcC5jaHVua3MgPSBbXTtcbiAgICAgICAgICAgIGNhcC5zdHJlYW0gPSB0aGlzLmNhbnZhcy5jYXB0dXJlU3RyZWFtKCk7XG4gICAgICAgICAgICBjYXAub3B0aW9ucyA9IHsgbWltZVR5cGU6ICd2aWRlby93ZWJtJyB9OyAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIGZvcm1hdCBvcHRpb25zXG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlcihjYXAuc3RyZWFtLCBjYXAub3B0aW9ucyk7XG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICBjYXAuY2h1bmtzLnB1c2goZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RvcHBlZCByZWNvcmRpbmc/IENyZWF0ZSB0aGUgZmluYWwgY2FwdHVyZSBmaWxlIGJsb2JcbiAgICAgICAgICAgICAgICBpZiAoY2FwLnJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJsb2IgPSBuZXcgQmxvYihjYXAuY2h1bmtzLCB7IHR5cGU6IGNhcC5vcHRpb25zLm1pbWVUeXBlIH0pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgcmVtb3ZlIGFsbCBzdHJlYW0gdHJhY2tzLCBhbmQgc2V0IG9iamVjdHMgdG8gbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FwLnN0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYWNrcyA9IGNhcC5zdHJlYW0uZ2V0VHJhY2tzKCkgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja3MuZm9yRWFjaCh0cmFjayA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2suc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcC5zdHJlYW0ucmVtb3ZlVHJhY2sodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FwLnN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGNhcC5tZWRpYV9yZWNvcmRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FwLnJlc29sdmUoeyB1cmwsIGJsb2IsIHR5cGU6ICd3ZWJtJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FwLm1lZGlhX3JlY29yZGVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgJ1NjZW5lIHZpZGVvIGNhcHR1cmUgZmFpbGVkJywgZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU3RvcHMgY2FwdHVyaW5nIGEgdmlkZW8gc3RyZWFtIGZyb20gdGhlIGNhbnZhcywgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2aWRlbyB3aGVuIGF2YWlsYWJsZVxuICAgIHN0b3BWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9fY2FwdHVyZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ05vIHNjZW5lIHZpZGVvIGNhcHR1cmUgaW4gcHJvZ3Jlc3MsIGNhbGwgU2NlbmUuc3RhcnRWaWRlb0NhcHR1cmUoKSBmaXJzdCcpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIHdoZW4gZmluYWwgc3RyZWFtIGlzIGF2YWlsYWJsZVxuICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0b3AgcmVjb3JkaW5nXG4gICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5tZWRpYV9yZWNvcmRlci5zdG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW9fY2FwdHVyZS5wcm9taXNlO1xuICAgIH1cblxufVxuIiwiLy8gRGVlcC9yZWN1cnNpdmUgbWVyZ2Ugb2Ygb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgaW50byBhIGRlc3RpbmF0aW9uIG9iamVjdFxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VPYmplY3RzIChkZXN0LCAuLi5zb3VyY2VzKSB7XG4gICAgZm9yIChsZXQgcz0wOyBzIDwgc291cmNlcy5sZW5ndGg7IHMrKykge1xuICAgICAgICBsZXQgc291cmNlID0gc291cmNlc1tzXTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2UgdGhlIHNvdXJjZSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBpZiBpdCBpcyBhIGEgbm9uLW51bGwga2V5L3ZhbHVlIG9iamVjdFxuICAgICAgICAgICAgLy8gKGUuZy4gZG9uJ3QgbWVyZ2UgYXJyYXlzLCB0aG9zZSBhcmUgdHJlYXRlZCBhcyBzY2FsYXIgdmFsdWVzOyBudWxsIHZhbHVlcyB3aWxsIG92ZXJ3cml0ZS9lcmFzZVxuICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzIGRlc3RpbmF0aW9uIHZhbHVlKVxuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3Rba2V5XSAhPT0gbnVsbCAmJiB0eXBlb2YgZGVzdFtrZXldID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkZXN0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IG1lcmdlT2JqZWN0cyhkZXN0W2tleV0sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IG1lcmdlT2JqZWN0cyh7fSwgdmFsdWUpOyAvLyBkZXN0aW5hdGlvbiBub3QgYW4gb2JqZWN0LCBvdmVyd3JpdGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIHByZXZpb3VzIGRlc3RpbmF0aW9uIHZhbHVlIGlmIHRoZSBzb3VyY2UgcHJvcGVydHkgaXM6IGEgc2NhbGFyIChudW1iZXIvc3RyaW5nKSxcbiAgICAgICAgICAgIC8vIGFuIGFycmF5LCBvciBhIG51bGwgdmFsdWVcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZXN0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVuZGVmaW5lZCBzb3VyY2UgcHJvcGVydGllcyBhcmUgaWdub3JlZFxuICAgICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59XG4iLCJpbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9CQiB7XG5cbiAgICBjb25zdHJ1Y3RvciAoeCwgeSwgYSwgdywgaCkge1xuICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IFt3LCBoXTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGE7XG4gICAgICAgIHRoaXMuY2VudHJvaWQgPSBbeCwgeV07XG4gICAgICAgIHRoaXMucXVhZCA9IFtdO1xuICAgICAgICB0aGlzLmF4ZXMgPSBbXTtcblxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIG1vdmUgKHB4LCBweSkge1xuICAgIFx0dGhpcy5jZW50cm9pZCA9IFtweCwgcHldO1xuXG4gICAgXHR0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGdldEV4dGVudCAoKSB7XG4gICAgXHRsZXQgaW5mID0gMWU2O1xuICAgIFx0bGV0IGFhYmIgPSBbaW5mLCBpbmYsIC1pbmYsIC1pbmZdO1xuXG4gICAgXHRmb3IgKGxldCBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgYWFiYlswXSA9IE1hdGgubWluKHRoaXMucXVhZFtpXVswXSwgYWFiYlswXSk7XG4gICAgICAgICAgICBhYWJiWzFdID0gTWF0aC5taW4odGhpcy5xdWFkW2ldWzFdLCBhYWJiWzFdKTtcbiAgICAgICAgICAgIGFhYmJbMl0gPSBNYXRoLm1heCh0aGlzLnF1YWRbaV1bMF0sIGFhYmJbMl0pO1xuICAgICAgICAgICAgYWFiYlszXSA9IE1hdGgubWF4KHRoaXMucXVhZFtpXVsxXSwgYWFiYlszXSk7XG4gICAgXHR9XG5cbiAgICBcdHJldHVybiBhYWJiO1xuICAgIH1cblxuICAgIHBlcnBBeGVzICgpIHtcbiAgICBcdHRoaXMuYXhlc1swXSA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnN1Yih0aGlzLnF1YWRbMl0sIHRoaXMucXVhZFszXSkpO1xuICAgIFx0dGhpcy5heGVzWzFdID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3Iuc3ViKHRoaXMucXVhZFsyXSwgdGhpcy5xdWFkWzFdKSk7XG4gICAgfVxuXG4gICAgdXBkYXRlICgpIHtcbiAgICBcdGxldCB4ID0gWyBNYXRoLmNvcyh0aGlzLmFuZ2xlKSwgTWF0aC5zaW4odGhpcy5hbmdsZSldO1xuICAgIFx0bGV0IHkgPSBbLU1hdGguc2luKHRoaXMuYW5nbGUpLCBNYXRoLmNvcyh0aGlzLmFuZ2xlKV07XG5cbiAgICBcdHggPSBWZWN0b3IubXVsdCh4LCB0aGlzLmRpbWVuc2lvblswXSAvIDIuMCk7XG4gICAgXHR5ID0gVmVjdG9yLm11bHQoeSwgdGhpcy5kaW1lbnNpb25bMV0gLyAyLjApO1xuXG4gICAgXHR0aGlzLnF1YWRbMF0gPSBWZWN0b3Iuc3ViKFZlY3Rvci5zdWIodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyBsb3dlci1sZWZ0XG4gICAgXHR0aGlzLnF1YWRbMV0gPSBWZWN0b3Iuc3ViKFZlY3Rvci5hZGQodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyBsb3dlci1yaWdodFxuICAgIFx0dGhpcy5xdWFkWzJdID0gVmVjdG9yLmFkZChWZWN0b3IuYWRkKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gdXBlci1yaWdodFxuICAgIFx0dGhpcy5xdWFkWzNdID0gVmVjdG9yLmFkZChWZWN0b3Iuc3ViKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gdXBlci1sZWZ0XG5cbiAgICBcdHRoaXMucGVycEF4ZXMoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcHJvamVjdFRvQXhpcyAob2JiLCBheGlzKSB7XG4gICAgXHRsZXQgaW5mID0gMWU2O1xuICAgIFx0bGV0IG1pbiA9IGluZjtcbiAgICBcdGxldCBtYXggPSAtaW5mO1xuXG4gICAgXHRsZXQgcXVhZCA9IG9iYi5xdWFkO1xuXG4gICAgXHQvLyBmb3IgZWFjaCBheGlzLCBwcm9qZWN0IG9iYiBxdWFkIHRvIGl0IGFuZCBmaW5kIG1pbiBhbmQgbWF4IHZhbHVlc1xuICAgIFx0Zm9yIChsZXQgaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgICAgIGxldCBkID0gIFZlY3Rvci5kb3QocXVhZFtpXSwgYXhpcyk7XG4gICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIGQpO1xuICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBkKTtcbiAgICBcdH1cblxuICAgIFx0cmV0dXJuIFttaW4sIG1heF07XG4gICAgfVxuXG4gICAgc3RhdGljIGF4aXNDb2xsaWRlIChvYmJfYSwgb2JiX2IsIGF4ZXMpIHtcbiAgICBcdGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgXHRcdGxldCBhX3Byb2ogPSBPQkIucHJvamVjdFRvQXhpcyhvYmJfYSwgYXhlc1tpXSk7XG4gICAgXHRcdGxldCBiX3Byb2ogPSBPQkIucHJvamVjdFRvQXhpcyhvYmJfYiwgYXhlc1tpXSk7XG5cbiAgICBcdFx0aWYgKGJfcHJvalswXSA+IGFfcHJvalsxXSB8fCBiX3Byb2pbMV0gPCBhX3Byb2pbMF0pIHtcbiAgICBcdFx0XHRyZXR1cm4gZmFsc2U7XG4gICAgXHRcdH1cbiAgICBcdH1cbiAgICBcdHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcnNlY3Qob2JiX2EsIG9iYl9iKSB7XG4gICAgXHRyZXR1cm4gT0JCLmF4aXNDb2xsaWRlKG9iYl9hLCBvYmJfYiwgb2JiX2EuYXhlcykgJiYgT0JCLmF4aXNDb2xsaWRlKG9iYl9hLCBvYmJfYiwgb2JiX2IuYXhlcyk7XG4gICAgfVxuXG59XG5cbiIsIi8vIFByb21pc2VzIHBvbHlmaWxsXG5pbXBvcnQgJ2NvcmUtanMvZXM2L3Byb21pc2UnO1xuXG4vLyBPYmplY3QuYXNzaWduIHBvbHlmaWxsXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICBPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICAgICAgLy8gV2UgbXVzdCBjaGVjayBhZ2FpbnN0IHRoZXNlIHNwZWNpZmljIGNhc2VzLlxuICAgICAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkobmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH0pKCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdWJzY3JpYmVNaXhpbiAodGFyZ2V0KSB7XG5cbiAgICBsZXQgbGlzdGVuZXJzID0gW107XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcblxuICAgICAgICBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHVuc3Vic2NyaWJlQWxsKCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzID0gW107XG4gICAgICAgIH0sXG5cbiAgICAgICAgdHJpZ2dlcihldmVudCwgLi4uZGF0YSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJbZXZlbnRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyW2V2ZW50XSguLi5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBoYXNTdWJzY3JpYmVyc0ZvcihldmVudCkge1xuICAgICAgICAgICAgbGV0IGhhcyA9IGZhbHNlO1xuICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJbZXZlbnRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gaGFzO1xuICAgICAgICB9XG5cbiAgICB9KTtcblxufVxuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuLy8gTWFyayB0aHJlYWQgYXMgbWFpbiBvciB3b3JrZXJcbmNvbnN0IFRocmVhZCA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBUaHJlYWQ7XG5cbnRyeSB7XG4gICAgaWYgKHdpbmRvdy5kb2N1bWVudCAhPT0gSFRNTERvY3VtZW50KSB7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICBUaHJlYWQuaXNfd29ya2VyID0gZmFsc2U7XG4gICAgICAgIFRocmVhZC5pc19tYWluICAgPSB0cnVlO1xuICAgIH1cbn1cbmNhdGNoIChlKSB7XG4gICAgaWYgKHNlbGYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBUaHJlYWQuaXNfd29ya2VyID0gdHJ1ZTtcbiAgICAgICAgVGhyZWFkLmlzX21haW4gICA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFBhdGNoIGZvciAzcmQgcGFydHkgbGlicyB0aGF0IHJlcXVpcmUgdGhlc2UgZ2xvYmFscyB0byBiZSBwcmVzZW50LiBTcGVjaWZpY2FsbHksIEZvbnRGYWNlT2JzZXJ2ZXIuXG4gICAgICAgIC8vIEJyaXR0bGUgc29sdXRpb24gYnV0IGFsbG93cyB0aGF0IGxpYnJhcnkgdG8gbG9hZCBvbiB3b3JrZXIgdGhyZWFkcy5cbiAgICAgICAgc2VsZi53aW5kb3cgPSB7IGRvY3VtZW50OiB7fSB9O1xuICAgICAgICBzZWxmLmRvY3VtZW50ID0gc2VsZi53aW5kb3cuZG9jdW1lbnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5cbi8vIEFkZCBhIGJhc2UgVVJMIGZvciBzY2hlbWVsZXNzIG9yIHByb3RvY29sLWxlc3MgVVJMc1xuLy8gRGVmYXVsdHMgdG8gYWRkaW5nIGN1cnJlbnQgd2luZG93IHByb3RvY29sIGFuZCBiYXNlLCBvciBhZGRzIGEgY3VzdG9tIGJhc2UgaWYgc3BlY2lmaWVkXG4vLyBNYXliZSB1c2UgaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9VUkkuanMgaWYgbW9yZSByb2J1c3QgZnVuY3Rpb25hbGl0eSBpcyBuZWVkZWRcbmV4cG9ydCBmdW5jdGlvbiBhZGRCYXNlVVJMICh1cmwsIGJhc2UpIHtcbiAgICBpZiAoIXVybCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2NoZW1lbGVzcywgYWRkIHByb3RvY29sXG4gICAgaWYgKHVybC5zdWJzdHIoMCwgMikgPT09ICcvLycpIHtcbiAgICAgICAgdXJsID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgdXJsO1xuICAgIH1cbiAgICAvLyBObyBodHRwKHMpIG9yIGRhdGEsIGFkZCBiYXNlXG4gICAgZWxzZSBpZiAodXJsLnNlYXJjaCgvXihodHRwfGh0dHBzfGRhdGF8YmxvYik6LykgPCAwKSB7XG4gICAgICAgIHZhciByZWxhdGl2ZSA9ICh1cmxbMF0gIT09ICcvJyk7XG4gICAgICAgIHZhciBiYXNlX2luZm87XG4gICAgICAgIGlmIChiYXNlKSB7XG4gICAgICAgICAgICBiYXNlX2luZm8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7IC8vIHVzZSBhIHRlbXBvcmFyeSBlbGVtZW50IHRvIHBhcnNlIFVSTFxuICAgICAgICAgICAgYmFzZV9pbmZvLmhyZWYgPSBiYXNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYmFzZV9pbmZvID0gd2luZG93LmxvY2F0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbGF0aXZlKSB7XG4gICAgICAgICAgICBsZXQgcGF0aCA9IHBhdGhGb3JVUkwoYmFzZV9pbmZvLmhyZWYpO1xuICAgICAgICAgICAgdXJsID0gcGF0aCArIHVybDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEVhc3kgd2F5XG4gICAgICAgICAgICBpZiAoYmFzZV9pbmZvLm9yaWdpbikge1xuICAgICAgICAgICAgICAgIHVybCA9IGJhc2VfaW5mby5vcmlnaW4gKyAnLycgKyB1cmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIYXJkIHdheSAoSUUxMSlcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBvcmlnaW4gPSB1cmwubWF0Y2goL14oKGh0dHB8aHR0cHN8ZGF0YXxibG9iKTpcXC9cXC9bXlxcL10qXFwvKS8pO1xuICAgICAgICAgICAgICAgIG9yaWdpbiA9IChvcmlnaW4gJiYgb3JpZ2luLmxlbmd0aCA+IDEpID8gb3JpZ2luWzBdIDogJyc7XG4gICAgICAgICAgICAgICAgdXJsID0gb3JpZ2luICsgdXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoRm9yVVJMICh1cmwpIHtcbiAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLnNlYXJjaCgvXihkYXRhfGJsb2IpOi8pID09PSAtMSkge1xuICAgICAgICBsZXQgcXMgPSB1cmwuaW5kZXhPZignPycpO1xuICAgICAgICBpZiAocXMgPiAtMSkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cigwLCBxcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGFzaCA9IHVybC5pbmRleE9mKCcjJyk7XG4gICAgICAgIGlmIChoYXNoID4gLTEpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgaGFzaCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXJsLnN1YnN0cigwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpIHx8ICcnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbnNpb25Gb3JVUkwgKHVybCkge1xuICAgIHVybCA9IHVybC5zcGxpdCgnLycpLnBvcCgpO1xuICAgIGxldCBsYXN0X2RvdCA9IHVybC5sYXN0SW5kZXhPZignLicpO1xuICAgIGlmIChsYXN0X2RvdCA+IC0xKSB7XG4gICAgICAgIHJldHVybiB1cmwuc3Vic3RyaW5nKGxhc3RfZG90ICsgMSk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWxhdGl2ZVVSTCAodXJsKSB7XG4gICAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuICEodXJsLnNlYXJjaCgvXihodHRwfGh0dHBzfGRhdGF8YmxvYik6LykgPiAtMSB8fCB1cmwuc3Vic3RyKDAsIDIpID09PSAnLy8nKTtcbn1cblxuLy8gUmVzb2x2ZXMgJy4vJyBhbmQgJy4uLycgY29tcG9uZW50cyBmcm9tIHJlbGF0aXZlIHBhdGgsIHRvIGdldCBhIFwiZmxhdHRlbmVkXCIgcGF0aFxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5SZWxhdGl2ZVVSTCAodXJsKSB7XG4gICAgbGV0IGRpcnMgPSAodXJsIHx8ICcnKS5zcGxpdCgnLycpO1xuICAgIGZvciAobGV0IGQgPSAxOyBkIDwgZGlycy5sZW5ndGg7IGQrKykge1xuICAgICAgICBpZiAoZGlyc1tkXSA9PT0gJy4nKSB7XG4gICAgICAgICAgICBkaXJzLnNwbGljZShkLCAxKTtcbiAgICAgICAgICAgIGQtLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkaXJzW2RdID09PSAnLi4nKSB7XG4gICAgICAgICAgICBkID0gZCArIDA7XG4gICAgICAgICAgICBkaXJzLnNwbGljZShkLTEsIDIpO1xuICAgICAgICAgICAgZC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaXJzLmpvaW4oJy8nKTtcbn1cblxuLy8gQWRkIGEgc2V0IG9mIHF1ZXJ5IHN0cmluZyBwYXJhbXMgdG8gYSBVUkxcbi8vIHBhcmFtczogaGFzaCBvZiBrZXkvdmFsdWUgcGFpcnMgb2YgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnNcbmV4cG9ydCBmdW5jdGlvbiBhZGRQYXJhbXNUb1VSTCAodXJsLCBwYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcyB8fCBPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cblxuICAgIHZhciBxc19pbmRleCA9IHVybC5pbmRleE9mKCc/Jyk7XG4gICAgdmFyIGhhc2hfaW5kZXggPSB1cmwuaW5kZXhPZignIycpO1xuXG4gICAgLy8gU2F2ZSBhbmQgdHJpbSBoYXNoXG4gICAgdmFyIGhhc2ggPSAnJztcbiAgICBpZiAoaGFzaF9pbmRleCA+IC0xKSB7XG4gICAgICAgIGhhc2ggPSB1cmwuc2xpY2UoaGFzaF9pbmRleCk7XG4gICAgICAgIHVybCA9IHVybC5zbGljZSgwLCBoYXNoX2luZGV4KTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBxdWVyeSBzdHJpbmdcbiAgICBpZiAocXNfaW5kZXggPT09IC0xKSB7XG4gICAgICAgIHFzX2luZGV4ID0gdXJsLmxlbmd0aDtcbiAgICAgICAgdXJsICs9ICc/JztcbiAgICB9XG4gICAgcXNfaW5kZXgrKzsgLy8gYWR2YW5jZWQgcGFzdCAnPydcblxuICAgIC8vIEJ1aWxkIHF1ZXJ5IHN0cmluZyBwYXJhbXNcbiAgICB2YXIgdXJsX3BhcmFtcyA9ICcnO1xuICAgIGZvciAodmFyIHAgaW4gcGFyYW1zKSB7XG4gICAgICAgIHVybF9wYXJhbXMgKz0gYCR7cH09JHtwYXJhbXNbcF19JmA7XG4gICAgfVxuXG4gICAgLy8gSW5zZXJ0IG5ldyBxdWVyeSBzdHJpbmcgcGFyYW1zIGFuZCByZXN0b3JlIGhhc2hcbiAgICAvLyBOT1RFOiBkb2Vzbid0IHJlcGxhY2UgYW55IHZhbHVlcyBhbHJlYWR5IHByZXNlbnQgb24gcXVlcnkgc3RyaW5nLCBqdXN0IGluc2VydHMgZHVwZSB2YWx1ZXNcbiAgICB1cmwgPSB1cmwuc2xpY2UoMCwgcXNfaW5kZXgpICsgdXJsX3BhcmFtcyArIHVybC5zbGljZShxc19pbmRleCkgKyBoYXNoO1xuXG4gICAgcmV0dXJuIHVybDtcbn1cblxuLy8gUG9seWZpbGwgKGZvciBTYWZhcmkgY29tcGF0aWJpbGl0eSlcbmxldCBfY3JlYXRlT2JqZWN0VVJMO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTCAodXJsKSB7XG4gICAgaWYgKF9jcmVhdGVPYmplY3RVUkwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBfY3JlYXRlT2JqZWN0VVJMID0gKHdpbmRvdy5VUkwgJiYgd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwpIHx8ICh3aW5kb3cud2Via2l0VVJMICYmIHdpbmRvdy53ZWJraXRVUkwuY3JlYXRlT2JqZWN0VVJMKTtcblxuICAgICAgICBpZiAodHlwZW9mIF9jcmVhdGVPYmplY3RVUkwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIF9jcmVhdGVPYmplY3RVUkwgPSBudWxsO1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMIChvciB2ZW5kb3IgcHJlZml4KSBub3QgZm91bmQsIHVuYWJsZSB0byBjcmVhdGUgbG9jYWwgYmxvYiBVUkxzYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoX2NyZWF0ZU9iamVjdFVSTCkge1xuICAgICAgICByZXR1cm4gX2NyZWF0ZU9iamVjdFVSTCh1cmwpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG59XG5cbi8vIEdldCBVUkwgdGhhdCB0aGUgY3VycmVudCBzY3JpcHQgd2FzIGxvYWRlZCBmcm9tXG4vLyBJZiBjdXJyZW50U2NyaXB0IGlzIG5vdCBhdmFpbGFibGUsIGxvb3BzIHRocm91Z2ggPHNjcmlwdD4gZWxlbWVudHMgc2VhcmNoaW5nIGZvciBhIGxpc3Qgb2YgcHJvdmlkZWQgcGF0aHNcbi8vIGUuZy4gZmluZEN1cnJlbnRVUkwoJ3RhbmdyYW0uZGVidWcuanMnLCAndGFuZ3JhbS5taW4uanMnKTtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ3VycmVudFVSTCAoLi4ucGF0aHMpIHtcbiAgICAvLyBGaW5kIGN1cnJlbnRseSBleGVjdXRpbmcgc2NyaXB0XG4gICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQ7XG4gICAgaWYgKHNjcmlwdCkge1xuICAgICAgICByZXR1cm4gc2NyaXB0LnNyYztcbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXRocykpIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgb24gbG9vcGluZyB0aHJvdWdoIDxzY3JpcHQ+IGVsZW1lbnRzIGlmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgaXMgbm90IHN1cHBvcnRlZFxuICAgICAgICB2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcbiAgICAgICAgZm9yICh2YXIgcz0wOyBzIDwgc2NyaXB0cy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgcGF0aHMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0c1tzXS5zcmMuaW5kZXhPZihwYXRoc1twXSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHRzW3NdLnNyYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvLyBNaXNjZWxsYW5lb3VzIHV0aWxpdGllc1xuLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi93b3JrZXJfYnJva2VyJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbnZhciBVdGlscztcbmV4cG9ydCBkZWZhdWx0IFV0aWxzID0ge307XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ1V0aWxzJywgVXRpbHMpO1xuXG4vLyBCYXNpYyBTYWZhcmkgZGV0ZWN0aW9uXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc5NDQ0NjAvZGV0ZWN0LXNhZmFyaS1icm93c2VyXG5VdGlscy5pc1NhZmFyaSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbn07XG5cbi8vIEJhc2ljIElFMTEgb3IgRWRnZSBkZXRlY3Rpb25cblV0aWxzLmlzTWljcm9zb2Z0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKFRyaWRlbnRcXC83LjB8RWRnZVsgL10oXFxkK1tcXC5cXGRdKykpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbn07XG5cblV0aWxzLmlvID0gZnVuY3Rpb24gKHVybCwgdGltZW91dCA9IDYwMDAwLCByZXNwb25zZVR5cGUgPSAndGV4dCcsIG1ldGhvZCA9ICdHRVQnLCBoZWFkZXJzID0ge30sIHByb3h5ID0gZmFsc2UpIHtcbiAgICBpZiAoVGhyZWFkLmlzX3dvcmtlciAmJiBVdGlscy5pc01pY3Jvc29mdCgpKSB7XG4gICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSUUxMSBhbmQgRWRnZSB3aWxsIGhhbmcgd2ViIHdvcmtlcnMgd2hlbiBwZXJmb3JtaW5nIFhIUiByZXF1ZXN0c1xuICAgICAgICAvLyBUaGVzZSByZXF1ZXN0cyBjYW4gYmUgcHJveGllZCB0aHJvdWdoIHRoZSBtYWluIHRocmVhZFxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy85NTQ1ODY2L1xuICAgICAgICBsb2coJ2RlYnVnJywgJ1Byb3h5aW5nIHJlcXVlc3QgZm9yIFVSTCB0byB3b3JrZXInLCB1cmwpO1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKCdVdGlscy5pbycsIHVybCwgdGltZW91dCwgcmVzcG9uc2VUeXBlLCBtZXRob2QsIGhlYWRlcnMsIHRydWUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0Lm9wZW4obWV0aG9kLCB1cmwsIHRydWUpO1xuICAgICAgICAgICAgcmVxdWVzdC50aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlO1xuICAgICAgICAgICAgcmVxdWVzdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFsndGV4dCcsICdqc29uJ10uaW5kZXhPZihyZXF1ZXN0LnJlc3BvbnNlVHlwZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKCdSZXF1ZXN0IGVycm9yIHdpdGggYSBzdGF0dXMgb2YgJyArIHJlcXVlc3Quc3RhdHVzVGV4dCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKCdUaGVyZSB3YXMgYSBuZXR3b3JrIGVycm9yJyArIGV2dC50b1N0cmluZygpKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxdWVzdC5vbnRpbWVvdXQgPSAoZXZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKCd0aW1lb3V0ICcrIGV2dC50b1N0cmluZygpKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxdWVzdC5zZW5kKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCAncmVxdWVzdCcsIHtcbiAgICAgICAgICAgIHZhbHVlOiByZXF1ZXN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChwcm94eSAmJiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMocmVzcG9uc2UpKSB8fCByZXNwb25zZTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuVXRpbHMucGFyc2VSZXNvdXJjZSA9IGZ1bmN0aW9uIChib2R5KSB7XG4gICAgdmFyIGRhdGE7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8ganN5YW1sICdqc29uJyBvcHRpb24gYWxsb3dzIGR1cGxpY2F0ZSBrZXlzXG4gICAgICAgIC8vIEtlZXBpbmcgdGhpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBzaG91bGQgY29uc2lkZXIgbWlncmF0aW5nIHRvIHJlcXVpcmluZ1xuICAgICAgICAvLyB1bmlxdWUga2V5cywgYXMgdGhpcyBpcyBZQU1MIHNwZWMuIEJ1dCBUYW5ncmFtIEVTIGN1cnJlbnRseSBhY2NlcHRzIGR1cGUga2V5cyBhcyB3ZWxsLFxuICAgICAgICAvLyBzbyBzaG91bGQgY29uc2lkZXIgaG93IGJlc3QgdG8gdW5pZnkuXG4gICAgICAgIGRhdGEgPSB5YW1sLnNhZmVMb2FkKGJvZHksIHsganNvbjogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xufTtcblxuVXRpbHMubG9hZFJlc291cmNlID0gZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgVXRpbHMuaW8oc291cmNlKS50aGVuKChib2R5KSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBVdGlscy5wYXJzZVJlc291cmNlKGJvZHkpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShzb3VyY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuXG4vLyBOZWVkZWQgZm9yIG9sZGVyIGJyb3dzZXJzIHRoYXQgc3RpbGwgc3VwcG9ydCBXZWJHTCAoU2FmYXJpIDYgZXRjLilcblV0aWxzLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID1cbiAgICAgICAgICAgIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgICAgfHxcbiAgICAgICAgICAgIHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgICAgfHxcbiAgICAgICAgICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSAgICAgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIDEwMDAgLzYwKTtcbiAgICAgICAgICAgIH07XG4gICAgfVxufTtcblxuLy8gU3RyaW5naWZ5IGFuIG9iamVjdCBpbnRvIEpTT04sIGJ1dCBjb252ZXJ0IGZ1bmN0aW9ucyB0byBzdHJpbmdzXG5VdGlscy5zZXJpYWxpemVXaXRoRnVuY3Rpb25zID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkob2JqLCBmdW5jdGlvbihrLCB2KSB7XG4gICAgICAgIC8vIENvbnZlcnQgZnVuY3Rpb25zIHRvIHN0cmluZ3NcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG59O1xuXG4vLyBSZWN1cnNpdmVseSBwYXJzZSBhbiBvYmplY3QsIGF0dGVtcHRpbmcgdG8gY29udmVydCBzdHJpbmcgcHJvcGVydGllcyB0aGF0IGxvb2sgbGlrZSBmdW5jdGlvbnMgYmFjayBpbnRvIGZ1bmN0aW9uc1xuVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zID0gZnVuY3Rpb24ob2JqLCB3cmFwKSB7XG4gICAgLy8gQ29udmVydCBzdHJpbmdcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb2JqID0gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihvYmosIHdyYXApO1xuICAgIH1cbiAgICAvLyBMb29wIHRocm91Z2ggb2JqZWN0IHByb3BlcnRpZXNcbiAgICBlbHNlIGlmIChvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGxldCBwIGluIG9iaikge1xuICAgICAgICAgICAgb2JqW3BdID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKG9ialtwXSwgd3JhcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIENvbnZlcnQgc3RyaW5nIGJhY2sgaW50byBhIGZ1bmN0aW9uXG5VdGlscy5zdHJpbmdUb0Z1bmN0aW9uID0gZnVuY3Rpb24odmFsLCB3cmFwKSB7XG4gICAgLy8gUGFyc2UgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCBib2R5XG4gICAgbGV0IGZtYXRjaCA9XG4gICAgICAgICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgJiZcbiAgICAgICAgdmFsLm1hdGNoKC9eXFxzKmZ1bmN0aW9uW14oXSpcXCgoW14pXSopXFwpXFxzKj9cXHsoW1xcc1xcU10qKVxcfSQvbSk7XG5cbiAgICBpZiAoZm1hdGNoICYmIGZtYXRjaC5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgc3JjID0gZm1hdGNoWzJdO1xuICAgICAgICAgICAgbGV0IGFyZ3MgPSBmbWF0Y2hbMV0ubGVuZ3RoID4gMCAmJiBmbWF0Y2hbMV0uc3BsaXQoJywnKS5tYXAoeCA9PiB4LnRyaW0oKSkuZmlsdGVyKHggPT4geCk7XG4gICAgICAgICAgICBhcmdzID0gYXJncy5sZW5ndGggPiAwID8gYXJncyA6IFsnY29udGV4dCddOyAvLyBkZWZhdWx0IHRvIHNpbmdsZSAnY29udGV4dCcgYXJndW1lbnRcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3cmFwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbiguLi5hcmdzLCB3cmFwKHNyYykpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oLi4uYXJncywgc3JjKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGZhbGwtYmFjayB0byBvcmlnaW5hbCB2YWx1ZSBpZiBwYXJzaW5nIGZhaWxlZFxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufTtcblxuLy8gRGVmYXVsdCB0byBhbGxvd2luZyBoaWdoIHBpeGVsIGRlbnNpdHlcbi8vIFJldHVybnMgdHJ1ZSBpZiBkaXNwbGF5IGRlbnNpdHkgY2hhbmdlZFxuVXRpbHMudXNlX2hpZ2hfZGVuc2l0eV9kaXNwbGF5ID0gdHJ1ZTtcblV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHByZXYgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvID0gKFV0aWxzLnVzZV9oaWdoX2RlbnNpdHlfZGlzcGxheSAmJiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgfHwgMTtcbiAgICByZXR1cm4gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICE9PSBwcmV2O1xufTtcblxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgVXRpbHMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpO1xufVxuXG4vLyBVc2VkIGZvciBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBwb3dlci1vZi0yIGFuZCBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuLy8gVmlhOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NzIyMjQ3L3dlYmdsLXdhaXQtZm9yLXRleHR1cmUtdG8tbG9hZFxuVXRpbHMuaXNQb3dlck9mMiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmICh2YWx1ZSAtIDEpKSA9PT0gMDtcbn07XG5cbi8vIEludGVycG9sYXRlICd4JyBhbG9uZyBhIHNlcmllcyBvZiBjb250cm9sIHBvaW50c1xuLy8gJ3BvaW50cycgaXMgYW4gYXJyYXkgb2YgY29udHJvbCBwb2ludHMgaW4gdGhlIGZvcm0gW3gsIHldXG4vL1xuLy8gRXhhbXBsZTpcbi8vICAgICBDb250cm9sIHBvaW50czpcbi8vICAgICAgICAgWzAsIDVdOiAgd2hlbiB4PTAsIHk9NVxuLy8gICAgICAgICBbNCwgMTBdOiB3aGVuIHg9NCwgeT0xMFxuLy9cbi8vICAgICBVdGlscy5pbnRlcnBvbGF0ZSgyLCBbWzAsIDVdLCBbNCwgMTBdXSk7XG4vLyAgICAgLT4gY29tcHV0ZXMgeD0yLCBoYWxmd2F5IGJldHdlZW4geD0wIGFuZCB4PTQ6ICgxMCAtIDUpIC8gMiArNVxuLy8gICAgIC0+IHJldHVybnMgNy41XG4vL1xuLy8gVE9ETzogYWRkIG90aGVyIGludGVycG9sYXRpb24gbWV0aG9kcyBiZXNpZGVzIGxpbmVhclxuLy9cblV0aWxzLmludGVycG9sYXRlID0gZnVuY3Rpb24oeCwgcG9pbnRzLCB0cmFuc2Zvcm0pIHtcbiAgICAvLyBJZiB0aGlzIGRvZXNuJ3QgcmVzZW1ibGUgYSBsaXN0IG9mIGNvbnRyb2wgcG9pbnRzLCBqdXN0IHJldHVybiB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocG9pbnRzKSB8fCAhQXJyYXkuaXNBcnJheShwb2ludHNbMF0pKSB7XG4gICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuXG4gICAgdmFyIHgxLCB4MiwgZCwgeSwgeTEsIHkyO1xuXG4gICAgLy8gTWluIGJvdW5kc1xuICAgIGlmICh4IDw9IHBvaW50c1swXVswXSkge1xuICAgICAgICB5ID0gcG9pbnRzWzBdWzFdO1xuICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgeSA9IHRyYW5zZm9ybSh5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNYXggYm91bmRzXG4gICAgZWxzZSBpZiAoeCA+PSBwb2ludHNbcG9pbnRzLmxlbmd0aC0xXVswXSkge1xuICAgICAgICB5ID0gcG9pbnRzW3BvaW50cy5sZW5ndGgtMV1bMV07XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB5ID0gdHJhbnNmb3JtKHkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEZpbmQgd2hpY2ggY29udHJvbCBwb2ludHMgeCBpcyBiZXR3ZWVuXG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGk9MDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh4ID49IHBvaW50c1tpXVswXSAmJiB4IDwgcG9pbnRzW2krMV1bMF0pIHtcbiAgICAgICAgICAgICAgICAvLyBMaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgICAgICAgICAgICAgIHgxID0gcG9pbnRzW2ldWzBdO1xuICAgICAgICAgICAgICAgIHgyID0gcG9pbnRzW2krMV1bMF07XG5cbiAgICAgICAgICAgICAgICAvLyBNdWx0aXBsZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwb2ludHNbaV1bMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYz0wOyBjIDwgcG9pbnRzW2ldWzFdLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxID0gdHJhbnNmb3JtKHBvaW50c1tpXVsxXVtjXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSB0cmFuc2Zvcm0ocG9pbnRzW2krMV1bMV1bY10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSB5MiAtIHkxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlbY10gPSBkICogKHggLSB4MSkgLyAoeDIgLSB4MSkgKyB5MTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBwb2ludHNbaSsxXVsxXVtjXSAtIHBvaW50c1tpXVsxXVtjXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5W2NdID0gZCAqICh4IC0geDEpIC8gKHgyIC0geDEpICsgcG9pbnRzW2ldWzFdW2NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNpbmdsZSB2YWx1ZVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB0cmFuc2Zvcm0ocG9pbnRzW2ldWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkyID0gdHJhbnNmb3JtKHBvaW50c1tpKzFdWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSB5MiAtIHkxO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHkxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHBvaW50c1tpKzFdWzFdIC0gcG9pbnRzW2ldWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHBvaW50c1tpXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geTtcbn07XG5cblV0aWxzLnRvQ1NTQ29sb3IgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICBpZiAoY29sb3JbM10gPT09IDEpIHsgLy8gZnVsbCBvcGFjaXR5XG4gICAgICAgIHJldHVybiBgcmdiKCR7Y29sb3Iuc2xpY2UoMCwgMykubWFwKGMgPT4gTWF0aC5yb3VuZChjICogMjU1KSkuam9pbignLCAnKX0pYDtcbiAgICB9XG4gICAgLy8gUkdCIGlzIGJldHdlZW4gWzAsIDI1NV0gb3BhY2l0eSBpcyBiZXR3ZWVuIFswLCAxXVxuICAgIHJldHVybiBgcmdiYSgke2NvbG9yLm1hcCgoYywgaSkgPT4gKGkgPCAzICYmIE1hdGgucm91bmQoYyAqIDI1NSkpIHx8IGMpLmpvaW4oJywgJyl9KWA7XG59O1xuXG5VdGlscy5wb2ludEluVGlsZSA9IGZ1bmN0aW9uIChwb2ludCkge1xuICAgIHJldHVybiBwb2ludFswXSA+PSAwICYmwqBwb2ludFsxXSA+IC1HZW8udGlsZV9zY2FsZSAmJiBwb2ludFswXSA8IEdlby50aWxlX3NjYWxlICYmIHBvaW50WzFdIDw9IDA7XG59O1xuIiwibGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmxldCBwa2cgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uLy4uL3BhY2thZ2UuanNvbicsICd1dGY4JykpO1xubGV0IHZlcnNpb247XG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uID0gJ3YnICsgcGtnLnZlcnNpb247XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG4vLyBXb3JrZXJCcm9rZXIgcm91dGVzIG1lc3NhZ2VzIGJldHdlZW4gd2ViIHdvcmtlcnMgYW5kIHRoZSBtYWluIHRocmVhZCwgYWxsb3dpbmcgZm9yIHNpbXBsZXJcbi8vIGFzeW5jIGNvZGUgdmlhIHByb21pc2VzLiBFeGFtcGxlIHVzYWdlOlxuLy9cbi8vIEluIHdlYiB3b3JrZXIsIHJlZ2lzdGVyIHNlbGYgYXMgYSBjYWxsYWJsZSBcInRhcmdldFwiLCBhbmQgZGVmaW5lIGEgbWV0aG9kOlxuLy9cbi8vICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdzZWxmJywgc2VsZik7XG4vL1xuLy8gICAgIHNlbGYuc3F1YXJlID0gZnVuY3Rpb24gKHgpIHtcbi8vICAgICAgICAgcmV0dXJuIHggKiB4O1xuLy8gICAgIH07XG4vL1xuLy8gSW4gbWFpbiB0aHJlYWQsIGludm9rZSB0aGF0IG1ldGhvZCBhbmQgcmVjZWl2ZSB0aGUgcmVzdWx0IChpZiBhbnkpIGFzIGEgcHJvbWlzZS5cbi8vXG4vLyAgICAgd29ya2VyID0gbmV3IFdvcmtlciguLi4pO1xuLy8gICAgIFdvcmtlckJyb2tlci5hZGRXb3JrZXIod29ya2VyKTtcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHdvcmtlciwgJ3NlbGYuc3F1YXJlJywgNSkudGhlbihmdW5jdGlvbih5KSB7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKHkpO1xuLy8gICAgIH0pO1xuLy9cbi8vICAgICAtPiBwcmludHMgMjVcbi8vXG4vLyBBc3luYyBjb2RlOlxuLy9cbi8vIEZvciBzeW5jaHJvbm91cyBjb2RlIHRoYXQgbXVzdCBwYXNzIGEgcmV0dXJuIHZhbHVlIHRvIHRoZSBtYWluIHRocmVhZCwgdGhlIGZ1bmN0aW9uIGNhbiBzaW1wbHlcbi8vIHJldHVybiBhbiBpbW1lZGlhdGUgdmFsdWUgKHNlZSBleGFtcGxlIGFib3ZlKS4gRm9yIGNhc2VzIHdoZXJlIHRoZSB3b3JrZXIgbWV0aG9kIG5lZWRzIHRvIHJ1blxuLy8gYXN5bmNocm9ub3VzIGNvZGUsIHRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgcHJvbWlzZSwgYW5kIHRoZSByZXNvbHZlZCBvciByZWplY3RlZCB2YWx1ZSB3aWxsXG4vLyBiZSBzZW50IGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkIHdoZW4gdGhlIHByb21pc2UgaXMgZnVsZmlsbGVkLlxuLy9cbi8vIEVycm9yIGhhbmRsaW5nOlxuLy9cbi8vIElmIHRoZSB3b3JrZXIgbWV0aG9kIGVpdGhlciB0aHJvd3MgYW4gZXJyb3IsIG9yIHJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQsIGl0IHdpbGwgYmVcbi8vIHNlbnQgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQgYXMgYSBwcm9taXNlIHJlamVjdGlvbi4gVGhlc2UgdHdvIGV4YW1wbGVzIGFyZSBlcXVpdmFsZW50OlxuLy9cbi8vICAgICBJbiB3b3JrZXIsIHRocm93aW5nIGFuIGVycm9yOlxuLy9cbi8vICAgICAgICAgc2VsZi5icm9rZW4gPSBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vycm9yIGluIHdvcmtlciEnKTtcbi8vICAgICAgICAgfTtcbi8vXG4vLyAgICAgSW4gd29ya2VyLCByZXR1cm5pbmcgYSByZWplY3RlZCBwcm9taXNlOlxuLy9cbi8vICAgICAgICAgc2VsZi5icm9rZW4gPSBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdlcnJvciBpbiB3b3JrZXIhJykpO1xuLy8gICAgICAgICB9O1xuLy9cbi8vICAgICBJbiBtYWluIHRocmVhZCwgYm90aCBlcnJvcnMgYXJlIHJlY2VpdmVkIGFzIGEgcHJvbWlzZSByZWplY3Rpb246XG4vL1xuLy8gICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2Uod29ya2VyLCAnc2VsZi5icm9rZW4nKS50aGVuKFxuLy8gICAgICAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlZFxuLy8gICAgICAgICAgICAgZnVuY3Rpb24oKSB7XG4vLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3N1Y2Nlc3MhJyk7XG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgLy8gUHJvbWlzZSByZWplY3RlZFxuLy8gICAgICAgICAgICAgZnVuY3Rpb24oZXJyb3IpIHtcbi8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IhJywgZXJyb3IpO1xuLy8gICAgICAgICAgICAgfSk7XG4vL1xuLy8gICAgICAgICAtPiBwcmludHMgJ2Vycm9yISBlcnJvciBpbiB3b3JrZXInXG4vL1xuLy8gQ2FsbGluZyBmcm9tIHdvcmtlciB0byBtYWluIHRocmVhZDpcbi8vXG4vLyBUaGUgc2FtZSBzdHlsZSBvZiBjYWxscyBjYW4gYmUgbWFkZSAqZnJvbSogYSB3ZWIgd29ya2VyLCB0byB0aGUgbWFpbiB0aHJlYWQuIFRoZSBBUEkgaXMgdGhlIHNhbWVcbi8vIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCwgJ3dvcmtlcicsIGlzIG5vdCBuZWVkZWQgZm9yIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgpLFxuLy8gc2luY2UgdGhlIG1haW4gdGhyZWFkIGlzIHRoZSBpbXBsaWNpdCB0YXJnZXQuXG4vL1xuLy8gSW4gbWFpbiB0aHJlYWQsIGRlZmluZSBhIG1ldGhvZCBhbmQgcmVnaXN0ZXIgaXQ6XG4vL1xuLy8gICAgIHZhciBnZW9tZXRyeSA9IHtcbi8vICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbih4LCB5KSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuLy8gICAgICAgICB9XG4vLyAgICAgfTtcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCgnZ2VvbWV0cnknLCBnZW9tZXRyeSk7XG4vL1xuLy8gSW4gd29ya2VyIHRocmVhZCk6XG4vL1xuLy8gICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnZ2VvbWV0cnkubGVuZ3RoJywgMywgNCkudGhlbihmdW5jdGlvbihkKSB7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKGQpO1xuLy8gICAgIH0pO1xuLy9cbi8vICAgICAtPiBwcmludHMgNVxuLy9cblxuaW1wb3J0IFRocmVhZCBmcm9tICcuL3RocmVhZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcblxudmFyIFdvcmtlckJyb2tlcjtcbmV4cG9ydCBkZWZhdWx0IFdvcmtlckJyb2tlciA9IHt9O1xuXG4vLyBHbG9iYWwgbGlzdCBvZiBhbGwgd29ya2VyIG1lc3NhZ2VzXG4vLyBVbmlxdWVseSB0cmFja3MgZXZlcnkgY2FsbCBtYWRlIGJldHdlZW4gbWFpbiB0aHJlYWQgYW5kIGEgd29ya2VyXG52YXIgbWVzc2FnZV9pZCA9IDA7XG52YXIgbWVzc2FnZXMgPSB7fTtcblxuLy8gUmVnaXN0ZXIgYW4gb2JqZWN0IHRvIHJlY2VpdmUgY2FsbHMgZnJvbSBvdGhlciB0aHJlYWRcbnZhciB0YXJnZXRzID0ge307XG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0ID0gZnVuY3Rpb24gKG5hbWUsIHRhcmdldCkge1xuICAgIHRhcmdldHNbbmFtZV0gPSB0YXJnZXQ7XG59O1xuXG4vLyBHaXZlbiBhIGRvdC1ub3RhdGlvbi1zdHlsZSBtZXRob2QgbmFtZSwgZS5nLiAnT2JqZWN0Lm9iamVjdC5tZXRob2QnLFxuLy8gZmluZCB0aGUgb2JqZWN0IHRvIGNhbGwgdGhlIG1ldGhvZCBvbiBmcm9tIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgdGFyZ2V0c1xuZnVuY3Rpb24gZmluZFRhcmdldCAobWV0aG9kKSB7XG4gICAgdmFyIGNoYWluID0gW107XG4gICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNoYWluID0gbWV0aG9kLnNwbGl0KCcuJyk7XG4gICAgICAgIG1ldGhvZCA9IGNoYWluLnBvcCgpO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXQgPSB0YXJnZXRzO1xuXG4gICAgZm9yIChsZXQgbT0wOyBtIDwgY2hhaW4ubGVuZ3RoOyBtKyspIHtcbiAgICAgICAgaWYgKHRhcmdldFtjaGFpblttXV0pIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldFtjaGFpblttXV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW21ldGhvZCwgdGFyZ2V0XTtcbn1cblxuLy8gTWFpbiB0aHJlYWQ6XG4vLyAtIFNlbmQgbWVzc2FnZXMgdG8gd29ya2VycywgYW5kIG9wdGlvbmFsbHkgcmVjZWl2ZSBhbiBhc3luYyByZXNwb25zZSBhcyBhIHByb21pc2Vcbi8vIC0gUmVjZWl2ZSBtZXNzYWdlcyBmcm9tIHdvcmtlcnMsIGFuZCBvcHRpb25hbGx5IHNlbmQgYW4gYXN5bmMgcmVzcG9uc2UgYmFjayBhcyBhIHByb21pc2VcbmZ1bmN0aW9uIHNldHVwTWFpblRocmVhZCAoKSB7XG5cbiAgICAvLyBTZW5kIGEgbWVzc2FnZSB0byBhIHdvcmtlciwgYW5kIG9wdGlvbmFsbHkgZ2V0IGFuIGFzeW5jIHJlc3BvbnNlXG4gICAgLy8gQXJndW1lbnRzOlxuICAgIC8vICAgLSB3b3JrZXI6IG9uZSBvciBtb3JlIHdlYiB3b3JrZXIgaW5zdGFuY2VzIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8gKHNpbmdsZSB2YWx1ZSBvciBhcnJheSlcbiAgICAvLyAgIC0gbWV0aG9kOiB0aGUgbWV0aG9kIHdpdGggdGhpcyBuYW1lLCBzcGVjaWZpZWQgd2l0aCBkb3Qtbm90YXRpb24sIHdpbGwgYmUgaW52b2tlZCBpbiB0aGUgd29ya2VyXG4gICAgLy8gICAtIG1lc3NhZ2U6IHNwcmVhZCBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgbWV0aG9kIHdpdGhcbiAgICAvLyBSZXR1cm5zOlxuICAgIC8vICAgLSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBpZiB0aGUgd29ya2VyIG1ldGhvZCByZXR1cm5zIGEgdmFsdWUgKGNvdWxkIGJlIGltbWVkaWF0ZWx5LCBvciBhc3luYylcbiAgICAvL1xuICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSA9IGZ1bmN0aW9uICh3b3JrZXIsIG1ldGhvZCwgLi4ubWVzc2FnZSkge1xuICAgICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIHdvcmtlciBzcGVjaWZpZWQsIHBvc3QgdG8gbXVsdGlwbGVcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkod29ya2VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgIHdvcmtlci5tYXAodyA9PiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodywgbWV0aG9kLCAuLi5tZXNzYWdlKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmFjayBzdGF0ZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlc1ttZXNzYWdlX2lkXSA9IHsgbWV0aG9kLCBtZXNzYWdlLCByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgIGlmIChtZXNzYWdlICYmIG1lc3NhZ2UubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VbMF0gaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSBtZXNzYWdlWzBdLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZVswXS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnbWFpbl9zZW5kJywgICAgICAvLyBtYXJrIG1lc3NhZ2UgYXMgbWV0aG9kIGludm9jYXRpb24gZnJvbSBtYWluIHRocmVhZFxuICAgICAgICAgICAgbWVzc2FnZV9pZCwgICAgICAgICAgICAgLy8gdW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2UsIGZvciBsaWZlIG9mIHByb2dyYW1cbiAgICAgICAgICAgIG1ldGhvZCwgICAgICAgICAgICAgICAgIC8vIHdpbGwgZGlzcGF0Y2ggdG8gYSBmdW5jdGlvbiBvZiB0aGlzIG5hbWUgd2l0aGluIHRoZSB3b3JrZXJcbiAgICAgICAgICAgIG1lc3NhZ2UgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcGF5bG9hZFxuICAgICAgICB9O1xuXG4gICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byB3b3JrZXIgdGhyZWFkYCk7XG4gICAgICAgIH1cblxuICAgICAgICBtZXNzYWdlX2lkKys7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICAvLyBBZGQgYSB3b3JrZXIgdG8gY29tbXVuaWNhdGUgd2l0aCAtIGVhY2ggd29ya2VyIG11c3QgYmUgcmVnaXN0ZXJlZCBmcm9tIHRoZSBtYWluIHRocmVhZFxuICAgIFdvcmtlckJyb2tlci5hZGRXb3JrZXIgPSBmdW5jdGlvbiAod29ya2VyKSB7XG4gICAgICAgIGlmICghKHdvcmtlciBpbnN0YW5jZW9mIFdvcmtlcikpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBhZGQgbm9uLVdvcmtlciBvYmplY3RgLCB3b3JrZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiBXb3JrZXJCcm9rZXJNYWluVGhyZWFkSGFuZGxlcihldmVudCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBtYXliZURlY29kZShldmVudC5kYXRhKTtcbiAgICAgICAgICAgIGxldCBpZCA9IGRhdGEubWVzc2FnZV9pZDtcblxuICAgICAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBjb21pbmcgYmFjayBmcm9tIHRoZSB3b3JrZXIsIGFuZCBmdWxmaWxsIHRoYXQgbWVzc2FnZSdzIHByb21pc2VcbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICd3b3JrZXJfcmVwbHknKSB7XG4gICAgICAgICAgICAgICAgLy8gUGFzcyB0aGUgcmVzdWx0IHRvIHRoZSBwcm9taXNlXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaWRdLnJlamVjdChkYXRhLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZXNvbHZlKGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2VzW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGluaXRpYXRpbmcgYSBjYWxsIGZyb20gdGhlIHdvcmtlciwgZGlzcGF0Y2ggdGhlbSxcbiAgICAgICAgICAgIC8vIGFuZCBzZW5kIGFueSByZXR1cm4gdmFsdWUgYmFjayB0byB0aGUgd29ya2VyXG4gICAgICAgICAgICAvLyBVbmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZSAmIHJldHVybiBjYWxsIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICd3b3JrZXJfc2VuZCcgJiYgaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIHJlcXVlc3RlZCBtZXRob2QgYW5kIHNhdmUgdGhlIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgICAgIHZhciBbbWV0aG9kX25hbWUsIHRhcmdldF0gPSBmaW5kVGFyZ2V0KGRhdGEubWV0aG9kKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IG9uIHRhcmdldCAke2RhdGEudGFyZ2V0fSBiZWNhdXNlIG5vIG9iamVjdCB3aXRoIHRoYXQgbmFtZSBpcyByZWdpc3RlcmVkIG9uIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9ICh0eXBlb2YgdGFyZ2V0W21ldGhvZF9uYW1lXSA9PT0gJ2Z1bmN0aW9uJykgJiYgdGFyZ2V0W21ldGhvZF9uYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IG9uIHRhcmdldCAke2RhdGEudGFyZ2V0fSBiZWNhdXNlIG9iamVjdCBoYXMgbm8gbWV0aG9kIHdpdGggdGhhdCBuYW1lYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCwgZXJyb3I7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kLmFwcGx5KHRhcmdldCwgZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaHJvd24gZXJyb3JzIHdpbGwgYmUgcGFzc2VkIGJhY2sgKGluIHN0cmluZyBmb3JtKSB0byB3b3JrZXJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNlbmQgcmV0dXJuIHZhbHVlIHRvIHdvcmtlclxuICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgICAgICAgICAvLyBBc3luYyByZXN1bHRcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSB2YWx1ZS50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIHdvcmtlciB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm1lc3NhZ2V9OiAke2Vycm9yLnN0YWNrfWAgOiBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW1tZWRpYXRlIHJlc3VsdFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gcmVzdWx0LnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIHdvcmtlciB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgLy8gRXhwb3NlIGZvciBkZWJ1Z2dpbmdcbiAgICBXb3JrZXJCcm9rZXIuZ2V0TWVzc2FnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlcztcbiAgICB9O1xuXG4gICAgV29ya2VyQnJva2VyLmdldE1lc3NhZ2VJZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VfaWQ7XG4gICAgfTtcblxufVxuXG4vLyBXb3JrZXIgdGhyZWFkczpcbi8vIC0gUmVjZWl2ZSBtZXNzYWdlcyBmcm9tIG1haW4gdGhyZWFkLCBhbmQgb3B0aW9uYWxseSBzZW5kIGFuIGFzeW5jIHJlc3BvbnNlIGJhY2sgYXMgYSBwcm9taXNlXG4vLyAtIFNlbmQgbWVzc2FnZXMgdG8gbWFpbiB0aHJlYWQsIGFuZCBvcHRpb25hbGx5IHJlY2VpdmUgYW4gYXN5bmMgcmVzcG9uc2UgYXMgYSBwcm9taXNlXG5mdW5jdGlvbiBzZXR1cFdvcmtlclRocmVhZCAoKSB7XG5cbiAgICAvLyBTZW5kIGEgbWVzc2FnZSB0byB0aGUgbWFpbiB0aHJlYWQsIGFuZCBvcHRpb25hbGx5IGdldCBhbiBhc3luYyByZXNwb25zZSBhcyBhIHByb21pc2VcbiAgICAvLyBBcmd1bWVudHM6XG4gICAgLy8gICAtIG1ldGhvZDogdGhlIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSwgc3BlY2lmaWVkIHdpdGggZG90LW5vdGF0aW9uLCB3aWxsIGJlIGludm9rZWQgb24gdGhlIG1haW4gdGhyZWFkXG4gICAgLy8gICAtIG1lc3NhZ2U6IGFycmF5IG9mIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBtZXRob2Qgd2l0aFxuICAgIC8vIFJldHVybnM6XG4gICAgLy8gICAtIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIGlmIHRoZSBtYWluIHRocmVhZCBtZXRob2QgcmV0dXJucyBhIHZhbHVlIChjb3VsZCBiZSBpbW1lZGlhdGVseSwgb3IgYXN5bmMpXG4gICAgLy9cbiAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UgPSBmdW5jdGlvbiAobWV0aG9kLCAuLi5tZXNzYWdlKSB7XG4gICAgICAgIC8vIFRyYWNrIHN0YXRlIG9mIHRoaXMgbWVzc2FnZVxuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VzW21lc3NhZ2VfaWRdID0geyBtZXRob2QsIG1lc3NhZ2UsIHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgICB9KTtcblxuICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5sZW5ndGggPT09IDEgJiYgbWVzc2FnZVswXSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IG1lc3NhZ2VbMF0udHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlWzBdLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfc2VuZCcsICAgIC8vIG1hcmsgbWVzc2FnZSBhcyBtZXRob2QgaW52b2NhdGlvbiBmcm9tIHdvcmtlclxuICAgICAgICAgICAgbWVzc2FnZV9pZCwgICAgICAgICAgICAgLy8gdW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2UsIGZvciBsaWZlIG9mIHByb2dyYW1cbiAgICAgICAgICAgIG1ldGhvZCwgICAgICAgICAgICAgICAgIC8vIHdpbGwgZGlzcGF0Y2ggdG8gYSBtZXRob2Qgb2YgdGhpcyBuYW1lIG9uIHRoZSBtYWluIHRocmVhZFxuICAgICAgICAgICAgbWVzc2FnZSAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBwYXlsb2FkXG4gICAgICAgIH07XG5cbiAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byBtYWluIHRocmVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVzc2FnZV9pZCsrO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gV29ya2VyQnJva2VyV29ya2VyVGhyZWFkSGFuZGxlcihldmVudCkge1xuICAgICAgICBsZXQgZGF0YSA9IG1heWJlRGVjb2RlKGV2ZW50LmRhdGEpO1xuICAgICAgICBsZXQgaWQgPSBkYXRhLm1lc3NhZ2VfaWQ7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBjb21pbmcgYmFjayBmcm9tIHRoZSBtYWluIHRocmVhZCwgYW5kIGZ1bGZpbGwgdGhhdCBtZXNzYWdlJ3MgcHJvbWlzZVxuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnbWFpbl9yZXBseScpIHtcbiAgICAgICAgICAgIC8vIFBhc3MgdGhlIHJlc3VsdCB0byB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZWplY3QoZGF0YS5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpZF0ucmVzb2x2ZShkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZXNbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlY2VpdmUgbWVzc2FnZXMgZnJvbSBtYWluIHRocmVhZCwgZGlzcGF0Y2ggdGhlbSwgYW5kIHNlbmQgYmFjayBhIHJlcGx5XG4gICAgICAgIC8vIFVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlICYgcmV0dXJuIGNhbGwgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgZWxzZSBpZiAoZGF0YS50eXBlID09PSAnbWFpbl9zZW5kJyAmJiBpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBDYWxsIHRoZSByZXF1ZXN0ZWQgd29ya2VyIG1ldGhvZCBhbmQgc2F2ZSB0aGUgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICB2YXIgW21ldGhvZF9uYW1lLCB0YXJnZXRdID0gZmluZFRhcmdldChkYXRhLm1ldGhvZCk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBkaXNwYXRjaCBtZXNzYWdlIHR5cGUgJHtkYXRhLm1ldGhvZH0gb24gdGFyZ2V0ICR7ZGF0YS50YXJnZXR9IGJlY2F1c2Ugbm8gb2JqZWN0IHdpdGggdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQgb24gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG1ldGhvZCA9ICh0eXBlb2YgdGFyZ2V0W21ldGhvZF9uYW1lXSA9PT0gJ2Z1bmN0aW9uJykgJiYgdGFyZ2V0W21ldGhvZF9uYW1lXTtcblxuICAgICAgICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IGJlY2F1c2Ugd29ya2VyIGhhcyBubyBtZXRob2Qgd2l0aCB0aGF0IG5hbWVgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZXJyb3I7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1ldGhvZC5hcHBseSh0YXJnZXQsIGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhyb3duIGVycm9ycyB3aWxsIGJlIHBhc3NlZCBiYWNrIChpbiBzdHJpbmcgZm9ybSkgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgICAgICBlcnJvciA9IGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNlbmQgcmV0dXJuIHZhbHVlIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgICAgICAvLyBBc3luYyByZXN1bHRcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IHZhbHVlLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW1tZWRpYXRlIHJlc3VsdFxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gcmVzdWx0LnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd29ya2VyX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubWVzc2FnZX06ICR7ZXJyb3Iuc3RhY2t9YCA6IGVycm9yKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxufVxuXG4vLyBTcGVjaWFsIHZhbHVlIHdyYXBwZXIsIHRvIGluZGljYXRlIHRoYXQgd2Ugd2FudCB0byBmaW5kIGFuZCBpbmNsdWRlIHRyYW5zZmVyYWJsZSBvYmplY3RzIGluIHRoZSBtZXNzYWdlXG5Xb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMgPSBmdW5jdGlvbiAoLi4udmFsdWUpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSkge1xuICAgICAgICByZXR1cm4gbmV3IFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcyguLi52YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudHJhbnNmZXJhYmxlcyA9IGZpbmRUcmFuc2ZlcmFibGVzKHRoaXMudmFsdWUpO1xufTtcblxuLy8gQnVpbGQgYSBsaXN0IG9mIHRyYW5zZmVyYWJsZSBvYmplY3RzIGZyb20gYSBzb3VyY2Ugb2JqZWN0XG4vLyBSZXR1cm5zIGEgbGlzdCBvZiBpbmZvIGFib3V0IGVhY2ggdHJhbnNmZXJhYmxlOlxuLy8gICAtIG9iamVjdDogdGhlIGFjdHVhbCB0cmFuc2ZlcmFibGUgb2JqZWN0XG4vLyAgIC0gcGFyZW50OiB0aGUgcGFyZW50IG9iamVjdCB0aGF0IHRoZSB0cmFuc2ZlcmFibGUgaXMgYSBwcm9wZXJ0eSBvZiAoaWYgYW55KVxuLy8gICAtIHByb3BlcnR5OiB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgdHJhbnNmZXJhYmxlIG9uIHRoZSBwYXJlbnQgb2JqZWN0IChpZiBhbnkpXG4vLyBUT0RPOiBhZGQgb3B0aW9uIGluIGNhc2UgeW91IERPTidUIHdhbnQgdG8gdHJhbnNmZXIgb2JqZWN0c1xuZnVuY3Rpb24gZmluZFRyYW5zZmVyYWJsZXMoc291cmNlLCBwYXJlbnQgPSBudWxsLCBwcm9wZXJ0eSA9IG51bGwsIGxpc3QgPSBbXSkge1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgIC8vIENoZWNrIGVhY2ggYXJyYXkgZWxlbWVudFxuICAgICAgICBzb3VyY2UuZm9yRWFjaCgoeCwgaSkgPT4gZmluZFRyYW5zZmVyYWJsZXMoeCwgc291cmNlLCBpLCBsaXN0KSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIElzIHRoZSBvYmplY3QgYSB0cmFuc2ZlcmFibGUgYXJyYXkgYnVmZmVyP1xuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGxpc3QucHVzaCh7IG9iamVjdDogc291cmNlLCBwYXJlbnQsIHByb3BlcnR5IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9yIGxvb2tzIGxpa2UgYSB0eXBlZCBhcnJheSAoaGFzIGFuIGFycmF5IGJ1ZmZlciBwcm9wZXJ0eSk/XG4gICAgICAgIGVsc2UgaWYgKHNvdXJjZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgbGlzdC5wdXNoKHsgb2JqZWN0OiBzb3VyY2UuYnVmZmVyLCBwYXJlbnQsIHByb3BlcnR5IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBlYWNoIHByb3BlcnR5XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBmaW5kVHJhbnNmZXJhYmxlcyhzb3VyY2VbcHJvcF0sIHNvdXJjZSwgcHJvcCwgbGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG59XG5cbi8vIFJlbW92ZSBuZXV0ZXJlZCB0cmFuc2ZlcmFibGVzIGZyb20gcGFyZW50IG9iamVjdHMsIGFzIHRoZXkgc2hvdWxkIG5vIGxvbmdlciBiZSBhY2Nlc3NlZCBhZnRlciB0cmFuc2ZlclxuZnVuY3Rpb24gZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0cmFuc2ZlcmFibGVzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyYW5zZmVyYWJsZXMuZmlsdGVyKHQgPT4gdC5wYXJlbnQgJiYgdC5wcm9wZXJ0eSkuZm9yRWFjaCh0ID0+IGRlbGV0ZSB0LnBhcmVudFt0LnByb3BlcnR5XSk7XG59XG5cbi8vIE1lc3NhZ2UgcGF5bG9hZCBjYW4gYmUgc3RyaW5naWZpZWQgZm9yIGZhc3RlciB0cmFuc2ZlciwgaWYgaXQgZG9lcyBub3QgaW5jbHVkZSB0cmFuc2ZlcmFibGUgb2JqZWN0c1xuZnVuY3Rpb24gbWF5YmVFbmNvZGUgKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpIHtcbiAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZDtcbn1cblxuLy8gUGFyc2Ugc3RyaW5naWZpZWQgbWVzc2FnZSBwYXlsb2FkXG5mdW5jdGlvbiBtYXliZURlY29kZSAoZGF0YSkge1xuICAgIHJldHVybiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGEpO1xufVxuXG4vLyBTZXR1cCB0aGlzIHRocmVhZCBhcyBhcHByb3ByaWF0ZVxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgc2V0dXBNYWluVGhyZWFkKCk7XG59XG5cbmlmIChUaHJlYWQuaXNfd29ya2VyKSB7XG4gICAgc2V0dXBXb3JrZXJUaHJlYWQoKTtcbn1cbiIsIi8qKiogVmVjdG9yIGZ1bmN0aW9ucyAtIHZlY3RvcnMgcHJvdmlkZWQgYXMgW3gsIHksIHpdIGFycmF5cyAqKiovXG5cbnZhciBWZWN0b3I7XG5leHBvcnQgZGVmYXVsdCBWZWN0b3IgPSB7fTtcblxuVmVjdG9yLnNldCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgdmFyIFYgPSBbXTtcbiAgICB2YXIgbGltID0gdi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICBWW2ldID0gdltpXTtcbiAgICB9XG4gICAgcmV0dXJuIFY7XG59O1xuXG5WZWN0b3IubmVnID0gZnVuY3Rpb24gKHYpIHtcbiAgICB2YXIgViA9IFtdO1xuICAgIHZhciBsaW0gPSB2Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIFZbaV0gPSB2W2ldICogLTE7XG4gICAgfVxuICAgIHJldHVybiBWO1xufTtcblxuLy8gQWRkaXRpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5hZGQgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXTtcbiAgICB2YXIgbGltID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICB2W2ldID0gdjFbaV0gKyB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG4vLyBTdWJzdHJhY3Rpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5zdWIgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXTtcbiAgICB2YXIgbGltID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIHZbaV0gPSB2MVtpXSAtIHYyW2ldO1xuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cblZlY3Rvci5zaWduZWRfYXJlYSA9IGZ1bmN0aW9uICh2MSwgdjIsIHYzKSB7XG4gICAgcmV0dXJuICh2MlswXS12MVswXSkqKHYzWzFdLXYxWzFdKSAtICh2M1swXS12MVswXSkqKHYyWzFdLXYxWzFdKTtcbn07XG5cbi8vIE11bHRpcGxpY2F0aW9uIG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IubXVsdCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdLFxuICAgICAgICBsZW4gPSB2MS5sZW5ndGgsXG4gICAgICAgIGk7XG5cbiAgICBpZiAodHlwZW9mIHYyID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBNdWxpdHBseSBieSBzY2FsYXJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gKiB2MjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gTXVsdGlwbHkgdHdvIHZlY3RvcnNcbiAgICAgICAgbGVuID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldICogdjJbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG4vLyBEaXZpc2lvbiBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmRpdiA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdLFxuICAgICAgICBpO1xuICAgIGlmKHR5cGVvZiB2MiA9PT0gJ251bWJlcicpe1xuICAgICAgICAvLyBEaXZpZGUgYnkgc2NhbGFyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gLyB2MjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpdmlkZSB0byB2ZWN0b3JzXG4gICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbih2MS5sZW5ndGgsdjIubGVuZ3RoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gLyB2MltpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cbi8vIEdldCAyRCBwZXJwZW5kaWN1bGFyXG5WZWN0b3IucGVycCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICByZXR1cm4gWyB2MlsxXSAtIHYxWzFdLFxuICAgICAgICAgICAgIHYxWzBdIC0gdjJbMF0gXTtcbn07XG5cbi8vIEdldCAyRCB2ZWN0b3Igcm90YXRlZFxuVmVjdG9yLnJvdCA9IGZ1bmN0aW9uICh2LCBhKSB7XG4gICAgdmFyIGMgPSBNYXRoLmNvcyhhKTtcbiAgICB2YXIgcyA9IE1hdGguc2luKGEpO1xuICAgIHJldHVybiBbdlswXSAqIGMgLSB2WzFdICogcyxcbiAgICAgICAgICAgIHZbMF0gKiBzICsgdlsxXSAqIGNdO1xufTtcblxuLy8gR2V0IDJEIGhlYWRpbmcgYW5nbGVcblZlY3Rvci5hbmdsZSA9IGZ1bmN0aW9uIChbeCwgeV0pIHtcbiAgICByZXR1cm4gTWF0aC5hdGFuMih5LHgpO1xufTtcblxuLy8gR2V0IGFuZ2xlIGJldHdlZW4gdHdvIHZlY3RvcnNcblZlY3Rvci5hbmdsZUJldHdlZW4gPSBmdW5jdGlvbihBLCBCKXtcbiAgICB2YXIgZGVsdGEgPSBWZWN0b3IuZG90KEEsIEIpO1xuICAgIGlmIChkZWx0YSA8IC0xKSB7XG4gICAgICAgIGRlbHRhID0gLTE7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmFjb3MoZGVsdGEpO1xufTtcblxuLy8gQ29tcGFyZSB0d28gcG9pbnRzXG5WZWN0b3IuaXNFcXVhbCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgbGVuID0gdjEubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKHYxW2ldICE9PSB2MltpXSl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBWZWN0b3IgbGVuZ3RoIHNxdWFyZWRcblZlY3Rvci5sZW5ndGhTcSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgaWYgKHYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiAodlswXSp2WzBdICsgdlsxXSp2WzFdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodi5sZW5ndGggPj0gMykge1xuICAgICAgICByZXR1cm4gKHZbMF0qdlswXSArIHZbMV0qdlsxXSArIHZbMl0qdlsyXSk7XG4gICAgfVxuICAgIHJldHVybiAwO1xufTtcblxuLy8gVmVjdG9yIGxlbmd0aFxuVmVjdG9yLmxlbmd0aCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIE1hdGguc3FydChWZWN0b3IubGVuZ3RoU3EodikpO1xufTtcblxuLy8gTm9ybWFsaXplIGEgdmVjdG9yXG5WZWN0b3Iubm9ybWFsaXplID0gZnVuY3Rpb24gKHYpIHtcbiAgICB2YXIgZDtcbiAgICBpZiAodi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgZCA9IHZbMF0qdlswXSArIHZbMV0qdlsxXTtcbiAgICAgICAgZCA9IE1hdGguc3FydChkKTtcblxuICAgICAgICBpZiAoZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFt2WzBdIC8gZCwgdlsxXSAvIGRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbMCwgMF07XG4gICAgfSBlbHNlIGlmICh2Lmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGQgPSB2WzBdKnZbMF0gKyB2WzFdKnZbMV0gKyB2WzJdKnZbMl07XG4gICAgICAgIGQgPSBNYXRoLnNxcnQoZCk7XG5cbiAgICAgICAgaWYgKGQgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbdlswXSAvIGQsIHZbMV0gLyBkLCB2WzJdIC8gZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFswLCAwLCAwXTtcbn07XG5cbi8vIENyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5jcm9zcyAgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgKHYxWzFdICogdjJbMl0pIC0gKHYxWzJdICogdjJbMV0pLFxuICAgICAgICAodjFbMl0gKiB2MlswXSkgLSAodjFbMF0gKiB2MlsyXSksXG4gICAgICAgICh2MVswXSAqIHYyWzFdKSAtICh2MVsxXSAqIHYyWzBdKVxuICAgIF07XG59O1xuXG4vLyBEb3QgcHJvZHVjdCBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmRvdCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgbiA9IDA7XG4gICAgdmFyIGxpbSA9IE1hdGgubWluKHYxLmxlbmd0aCwgdjIubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIG4gKz0gdjFbaV0gKiB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG59O1xuIiwiaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IENhbWVyYSBmcm9tICcuL2NhbWVyYSc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5cbmV4cG9ydCBjb25zdCBWSUVXX1BBTl9TTkFQX1RJTUUgPSAwLjU7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuXG4gICAgY29uc3RydWN0b3IgKHNjZW5lLCBvcHRpb25zKSB7XG4gICAgICAgIHN1YnNjcmliZU1peGluKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgICAgdGhpcy5jcmVhdGVNYXRyaWNlcygpO1xuXG4gICAgICAgIHRoaXMuem9vbSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2VudGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBudWxsO1xuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBudWxsO1xuXG4gICAgICAgIHRoaXMucGFubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhbm5pbmdfc3RvcF9hdCA9IDA7XG4gICAgICAgIHRoaXMucGFuX3NuYXBfdGltZXIgPSAwO1xuICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy56b29tX2RpcmVjdGlvbiA9IDA7XG5cbiAgICAgICAgLy8gU2l6ZSBvZiB2aWV3cG9ydCBpbiBDU1MgcGl4ZWxzLCBkZXZpY2UgcGl4ZWxzLCBhbmQgbWVyY2F0b3IgbWV0ZXJzXG4gICAgICAgIHRoaXMuc2l6ZSA9IHtcbiAgICAgICAgICAgIGNzczoge30sXG4gICAgICAgICAgICBkZXZpY2U6IHt9LFxuICAgICAgICAgICAgbWV0ZXJzOiB7fVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFzcGVjdCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5idWZmZXIgPSAwO1xuICAgICAgICB0aGlzLmNvbnRpbnVvdXNfem9vbSA9ICh0eXBlb2Ygb3B0aW9ucy5jb250aW51b3VzWm9vbSA9PT0gJ2Jvb2xlYW4nKSA/IG9wdGlvbnMuY29udGludW91c1pvb20gOiB0cnVlO1xuICAgICAgICB0aGlzLnRpbGVfc2ltcGxpZmljYXRpb25fbGV2ZWwgPSAwOyAvLyBsZXZlbC1vZi1kZXRhaWwgZG93bnNhbXBsaW5nIHRvIGFwcGx5IHRvIHRpbGUgbG9hZGluZ1xuICAgICAgICB0aGlzLnByZXNlcnZlX3RpbGVzX3dpdGhpbl96b29tID0gMTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgc3RhdGUgYmVmb3JlIHNjZW5lIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAgcmVzZXQgKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBjYW1lcmFcbiAgICBjcmVhdGVDYW1lcmEgKCkge1xuICAgICAgICBsZXQgYWN0aXZlX2NhbWVyYSA9IHRoaXMuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgICAgIGlmIChhY3RpdmVfY2FtZXJhKSB7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYSA9IENhbWVyYS5jcmVhdGUoYWN0aXZlX2NhbWVyYSwgdGhpcywgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1thY3RpdmVfY2FtZXJhXSk7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYS51cGRhdGVWaWV3KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgYWN0aXZlIGNhbWVyYSAtIGZvciBwdWJsaWMgQVBJXG4gICAgZ2V0QWN0aXZlQ2FtZXJhICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2NlbmUuY29uZmlnICYmIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW25hbWVdLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIG5vIGNhbWVyYSBzZXQgYXMgYWN0aXZlLCB1c2UgZmlyc3Qgb25lXG4gICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXMpO1xuICAgICAgICAgICAgcmV0dXJuIGtleXMubGVuZ3RoICYmIGtleXNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgYWN0aXZlIGNhbWVyYSBhbmQgcmVjb21waWxlIC0gZm9yIHB1YmxpYyBBUElcbiAgICBzZXRBY3RpdmVDYW1lcmEgKG5hbWUpIHtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgICAgICBpZiAodGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXS5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBDbGVhciBwcmV2aW91c2x5IGFjdGl2ZSBjYW1lcmFcbiAgICAgICAgICAgIGlmIChwcmV2ICYmIHByZXYgIT09IG5hbWUgJiYgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1twcmV2XSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW3ByZXZdLmFjdGl2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2NlbmUudXBkYXRlQ29uZmlnKHsgcmVidWlsZDogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgdGhpcy5jYW1lcmEudXBkYXRlKCk7XG4gICAgICAgIHRoaXMucGFuX3NuYXBfdGltZXIgPSAoKCtuZXcgRGF0ZSgpKSAtIHRoaXMucGFubmluZ19zdG9wX2F0KSAvIDEwMDA7XG4gICAgfVxuXG4gICAgLy8gU2V0IGxvZ2ljYWwgcGl4ZWwgc2l6ZSBvZiB2aWV3cG9ydFxuICAgIHNldFZpZXdwb3J0U2l6ZSAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICB0aGlzLnNpemUuY3NzID0geyB3aWR0aCwgaGVpZ2h0IH07XG4gICAgICAgIHRoaXMuc2l6ZS5kZXZpY2UgPSB7XG4gICAgICAgICAgICB3aWR0aDogTWF0aC5yb3VuZCh0aGlzLnNpemUuY3NzLndpZHRoICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLnNpemUuY3NzLmhlaWdodCAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbylcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hc3BlY3QgPSB0aGlzLnNpemUuY3NzLndpZHRoIC8gdGhpcy5zaXplLmNzcy5oZWlnaHQ7XG4gICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBtYXAgdmlldywgY2FuIGJlIHBhc3NlZCBhbiBvYmplY3Qgd2l0aCBsYXQvbG5nIGFuZC9vciB6b29tXG4gICAgc2V0VmlldyAoeyBsbmcsIGxhdCwgem9vbSB9ID0ge30pIHtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBTZXQgY2VudGVyXG4gICAgICAgIGlmICh0eXBlb2YgbG5nID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgbGF0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNlbnRlciB8fCBsbmcgIT09IHRoaXMuY2VudGVyLmxuZyB8fCBsYXQgIT09IHRoaXMuY2VudGVyLmxhdCkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2VudGVyID0geyBsbmc6IEdlby53cmFwTG5nKGxuZyksIGxhdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHpvb21cbiAgICAgICAgaWYgKHR5cGVvZiB6b29tID09PSAnbnVtYmVyJyAmJiB6b29tICE9PSB0aGlzLnpvb20pIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRab29tKHpvb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuXG4gICAgc2V0Wm9vbSAoem9vbSkge1xuICAgICAgICBpZiAodGhpcy56b29taW5nKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxhc3RfdGlsZV96b29tID0gdGhpcy50aWxlX3pvb207XG4gICAgICAgIGxldCB0aWxlX3pvb20gPSB0aGlzLnRpbGVab29tKHpvb20pO1xuICAgICAgICBpZiAoIXRoaXMuY29udGludW91c196b29tKSB7XG4gICAgICAgICAgICB6b29tID0gdGlsZV96b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbGVfem9vbSAhPT0gbGFzdF90aWxlX3pvb20pIHtcbiAgICAgICAgICAgIHRoaXMuem9vbV9kaXJlY3Rpb24gPSB0aWxlX3pvb20gPiBsYXN0X3RpbGVfem9vbSA/IDEgOiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnRpbGVfem9vbSA9IHRpbGVfem9vbTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG5cbiAgICBzdGFydFpvb20gKCkge1xuICAgICAgICB0aGlzLmxhc3Rfem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgdGhpcy56b29taW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaG9vc2UgdGhlIGJhc2Ugem9vbSBsZXZlbCB0byB1c2UgZm9yIGEgZ2l2ZW4gZnJhY3Rpb25hbCB6b29tXG4gICAgYmFzZVpvb20gKHpvb20pIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3Ioem9vbSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGEgZ2l2ZW4gdmlldyB6b29tLCB3aGF0IHRpbGUgem9vbSBzaG91bGQgYmUgbG9hZGVkP1xuICAgIHRpbGVab29tICh2aWV3X3pvb20pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVpvb20odmlld196b29tKSAtIHRoaXMudGlsZV9zaW1wbGlmaWNhdGlvbl9sZXZlbDtcbiAgICB9XG5cbiAgICAvLyBGb3IgYSBnaXZlbiB0aWxlIHpvb20sIHdoYXQgc3R5bGUgem9vbSBzaG91bGQgYmUgdXNlZD9cbiAgICBzdHlsZVpvb20gKHRpbGVfem9vbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlWm9vbSh0aWxlX3pvb20pICsgdGhpcy50aWxlX3NpbXBsaWZpY2F0aW9uX2xldmVsO1xuICAgIH1cblxuICAgIHNldFBhbm5pbmcgKHBhbm5pbmcpIHtcbiAgICAgICAgdGhpcy5wYW5uaW5nID0gcGFubmluZztcbiAgICAgICAgaWYgKCF0aGlzLnBhbm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMucGFubmluZ19zdG9wX2F0ID0gKCtuZXcgRGF0ZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlYWR5ICgpIHtcbiAgICAgICAgLy8gVE9ETzogYmV0dGVyIGNvbmNlcHQgb2YgXCJyZWFkaW5lc3NcIiBzdGF0ZT9cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNpemUuY3NzLndpZHRoICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2l6ZS5jc3MuaGVpZ2h0ICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPT0gbnVsbCB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuem9vbSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHZpZXdwb3J0IGJvdW5kcyBiYXNlZCBvbiBjdXJyZW50IGNlbnRlciBhbmQgem9vbVxuICAgIHVwZGF0ZUJvdW5kcyAoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy56b29tKTtcblxuICAgICAgICAvLyBTaXplIG9mIHRoZSBoYWxmLXZpZXdwb3J0IGluIG1ldGVycyBhdCBjdXJyZW50IHpvb21cbiAgICAgICAgdGhpcy5zaXplLm1ldGVycyA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMuc2l6ZS5jc3Mud2lkdGggKiB0aGlzLm1ldGVyc19wZXJfcGl4ZWwsXG4gICAgICAgICAgICB5OiB0aGlzLnNpemUuY3NzLmhlaWdodCAqIHRoaXMubWV0ZXJzX3Blcl9waXhlbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENlbnRlciBvZiB2aWV3cG9ydCBpbiBtZXRlcnMsIGFuZCB0aWxlXG4gICAgICAgIGxldCBbeCwgeV0gPSBHZW8ubGF0TG5nVG9NZXRlcnMoW3RoaXMuY2VudGVyLmxuZywgdGhpcy5jZW50ZXIubGF0XSk7XG4gICAgICAgIHRoaXMuY2VudGVyLm1ldGVycyA9IHsgeCwgeSB9O1xuXG4gICAgICAgIHRoaXMuY2VudGVyLnRpbGUgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5jZW50ZXIubWV0ZXJzLngsIHRoaXMuY2VudGVyLm1ldGVycy55XSwgdGhpcy50aWxlX3pvb20pO1xuXG4gICAgICAgIC8vIEJvdW5kcyBpbiBtZXRlcnNcbiAgICAgICAgdGhpcy5ib3VuZHMgPSB7XG4gICAgICAgICAgICBzdzoge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuY2VudGVyLm1ldGVycy54IC0gdGhpcy5zaXplLm1ldGVycy54IC8gMixcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNlbnRlci5tZXRlcnMueSAtIHRoaXMuc2l6ZS5tZXRlcnMueSAvIDJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZToge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuY2VudGVyLm1ldGVycy54ICsgdGhpcy5zaXplLm1ldGVycy54IC8gMixcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNlbnRlci5tZXRlcnMueSArIHRoaXMuc2l6ZS5tZXRlcnMueSAvIDJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNjZW5lLnRpbGVfbWFuYWdlci51cGRhdGVUaWxlc0ZvclZpZXcoKTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ21vdmUnKTtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7IC8vIFRPRE8gYXV0b21hdGUgdmlhIG1vdmUgZXZlbnQ/XG4gICAgfVxuXG4gICAgZmluZFZpc2libGVUaWxlQ29vcmRpbmF0ZXMgKCkge1xuICAgICAgICBpZiAoIXRoaXMuYm91bmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgeiA9IHRoaXMudGlsZV96b29tO1xuICAgICAgICBsZXQgc3cgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5ib3VuZHMuc3cueCwgdGhpcy5ib3VuZHMuc3cueV0sIHopO1xuICAgICAgICBsZXQgbmUgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5ib3VuZHMubmUueCwgdGhpcy5ib3VuZHMubmUueV0sIHopO1xuXG4gICAgICAgIGxldCBjb29yZHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgeCA9IHN3LnggLSB0aGlzLmJ1ZmZlcjsgeCA8PSBuZS54ICsgdGhpcy5idWZmZXI7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IG5lLnkgLSB0aGlzLmJ1ZmZlcjsgeSA8PSBzdy55ICsgdGhpcy5idWZmZXI7IHkrKykge1xuICAgICAgICAgICAgICAgIGNvb3Jkcy5wdXNoKFRpbGUuY29vcmQoeyB4LCB5LCB6IH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29vcmRzO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0b28gZmFyIG91dHNpZGUgb2Ygdmlld1xuICAgIHBydW5lVGlsZXNGb3JWaWV3ICgpIHtcbiAgICAgICAgLy8gVE9ETzogd2lsbCB0aGlzIGZ1bmN0aW9uIGV2ZXIgYmUgY2FsbGVkIHdoZW4gdmlldyBpc24ndCByZWFkeT9cbiAgICAgICAgaWYgKCF0aGlzLnJlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IGFyZSBhIHNwZWNpZmllZCAjIG9mIHRpbGVzIG91dHNpZGUgb2YgdGhlIHZpZXdwb3J0IGJvcmRlclxuICAgICAgICBsZXQgYm9yZGVyX3RpbGVzID0gW1xuICAgICAgICAgICAgTWF0aC5jZWlsKChNYXRoLmZsb29yKHRoaXMuc2l6ZS5jc3Mud2lkdGggLyBHZW8udGlsZV9zaXplKSArIDIpIC8gMiksXG4gICAgICAgICAgICBNYXRoLmNlaWwoKE1hdGguZmxvb3IodGhpcy5zaXplLmNzcy5oZWlnaHQgLyBHZW8udGlsZV9zaXplKSArIDIpIC8gMilcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLnNjZW5lLnRpbGVfbWFuYWdlci5yZW1vdmVUaWxlcyh0aWxlID0+IHtcbiAgICAgICAgICAgIC8vIElnbm9yZSB2aXNpYmxlIHRpbGVzXG4gICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlIHx8IHRpbGUucHJveHlfZm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGlsZXMgb3V0c2lkZSBnaXZlbiB6b29tIHRoYXQgYXJlIHN0aWxsIGxvYWRpbmdcbiAgICAgICAgICAgIGlmICh0aWxlLmxvYWRpbmcgJiYgdGlsZS5zdHlsZV96b29tICE9PSB0aGlzLnRpbGVfem9vbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXNjYXJkIGlmIHRvbyBmYXIgZnJvbSBjdXJyZW50IHpvb21cbiAgICAgICAgICAgIGxldCB6ZGlmZiA9IE1hdGguYWJzKHRpbGUuc3R5bGVfem9vbSAtIHRoaXMudGlsZV96b29tKTtcbiAgICAgICAgICAgIGlmICh6ZGlmZiA+IHRoaXMucHJlc2VydmVfdGlsZXNfd2l0aGluX3pvb20pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIHRpbGVzIGF0IGRpZmZlcmVudCB6b29tc1xuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbSh0aWxlLmNvb3JkcywgdGhpcy50aWxlX3pvb20pO1xuXG4gICAgICAgICAgICAvLyBEaXNjYXJkIHRpbGVzIG91dHNpZGUgYW4gYXJlYSBzdXJyb3VuZGluZyB0aGUgdmlld3BvcnRcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhjb29yZHMueCAtIHRoaXMuY2VudGVyLnRpbGUueCkgLSBib3JkZXJfdGlsZXNbMF0gPiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgVmlldzogcmVtb3ZlIHRpbGUgJHt0aWxlLmtleX0gKGFzICR7Y29vcmRzLnh9LyR7Y29vcmRzLnl9LyR7dGhpcy50aWxlX3pvb219KSBmb3IgYmVpbmcgdG9vIGZhciBvdXQgb2YgdmlzaWJsZSBhcmVhICoqKmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoY29vcmRzLnkgLSB0aGlzLmNlbnRlci50aWxlLnkpIC0gYm9yZGVyX3RpbGVzWzFdID4gdGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFZpZXc6IHJlbW92ZSB0aWxlICR7dGlsZS5rZXl9IChhcyAke2Nvb3Jkcy54fS8ke2Nvb3Jkcy55fS8ke3RoaXMudGlsZV96b29tfSkgZm9yIGJlaW5nIHRvbyBmYXIgb3V0IG9mIHZpc2libGUgYXJlYSAqKipgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWxsb2NhdGUgbW9kZWwtdmlldyBtYXRyaWNlc1xuICAgIC8vIDY0LWJpdCB2ZXJzaW9ucyBhcmUgZm9yIENQVSBjYWxjdWF0aW9uc1xuICAgIC8vIDMyLWJpdCB2ZXJzaW9ucyBhcmUgZG93bnNhbXBsZWQgYW5kIHNlbnQgdG8gR1BVXG4gICAgY3JlYXRlTWF0cmljZXMgKCkge1xuICAgICAgICB0aGlzLm1hdHJpY2VzID0ge307XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWwgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5tb2RlbDMyID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWxfdmlldyA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm1vZGVsX3ZpZXczMiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm5vcm1hbCA9IG5ldyBGbG9hdDY0QXJyYXkoOSk7XG4gICAgICAgIHRoaXMubWF0cmljZXMubm9ybWFsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLmludmVyc2Vfbm9ybWFsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgc2V0IG1vZGVsL3ZpZXcgYW5kIG5vcm1hbCBtYXRyaWNlcyBmb3IgYSB0aWxlXG4gICAgc2V0dXBUaWxlICh0aWxlLCBwcm9ncmFtKSB7XG4gICAgICAgIC8vIFRpbGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgLy8gVE9ETzogY2FsYyB0aGVzZSBvbmNlIHBlciB0aWxlIChjdXJyZW50bHkgYmVpbmcgbmVlZGxlc3NseSByZS1jYWxjdWxhdGVkIHBlci10aWxlLXBlci1zdHlsZSlcbiAgICAgICAgdGlsZS5zZXR1cFByb2dyYW0odGhpcy5tYXRyaWNlcywgcHJvZ3JhbSk7XG5cbiAgICAgICAgLy8gTW9kZWwtdmlldyBhbmQgbm9ybWFsIG1hdHJpY2VzXG4gICAgICAgIHRoaXMuY2FtZXJhLnNldHVwTWF0cmljZXModGhpcy5tYXRyaWNlcywgcHJvZ3JhbSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGdlbmVyYWwgdW5pZm9ybXMgdGhhdCBtdXN0IGJlIHVwZGF0ZWQgb25jZSBwZXIgcHJvZ3JhbVxuICAgIHNldHVwUHJvZ3JhbSAocHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzJmdicsICd1X3Jlc29sdXRpb24nLCBbdGhpcy5zaXplLmRldmljZS53aWR0aCwgdGhpcy5zaXplLmRldmljZS5oZWlnaHRdKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9tYXBfcG9zaXRpb24nLCBbdGhpcy5jZW50ZXIubWV0ZXJzLngsIHRoaXMuY2VudGVyLm1ldGVycy55LCB0aGlzLnpvb21dKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X21ldGVyc19wZXJfcGl4ZWwnLCB0aGlzLm1ldGVyc19wZXJfcGl4ZWwpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJywgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3ZpZXdfcGFuX3NuYXBfdGltZXInLCB0aGlzLnBhbl9zbmFwX3RpbWVyKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxaScsICd1X3ZpZXdfcGFubmluZycsIHRoaXMucGFubmluZyk7XG5cbiAgICAgICAgdGhpcy5jYW1lcmEuc2V0dXBQcm9ncmFtKHByb2dyYW0pO1xuICAgIH1cblxuICAgIC8vIFZpZXcgcmVxdWlyZXMgc29tZSBhbmltYXRpb24sIHN1Y2ggYXMgYWZ0ZXIgcGFubmluZyBzdG9wc1xuICAgIGlzQW5pbWF0aW5nICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnBhbl9zbmFwX3RpbWVyIDw9IFZJRVdfUEFOX1NOQVBfVElNRSk7XG4gICAgfVxuXG59XG4iXX0= diff --git a/dist/tangram.min.js b/dist/tangram.min.js index 4633bc6f6..cd37f69bc 100644 --- a/dist/tangram.min.js +++ b/dist/tangram.min.js @@ -1,18 +1,18 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Tangram=e()}}(function(){var e;return function t(e,r,n){function i(s,a){if(!r[s]){if(!e[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(o)return o(s,!0);var l=new Error("Cannot find module '"+s+"'");throw l.code="MODULE_NOT_FOUND",l}var c=r[s]={exports:{}};e[s][0].call(c.exports,function(t){var r=e[s][1][t];return i(r?r:t)},c,c.exports,t,e,r,n)}return r[s].exports}for(var o="function"==typeof require&&require,s=0;sc){for(var t=0,r=a.length-l;r>t;t++)a[t]=a[t+l];a.length-=l,l=0}}a.length=0,l=0,u=!1}function i(e){var t=1,r=new h(e),n=document.createTextNode("");return r.observe(n,{characterData:!0}),function(){t=-t,n.data=t}}function o(e){return function(){function t(){clearTimeout(r),clearInterval(n),e()}var r=setTimeout(t,0),n=setInterval(t,50)}}t.exports=r;var s,a=[],u=!1,l=0,c=1024,f="undefined"!=typeof e?e:self,h=f.MutationObserver||f.WebKitMutationObserver;s="function"==typeof h?i(n):o(n),r.requestFlush=s,r.makeRequestCallFromTimer=o}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(e,t,r){"use strict";function n(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===e[t-2]?2:"="===e[t-1]?1:0}function i(e){return 3*e.length/4-n(e)}function o(e){var t,r,i,o,s,a,u=e.length;s=n(e),a=new f(3*u/4-s),i=s>0?u-4:u;var l=0;for(t=0,r=0;i>t;t+=4,r+=3)o=c[e.charCodeAt(t)]<<18|c[e.charCodeAt(t+1)]<<12|c[e.charCodeAt(t+2)]<<6|c[e.charCodeAt(t+3)],a[l++]=o>>16&255,a[l++]=o>>8&255,a[l++]=255&o;return 2===s?(o=c[e.charCodeAt(t)]<<2|c[e.charCodeAt(t+1)]>>4,a[l++]=255&o):1===s&&(o=c[e.charCodeAt(t)]<<10|c[e.charCodeAt(t+1)]<<4|c[e.charCodeAt(t+2)]>>2,a[l++]=o>>8&255,a[l++]=255&o),a}function s(e){return l[e>>18&63]+l[e>>12&63]+l[e>>6&63]+l[63&e]}function a(e,t,r){for(var n,i=[],o=t;r>o;o+=3)n=(e[o]<<16)+(e[o+1]<<8)+e[o+2],i.push(s(n));return i.join("")}function u(e){for(var t,r=e.length,n=r%3,i="",o=[],s=16383,u=0,c=r-n;c>u;u+=s)o.push(a(e,u,u+s>c?c:u+s));return 1===n?(t=e[r-1],i+=l[t>>2],i+=l[t<<4&63],i+="=="):2===n&&(t=(e[r-2]<<8)+e[r-1],i+=l[t>>10],i+=l[t>>4&63],i+=l[t<<2&63],i+="="),o.push(i),o.join("")}r.byteLength=i,r.toByteArray=o,r.fromByteArray=u;for(var l=[],c=[],f="undefined"!=typeof Uint8Array?Uint8Array:Array,h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",d=0,p=h.length;p>d;++d)l[d]=h[d],c[h.charCodeAt(d)]=d;c["-".charCodeAt(0)]=62,c["_".charCodeAt(0)]=63},{}],4:[function(){},{}],5:[function(e,t,r){(function(t){"use strict";function n(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&"function"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(t){return!1}}function i(){return s.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function o(e,t){if(i()e)throw new RangeError('"size" argument must not be negative')}function l(e,t,r,n){return u(t),0>=t?o(e,t):void 0!==r?"string"==typeof n?o(e,t).fill(r,n):o(e,t).fill(r):o(e,t)}function c(e,t){if(u(t),e=o(e,0>t?0:0|_(t)),!s.TYPED_ARRAY_SUPPORT)for(var r=0;t>r;++r)e[r]=0;return e}function f(e,t,r){if(("string"!=typeof r||""===r)&&(r="utf8"),!s.isEncoding(r))throw new TypeError('"encoding" must be a valid string encoding');var n=0|g(t,r);e=o(e,n);var i=e.write(t,r);return i!==n&&(e=e.slice(0,i)),e}function h(e,t){var r=t.length<0?0:0|_(t.length);e=o(e,r);for(var n=0;r>n;n+=1)e[n]=255&t[n];return e}function d(e,t,r,n){if(t.byteLength,0>r||t.byteLength=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|e}function m(e){return+e!=e&&(e=0),s.alloc(+e)}function g(e,t){if(s.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return W(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return X(e).length;default:if(n)return W(e).length;t=(""+t).toLowerCase(),n=!0}}function v(e,t,r){var n=!1;if((void 0===t||0>t)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),0>=r)return"";if(r>>>=0,t>>>=0,t>=r)return"";for(e||(e="utf8");;)switch(e){case"hex":return N(this,t,r);case"utf8":case"utf-8":return M(this,t,r);case"ascii":return P(this,t,r);case"latin1":case"binary":return z(this,t,r);case"base64":return R(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return j(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function y(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function b(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:-2147483648>r&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:e.length-1),0>r&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(0>r){if(!i)return-1;r=0}if("string"==typeof t&&(t=s.from(t,n)),s.isBuffer(t))return 0===t.length?-1:x(e,t,r,n,i);if("number"==typeof t)return t=255&t,s.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):x(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function x(e,t,r,n,i){function o(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}var s=1,a=e.length,u=t.length;if(void 0!==n&&(n=String(n).toLowerCase(),"ucs2"===n||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;s=2,a/=2,u/=2,r/=2}var l;if(i){var c=-1;for(l=r;a>l;l++)if(o(e,l)===o(t,-1===c?0:l-c)){if(-1===c&&(c=l),l-c+1===u)return c*s}else-1!==c&&(l-=l-c),c=-1}else for(r+u>a&&(r=a-u),l=r;l>=0;l--){for(var f=!0,h=0;u>h;h++)if(o(e,l+h)!==o(t,h)){f=!1;break}if(f)return l}return-1}function w(e,t,r,n){r=Number(r)||0;var i=e.length-r;n?(n=Number(n),n>i&&(n=i)):n=i;var o=t.length;if(o%2!==0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var s=0;n>s;++s){var a=parseInt(t.substr(2*s,2),16);if(isNaN(a))return s;e[r+s]=a}return s}function k(e,t,r,n){return Y(W(t,e.length-r),e,r,n)}function A(e,t,r,n){return Y(Z(t),e,r,n)}function T(e,t,r,n){return A(e,t,r,n)}function E(e,t,r,n){return Y(X(t),e,r,n)}function S(e,t,r,n){return Y(H(t,e.length-r),e,r,n)}function R(e,t,r){return K.fromByteArray(0===t&&r===e.length?e:e.slice(t,r))}function M(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;r>i;){var o=e[i],s=null,a=o>239?4:o>223?3:o>191?2:1;if(r>=i+a){var u,l,c,f;switch(a){case 1:128>o&&(s=o);break;case 2:u=e[i+1],128===(192&u)&&(f=(31&o)<<6|63&u,f>127&&(s=f));break;case 3:u=e[i+1],l=e[i+2],128===(192&u)&&128===(192&l)&&(f=(15&o)<<12|(63&u)<<6|63&l,f>2047&&(55296>f||f>57343)&&(s=f));break;case 4:u=e[i+1],l=e[i+2],c=e[i+3],128===(192&u)&&128===(192&l)&&128===(192&c)&&(f=(15&o)<<18|(63&u)<<12|(63&l)<<6|63&c,f>65535&&1114112>f&&(s=f))}}null===s?(s=65533,a=1):s>65535&&(s-=65536,n.push(s>>>10&1023|55296),s=56320|1023&s),n.push(s),i+=a}return O(n)}function O(e){var t=e.length;if(et>=t)return String.fromCharCode.apply(String,e);for(var r="",n=0;t>n;)r+=String.fromCharCode.apply(String,e.slice(n,n+=et));return r}function P(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;r>i;++i)n+=String.fromCharCode(127&e[i]);return n}function z(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;r>i;++i)n+=String.fromCharCode(e[i]);return n}function N(e,t,r){var n=e.length;(!t||0>t)&&(t=0),(!r||0>r||r>n)&&(r=n);for(var i="",o=t;r>o;++o)i+=q(e[o]);return i}function j(e,t,r){for(var n=e.slice(t,r),i="",o=0;oe)throw new RangeError("offset is not uint");if(e+t>r)throw new RangeError("Trying to access beyond buffer length")}function I(e,t,r,n,i,o){if(!s.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||o>t)throw new RangeError('"value" argument is out of bounds');if(r+n>e.length)throw new RangeError("Index out of range")}function C(e,t,r,n){0>t&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-r,2);o>i;++i)e[r+i]=(t&255<<8*(n?i:1-i))>>>8*(n?i:1-i)}function F(e,t,r,n){0>t&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-r,4);o>i;++i)e[r+i]=t>>>8*(n?i:3-i)&255}function U(e,t,r,n){if(r+n>e.length)throw new RangeError("Index out of range");if(0>r)throw new RangeError("Index out of range")}function D(e,t,r,n,i){return i||U(e,t,r,4,3.4028234663852886e38,-3.4028234663852886e38),$.write(e,t,r,n,23,4),r+4}function B(e,t,r,n,i){return i||U(e,t,r,8,1.7976931348623157e308,-1.7976931348623157e308),$.write(e,t,r,n,52,8),r+8}function G(e){if(e=V(e).replace(tt,""),e.length<2)return"";for(;e.length%4!==0;)e+="=";return e}function V(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function q(e){return 16>e?"0"+e.toString(16):e.toString(16)}function W(e,t){t=t||1/0;for(var r,n=e.length,i=null,o=[],s=0;n>s;++s){if(r=e.charCodeAt(s),r>55295&&57344>r){if(!i){if(r>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(t-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(56320>r){(t-=3)>-1&&o.push(239,191,189),i=r;continue}r=(i-55296<<10|r-56320)+65536}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,128>r){if((t-=1)<0)break;o.push(r)}else if(2048>r){if((t-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(65536>r){if((t-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(1114112>r))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function Z(e){for(var t=[],r=0;r>8,i=r%256,o.push(i),o.push(n);return o}function X(e){return K.toByteArray(G(e))}function Y(e,t,r,n){for(var i=0;n>i&&!(i+r>=t.length||i>=e.length);++i)t[i+r]=e[i];return i}function J(e){return e!==e}var K=e("base64-js"),$=e("ieee754"),Q=e("isarray");r.Buffer=s,r.SlowBuffer=m,r.INSPECT_MAX_BYTES=50,s.TYPED_ARRAY_SUPPORT=void 0!==t.TYPED_ARRAY_SUPPORT?t.TYPED_ARRAY_SUPPORT:n(),r.kMaxLength=i(),s.poolSize=8192,s._augment=function(e){return e.__proto__=s.prototype,e},s.from=function(e,t,r){return a(null,e,t,r)},s.TYPED_ARRAY_SUPPORT&&(s.prototype.__proto__=Uint8Array.prototype,s.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&s[Symbol.species]===s&&Object.defineProperty(s,Symbol.species,{value:null,configurable:!0})),s.alloc=function(e,t,r){return l(null,e,t,r)},s.allocUnsafe=function(e){return c(null,e)},s.allocUnsafeSlow=function(e){return c(null,e)},s.isBuffer=function(e){return!(null==e||!e._isBuffer)},s.compare=function(e,t){if(!s.isBuffer(e)||!s.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var r=e.length,n=t.length,i=0,o=Math.min(r,n);o>i;++i)if(e[i]!==t[i]){r=e[i],n=t[i];break}return n>r?-1:r>n?1:0},s.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},s.concat=function(e,t){if(!Q(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return s.alloc(0);var r;if(void 0===t)for(t=0,r=0;rt;t+=2)y(this,t,t+1);return this},s.prototype.swap32=function(){var e=this.length;if(e%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;e>t;t+=4)y(this,t,t+3),y(this,t+1,t+2);return this},s.prototype.swap64=function(){var e=this.length;if(e%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;e>t;t+=8)y(this,t,t+7),y(this,t+1,t+6),y(this,t+2,t+5),y(this,t+3,t+4);return this},s.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?M(this,0,e):v.apply(this,arguments)},s.prototype.equals=function(e){if(!s.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e?!0:0===s.compare(this,e)},s.prototype.inspect=function(){var e="",t=r.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString("hex",0,t).match(/.{2}/g).join(" "),this.length>t&&(e+=" ... ")),""},s.prototype.compare=function(e,t,r,n,i){if(!s.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),0>t||r>e.length||0>n||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(t>>>=0,r>>>=0,n>>>=0,i>>>=0,this===e)return 0;for(var o=i-n,a=r-t,u=Math.min(o,a),l=this.slice(n,i),c=e.slice(t,r),f=0;u>f;++f)if(l[f]!==c[f]){o=l[f],a=c[f];break}return a>o?-1:o>a?1:0},s.prototype.includes=function(e,t,r){return-1!==this.indexOf(e,t,r)},s.prototype.indexOf=function(e,t,r){return b(this,e,t,r,!0)},s.prototype.lastIndexOf=function(e,t,r){return b(this,e,t,r,!1)},s.prototype.write=function(e,t,r,n){if(void 0===t)n="utf8",r=this.length,t=0;else if(void 0===r&&"string"==typeof t)n=t,r=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t=0|t,isFinite(r)?(r=0|r,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-t;if((void 0===r||r>i)&&(r=i),e.length>0&&(0>r||0>t)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return w(this,e,t,r);case"utf8":case"utf-8":return k(this,e,t,r);case"ascii":return A(this,e,t,r);case"latin1":case"binary":return T(this,e,t,r);case"base64":return E(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},s.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var et=4096;s.prototype.slice=function(e,t){var r=this.length;e=~~e,t=void 0===t?r:~~t,0>e?(e+=r,0>e&&(e=0)):e>r&&(e=r),0>t?(t+=r,0>t&&(t=0)):t>r&&(t=r),e>t&&(t=e);var n;if(s.TYPED_ARRAY_SUPPORT)n=this.subarray(e,t),n.__proto__=s.prototype;else{var i=t-e;n=new s(i,void 0);for(var o=0;i>o;++o)n[o]=this[o+e]}return n},s.prototype.readUIntLE=function(e,t,r){e=0|e,t=0|t,r||L(e,t,this.length);for(var n=this[e],i=1,o=0;++o0&&(i*=256);)n+=this[e+--t]*i;return n},s.prototype.readUInt8=function(e,t){return t||L(e,1,this.length),this[e]},s.prototype.readUInt16LE=function(e,t){return t||L(e,2,this.length),this[e]|this[e+1]<<8},s.prototype.readUInt16BE=function(e,t){return t||L(e,2,this.length),this[e]<<8|this[e+1]},s.prototype.readUInt32LE=function(e,t){return t||L(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},s.prototype.readUInt32BE=function(e,t){return t||L(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},s.prototype.readIntLE=function(e,t,r){e=0|e,t=0|t,r||L(e,t,this.length);for(var n=this[e],i=1,o=0;++o=i&&(n-=Math.pow(2,8*t)),n},s.prototype.readIntBE=function(e,t,r){e=0|e,t=0|t,r||L(e,t,this.length);for(var n=t,i=1,o=this[e+--n];n>0&&(i*=256);)o+=this[e+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*t)),o},s.prototype.readInt8=function(e,t){return t||L(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},s.prototype.readInt16LE=function(e,t){t||L(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt16BE=function(e,t){t||L(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt32LE=function(e,t){return t||L(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},s.prototype.readInt32BE=function(e,t){return t||L(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},s.prototype.readFloatLE=function(e,t){return t||L(e,4,this.length),$.read(this,e,!0,23,4)},s.prototype.readFloatBE=function(e,t){return t||L(e,4,this.length),$.read(this,e,!1,23,4)},s.prototype.readDoubleLE=function(e,t){return t||L(e,8,this.length),$.read(this,e,!0,52,8)},s.prototype.readDoubleBE=function(e,t){return t||L(e,8,this.length),$.read(this,e,!1,52,8)},s.prototype.writeUIntLE=function(e,t,r,n){if(e=+e,t=0|t,r=0|r,!n){var i=Math.pow(2,8*r)-1;I(this,e,t,r,i,0)}var o=1,s=0;for(this[t]=255&e;++s=0&&(s*=256);)this[t+o]=e/s&255;return t+r},s.prototype.writeUInt8=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,1,255,0),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},s.prototype.writeUInt16LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):C(this,e,t,!0),t+2},s.prototype.writeUInt16BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},s.prototype.writeUInt32LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):F(this,e,t,!0),t+4},s.prototype.writeUInt32BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):F(this,e,t,!1),t+4},s.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t=0|t,!n){var i=Math.pow(2,8*r-1);I(this,e,t,r,i-1,-i)}var o=0,s=1,a=0;for(this[t]=255&e;++oe&&0===a&&0!==this[t+o-1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+r},s.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t=0|t,!n){var i=Math.pow(2,8*r-1);I(this,e,t,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[t+o]=255&e;--o>=0&&(s*=256);)0>e&&0===a&&0!==this[t+o+1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+r},s.prototype.writeInt8=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,1,127,-128),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),0>e&&(e=255+e+1),this[t]=255&e,t+1},s.prototype.writeInt16LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):C(this,e,t,!0),t+2},s.prototype.writeInt16BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},s.prototype.writeInt32LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,2147483647,-2147483648),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):F(this,e,t,!0),t+4},s.prototype.writeInt32BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,2147483647,-2147483648),0>e&&(e=4294967295+e+1),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):F(this,e,t,!1),t+4},s.prototype.writeFloatLE=function(e,t,r){return D(this,e,t,!0,r)},s.prototype.writeFloatBE=function(e,t,r){return D(this,e,t,!1,r)},s.prototype.writeDoubleLE=function(e,t,r){return B(this,e,t,!0,r)},s.prototype.writeDoubleBE=function(e,t,r){return B(this,e,t,!1,r)},s.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&r>n&&(n=r),n===r)return 0;if(0===e.length||0===this.length)return 0;if(0>t)throw new RangeError("targetStart out of bounds");if(0>r||r>=this.length)throw new RangeError("sourceStart out of bounds");if(0>n)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-tr&&n>t)for(i=o-1;i>=0;--i)e[i+t]=this[i+r];else if(1e3>o||!s.TYPED_ARRAY_SUPPORT)for(i=0;o>i;++i)e[i+t]=this[i+r];else Uint8Array.prototype.set.call(e,this.subarray(r,r+o),t);return o},s.prototype.fill=function(e,t,r,n){if("string"==typeof e){if("string"==typeof t?(n=t,t=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),1===e.length){var i=e.charCodeAt(0);256>i&&(e=i)}if(void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!s.isEncoding(n))throw new TypeError("Unknown encoding: "+n)}else"number"==typeof e&&(e=255&e);if(0>t||this.length=r)return this;t>>>=0,r=void 0===r?this.length:r>>>0,e||(e=0);var o;if("number"==typeof e)for(o=t;r>o;++o)this[o]=e;else{var a=s.isBuffer(e)?e:W(new s(e,n).toString()),u=a.length;for(o=0;r-t>o;++o)this[o+t]=a[o%u]}return this};var tt=/[^+\/0-9A-Za-z-_]/g}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"base64-js":3,ieee754:91,isarray:94}],6:[function(e,t){e("../modules/es6.object.to-string"),e("../modules/es6.string.iterator"),e("../modules/web.dom.iterable"),e("../modules/es6.promise"),t.exports=e("../modules/_core").Promise},{"../modules/_core":14,"../modules/es6.object.to-string":66,"../modules/es6.promise":67,"../modules/es6.string.iterator":68,"../modules/web.dom.iterable":69}],7:[function(e,t){t.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},{}],8:[function(e,t){var r=e("./_wks")("unscopables"),n=Array.prototype;void 0==n[r]&&e("./_hide")(n,r,{}),t.exports=function(e){n[r][e]=!0}},{"./_hide":25,"./_wks":63}],9:[function(e,t){t.exports=function(e,t,r,n){if(!(e instanceof t)||void 0!==n&&n in e)throw TypeError(r+": incorrect invocation!");return e}},{}],10:[function(e,t){var r=e("./_is-object");t.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},{"./_is-object":31}],11:[function(e,t){var r=e("./_to-iobject"),n=e("./_to-length"),i=e("./_to-index");t.exports=function(e){return function(t,o,s){var a,u=r(t),l=n(u.length),c=i(s,l);if(e&&o!=o){for(;l>c;)if(a=u[c++],a!=a)return!0}else for(;l>c;c++)if((e||c in u)&&u[c]===o)return e||c||0;return!e&&-1}}},{"./_to-index":56,"./_to-iobject":58,"./_to-length":59}],12:[function(e,t){var r=e("./_cof"),n=e("./_wks")("toStringTag"),i="Arguments"==r(function(){return arguments}()),o=function(e,t){try{return e[t]}catch(r){}};t.exports=function(e){var t,s,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(s=o(t=Object(e),n))?s:i?r(t):"Object"==(a=r(t))&&"function"==typeof t.callee?"Arguments":a}},{"./_cof":13,"./_wks":63}],13:[function(e,t){var r={}.toString;t.exports=function(e){return r.call(e).slice(8,-1)}},{}],14:[function(e,t){var r=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},{}],15:[function(e,t){var r=e("./_a-function");t.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,i){return e.call(t,r,n,i)}}return function(){return e.apply(t,arguments)}}},{"./_a-function":7}],16:[function(e,t){t.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},{}],17:[function(e,t){t.exports=!e("./_fails")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{"./_fails":21}],18:[function(e,t){var r=e("./_is-object"),n=e("./_global").document,i=r(n)&&r(n.createElement);t.exports=function(e){return i?n.createElement(e):{}}},{"./_global":23,"./_is-object":31}],19:[function(e,t){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],20:[function(e,t){var r=e("./_global"),n=e("./_core"),i=e("./_hide"),o=e("./_redefine"),s=e("./_ctx"),a="prototype",u=function(e,t,l){var c,f,h,d,p=e&u.F,_=e&u.G,m=e&u.S,g=e&u.P,v=e&u.B,y=_?r:m?r[t]||(r[t]={}):(r[t]||{})[a],b=_?n:n[t]||(n[t]={}),x=b[a]||(b[a]={});_&&(l=t);for(c in l)f=!p&&y&&void 0!==y[c],h=(f?y:l)[c],d=v&&f?s(h,r):g&&"function"==typeof h?s(Function.call,h):h,y&&o(y,c,h,e&u.U),b[c]!=h&&i(b,c,d),g&&x[c]!=h&&(x[c]=h)};r.core=n,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,t.exports=u},{"./_core":14,"./_ctx":15,"./_global":23,"./_hide":25,"./_redefine":48}],21:[function(e,t){t.exports=function(e){try{return!!e()}catch(t){return!0}}},{}],22:[function(e,t,r){var n=e("./_ctx"),i=e("./_iter-call"),o=e("./_is-array-iter"),s=e("./_an-object"),a=e("./_to-length"),u=e("./core.get-iterator-method"),l={},c={},r=t.exports=function(e,t,r,f,h){var d,p,_,m,g=h?function(){return e}:u(e),v=n(r,f,t?2:1),y=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(o(g)){for(d=a(e.length);d>y;y++)if(m=t?v(s(p=e[y])[0],p[1]):v(e[y]),m===l||m===c)return m}else for(_=g.call(e);!(p=_.next()).done;)if(m=i(_,v,p.value,t),m===l||m===c)return m};r.BREAK=l,r.RETURN=c},{"./_an-object":10,"./_ctx":15,"./_is-array-iter":30,"./_iter-call":32,"./_to-length":59,"./core.get-iterator-method":64}],23:[function(e,t){var r=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],24:[function(e,t){var r={}.hasOwnProperty;t.exports=function(e,t){return r.call(e,t)}},{}],25:[function(e,t){var r=e("./_object-dp"),n=e("./_property-desc");t.exports=e("./_descriptors")?function(e,t,i){return r.f(e,t,n(1,i))}:function(e,t,r){return e[t]=r,e}},{"./_descriptors":17,"./_object-dp":41,"./_property-desc":46}],26:[function(e,t){t.exports=e("./_global").document&&document.documentElement},{"./_global":23}],27:[function(e,t){t.exports=!e("./_descriptors")&&!e("./_fails")(function(){return 7!=Object.defineProperty(e("./_dom-create")("div"),"a",{get:function(){return 7}}).a})},{"./_descriptors":17,"./_dom-create":18,"./_fails":21}],28:[function(e,t){t.exports=function(e,t,r){var n=void 0===r;switch(t.length){case 0:return n?e():e.call(r);case 1:return n?e(t[0]):e.call(r,t[0]);case 2:return n?e(t[0],t[1]):e.call(r,t[0],t[1]);case 3:return n?e(t[0],t[1],t[2]):e.call(r,t[0],t[1],t[2]);case 4:return n?e(t[0],t[1],t[2],t[3]):e.call(r,t[0],t[1],t[2],t[3])}return e.apply(r,t)}},{}],29:[function(e,t){var r=e("./_cof");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},{"./_cof":13}],30:[function(e,t){var r=e("./_iterators"),n=e("./_wks")("iterator"),i=Array.prototype;t.exports=function(e){return void 0!==e&&(r.Array===e||i[n]===e)}},{"./_iterators":37,"./_wks":63}],31:[function(e,t){t.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},{}],32:[function(e,t){var r=e("./_an-object");t.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(o){var s=e["return"];throw void 0!==s&&r(s.call(e)),o}}},{"./_an-object":10}],33:[function(e,t){"use strict";var r=e("./_object-create"),n=e("./_property-desc"),i=e("./_set-to-string-tag"),o={};e("./_hide")(o,e("./_wks")("iterator"),function(){return this}),t.exports=function(e,t,s){e.prototype=r(o,{next:n(1,s)}),i(e,t+" Iterator")}},{"./_hide":25,"./_object-create":40,"./_property-desc":46,"./_set-to-string-tag":50,"./_wks":63}],34:[function(e,t){"use strict";var r=e("./_library"),n=e("./_export"),i=e("./_redefine"),o=e("./_hide"),s=e("./_has"),a=e("./_iterators"),u=e("./_iter-create"),l=e("./_set-to-string-tag"),c=e("./_object-gpo"),f=e("./_wks")("iterator"),h=!([].keys&&"next"in[].keys()),d="@@iterator",p="keys",_="values",m=function(){return this};t.exports=function(e,t,g,v,y,b,x){u(g,t,v);var w,k,A,T=function(e){if(!h&&e in M)return M[e];switch(e){case p:return function(){return new g(this,e)};case _:return function(){return new g(this,e)}}return function(){return new g(this,e)}},E=t+" Iterator",S=y==_,R=!1,M=e.prototype,O=M[f]||M[d]||y&&M[y],P=O||T(y),z=y?S?T("entries"):P:void 0,N="Array"==t?M.entries||O:O;if(N&&(A=c(N.call(new e)),A!==Object.prototype&&(l(A,E,!0),r||s(A,f)||o(A,f,m))),S&&O&&O.name!==_&&(R=!0,P=function(){return O.call(this)}),r&&!x||!h&&!R&&M[f]||o(M,f,P),a[t]=P,a[E]=m,y)if(w={values:S?P:T(_),keys:b?P:T(p),entries:z},x)for(k in w)k in M||i(M,k,w[k]);else n(n.P+n.F*(h||R),t,w);return w}},{"./_export":20,"./_has":24,"./_hide":25,"./_iter-create":33,"./_iterators":37,"./_library":38,"./_object-gpo":43,"./_redefine":48,"./_set-to-string-tag":50,"./_wks":63}],35:[function(e,t){var r=e("./_wks")("iterator"),n=!1;try{var i=[7][r]();i["return"]=function(){n=!0},Array.from(i,function(){throw 2})}catch(o){}t.exports=function(e,t){if(!t&&!n)return!1;var i=!1;try{var o=[7],s=o[r]();s.next=function(){return{done:i=!0}},o[r]=function(){return s},e(o)}catch(a){}return i}},{"./_wks":63}],36:[function(e,t){t.exports=function(e,t){return{value:t,done:!!e}}},{}],37:[function(e,t){t.exports={}},{}],38:[function(e,t){t.exports=!1},{}],39:[function(e,t){var r=e("./_global"),n=e("./_task").set,i=r.MutationObserver||r.WebKitMutationObserver,o=r.process,s=r.Promise,a="process"==e("./_cof")(o);t.exports=function(){var e,t,u,l=function(){var r,n;for(a&&(r=o.domain)&&r.exit();e;){n=e.fn,e=e.next;try{n()}catch(i){throw e?u():t=void 0,i}}t=void 0,r&&r.enter()};if(a)u=function(){o.nextTick(l)};else if(i){var c=!0,f=document.createTextNode("");new i(l).observe(f,{characterData:!0}),u=function(){f.data=c=!c}}else if(s&&s.resolve){var h=s.resolve();u=function(){h.then(l)}}else u=function(){n.call(r,l)};return function(r){var n={fn:r,next:void 0};t&&(t.next=n),e||(e=n,u()),t=n}}},{"./_cof":13,"./_global":23,"./_task":55}],40:[function(e,t){var r=e("./_an-object"),n=e("./_object-dps"),i=e("./_enum-bug-keys"),o=e("./_shared-key")("IE_PROTO"),s=function(){},a="prototype",u=function(){var t,r=e("./_dom-create")("iframe"),n=i.length,o="<",s=">"; -for(r.style.display="none",e("./_html").appendChild(r),r.src="javascript:",t=r.contentWindow.document,t.open(),t.write(o+"script"+s+"document.F=Object"+o+"/script"+s),t.close(),u=t.F;n--;)delete u[a][i[n]];return u()};t.exports=Object.create||function(e,t){var i;return null!==e?(s[a]=r(e),i=new s,s[a]=null,i[o]=e):i=u(),void 0===t?i:n(i,t)}},{"./_an-object":10,"./_dom-create":18,"./_enum-bug-keys":19,"./_html":26,"./_object-dps":42,"./_shared-key":51}],41:[function(e,t,r){var n=e("./_an-object"),i=e("./_ie8-dom-define"),o=e("./_to-primitive"),s=Object.defineProperty;r.f=e("./_descriptors")?Object.defineProperty:function(e,t,r){if(n(e),t=o(t,!0),n(r),i)try{return s(e,t,r)}catch(a){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},{"./_an-object":10,"./_descriptors":17,"./_ie8-dom-define":27,"./_to-primitive":61}],42:[function(e,t){var r=e("./_object-dp"),n=e("./_an-object"),i=e("./_object-keys");t.exports=e("./_descriptors")?Object.defineProperties:function(e,t){n(e);for(var o,s=i(t),a=s.length,u=0;a>u;)r.f(e,o=s[u++],t[o]);return e}},{"./_an-object":10,"./_descriptors":17,"./_object-dp":41,"./_object-keys":45}],43:[function(e,t){var r=e("./_has"),n=e("./_to-object"),i=e("./_shared-key")("IE_PROTO"),o=Object.prototype;t.exports=Object.getPrototypeOf||function(e){return e=n(e),r(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?o:null}},{"./_has":24,"./_shared-key":51,"./_to-object":60}],44:[function(e,t){var r=e("./_has"),n=e("./_to-iobject"),i=e("./_array-includes")(!1),o=e("./_shared-key")("IE_PROTO");t.exports=function(e,t){var s,a=n(e),u=0,l=[];for(s in a)s!=o&&r(a,s)&&l.push(s);for(;t.length>u;)r(a,s=t[u++])&&(~i(l,s)||l.push(s));return l}},{"./_array-includes":11,"./_has":24,"./_shared-key":51,"./_to-iobject":58}],45:[function(e,t){var r=e("./_object-keys-internal"),n=e("./_enum-bug-keys");t.exports=Object.keys||function(e){return r(e,n)}},{"./_enum-bug-keys":19,"./_object-keys-internal":44}],46:[function(e,t){t.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},{}],47:[function(e,t){var r=e("./_redefine");t.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},{"./_redefine":48}],48:[function(e,t){var r=e("./_global"),n=e("./_hide"),i=e("./_has"),o=e("./_uid")("src"),s="toString",a=Function[s],u=(""+a).split(s);e("./_core").inspectSource=function(e){return a.call(e)},(t.exports=function(e,t,s,a){var l="function"==typeof s;l&&(i(s,"name")||n(s,"name",t)),e[t]!==s&&(l&&(i(s,o)||n(s,o,e[t]?""+e[t]:u.join(String(t)))),e===r?e[t]=s:a?e[t]?e[t]=s:n(e,t,s):(delete e[t],n(e,t,s)))})(Function.prototype,s,function(){return"function"==typeof this&&this[o]||a.call(this)})},{"./_core":14,"./_global":23,"./_has":24,"./_hide":25,"./_uid":62}],49:[function(e,t){"use strict";var r=e("./_global"),n=e("./_object-dp"),i=e("./_descriptors"),o=e("./_wks")("species");t.exports=function(e){var t=r[e];i&&t&&!t[o]&&n.f(t,o,{configurable:!0,get:function(){return this}})}},{"./_descriptors":17,"./_global":23,"./_object-dp":41,"./_wks":63}],50:[function(e,t){var r=e("./_object-dp").f,n=e("./_has"),i=e("./_wks")("toStringTag");t.exports=function(e,t,o){e&&!n(e=o?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},{"./_has":24,"./_object-dp":41,"./_wks":63}],51:[function(e,t){var r=e("./_shared")("keys"),n=e("./_uid");t.exports=function(e){return r[e]||(r[e]=n(e))}},{"./_shared":52,"./_uid":62}],52:[function(e,t){var r=e("./_global"),n="__core-js_shared__",i=r[n]||(r[n]={});t.exports=function(e){return i[e]||(i[e]={})}},{"./_global":23}],53:[function(e,t){var r=e("./_an-object"),n=e("./_a-function"),i=e("./_wks")("species");t.exports=function(e,t){var o,s=r(e).constructor;return void 0===s||void 0==(o=r(s)[i])?t:n(o)}},{"./_a-function":7,"./_an-object":10,"./_wks":63}],54:[function(e,t){var r=e("./_to-integer"),n=e("./_defined");t.exports=function(e){return function(t,i){var o,s,a=String(n(t)),u=r(i),l=a.length;return 0>u||u>=l?e?"":void 0:(o=a.charCodeAt(u),55296>o||o>56319||u+1===l||(s=a.charCodeAt(u+1))<56320||s>57343?e?a.charAt(u):o:e?a.slice(u,u+2):(o-55296<<10)+(s-56320)+65536)}}},{"./_defined":16,"./_to-integer":57}],55:[function(e,t){var r,n,i,o=e("./_ctx"),s=e("./_invoke"),a=e("./_html"),u=e("./_dom-create"),l=e("./_global"),c=l.process,f=l.setImmediate,h=l.clearImmediate,d=l.MessageChannel,p=0,_={},m="onreadystatechange",g=function(){var e=+this;if(_.hasOwnProperty(e)){var t=_[e];delete _[e],t()}},v=function(e){g.call(e.data)};f&&h||(f=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return _[++p]=function(){s("function"==typeof e?e:Function(e),t)},r(p),p},h=function(e){delete _[e]},"process"==e("./_cof")(c)?r=function(e){c.nextTick(o(g,e,1))}:d?(n=new d,i=n.port2,n.port1.onmessage=v,r=o(i.postMessage,i,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(e){l.postMessage(e+"","*")},l.addEventListener("message",v,!1)):r=m in u("script")?function(e){a.appendChild(u("script"))[m]=function(){a.removeChild(this),g.call(e)}}:function(e){setTimeout(o(g,e,1),0)}),t.exports={set:f,clear:h}},{"./_cof":13,"./_ctx":15,"./_dom-create":18,"./_global":23,"./_html":26,"./_invoke":28}],56:[function(e,t){var r=e("./_to-integer"),n=Math.max,i=Math.min;t.exports=function(e,t){return e=r(e),0>e?n(e+t,0):i(e,t)}},{"./_to-integer":57}],57:[function(e,t){var r=Math.ceil,n=Math.floor;t.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},{}],58:[function(e,t){var r=e("./_iobject"),n=e("./_defined");t.exports=function(e){return r(n(e))}},{"./_defined":16,"./_iobject":29}],59:[function(e,t){var r=e("./_to-integer"),n=Math.min;t.exports=function(e){return e>0?n(r(e),9007199254740991):0}},{"./_to-integer":57}],60:[function(e,t){var r=e("./_defined");t.exports=function(e){return Object(r(e))}},{"./_defined":16}],61:[function(e,t){var r=e("./_is-object");t.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},{"./_is-object":31}],62:[function(e,t){var r=0,n=Math.random();t.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++r+n).toString(36))}},{}],63:[function(e,t){var r=e("./_shared")("wks"),n=e("./_uid"),i=e("./_global").Symbol,o="function"==typeof i,s=t.exports=function(e){return r[e]||(r[e]=o&&i[e]||(o?i:n)("Symbol."+e))};s.store=r},{"./_global":23,"./_shared":52,"./_uid":62}],64:[function(e,t){var r=e("./_classof"),n=e("./_wks")("iterator"),i=e("./_iterators");t.exports=e("./_core").getIteratorMethod=function(e){return void 0!=e?e[n]||e["@@iterator"]||i[r(e)]:void 0}},{"./_classof":12,"./_core":14,"./_iterators":37,"./_wks":63}],65:[function(e,t){"use strict";var r=e("./_add-to-unscopables"),n=e("./_iter-step"),i=e("./_iterators"),o=e("./_to-iobject");t.exports=e("./_iter-define")(Array,"Array",function(e,t){this._t=o(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,r=this._i++;return!e||r>=e.length?(this._t=void 0,n(1)):"keys"==t?n(0,r):"values"==t?n(0,e[r]):n(0,[r,e[r]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},{"./_add-to-unscopables":8,"./_iter-define":34,"./_iter-step":36,"./_iterators":37,"./_to-iobject":58}],66:[function(e){"use strict";var t=e("./_classof"),r={};r[e("./_wks")("toStringTag")]="z",r+""!="[object z]"&&e("./_redefine")(Object.prototype,"toString",function(){return"[object "+t(this)+"]"},!0)},{"./_classof":12,"./_redefine":48,"./_wks":63}],67:[function(e){"use strict";var t,r,n,i=e("./_library"),o=e("./_global"),s=e("./_ctx"),a=e("./_classof"),u=e("./_export"),l=e("./_is-object"),c=e("./_a-function"),f=e("./_an-instance"),h=e("./_for-of"),d=e("./_species-constructor"),p=e("./_task").set,_=e("./_microtask")(),m="Promise",g=o.TypeError,v=o.process,y=o[m],v=o.process,b="process"==a(v),x=function(){},w=!!function(){try{var t=y.resolve(1),r=(t.constructor={})[e("./_wks")("species")]=function(e){e(x,x)};return(b||"function"==typeof PromiseRejectionEvent)&&t.then(x)instanceof r}catch(n){}}(),k=function(e,t){return e===t||e===y&&t===n},A=function(e){var t;return l(e)&&"function"==typeof(t=e.then)?t:!1},T=function(e){return k(y,e)?new E(e):new r(e)},E=r=function(e){var t,r;this.promise=new e(function(e,n){if(void 0!==t||void 0!==r)throw g("Bad Promise constructor");t=e,r=n}),this.resolve=c(t),this.reject=c(r)},S=function(e){try{e()}catch(t){return{error:t}}},R=function(e,t){if(!e._n){e._n=!0;var r=e._c;_(function(){for(var n=e._v,i=1==e._s,o=0,s=function(t){var r,o,s=i?t.ok:t.fail,a=t.resolve,u=t.reject,l=t.domain;try{s?(i||(2==e._h&&P(e),e._h=1),s===!0?r=n:(l&&l.enter(),r=s(n),l&&l.exit()),r===t.promise?u(g("Promise-chain cycle")):(o=A(r))?o.call(r,a,u):a(r)):u(n)}catch(c){u(c)}};r.length>o;)s(r[o++]);e._c=[],e._n=!1,t&&!e._h&&M(e)})}},M=function(e){p.call(o,function(){var t,r,n,i=e._v;if(O(e)&&(t=S(function(){b?v.emit("unhandledRejection",i,e):(r=o.onunhandledrejection)?r({promise:e,reason:i}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",i)}),e._h=b||O(e)?2:1),e._a=void 0,t)throw t.error})},O=function(e){if(1==e._h)return!1;for(var t,r=e._a||e._c,n=0;r.length>n;)if(t=r[n++],t.fail||!O(t.promise))return!1;return!0},P=function(e){p.call(o,function(){var t;b?v.emit("rejectionHandled",e):(t=o.onrejectionhandled)&&t({promise:e,reason:e._v})})},z=function(e){var t=this;t._d||(t._d=!0,t=t._w||t,t._v=e,t._s=2,t._a||(t._a=t._c.slice()),R(t,!0))},N=function(e){var t,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===e)throw g("Promise can't be resolved itself");(t=A(e))?_(function(){var n={_w:r,_d:!1};try{t.call(e,s(N,n,1),s(z,n,1))}catch(i){z.call(n,i)}}):(r._v=e,r._s=1,R(r,!1))}catch(n){z.call({_w:r,_d:!1},n)}}};w||(y=function(e){f(this,y,m,"_h"),c(e),t.call(this);try{e(s(N,this,1),s(z,this,1))}catch(r){z.call(this,r)}},t=function(){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},t.prototype=e("./_redefine-all")(y.prototype,{then:function(e,t){var r=T(d(this,y));return r.ok="function"==typeof e?e:!0,r.fail="function"==typeof t&&t,r.domain=b?v.domain:void 0,this._c.push(r),this._a&&this._a.push(r),this._s&&R(this,!1),r.promise},"catch":function(e){return this.then(void 0,e)}}),E=function(){var e=new t;this.promise=e,this.resolve=s(N,e,1),this.reject=s(z,e,1)}),u(u.G+u.W+u.F*!w,{Promise:y}),e("./_set-to-string-tag")(y,m),e("./_set-species")(m),n=e("./_core")[m],u(u.S+u.F*!w,m,{reject:function(e){var t=T(this),r=t.reject;return r(e),t.promise}}),u(u.S+u.F*(i||!w),m,{resolve:function(e){if(e instanceof y&&k(e.constructor,this))return e;var t=T(this),r=t.resolve;return r(e),t.promise}}),u(u.S+u.F*!(w&&e("./_iter-detect")(function(e){y.all(e)["catch"](x)})),m,{all:function(e){var t=this,r=T(t),n=r.resolve,i=r.reject,o=S(function(){var r=[],o=0,s=1;h(e,!1,function(e){var a=o++,u=!1;r.push(void 0),s++,t.resolve(e).then(function(e){u||(u=!0,r[a]=e,--s||n(r))},i)}),--s||n(r)});return o&&i(o.error),r.promise},race:function(e){var t=this,r=T(t),n=r.reject,i=S(function(){h(e,!1,function(e){t.resolve(e).then(r.resolve,n)})});return i&&n(i.error),r.promise}})},{"./_a-function":7,"./_an-instance":9,"./_classof":12,"./_core":14,"./_ctx":15,"./_export":20,"./_for-of":22,"./_global":23,"./_is-object":31,"./_iter-detect":35,"./_library":38,"./_microtask":39,"./_redefine-all":47,"./_set-species":49,"./_set-to-string-tag":50,"./_species-constructor":53,"./_task":55,"./_wks":63}],68:[function(e){"use strict";var t=e("./_string-at")(!0);e("./_iter-define")(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,r=this._t,n=this._i;return n>=r.length?{value:void 0,done:!0}:(e=t(r,n),this._i+=e.length,{value:e,done:!1})})},{"./_iter-define":34,"./_string-at":54}],69:[function(e){for(var t=e("./es6.array.iterator"),r=e("./_redefine"),n=e("./_global"),i=e("./_hide"),o=e("./_iterators"),s=e("./_wks"),a=s("iterator"),u=s("toStringTag"),l=o.Array,c=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],f=0;5>f;f++){var h,d=c[f],p=n[d],_=p&&p.prototype;if(_){_[a]||i(_,a,l),_[u]||i(_,u,d),o[d]=l;for(h in t)_[h]||r(_,h,t[h],!0)}}},{"./_global":23,"./_hide":25,"./_iterators":37,"./_redefine":48,"./_wks":63,"./es6.array.iterator":65}],70:[function(e,t,r){(function(e){function t(e){return Array.isArray?Array.isArray(e):"[object Array]"===m(e)}function n(e){return"boolean"==typeof e}function i(e){return null===e}function o(e){return null==e}function s(e){return"number"==typeof e}function a(e){return"string"==typeof e}function u(e){return"symbol"==typeof e}function l(e){return void 0===e}function c(e){return"[object RegExp]"===m(e)}function f(e){return"object"==typeof e&&null!==e}function h(e){return"[object Date]"===m(e)}function d(e){return"[object Error]"===m(e)||e instanceof Error}function p(e){return"function"==typeof e}function _(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function m(e){return Object.prototype.toString.call(e)}r.isArray=t,r.isBoolean=n,r.isNull=i,r.isNullOrUndefined=o,r.isNumber=s,r.isString=a,r.isSymbol=u,r.isUndefined=l,r.isRegExp=c,r.isObject=f,r.isDate=h,r.isError=d,r.isFunction=p,r.isPrimitive=_,r.isBuffer=e.isBuffer}).call(this,{isBuffer:e("../../is-buffer/index.js")})},{"../../is-buffer/index.js":93}],71:[function(e,t,r){function n(e){return e=Math.round(e),0>e?0:e>255?255:e}function i(e){return 0>e?0:e>1?1:e}function o(e){return n("%"===e[e.length-1]?parseFloat(e)/100*255:parseInt(e))}function s(e){return i("%"===e[e.length-1]?parseFloat(e)/100:parseFloat(e))}function a(e,t,r){return 0>r?r+=1:r>1&&(r-=1),1>6*r?e+(t-e)*r*6:1>2*r?t:2>3*r?e+(t-e)*(2/3-r)*6:e}function u(e){var t=e.replace(/ /g,"").toLowerCase();if(t in l)return l[t].slice();if("#"===t[0]){if(4===t.length){var r=parseInt(t.substr(1),16);return r>=0&&4095>=r?[(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,1]:null}if(7===t.length){var r=parseInt(t.substr(1),16);return r>=0&&16777215>=r?[(16711680&r)>>16,(65280&r)>>8,255&r,1]:null}return null}var i=t.indexOf("("),u=t.indexOf(")");if(-1!==i&&u+1===t.length){var c=t.substr(0,i),f=t.substr(i+1,u-(i+1)).split(","),h=1;switch(c){case"rgba":if(4!==f.length)return null;h=s(f.pop());case"rgb":return 3!==f.length?null:[o(f[0]),o(f[1]),o(f[2]),h];case"hsla":if(4!==f.length)return null;h=s(f.pop());case"hsl":if(3!==f.length)return null;var d=(parseFloat(f[0])%360+360)%360/360,p=s(f[1]),_=s(f[2]),m=.5>=_?_*(p+1):_+p-_*p,g=2*_-m;return[n(255*a(g,m,d+1/3)),n(255*a(g,m,d)),n(255*a(g,m,d-1/3)),h];default:return null}}return null}var l={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{r.parseCSSColor=u}catch(c){}},{}],72:[function(e,t){"use strict";function r(e,t,r){r=r||2;var i=t&&t.length,s=i?t[0]*r:e.length,a=n(e,0,s,r,!0),u=[];if(!a)return u;var l,f,h,d,p,_,m;if(i&&(a=c(e,t,a,r)),e.length>80*r){l=h=e[0],f=d=e[1];for(var g=r;s>g;g+=r)p=e[g],_=e[g+1],l>p&&(l=p),f>_&&(f=_),p>h&&(h=p),_>d&&(d=_);m=Math.max(h-l,d-f)}return o(a,u,r,l,f,m),u}function n(e,t,r,n,i){var o,s;if(i===O(e,t,r,n)>0)for(o=t;r>o;o+=n)s=S(o,e[o],e[o+1],s);else for(o=r-n;o>=t;o-=n)s=S(o,e[o],e[o+1],s);return s&&x(s,s.next)&&(R(s),s=s.next),s}function i(e,t){if(!e)return e;t||(t=e);var r,n=e;do if(r=!1,n.steiner||!x(n,n.next)&&0!==b(n.prev,n,n.next))n=n.next;else{if(R(n),n=t=n.prev,n===n.next)return null;r=!0}while(r||n!==t);return t}function o(e,t,r,n,c,f,h){if(e){!h&&f&&p(e,n,c,f);for(var d,_,m=e;e.prev!==e.next;)if(d=e.prev,_=e.next,f?a(e,n,c,f):s(e))t.push(d.i/r),t.push(e.i/r),t.push(_.i/r),R(e),e=_.next,m=_.next;else if(e=_,e===m){h?1===h?(e=u(e,t,r),o(e,t,r,n,c,f,2)):2===h&&l(e,t,r,n,c,f):o(i(e),t,r,n,c,f,1);break}}}function s(e){var t=e.prev,r=e,n=e.next;if(b(t,r,n)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(v(t.x,t.y,r.x,r.y,n.x,n.y,i.x,i.y)&&b(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function a(e,t,r,n){var i=e.prev,o=e,s=e.next;if(b(i,o,s)>=0)return!1;for(var a=i.xo.x?i.x>s.x?i.x:s.x:o.x>s.x?o.x:s.x,c=i.y>o.y?i.y>s.y?i.y:s.y:o.y>s.y?o.y:s.y,f=m(a,u,t,r,n),h=m(l,c,t,r,n),d=e.nextZ;d&&d.z<=h;){if(d!==e.prev&&d!==e.next&&v(i.x,i.y,o.x,o.y,s.x,s.y,d.x,d.y)&&b(d.prev,d,d.next)>=0)return!1;d=d.nextZ}for(d=e.prevZ;d&&d.z>=f;){if(d!==e.prev&&d!==e.next&&v(i.x,i.y,o.x,o.y,s.x,s.y,d.x,d.y)&&b(d.prev,d,d.next)>=0)return!1;d=d.prevZ}return!0}function u(e,t,r){var n=e;do{var i=n.prev,o=n.next.next;!x(i,o)&&w(i,n,n.next,o)&&A(i,o)&&A(o,i)&&(t.push(i.i/r),t.push(n.i/r),t.push(o.i/r),R(n),R(n.next),n=e=o),n=n.next}while(n!==e);return n}function l(e,t,r,n,s,a){var u=e;do{for(var l=u.next.next;l!==u.prev;){if(u.i!==l.i&&y(u,l)){var c=E(u,l);return u=i(u,u.next),c=i(c,c.next),o(u,t,r,n,s,a),void o(c,t,r,n,s,a)}l=l.next}u=u.next}while(u!==e)}function c(e,t,r,o){var s,a,u,l,c,d=[];for(s=0,a=t.length;a>s;s++)u=t[s]*o,l=a-1>s?t[s+1]*o:e.length,c=n(e,u,l,o,!1),c===c.next&&(c.steiner=!0),d.push(g(c));for(d.sort(f),s=0;s=n.next.y){var a=n.x+(o-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(i>=a&&a>s){if(s=a,a===i){if(o===n.y)return n;if(o===n.next.y)return n.next}r=n.x=n.x&&n.x>=c&&v(f>o?i:s,o,c,f,f>o?s:i,o,n.x,n.y)&&(u=Math.abs(o-n.y)/(i-n.x),(h>u||u===h&&n.x>r.x)&&A(n,e)&&(r=n,h=u)),n=n.next;return r}function p(e,t,r,n){var i=e;do null===i.z&&(i.z=m(i.x,i.y,t,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,_(i)}function _(e){var t,r,n,i,o,s,a,u,l=1;do{for(r=e,e=null,o=null,s=0;r;){for(s++,n=r,a=0,t=0;l>t&&(a++,n=n.nextZ,n);t++);for(u=l;a>0||u>0&&n;)0===a?(i=n,n=n.nextZ,u--):0!==u&&n?r.z<=n.z?(i=r,r=r.nextZ,a--):(i=n,n=n.nextZ,u--):(i=r,r=r.nextZ,a--),o?o.nextZ=i:e=i,i.prevZ=o,o=i;r=n}o.nextZ=null,l*=2}while(s>1);return e}function m(e,t,r,n,i){return e=32767*(e-r)/i,t=32767*(t-n)/i,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e|t<<1}function g(e){var t=e,r=e;do t.x=0&&(e-s)*(n-a)-(r-s)*(t-a)>=0&&(r-s)*(o-a)-(i-s)*(n-a)>=0}function y(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!k(e,t)&&A(e,t)&&A(t,e)&&T(e,t)}function b(e,t,r){return(t.y-e.y)*(r.x-t.x)-(t.x-e.x)*(r.y-t.y)}function x(e,t){return e.x===t.x&&e.y===t.y}function w(e,t,r,n){return x(e,t)&&x(r,n)||x(e,n)&&x(r,t)?!0:b(e,t,r)>0!=b(e,t,n)>0&&b(r,n,e)>0!=b(r,n,t)>0}function k(e,t){var r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==t.i&&r.next.i!==t.i&&w(r,r.next,e,t))return!0;r=r.next}while(r!==e);return!1}function A(e,t){return b(e.prev,e,e.next)<0?b(e,t,e.next)>=0&&b(e,e.prev,t)>=0:b(e,t,e.prev)<0||b(e,e.next,t)<0}function T(e,t){var r=e,n=!1,i=(e.x+t.x)/2,o=(e.y+t.y)/2;do r.y>o!=r.next.y>o&&i<(r.next.x-r.x)*(o-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next;while(r!==e);return n}function E(e,t){var r=new M(e.i,e.x,e.y),n=new M(t.i,t.x,t.y),i=e.next,o=t.prev;return e.next=t,t.prev=e,r.next=i,i.prev=r,n.next=r,r.prev=n,o.next=n,n.prev=o,n}function S(e,t,r,n){var i=new M(e,t,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function R(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function M(e,t,r){this.i=e,this.x=t,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function O(e,t,r,n){for(var i=0,o=t,s=r-n;r>o;o+=n)i+=(e[s]-e[o])*(e[o+1]+e[s+1]),s=o;return i}t.exports=r,r.deviation=function(e,t,r,n){var i=t&&t.length,o=i?t[0]*r:e.length,s=Math.abs(O(e,0,o,r));if(i)for(var a=0,u=t.length;u>a;a++){var l=t[a]*r,c=u-1>a?t[a+1]*r:e.length;s-=Math.abs(O(e,l,c,r))}var f=0;for(a=0;as;s++)r.vertices.push(e[i][o][s]);i>0&&(n+=e[i-1].length,r.holes.push(n))}return r}},{}],73:[function(e,t){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(e){return"function"==typeof e}function i(e){return"number"==typeof e}function o(e){return"object"==typeof e&&null!==e}function s(e){return void 0===e}t.exports=r,r.EventEmitter=r,r.prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(e){if(!i(e)||0>e||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,r,i,a,u,l;if(this._events||(this._events={}),"error"===e&&(!this._events.error||o(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;var c=new Error('Uncaught, unspecified "error" event. ('+t+")");throw c.context=t,c}if(r=this._events[e],s(r))return!1;if(n(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),r.apply(this,a)}else if(o(r))for(a=Array.prototype.slice.call(arguments,1),l=r.slice(),i=l.length,u=0;i>u;u++)l[u].apply(this,a);return!0},r.prototype.addListener=function(e,t){var i;if(!n(t))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,n(t.listener)?t.listener:t),this._events[e]?o(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,o(this._events[e])&&!this._events[e].warned&&(i=s(this._maxListeners)?r.defaultMaxListeners:this._maxListeners,i&&i>0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace())),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function r(){this.removeListener(e,r),i||(i=!0,t.apply(this,arguments))}if(!n(t))throw TypeError("listener must be a function");var i=!1;return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var r,i,s,a;if(!n(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],s=r.length,i=-1,r===t||n(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(o(r)){for(a=s;a-->0;)if(r[a]===t||r[a].listener&&r[a].listener===t){i=a;break}if(0>i)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],n(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?n(this._events[e])?[this._events[e]]:this._events[e].slice():[]},r.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(n(t))return 1;if(t)return t.length}return 0},r.listenerCount=function(e,t){return e.listenerCount(t)}},{}],74:[function(e,t){!function(){function e(e,t){c?e.addEventListener("scroll",t,!1):e.attachEvent("scroll",t)}function r(e){document.body?e():c?document.addEventListener("DOMContentLoaded",e):document.attachEvent("onreadystatechange",function(){"interactive"!=document.readyState&&"complete"!=document.readyState||e()})}function n(e){this.a=document.createElement("div"),this.a.setAttribute("aria-hidden","true"),this.a.appendChild(document.createTextNode(e)),this.b=document.createElement("span"),this.c=document.createElement("span"),this.h=document.createElement("span"),this.f=document.createElement("span"),this.g=-1,this.b.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.c.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.f.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.h.style.cssText="display:inline-block;width:200%;height:200%;font-size:16px;max-width:none;",this.b.appendChild(this.h),this.c.appendChild(this.f),this.a.appendChild(this.b),this.a.appendChild(this.c)}function i(e,t){e.a.style.cssText="max-width:none;min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;left:-999px;white-space:nowrap;font:"+t+";"}function o(e){var t=e.a.offsetWidth,r=t+100;return e.f.style.width=r+"px",e.c.scrollLeft=r,e.b.scrollLeft=e.b.scrollWidth+100,e.g!==t?(e.g=t,!0):!1}function s(t,r){function n(){var e=i;o(e)&&null!==e.a.parentNode&&r(e.g)}var i=t;e(t.b,n),e(t.c,n),o(t)}function a(e,t){var r=t||{};this.family=e,this.style=r.style||"normal",this.weight=r.weight||"normal",this.stretch=r.stretch||"normal"}function u(){if(null===h){var e=document.createElement("div");try{e.style.font="condensed 100px sans-serif"}catch(t){}h=""!==e.style.font}return h}function l(e,t){return[e.style,e.weight,u()?e.stretch:"","100px",t].join(" ")}var c=!!document.addEventListener,f=null,h=null,d=!!window.FontFace;a.prototype.load=function(e,t){var o=this,a=e||"BESbswy",u=t||3e3,c=(new Date).getTime();return new Promise(function(e,t){if(d){var h=new Promise(function(e,t){function r(){(new Date).getTime()-c>=u?t():document.fonts.load(l(o,o.family),a).then(function(t){1<=t.length?e():setTimeout(r,25)},function(){t()})}r()}),p=new Promise(function(e,t){setTimeout(t,u)});Promise.race([p,h]).then(function(){e(o)},function(){t(o)})}else r(function(){function r(){var t;(t=-1!=m&&-1!=g||-1!=m&&-1!=v||-1!=g&&-1!=v)&&((t=m!=g&&m!=v&&g!=v)||(null===f&&(t=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),f=!!t&&(536>parseInt(t[1],10)||536===parseInt(t[1],10)&&11>=parseInt(t[2],10))),t=f&&(m==y&&g==y&&v==y||m==b&&g==b&&v==b||m==x&&g==x&&v==x)),t=!t),t&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),e(o))}function h(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),t(o);else{var e=document.hidden;(!0===e||void 0===e)&&(m=d.a.offsetWidth,g=p.a.offsetWidth,v=_.a.offsetWidth,r()),k=setTimeout(h,50)}}var d=new n(a),p=new n(a),_=new n(a),m=-1,g=-1,v=-1,y=-1,b=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",i(d,l(o,"sans-serif")),i(p,l(o,"serif")),i(_,l(o,"monospace")),w.appendChild(d.a),w.appendChild(p.a),w.appendChild(_.a),document.body.appendChild(w),y=d.a.offsetWidth,b=p.a.offsetWidth,x=_.a.offsetWidth,h(),s(d,function(e){m=e,r()}),i(d,l(o,'"'+o.family+'",sans-serif')),s(p,function(e){g=e,r()}),i(p,l(o,'"'+o.family+'",serif')),s(_,function(e){v=e,r()}),i(_,l(o,'"'+o.family+'",monospace'))})})},window.FontFaceObserver=a,window.FontFaceObserver.prototype.check=window.FontFaceObserver.prototype.load=a.prototype.load,"undefined"!=typeof t&&(t.exports=window.FontFaceObserver)}()},{}],75:[function(e,t){"use strict";function r(e,t,r,o,s,a,u,l){if(r/=t,o/=t,u>=r&&o>=l)return e;if(u>o||r>l)return null;for(var c=[],f=0;f=r&&o>=d)c.push(p);else if(!(h>o||r>d)){var g=1===m?n(_,r,o,s):i(_,r,o,s,a,3===m); -g.length&&c.push({geometry:g,type:m,tags:e[f].tags||null,min:p.min,max:p.max})}}return c.length?c:null}function n(e,t,r,n){for(var i=[],o=0;o=t&&r>=a&&i.push(s)}return i}function i(e,t,r,n,i,s){for(var a=[],u=0;uc;c++)l=p||_[c],p=_[c+1],h=d||l[n],d=p[n],t>h?d>r?(y.push(i(l,p,t),i(l,p,r)),s||(y=o(a,y,m,g))):d>=t&&y.push(i(l,p,t)):h>r?t>d?(y.push(i(l,p,r),i(l,p,t)),s||(y=o(a,y,m,g))):r>=d&&y.push(i(l,p,r)):(y.push(l),t>d?(y.push(i(l,p,t)),s||(y=o(a,y,m,g))):d>r&&(y.push(i(l,p,r)),s||(y=o(a,y,m,g))));l=_[v-1],h=l[n],h>=t&&r>=h&&y.push(l),f=y[y.length-1],s&&f&&(y[0][0]!==f[0]||y[0][1]!==f[1])&&y.push(y[0]),o(a,y,m,g)}return a}function o(e,t,r,n){return t.length&&(t.area=r,t.dist=n,e.push(t)),[]}t.exports=r},{}],76:[function(e,t){"use strict";function r(e,t){var r=[];if("FeatureCollection"===e.type)for(var i=0;in?-1:n>1?1:n,[r,n,0]}function a(e){for(var t,r,n=0,i=0,o=0;o1)return!1;var s=i.geometry[0].length;if(5!==s)return!1;for(var a=0;s>a;a++){var u=o(i.geometry[0][a],t,e.z2,e.x,e.y);if(u[0]!==-r&&u[0]!==t+r||u[1]!==-r&&u[1]!==t+r)return!1}return!0}t.exports=r;var f=e("./convert"),h=e("./clip"),d=e("./wrap"),p=e("./tile");n.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},n.prototype.splitTile=function(e,t,r,n,i,o,l){for(var f=[e,t,r,n],d=this.options,_=d.debug;f.length;){n=f.pop(),r=f.pop(),t=f.pop(),e=f.pop();var m=1<1&&console.time("creation"),v=this.tiles[g]=p(e,m,r,n,y,t===d.maxZoom),this.tileCoords.push({z:t,x:r,y:n}),_)){_>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,r,n,v.numFeatures,v.numPoints,v.numSimplified),console.timeEnd("creation"));var b="z"+t;this.stats[b]=(this.stats[b]||0)+1,this.total++}if(v.source=e,d.solidChildren||!c(v,d.extent,d.buffer)){if(i){if(t===d.maxZoom||t===i)continue;var x=1<1&&console.time("clipping");var w,k,A,T,E,S,R=.5*d.buffer/d.extent,M=.5-R,O=.5+R,P=1+R;w=k=A=T=null,E=h(e,m,r-R,r+O,0,a,v.min[0],v.max[0]),S=h(e,m,r+M,r+P,0,a,v.min[0],v.max[0]),E&&(w=h(E,m,n-R,n+O,1,u,v.min[1],v.max[1]),k=h(E,m,n+M,n+P,1,u,v.min[1],v.max[1])),S&&(A=h(S,m,n-R,n+O,1,u,v.min[1],v.max[1]),T=h(S,m,n+M,n+P,1,u,v.min[1],v.max[1])),_>1&&console.timeEnd("clipping"),w&&f.push(w,t+1,2*r,2*n),k&&f.push(k,t+1,2*r,2*n+1),A&&f.push(A,t+1,2*r+1,2*n),T&&f.push(T,t+1,2*r+1,2*n+1)}}},n.prototype.getTile=function(e,t,r){var n=this.options,o=n.extent,a=n.debug,u=1<1&&console.log("drilling down to z%d-%d-%d",e,t,r);for(var f,h=e,d=t,p=r;!f&&h>0;)h--,d=Math.floor(d/2),p=Math.floor(p/2),f=this.tiles[s(h,d,p)];if(!f)return null;if(a>1&&console.log("found parent tile z%d-%d-%d",h,d,p),f.source){if(c(f,o,n.buffer))return i(f,o);a>1&&console.time("drilling down"),this.splitTile(f.source,h,d,p,e,t,r),a>1&&console.timeEnd("drilling down")}return this.tiles[l]?i(this.tiles[l],o):null}},{"./clip":75,"./convert":76,"./tile":79,"./wrap":80}],78:[function(e,t){"use strict";function r(e,t){var r,i,o,s,a=t*t,u=e.length,l=0,c=u-1,f=[];for(e[l][2]=1,e[c][2]=1;c;){for(i=0,r=l+1;c>r;r++)o=n(e[r],e[l],e[c]),o>i&&(s=r,i=o);i>a?(e[s][2]=i,f.push(l),f.push(s),l=s):(c=f.pop(),l=f.pop())}}function n(e,t,r){var n=t[0],i=t[1],o=r[0],s=r[1],a=e[0],u=e[1],l=o-n,c=s-i;if(0!==l||0!==c){var f=((a-n)*l+(u-i)*c)/(l*l+c*c);f>1?(n=o,i=s):f>0&&(n+=l*f,i+=c*f)}return l=a-n,c=u-i,l*l+c*c}t.exports=r},{}],79:[function(e,t){"use strict";function r(e,t,r,i,o,s){for(var a={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:r,y:i,z2:t,transformed:!1,min:[2,1],max:[-1,0]},u=0;ua.max[0]&&(a.max[0]=c[0]),c[1]>a.max[1]&&(a.max[1]=c[1])}return a}function n(e,t,r,n){var i,o,s,a,u=t.geometry,l=t.type,c=[],f=r*r;if(1===l)for(i=0;if)&&(h.push(a),e.numSimplified++),e.numPoints++;c.push(h)}else e.numPoints+=s.length;c.length&&e.features.push({geometry:c,type:l,tags:t.tags||null})}t.exports=r},{}],80:[function(e,t){"use strict";function r(e,t,r){var i=e,s=o(e,1,-1-t,t,0,r,-1,2),a=o(e,1,1-t,2+t,0,r,-1,2);return(s||a)&&(i=o(e,1,-t,1+t,0,r,-1,2),s&&(i=n(s,1).concat(i)),a&&(i=i.concat(n(a,-1)))),i}function n(e,t){for(var r=[],n=0;n>1,c=-7,f=r?i-1:0,h=r?-1:1,d=e[t+f];for(f+=h,o=d&(1<<-c)-1,d>>=-c,c+=a;c>0;o=256*o+e[t+f],f+=h,c-=8);for(s=o&(1<<-c)-1,o>>=-c,c+=n;c>0;s=256*s+e[t+f],f+=h,c-=8);if(0===o)o=1-l;else{if(o===u)return s?0/0:1/0*(d?-1:1);s+=Math.pow(2,n),o-=l}return(d?-1:1)*s*Math.pow(2,o-n)},r.write=function(e,t,r,n,i,o){var s,a,u,l=8*o-i-1,c=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:o-1,p=n?1:-1,_=0>t||0===t&&0>1/t?1:0;for(t=Math.abs(t),isNaN(t)||1/0===t?(a=isNaN(t)?1:0,s=c):(s=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-s))<1&&(s--,u*=2),t+=s+f>=1?h/u:h*Math.pow(2,1-f),t*u>=2&&(s++,u/=2),s+f>=c?(a=0,s=c):s+f>=1?(a=(t*u-1)*Math.pow(2,i),s+=f):(a=t*Math.pow(2,f-1)*Math.pow(2,i),s=0));i>=8;e[r+d]=255&a,d+=p,a/=256,i-=8);for(s=s<0;e[r+d]=255&s,d+=p,s/=256,l-=8);e[r+d-p]|=128*_}},{}],92:[function(e,t){t.exports="function"==typeof Object.create?function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:function(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e}},{}],93:[function(e,t){function r(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function n(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&r(e.slice(0,0))}t.exports=function(e){return null!=e&&(r(e)||n(e)||!!e._isBuffer)}},{}],94:[function(e,t){var r={}.toString;t.exports=Array.isArray||function(e){return"[object Array]"==r.call(e)}},{}],95:[function(e,t){"use strict";var r=e("./lib/js-yaml.js");t.exports=r},{"./lib/js-yaml.js":96}],96:[function(e,t){"use strict";function r(e){return function(){throw new Error("Function "+e+" is deprecated and cannot be used.")}}var n=e("./js-yaml/loader");t.exports.Type=e("./js-yaml/type"),t.exports.Schema=e("./js-yaml/schema"),t.exports.FAILSAFE_SCHEMA=e("./js-yaml/schema/failsafe"),t.exports.JSON_SCHEMA=e("./js-yaml/schema/json"),t.exports.CORE_SCHEMA=e("./js-yaml/schema/core"),t.exports.DEFAULT_SAFE_SCHEMA=e("./js-yaml/schema/default_safe"),t.exports.DEFAULT_FULL_SCHEMA=e("./js-yaml/schema/default_full"),t.exports.load=n.load,t.exports.loadAll=n.loadAll,t.exports.safeLoad=n.safeLoad,t.exports.safeLoadAll=n.safeLoadAll,t.exports.YAMLException=e("./js-yaml/exception"),t.exports.MINIMAL_SCHEMA=e("./js-yaml/schema/failsafe"),t.exports.SAFE_SCHEMA=e("./js-yaml/schema/default_safe"),t.exports.DEFAULT_SCHEMA=e("./js-yaml/schema/default_full"),t.exports.scan=r("scan"),t.exports.parse=r("parse"),t.exports.compose=r("compose"),t.exports.addConstructor=r("addConstructor")},{"./js-yaml/exception":98,"./js-yaml/loader":99,"./js-yaml/schema":101,"./js-yaml/schema/core":102,"./js-yaml/schema/default_full":103,"./js-yaml/schema/default_safe":104,"./js-yaml/schema/failsafe":105,"./js-yaml/schema/json":106,"./js-yaml/type":107}],97:[function(e,t){"use strict";function r(e){return"undefined"==typeof e||null===e}function n(e){return"object"==typeof e&&null!==e}function i(e){return Array.isArray(e)?e:r(e)?[]:[e]}function o(e,t){var r,n,i,o;if(t)for(o=Object.keys(t),r=0,n=o.length;n>r;r+=1)i=o[r],e[i]=t[i];return e}function s(e,t){var r,n="";for(r=0;t>r;r+=1)n+=e;return n}function a(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e}t.exports.isNothing=r,t.exports.isObject=n,t.exports.toArray=i,t.exports.repeat=s,t.exports.isNegativeZero=a,t.exports.extend=o},{}],98:[function(e,t){"use strict";function r(e,t){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||"",this.name="YAMLException",this.reason=e,this.mark=t,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():"")}r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t},t.exports=r},{}],99:[function(e,t){"use strict";function r(e){return 10===e||13===e}function n(e){return 9===e||32===e}function i(e){return 9===e||32===e||10===e||13===e}function o(e){return 44===e||91===e||93===e||123===e||125===e}function s(e){var t;return e>=48&&57>=e?e-48:(t=32|e,t>=97&&102>=t?t-97+10:-1)}function a(e){return 120===e?2:117===e?4:85===e?8:0}function u(e){return e>=48&&57>=e?e-48:-1}function l(e){return 48===e?"\x00":97===e?"":98===e?"\b":116===e?" ":9===e?" ":110===e?"\n":118===e?" ":102===e?"\f":114===e?"\r":101===e?"":32===e?" ":34===e?'"':47===e?"/":92===e?"\\":78===e?"…":95===e?" ":76===e?"\u2028":80===e?"\u2029":""}function c(e){return 65535>=e?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}function f(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||V,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function h(e,t){return new D(t,new B(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function d(e,t){throw h(e,t)}function p(e,t){e.onWarning&&e.onWarning.call(null,h(e,t))}function _(e,t,r,n){var i,o,s,a;if(r>t){if(a=e.input.slice(t,r),n)for(i=0,o=a.length;o>i;i+=1)s=a.charCodeAt(i),9===s||s>=32&&1114111>=s||d(e,"expected valid JSON character");else $.test(a)&&d(e,"the stream contains non-printable characters");e.result+=a}}function m(e,t,r,n){var i,o,s,a;for(U.isObject(r)||d(e,"cannot merge mappings; the provided source object is unacceptable"),i=Object.keys(r),s=0,a=i.length;a>s;s+=1)o=i[s],q.call(t,o)||(t[o]=r[o],n[o]=!0)}function g(e,t,r,n,i,o){var s,a;if(i=String(i),null===t&&(t={}),"tag:yaml.org,2002:merge"===n)if(Array.isArray(o))for(s=0,a=o.length;a>s;s+=1)m(e,t,o[s],r);else m(e,t,o,r);else e.json||q.call(r,i)||!q.call(t,i)||d(e,"duplicated mapping key"),t[i]=o,delete r[i];return t}function v(e){var t;t=e.input.charCodeAt(e.position),10===t?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):d(e,"a line break is expected"),e.line+=1,e.lineStart=e.position}function y(e,t,i){for(var o=0,s=e.input.charCodeAt(e.position);0!==s;){for(;n(s);)s=e.input.charCodeAt(++e.position);if(t&&35===s)do s=e.input.charCodeAt(++e.position);while(10!==s&&13!==s&&0!==s);if(!r(s))break;for(v(e),s=e.input.charCodeAt(e.position),o++,e.lineIndent=0;32===s;)e.lineIndent++,s=e.input.charCodeAt(++e.position)}return-1!==i&&0!==o&&e.lineIndent1&&(e.result+=U.repeat("\n",t-1))}function w(e,t,s){var a,u,l,c,f,h,d,p,m,g=e.kind,v=e.result;if(m=e.input.charCodeAt(e.position),i(m)||o(m)||35===m||38===m||42===m||33===m||124===m||62===m||39===m||34===m||37===m||64===m||96===m)return!1;if((63===m||45===m)&&(u=e.input.charCodeAt(e.position+1),i(u)||s&&o(u)))return!1;for(e.kind="scalar",e.result="",l=c=e.position,f=!1;0!==m;){if(58===m){if(u=e.input.charCodeAt(e.position+1),i(u)||s&&o(u))break}else if(35===m){if(a=e.input.charCodeAt(e.position-1),i(a))break}else{if(e.position===e.lineStart&&b(e)||s&&o(m))break;if(r(m)){if(h=e.line,d=e.lineStart,p=e.lineIndent,y(e,!1,-1),e.lineIndent>=t){f=!0,m=e.input.charCodeAt(e.position);continue}e.position=c,e.line=h,e.lineStart=d,e.lineIndent=p;break}}f&&(_(e,l,c,!1),x(e,e.line-h),l=c=e.position,f=!1),n(m)||(c=e.position+1),m=e.input.charCodeAt(++e.position)}return _(e,l,c,!1),e.result?!0:(e.kind=g,e.result=v,!1)}function k(e,t){var n,i,o;if(n=e.input.charCodeAt(e.position),39!==n)return!1;for(e.kind="scalar",e.result="",e.position++,i=o=e.position;0!==(n=e.input.charCodeAt(e.position));)if(39===n){if(_(e,i,e.position,!0),n=e.input.charCodeAt(++e.position),39!==n)return!0;i=o=e.position,e.position++}else r(n)?(_(e,i,o,!0),x(e,y(e,!1,t)),i=o=e.position):e.position===e.lineStart&&b(e)?d(e,"unexpected end of the document within a single quoted scalar"):(e.position++,o=e.position);d(e,"unexpected end of the stream within a single quoted scalar")}function A(e,t){var n,i,o,u,l,f;if(f=e.input.charCodeAt(e.position),34!==f)return!1;for(e.kind="scalar",e.result="",e.position++,n=i=e.position;0!==(f=e.input.charCodeAt(e.position));){if(34===f)return _(e,n,e.position,!0),e.position++,!0;if(92===f){if(_(e,n,e.position,!0),f=e.input.charCodeAt(++e.position),r(f))y(e,!1,t);else if(256>f&&nt[f])e.result+=it[f],e.position++;else if((l=a(f))>0){for(o=l,u=0;o>0;o--)f=e.input.charCodeAt(++e.position),(l=s(f))>=0?u=(u<<4)+l:d(e,"expected hexadecimal character");e.result+=c(u),e.position++}else d(e,"unknown escape sequence");n=i=e.position}else r(f)?(_(e,n,i,!0),x(e,y(e,!1,t)),n=i=e.position):e.position===e.lineStart&&b(e)?d(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}d(e,"unexpected end of the stream within a double quoted scalar")}function T(e,t){var r,n,o,s,a,u,l,c,f,h,p,_=!0,m=e.tag,v=e.anchor,b={};if(p=e.input.charCodeAt(e.position),91===p)s=93,l=!1,n=[];else{if(123!==p)return!1;s=125,l=!0,n={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=n),p=e.input.charCodeAt(++e.position);0!==p;){if(y(e,!0,t),p=e.input.charCodeAt(e.position),p===s)return e.position++,e.tag=m,e.anchor=v,e.kind=l?"mapping":"sequence",e.result=n,!0;_||d(e,"missed comma between flow collection entries"),f=c=h=null,a=u=!1,63===p&&(o=e.input.charCodeAt(e.position+1),i(o)&&(a=u=!0,e.position++,y(e,!0,t))),r=e.line,z(e,t,W,!1,!0),f=e.tag,c=e.result,y(e,!0,t),p=e.input.charCodeAt(e.position),!u&&e.line!==r||58!==p||(a=!0,p=e.input.charCodeAt(++e.position),y(e,!0,t),z(e,t,W,!1,!0),h=e.result),l?g(e,n,b,f,c,h):n.push(a?g(e,null,b,f,c,h):c),y(e,!0,t),p=e.input.charCodeAt(e.position),44===p?(_=!0,p=e.input.charCodeAt(++e.position)):_=!1}d(e,"unexpected end of the stream within a flow collection")}function E(e,t){var i,o,s,a,l=Y,c=!1,f=t,h=0,p=!1;if(a=e.input.charCodeAt(e.position),124===a)o=!1;else{if(62!==a)return!1;o=!0}for(e.kind="scalar",e.result="";0!==a;)if(a=e.input.charCodeAt(++e.position),43===a||45===a)Y===l?l=43===a?K:J:d(e,"repeat of a chomping mode identifier");else{if(!((s=u(a))>=0))break;0===s?d(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?d(e,"repeat of an indentation width identifier"):(f=t+s-1,c=!0)}if(n(a)){do a=e.input.charCodeAt(++e.position);while(n(a));if(35===a)do a=e.input.charCodeAt(++e.position);while(!r(a)&&0!==a)}for(;0!==a;){for(v(e),e.lineIndent=0,a=e.input.charCodeAt(e.position);(!c||e.lineIndentf&&(f=e.lineIndent),r(a))h++;else{if(e.lineIndentt)&&0!==o)d(e,"bad indentation of a sequence entry");else if(e.lineIndentt)&&(z(e,t,X,!0,s)&&(v?_=e.result:m=e.result),v||(g(e,f,h,p,_,m),p=_=m=null),y(e,!0,-1),u=e.input.charCodeAt(e.position)),e.lineIndent>t&&0!==u)d(e,"bad indentation of a mapping entry");else if(e.lineIndentt?p=1:e.lineIndent===t?p=0:e.lineIndentt?p=1:e.lineIndent===t?p=0:e.lineIndentu;u+=1)if(c=e.implicitTypes[u],c.resolve(e.result)){e.result=c.construct(e.result),e.tag=c.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else q.call(e.typeMap,e.tag)?(c=e.typeMap[e.tag],null!==e.result&&c.kind!==e.kind&&d(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+c.kind+'", not "'+e.kind+'"'),c.resolve(e.result)?(e.result=c.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):d(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")):d(e,"unknown tag !<"+e.tag+">");return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||m}function N(e){var t,o,s,a,u=e.position,l=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};0!==(a=e.input.charCodeAt(e.position))&&(y(e,!0,-1),a=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==a));){for(l=!0,a=e.input.charCodeAt(++e.position),t=e.position;0!==a&&!i(a);)a=e.input.charCodeAt(++e.position);for(o=e.input.slice(t,e.position),s=[],o.length<1&&d(e,"directive name must not be less than one character in length");0!==a;){for(;n(a);)a=e.input.charCodeAt(++e.position);if(35===a){do a=e.input.charCodeAt(++e.position);while(0!==a&&!r(a));break}if(r(a))break;for(t=e.position;0!==a&&!i(a);)a=e.input.charCodeAt(++e.position);s.push(e.input.slice(t,e.position))}0!==a&&v(e),q.call(st,o)?st[o](e,o,s):p(e,'unknown document directive "'+o+'"')}return y(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,y(e,!0,-1)):l&&d(e,"directives end mark is expected"),z(e,e.lineIndent-1,X,!1,!0),y(e,!0,-1),e.checkLineBreaks&&Q.test(e.input.slice(u,e.position))&&p(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&b(e)?void(46===e.input.charCodeAt(e.position)&&(e.position+=3,y(e,!0,-1))):void(e.positionn;n+=1)t(o[n])}function I(e,t){var r=j(e,t);if(0===r.length)return void 0;if(1===r.length)return r[0];throw new D("expected a single document in the stream, but found more")}function C(e,t,r){L(e,t,U.extend({schema:G},r))}function F(e,t){return I(e,U.extend({schema:G},t))}for(var U=e("./common"),D=e("./exception"),B=e("./mark"),G=e("./schema/default_safe"),V=e("./schema/default_full"),q=Object.prototype.hasOwnProperty,W=1,Z=2,H=3,X=4,Y=1,J=2,K=3,$=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Q=/[\x85\u2028\u2029]/,et=/[,\[\]\{\}]/,tt=/^(?:!|!!|![a-z\-]+!)$/i,rt=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i,nt=new Array(256),it=new Array(256),ot=0;256>ot;ot++)nt[ot]=l(ot)?1:0,it[ot]=l(ot);var st={YAML:function(e,t,r){var n,i,o;null!==e.version&&d(e,"duplication of %YAML directive"),1!==r.length&&d(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(r[0]),null===n&&d(e,"ill-formed argument of the YAML directive"),i=parseInt(n[1],10),o=parseInt(n[2],10),1!==i&&d(e,"unacceptable YAML version of the document"),e.version=r[0],e.checkLineBreaks=2>o,1!==o&&2!==o&&p(e,"unsupported YAML version of the document")},TAG:function(e,t,r){var n,i;2!==r.length&&d(e,"TAG directive accepts exactly two arguments"),n=r[0],i=r[1],tt.test(n)||d(e,"ill-formed tag handle (first argument) of the TAG directive"),q.call(e.tagMap,n)&&d(e,'there is a previously declared suffix for "'+n+'" tag handle'),rt.test(i)||d(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=i}};t.exports.loadAll=L,t.exports.load=I,t.exports.safeLoadAll=C,t.exports.safeLoad=F},{"./common":97,"./exception":98,"./mark":100,"./schema/default_full":103,"./schema/default_safe":104}],100:[function(e,t){"use strict"; +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Tangram=e()}}(function(){var e;return function t(e,r,n){function i(s,a){if(!r[s]){if(!e[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(o)return o(s,!0);var l=new Error("Cannot find module '"+s+"'");throw l.code="MODULE_NOT_FOUND",l}var c=r[s]={exports:{}};e[s][0].call(c.exports,function(t){var r=e[s][1][t];return i(r?r:t)},c,c.exports,t,e,r,n)}return r[s].exports}for(var o="function"==typeof require&&require,s=0;sc){for(var t=0,r=a.length-l;r>t;t++)a[t]=a[t+l];a.length-=l,l=0}}a.length=0,l=0,u=!1}function i(e){var t=1,r=new h(e),n=document.createTextNode("");return r.observe(n,{characterData:!0}),function(){t=-t,n.data=t}}function o(e){return function(){function t(){clearTimeout(r),clearInterval(n),e()}var r=setTimeout(t,0),n=setInterval(t,50)}}t.exports=r;var s,a=[],u=!1,l=0,c=1024,f="undefined"!=typeof e?e:self,h=f.MutationObserver||f.WebKitMutationObserver;s="function"==typeof h?i(n):o(n),r.requestFlush=s,r.makeRequestCallFromTimer=o}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(e,t,r){"use strict";function n(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===e[t-2]?2:"="===e[t-1]?1:0}function i(e){return 3*e.length/4-n(e)}function o(e){var t,r,i,o,s,a,u=e.length;s=n(e),a=new f(3*u/4-s),i=s>0?u-4:u;var l=0;for(t=0,r=0;i>t;t+=4,r+=3)o=c[e.charCodeAt(t)]<<18|c[e.charCodeAt(t+1)]<<12|c[e.charCodeAt(t+2)]<<6|c[e.charCodeAt(t+3)],a[l++]=o>>16&255,a[l++]=o>>8&255,a[l++]=255&o;return 2===s?(o=c[e.charCodeAt(t)]<<2|c[e.charCodeAt(t+1)]>>4,a[l++]=255&o):1===s&&(o=c[e.charCodeAt(t)]<<10|c[e.charCodeAt(t+1)]<<4|c[e.charCodeAt(t+2)]>>2,a[l++]=o>>8&255,a[l++]=255&o),a}function s(e){return l[e>>18&63]+l[e>>12&63]+l[e>>6&63]+l[63&e]}function a(e,t,r){for(var n,i=[],o=t;r>o;o+=3)n=(e[o]<<16)+(e[o+1]<<8)+e[o+2],i.push(s(n));return i.join("")}function u(e){for(var t,r=e.length,n=r%3,i="",o=[],s=16383,u=0,c=r-n;c>u;u+=s)o.push(a(e,u,u+s>c?c:u+s));return 1===n?(t=e[r-1],i+=l[t>>2],i+=l[t<<4&63],i+="=="):2===n&&(t=(e[r-2]<<8)+e[r-1],i+=l[t>>10],i+=l[t>>4&63],i+=l[t<<2&63],i+="="),o.push(i),o.join("")}r.byteLength=i,r.toByteArray=o,r.fromByteArray=u;for(var l=[],c=[],f="undefined"!=typeof Uint8Array?Uint8Array:Array,h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",d=0,p=h.length;p>d;++d)l[d]=h[d],c[h.charCodeAt(d)]=d;c["-".charCodeAt(0)]=62,c["_".charCodeAt(0)]=63},{}],4:[function(){},{}],5:[function(e,t,r){(function(t){"use strict";function n(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&"function"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(t){return!1}}function i(){return s.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function o(e,t){if(i()e)throw new RangeError('"size" argument must not be negative')}function l(e,t,r,n){return u(t),0>=t?o(e,t):void 0!==r?"string"==typeof n?o(e,t).fill(r,n):o(e,t).fill(r):o(e,t)}function c(e,t){if(u(t),e=o(e,0>t?0:0|_(t)),!s.TYPED_ARRAY_SUPPORT)for(var r=0;t>r;++r)e[r]=0;return e}function f(e,t,r){if(("string"!=typeof r||""===r)&&(r="utf8"),!s.isEncoding(r))throw new TypeError('"encoding" must be a valid string encoding');var n=0|g(t,r);e=o(e,n);var i=e.write(t,r);return i!==n&&(e=e.slice(0,i)),e}function h(e,t){var r=t.length<0?0:0|_(t.length);e=o(e,r);for(var n=0;r>n;n+=1)e[n]=255&t[n];return e}function d(e,t,r,n){if(t.byteLength,0>r||t.byteLength=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|e}function m(e){return+e!=e&&(e=0),s.alloc(+e)}function g(e,t){if(s.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return W(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return X(e).length;default:if(n)return W(e).length;t=(""+t).toLowerCase(),n=!0}}function v(e,t,r){var n=!1;if((void 0===t||0>t)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),0>=r)return"";if(r>>>=0,t>>>=0,t>=r)return"";for(e||(e="utf8");;)switch(e){case"hex":return N(this,t,r);case"utf8":case"utf-8":return M(this,t,r);case"ascii":return O(this,t,r);case"latin1":case"binary":return z(this,t,r);case"base64":return R(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return j(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function y(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function b(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:-2147483648>r&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:e.length-1),0>r&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(0>r){if(!i)return-1;r=0}if("string"==typeof t&&(t=s.from(t,n)),s.isBuffer(t))return 0===t.length?-1:x(e,t,r,n,i);if("number"==typeof t)return t=255&t,s.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):x(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function x(e,t,r,n,i){function o(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}var s=1,a=e.length,u=t.length;if(void 0!==n&&(n=String(n).toLowerCase(),"ucs2"===n||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;s=2,a/=2,u/=2,r/=2}var l;if(i){var c=-1;for(l=r;a>l;l++)if(o(e,l)===o(t,-1===c?0:l-c)){if(-1===c&&(c=l),l-c+1===u)return c*s}else-1!==c&&(l-=l-c),c=-1}else for(r+u>a&&(r=a-u),l=r;l>=0;l--){for(var f=!0,h=0;u>h;h++)if(o(e,l+h)!==o(t,h)){f=!1;break}if(f)return l}return-1}function w(e,t,r,n){r=Number(r)||0;var i=e.length-r;n?(n=Number(n),n>i&&(n=i)):n=i;var o=t.length;if(o%2!==0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var s=0;n>s;++s){var a=parseInt(t.substr(2*s,2),16);if(isNaN(a))return s;e[r+s]=a}return s}function k(e,t,r,n){return Y(W(t,e.length-r),e,r,n)}function A(e,t,r,n){return Y(Z(t),e,r,n)}function T(e,t,r,n){return A(e,t,r,n)}function E(e,t,r,n){return Y(X(t),e,r,n)}function S(e,t,r,n){return Y(H(t,e.length-r),e,r,n)}function R(e,t,r){return K.fromByteArray(0===t&&r===e.length?e:e.slice(t,r))}function M(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;r>i;){var o=e[i],s=null,a=o>239?4:o>223?3:o>191?2:1;if(r>=i+a){var u,l,c,f;switch(a){case 1:128>o&&(s=o);break;case 2:u=e[i+1],128===(192&u)&&(f=(31&o)<<6|63&u,f>127&&(s=f));break;case 3:u=e[i+1],l=e[i+2],128===(192&u)&&128===(192&l)&&(f=(15&o)<<12|(63&u)<<6|63&l,f>2047&&(55296>f||f>57343)&&(s=f));break;case 4:u=e[i+1],l=e[i+2],c=e[i+3],128===(192&u)&&128===(192&l)&&128===(192&c)&&(f=(15&o)<<18|(63&u)<<12|(63&l)<<6|63&c,f>65535&&1114112>f&&(s=f))}}null===s?(s=65533,a=1):s>65535&&(s-=65536,n.push(s>>>10&1023|55296),s=56320|1023&s),n.push(s),i+=a}return P(n)}function P(e){var t=e.length;if(et>=t)return String.fromCharCode.apply(String,e);for(var r="",n=0;t>n;)r+=String.fromCharCode.apply(String,e.slice(n,n+=et));return r}function O(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;r>i;++i)n+=String.fromCharCode(127&e[i]);return n}function z(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;r>i;++i)n+=String.fromCharCode(e[i]);return n}function N(e,t,r){var n=e.length;(!t||0>t)&&(t=0),(!r||0>r||r>n)&&(r=n);for(var i="",o=t;r>o;++o)i+=q(e[o]);return i}function j(e,t,r){for(var n=e.slice(t,r),i="",o=0;oe)throw new RangeError("offset is not uint");if(e+t>r)throw new RangeError("Trying to access beyond buffer length")}function I(e,t,r,n,i,o){if(!s.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||o>t)throw new RangeError('"value" argument is out of bounds');if(r+n>e.length)throw new RangeError("Index out of range")}function C(e,t,r,n){0>t&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-r,2);o>i;++i)e[r+i]=(t&255<<8*(n?i:1-i))>>>8*(n?i:1-i)}function F(e,t,r,n){0>t&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-r,4);o>i;++i)e[r+i]=t>>>8*(n?i:3-i)&255}function U(e,t,r,n){if(r+n>e.length)throw new RangeError("Index out of range");if(0>r)throw new RangeError("Index out of range")}function D(e,t,r,n,i){return i||U(e,t,r,4,3.4028234663852886e38,-3.4028234663852886e38),$.write(e,t,r,n,23,4),r+4}function B(e,t,r,n,i){return i||U(e,t,r,8,1.7976931348623157e308,-1.7976931348623157e308),$.write(e,t,r,n,52,8),r+8}function G(e){if(e=V(e).replace(tt,""),e.length<2)return"";for(;e.length%4!==0;)e+="=";return e}function V(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function q(e){return 16>e?"0"+e.toString(16):e.toString(16)}function W(e,t){t=t||1/0;for(var r,n=e.length,i=null,o=[],s=0;n>s;++s){if(r=e.charCodeAt(s),r>55295&&57344>r){if(!i){if(r>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(t-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(56320>r){(t-=3)>-1&&o.push(239,191,189),i=r;continue}r=(i-55296<<10|r-56320)+65536}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,128>r){if((t-=1)<0)break;o.push(r)}else if(2048>r){if((t-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(65536>r){if((t-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(1114112>r))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function Z(e){for(var t=[],r=0;r>8,i=r%256,o.push(i),o.push(n);return o}function X(e){return K.toByteArray(G(e))}function Y(e,t,r,n){for(var i=0;n>i&&!(i+r>=t.length||i>=e.length);++i)t[i+r]=e[i];return i}function J(e){return e!==e}var K=e("base64-js"),$=e("ieee754"),Q=e("isarray");r.Buffer=s,r.SlowBuffer=m,r.INSPECT_MAX_BYTES=50,s.TYPED_ARRAY_SUPPORT=void 0!==t.TYPED_ARRAY_SUPPORT?t.TYPED_ARRAY_SUPPORT:n(),r.kMaxLength=i(),s.poolSize=8192,s._augment=function(e){return e.__proto__=s.prototype,e},s.from=function(e,t,r){return a(null,e,t,r)},s.TYPED_ARRAY_SUPPORT&&(s.prototype.__proto__=Uint8Array.prototype,s.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&s[Symbol.species]===s&&Object.defineProperty(s,Symbol.species,{value:null,configurable:!0})),s.alloc=function(e,t,r){return l(null,e,t,r)},s.allocUnsafe=function(e){return c(null,e)},s.allocUnsafeSlow=function(e){return c(null,e)},s.isBuffer=function(e){return!(null==e||!e._isBuffer)},s.compare=function(e,t){if(!s.isBuffer(e)||!s.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var r=e.length,n=t.length,i=0,o=Math.min(r,n);o>i;++i)if(e[i]!==t[i]){r=e[i],n=t[i];break}return n>r?-1:r>n?1:0},s.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},s.concat=function(e,t){if(!Q(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return s.alloc(0);var r;if(void 0===t)for(t=0,r=0;rt;t+=2)y(this,t,t+1);return this},s.prototype.swap32=function(){var e=this.length;if(e%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;e>t;t+=4)y(this,t,t+3),y(this,t+1,t+2);return this},s.prototype.swap64=function(){var e=this.length;if(e%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;e>t;t+=8)y(this,t,t+7),y(this,t+1,t+6),y(this,t+2,t+5),y(this,t+3,t+4);return this},s.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?M(this,0,e):v.apply(this,arguments)},s.prototype.equals=function(e){if(!s.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e?!0:0===s.compare(this,e)},s.prototype.inspect=function(){var e="",t=r.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString("hex",0,t).match(/.{2}/g).join(" "),this.length>t&&(e+=" ... ")),""},s.prototype.compare=function(e,t,r,n,i){if(!s.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),0>t||r>e.length||0>n||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(t>>>=0,r>>>=0,n>>>=0,i>>>=0,this===e)return 0;for(var o=i-n,a=r-t,u=Math.min(o,a),l=this.slice(n,i),c=e.slice(t,r),f=0;u>f;++f)if(l[f]!==c[f]){o=l[f],a=c[f];break}return a>o?-1:o>a?1:0},s.prototype.includes=function(e,t,r){return-1!==this.indexOf(e,t,r)},s.prototype.indexOf=function(e,t,r){return b(this,e,t,r,!0)},s.prototype.lastIndexOf=function(e,t,r){return b(this,e,t,r,!1)},s.prototype.write=function(e,t,r,n){if(void 0===t)n="utf8",r=this.length,t=0;else if(void 0===r&&"string"==typeof t)n=t,r=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t=0|t,isFinite(r)?(r=0|r,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-t;if((void 0===r||r>i)&&(r=i),e.length>0&&(0>r||0>t)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return w(this,e,t,r);case"utf8":case"utf-8":return k(this,e,t,r);case"ascii":return A(this,e,t,r);case"latin1":case"binary":return T(this,e,t,r);case"base64":return E(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},s.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var et=4096;s.prototype.slice=function(e,t){var r=this.length;e=~~e,t=void 0===t?r:~~t,0>e?(e+=r,0>e&&(e=0)):e>r&&(e=r),0>t?(t+=r,0>t&&(t=0)):t>r&&(t=r),e>t&&(t=e);var n;if(s.TYPED_ARRAY_SUPPORT)n=this.subarray(e,t),n.__proto__=s.prototype;else{var i=t-e;n=new s(i,void 0);for(var o=0;i>o;++o)n[o]=this[o+e]}return n},s.prototype.readUIntLE=function(e,t,r){e=0|e,t=0|t,r||L(e,t,this.length);for(var n=this[e],i=1,o=0;++o0&&(i*=256);)n+=this[e+--t]*i;return n},s.prototype.readUInt8=function(e,t){return t||L(e,1,this.length),this[e]},s.prototype.readUInt16LE=function(e,t){return t||L(e,2,this.length),this[e]|this[e+1]<<8},s.prototype.readUInt16BE=function(e,t){return t||L(e,2,this.length),this[e]<<8|this[e+1]},s.prototype.readUInt32LE=function(e,t){return t||L(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},s.prototype.readUInt32BE=function(e,t){return t||L(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},s.prototype.readIntLE=function(e,t,r){e=0|e,t=0|t,r||L(e,t,this.length);for(var n=this[e],i=1,o=0;++o=i&&(n-=Math.pow(2,8*t)),n},s.prototype.readIntBE=function(e,t,r){e=0|e,t=0|t,r||L(e,t,this.length);for(var n=t,i=1,o=this[e+--n];n>0&&(i*=256);)o+=this[e+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*t)),o},s.prototype.readInt8=function(e,t){return t||L(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},s.prototype.readInt16LE=function(e,t){t||L(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt16BE=function(e,t){t||L(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt32LE=function(e,t){return t||L(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},s.prototype.readInt32BE=function(e,t){return t||L(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},s.prototype.readFloatLE=function(e,t){return t||L(e,4,this.length),$.read(this,e,!0,23,4)},s.prototype.readFloatBE=function(e,t){return t||L(e,4,this.length),$.read(this,e,!1,23,4)},s.prototype.readDoubleLE=function(e,t){return t||L(e,8,this.length),$.read(this,e,!0,52,8)},s.prototype.readDoubleBE=function(e,t){return t||L(e,8,this.length),$.read(this,e,!1,52,8)},s.prototype.writeUIntLE=function(e,t,r,n){if(e=+e,t=0|t,r=0|r,!n){var i=Math.pow(2,8*r)-1;I(this,e,t,r,i,0)}var o=1,s=0;for(this[t]=255&e;++s=0&&(s*=256);)this[t+o]=e/s&255;return t+r},s.prototype.writeUInt8=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,1,255,0),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},s.prototype.writeUInt16LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):C(this,e,t,!0),t+2},s.prototype.writeUInt16BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},s.prototype.writeUInt32LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):F(this,e,t,!0),t+4},s.prototype.writeUInt32BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):F(this,e,t,!1),t+4},s.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t=0|t,!n){var i=Math.pow(2,8*r-1);I(this,e,t,r,i-1,-i)}var o=0,s=1,a=0;for(this[t]=255&e;++oe&&0===a&&0!==this[t+o-1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+r},s.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t=0|t,!n){var i=Math.pow(2,8*r-1);I(this,e,t,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[t+o]=255&e;--o>=0&&(s*=256);)0>e&&0===a&&0!==this[t+o+1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+r},s.prototype.writeInt8=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,1,127,-128),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),0>e&&(e=255+e+1),this[t]=255&e,t+1},s.prototype.writeInt16LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):C(this,e,t,!0),t+2},s.prototype.writeInt16BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},s.prototype.writeInt32LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,2147483647,-2147483648),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):F(this,e,t,!0),t+4},s.prototype.writeInt32BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,2147483647,-2147483648),0>e&&(e=4294967295+e+1),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):F(this,e,t,!1),t+4},s.prototype.writeFloatLE=function(e,t,r){return D(this,e,t,!0,r)},s.prototype.writeFloatBE=function(e,t,r){return D(this,e,t,!1,r)},s.prototype.writeDoubleLE=function(e,t,r){return B(this,e,t,!0,r)},s.prototype.writeDoubleBE=function(e,t,r){return B(this,e,t,!1,r)},s.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&r>n&&(n=r),n===r)return 0;if(0===e.length||0===this.length)return 0;if(0>t)throw new RangeError("targetStart out of bounds");if(0>r||r>=this.length)throw new RangeError("sourceStart out of bounds");if(0>n)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-tr&&n>t)for(i=o-1;i>=0;--i)e[i+t]=this[i+r];else if(1e3>o||!s.TYPED_ARRAY_SUPPORT)for(i=0;o>i;++i)e[i+t]=this[i+r];else Uint8Array.prototype.set.call(e,this.subarray(r,r+o),t);return o},s.prototype.fill=function(e,t,r,n){if("string"==typeof e){if("string"==typeof t?(n=t,t=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),1===e.length){var i=e.charCodeAt(0);256>i&&(e=i)}if(void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!s.isEncoding(n))throw new TypeError("Unknown encoding: "+n)}else"number"==typeof e&&(e=255&e);if(0>t||this.length=r)return this;t>>>=0,r=void 0===r?this.length:r>>>0,e||(e=0);var o;if("number"==typeof e)for(o=t;r>o;++o)this[o]=e;else{var a=s.isBuffer(e)?e:W(new s(e,n).toString()),u=a.length;for(o=0;r-t>o;++o)this[o+t]=a[o%u]}return this};var tt=/[^+\/0-9A-Za-z-_]/g}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"base64-js":3,ieee754:91,isarray:94}],6:[function(e,t){e("../modules/es6.object.to-string"),e("../modules/es6.string.iterator"),e("../modules/web.dom.iterable"),e("../modules/es6.promise"),t.exports=e("../modules/_core").Promise},{"../modules/_core":14,"../modules/es6.object.to-string":66,"../modules/es6.promise":67,"../modules/es6.string.iterator":68,"../modules/web.dom.iterable":69}],7:[function(e,t){t.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},{}],8:[function(e,t){var r=e("./_wks")("unscopables"),n=Array.prototype;void 0==n[r]&&e("./_hide")(n,r,{}),t.exports=function(e){n[r][e]=!0}},{"./_hide":25,"./_wks":63}],9:[function(e,t){t.exports=function(e,t,r,n){if(!(e instanceof t)||void 0!==n&&n in e)throw TypeError(r+": incorrect invocation!");return e}},{}],10:[function(e,t){var r=e("./_is-object");t.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},{"./_is-object":31}],11:[function(e,t){var r=e("./_to-iobject"),n=e("./_to-length"),i=e("./_to-index");t.exports=function(e){return function(t,o,s){var a,u=r(t),l=n(u.length),c=i(s,l);if(e&&o!=o){for(;l>c;)if(a=u[c++],a!=a)return!0}else for(;l>c;c++)if((e||c in u)&&u[c]===o)return e||c||0;return!e&&-1}}},{"./_to-index":56,"./_to-iobject":58,"./_to-length":59}],12:[function(e,t){var r=e("./_cof"),n=e("./_wks")("toStringTag"),i="Arguments"==r(function(){return arguments}()),o=function(e,t){try{return e[t]}catch(r){}};t.exports=function(e){var t,s,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(s=o(t=Object(e),n))?s:i?r(t):"Object"==(a=r(t))&&"function"==typeof t.callee?"Arguments":a}},{"./_cof":13,"./_wks":63}],13:[function(e,t){var r={}.toString;t.exports=function(e){return r.call(e).slice(8,-1)}},{}],14:[function(e,t){var r=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},{}],15:[function(e,t){var r=e("./_a-function");t.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,i){return e.call(t,r,n,i)}}return function(){return e.apply(t,arguments)}}},{"./_a-function":7}],16:[function(e,t){t.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},{}],17:[function(e,t){t.exports=!e("./_fails")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{"./_fails":21}],18:[function(e,t){var r=e("./_is-object"),n=e("./_global").document,i=r(n)&&r(n.createElement);t.exports=function(e){return i?n.createElement(e):{}}},{"./_global":23,"./_is-object":31}],19:[function(e,t){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],20:[function(e,t){var r=e("./_global"),n=e("./_core"),i=e("./_hide"),o=e("./_redefine"),s=e("./_ctx"),a="prototype",u=function(e,t,l){var c,f,h,d,p=e&u.F,_=e&u.G,m=e&u.S,g=e&u.P,v=e&u.B,y=_?r:m?r[t]||(r[t]={}):(r[t]||{})[a],b=_?n:n[t]||(n[t]={}),x=b[a]||(b[a]={});_&&(l=t);for(c in l)f=!p&&y&&void 0!==y[c],h=(f?y:l)[c],d=v&&f?s(h,r):g&&"function"==typeof h?s(Function.call,h):h,y&&o(y,c,h,e&u.U),b[c]!=h&&i(b,c,d),g&&x[c]!=h&&(x[c]=h)};r.core=n,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,t.exports=u},{"./_core":14,"./_ctx":15,"./_global":23,"./_hide":25,"./_redefine":48}],21:[function(e,t){t.exports=function(e){try{return!!e()}catch(t){return!0}}},{}],22:[function(e,t,r){var n=e("./_ctx"),i=e("./_iter-call"),o=e("./_is-array-iter"),s=e("./_an-object"),a=e("./_to-length"),u=e("./core.get-iterator-method"),l={},c={},r=t.exports=function(e,t,r,f,h){var d,p,_,m,g=h?function(){return e}:u(e),v=n(r,f,t?2:1),y=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(o(g)){for(d=a(e.length);d>y;y++)if(m=t?v(s(p=e[y])[0],p[1]):v(e[y]),m===l||m===c)return m}else for(_=g.call(e);!(p=_.next()).done;)if(m=i(_,v,p.value,t),m===l||m===c)return m};r.BREAK=l,r.RETURN=c},{"./_an-object":10,"./_ctx":15,"./_is-array-iter":30,"./_iter-call":32,"./_to-length":59,"./core.get-iterator-method":64}],23:[function(e,t){var r=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],24:[function(e,t){var r={}.hasOwnProperty;t.exports=function(e,t){return r.call(e,t)}},{}],25:[function(e,t){var r=e("./_object-dp"),n=e("./_property-desc");t.exports=e("./_descriptors")?function(e,t,i){return r.f(e,t,n(1,i))}:function(e,t,r){return e[t]=r,e}},{"./_descriptors":17,"./_object-dp":41,"./_property-desc":46}],26:[function(e,t){t.exports=e("./_global").document&&document.documentElement},{"./_global":23}],27:[function(e,t){t.exports=!e("./_descriptors")&&!e("./_fails")(function(){return 7!=Object.defineProperty(e("./_dom-create")("div"),"a",{get:function(){return 7}}).a})},{"./_descriptors":17,"./_dom-create":18,"./_fails":21}],28:[function(e,t){t.exports=function(e,t,r){var n=void 0===r;switch(t.length){case 0:return n?e():e.call(r);case 1:return n?e(t[0]):e.call(r,t[0]);case 2:return n?e(t[0],t[1]):e.call(r,t[0],t[1]);case 3:return n?e(t[0],t[1],t[2]):e.call(r,t[0],t[1],t[2]);case 4:return n?e(t[0],t[1],t[2],t[3]):e.call(r,t[0],t[1],t[2],t[3])}return e.apply(r,t)}},{}],29:[function(e,t){var r=e("./_cof");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},{"./_cof":13}],30:[function(e,t){var r=e("./_iterators"),n=e("./_wks")("iterator"),i=Array.prototype;t.exports=function(e){return void 0!==e&&(r.Array===e||i[n]===e)}},{"./_iterators":37,"./_wks":63}],31:[function(e,t){t.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},{}],32:[function(e,t){var r=e("./_an-object");t.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(o){var s=e["return"];throw void 0!==s&&r(s.call(e)),o}}},{"./_an-object":10}],33:[function(e,t){"use strict";var r=e("./_object-create"),n=e("./_property-desc"),i=e("./_set-to-string-tag"),o={};e("./_hide")(o,e("./_wks")("iterator"),function(){return this}),t.exports=function(e,t,s){e.prototype=r(o,{next:n(1,s)}),i(e,t+" Iterator")}},{"./_hide":25,"./_object-create":40,"./_property-desc":46,"./_set-to-string-tag":50,"./_wks":63}],34:[function(e,t){"use strict";var r=e("./_library"),n=e("./_export"),i=e("./_redefine"),o=e("./_hide"),s=e("./_has"),a=e("./_iterators"),u=e("./_iter-create"),l=e("./_set-to-string-tag"),c=e("./_object-gpo"),f=e("./_wks")("iterator"),h=!([].keys&&"next"in[].keys()),d="@@iterator",p="keys",_="values",m=function(){return this};t.exports=function(e,t,g,v,y,b,x){u(g,t,v);var w,k,A,T=function(e){if(!h&&e in M)return M[e];switch(e){case p:return function(){return new g(this,e)};case _:return function(){return new g(this,e)}}return function(){return new g(this,e)}},E=t+" Iterator",S=y==_,R=!1,M=e.prototype,P=M[f]||M[d]||y&&M[y],O=P||T(y),z=y?S?T("entries"):O:void 0,N="Array"==t?M.entries||P:P;if(N&&(A=c(N.call(new e)),A!==Object.prototype&&(l(A,E,!0),r||s(A,f)||o(A,f,m))),S&&P&&P.name!==_&&(R=!0,O=function(){return P.call(this)}),r&&!x||!h&&!R&&M[f]||o(M,f,O),a[t]=O,a[E]=m,y)if(w={values:S?O:T(_),keys:b?O:T(p),entries:z},x)for(k in w)k in M||i(M,k,w[k]);else n(n.P+n.F*(h||R),t,w);return w}},{"./_export":20,"./_has":24,"./_hide":25,"./_iter-create":33,"./_iterators":37,"./_library":38,"./_object-gpo":43,"./_redefine":48,"./_set-to-string-tag":50,"./_wks":63}],35:[function(e,t){var r=e("./_wks")("iterator"),n=!1;try{var i=[7][r]();i["return"]=function(){n=!0},Array.from(i,function(){throw 2})}catch(o){}t.exports=function(e,t){if(!t&&!n)return!1;var i=!1;try{var o=[7],s=o[r]();s.next=function(){return{done:i=!0}},o[r]=function(){return s},e(o)}catch(a){}return i}},{"./_wks":63}],36:[function(e,t){t.exports=function(e,t){return{value:t,done:!!e}}},{}],37:[function(e,t){t.exports={}},{}],38:[function(e,t){t.exports=!1},{}],39:[function(e,t){var r=e("./_global"),n=e("./_task").set,i=r.MutationObserver||r.WebKitMutationObserver,o=r.process,s=r.Promise,a="process"==e("./_cof")(o);t.exports=function(){var e,t,u,l=function(){var r,n;for(a&&(r=o.domain)&&r.exit();e;){n=e.fn,e=e.next;try{n()}catch(i){throw e?u():t=void 0,i}}t=void 0,r&&r.enter()};if(a)u=function(){o.nextTick(l)};else if(i){var c=!0,f=document.createTextNode("");new i(l).observe(f,{characterData:!0}),u=function(){f.data=c=!c}}else if(s&&s.resolve){var h=s.resolve();u=function(){h.then(l)}}else u=function(){n.call(r,l)};return function(r){var n={fn:r,next:void 0};t&&(t.next=n),e||(e=n,u()),t=n}}},{"./_cof":13,"./_global":23,"./_task":55}],40:[function(e,t){var r=e("./_an-object"),n=e("./_object-dps"),i=e("./_enum-bug-keys"),o=e("./_shared-key")("IE_PROTO"),s=function(){},a="prototype",u=function(){var t,r=e("./_dom-create")("iframe"),n=i.length,o="<",s=">"; +for(r.style.display="none",e("./_html").appendChild(r),r.src="javascript:",t=r.contentWindow.document,t.open(),t.write(o+"script"+s+"document.F=Object"+o+"/script"+s),t.close(),u=t.F;n--;)delete u[a][i[n]];return u()};t.exports=Object.create||function(e,t){var i;return null!==e?(s[a]=r(e),i=new s,s[a]=null,i[o]=e):i=u(),void 0===t?i:n(i,t)}},{"./_an-object":10,"./_dom-create":18,"./_enum-bug-keys":19,"./_html":26,"./_object-dps":42,"./_shared-key":51}],41:[function(e,t,r){var n=e("./_an-object"),i=e("./_ie8-dom-define"),o=e("./_to-primitive"),s=Object.defineProperty;r.f=e("./_descriptors")?Object.defineProperty:function(e,t,r){if(n(e),t=o(t,!0),n(r),i)try{return s(e,t,r)}catch(a){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},{"./_an-object":10,"./_descriptors":17,"./_ie8-dom-define":27,"./_to-primitive":61}],42:[function(e,t){var r=e("./_object-dp"),n=e("./_an-object"),i=e("./_object-keys");t.exports=e("./_descriptors")?Object.defineProperties:function(e,t){n(e);for(var o,s=i(t),a=s.length,u=0;a>u;)r.f(e,o=s[u++],t[o]);return e}},{"./_an-object":10,"./_descriptors":17,"./_object-dp":41,"./_object-keys":45}],43:[function(e,t){var r=e("./_has"),n=e("./_to-object"),i=e("./_shared-key")("IE_PROTO"),o=Object.prototype;t.exports=Object.getPrototypeOf||function(e){return e=n(e),r(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?o:null}},{"./_has":24,"./_shared-key":51,"./_to-object":60}],44:[function(e,t){var r=e("./_has"),n=e("./_to-iobject"),i=e("./_array-includes")(!1),o=e("./_shared-key")("IE_PROTO");t.exports=function(e,t){var s,a=n(e),u=0,l=[];for(s in a)s!=o&&r(a,s)&&l.push(s);for(;t.length>u;)r(a,s=t[u++])&&(~i(l,s)||l.push(s));return l}},{"./_array-includes":11,"./_has":24,"./_shared-key":51,"./_to-iobject":58}],45:[function(e,t){var r=e("./_object-keys-internal"),n=e("./_enum-bug-keys");t.exports=Object.keys||function(e){return r(e,n)}},{"./_enum-bug-keys":19,"./_object-keys-internal":44}],46:[function(e,t){t.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},{}],47:[function(e,t){var r=e("./_redefine");t.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},{"./_redefine":48}],48:[function(e,t){var r=e("./_global"),n=e("./_hide"),i=e("./_has"),o=e("./_uid")("src"),s="toString",a=Function[s],u=(""+a).split(s);e("./_core").inspectSource=function(e){return a.call(e)},(t.exports=function(e,t,s,a){var l="function"==typeof s;l&&(i(s,"name")||n(s,"name",t)),e[t]!==s&&(l&&(i(s,o)||n(s,o,e[t]?""+e[t]:u.join(String(t)))),e===r?e[t]=s:a?e[t]?e[t]=s:n(e,t,s):(delete e[t],n(e,t,s)))})(Function.prototype,s,function(){return"function"==typeof this&&this[o]||a.call(this)})},{"./_core":14,"./_global":23,"./_has":24,"./_hide":25,"./_uid":62}],49:[function(e,t){"use strict";var r=e("./_global"),n=e("./_object-dp"),i=e("./_descriptors"),o=e("./_wks")("species");t.exports=function(e){var t=r[e];i&&t&&!t[o]&&n.f(t,o,{configurable:!0,get:function(){return this}})}},{"./_descriptors":17,"./_global":23,"./_object-dp":41,"./_wks":63}],50:[function(e,t){var r=e("./_object-dp").f,n=e("./_has"),i=e("./_wks")("toStringTag");t.exports=function(e,t,o){e&&!n(e=o?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},{"./_has":24,"./_object-dp":41,"./_wks":63}],51:[function(e,t){var r=e("./_shared")("keys"),n=e("./_uid");t.exports=function(e){return r[e]||(r[e]=n(e))}},{"./_shared":52,"./_uid":62}],52:[function(e,t){var r=e("./_global"),n="__core-js_shared__",i=r[n]||(r[n]={});t.exports=function(e){return i[e]||(i[e]={})}},{"./_global":23}],53:[function(e,t){var r=e("./_an-object"),n=e("./_a-function"),i=e("./_wks")("species");t.exports=function(e,t){var o,s=r(e).constructor;return void 0===s||void 0==(o=r(s)[i])?t:n(o)}},{"./_a-function":7,"./_an-object":10,"./_wks":63}],54:[function(e,t){var r=e("./_to-integer"),n=e("./_defined");t.exports=function(e){return function(t,i){var o,s,a=String(n(t)),u=r(i),l=a.length;return 0>u||u>=l?e?"":void 0:(o=a.charCodeAt(u),55296>o||o>56319||u+1===l||(s=a.charCodeAt(u+1))<56320||s>57343?e?a.charAt(u):o:e?a.slice(u,u+2):(o-55296<<10)+(s-56320)+65536)}}},{"./_defined":16,"./_to-integer":57}],55:[function(e,t){var r,n,i,o=e("./_ctx"),s=e("./_invoke"),a=e("./_html"),u=e("./_dom-create"),l=e("./_global"),c=l.process,f=l.setImmediate,h=l.clearImmediate,d=l.MessageChannel,p=0,_={},m="onreadystatechange",g=function(){var e=+this;if(_.hasOwnProperty(e)){var t=_[e];delete _[e],t()}},v=function(e){g.call(e.data)};f&&h||(f=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return _[++p]=function(){s("function"==typeof e?e:Function(e),t)},r(p),p},h=function(e){delete _[e]},"process"==e("./_cof")(c)?r=function(e){c.nextTick(o(g,e,1))}:d?(n=new d,i=n.port2,n.port1.onmessage=v,r=o(i.postMessage,i,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(e){l.postMessage(e+"","*")},l.addEventListener("message",v,!1)):r=m in u("script")?function(e){a.appendChild(u("script"))[m]=function(){a.removeChild(this),g.call(e)}}:function(e){setTimeout(o(g,e,1),0)}),t.exports={set:f,clear:h}},{"./_cof":13,"./_ctx":15,"./_dom-create":18,"./_global":23,"./_html":26,"./_invoke":28}],56:[function(e,t){var r=e("./_to-integer"),n=Math.max,i=Math.min;t.exports=function(e,t){return e=r(e),0>e?n(e+t,0):i(e,t)}},{"./_to-integer":57}],57:[function(e,t){var r=Math.ceil,n=Math.floor;t.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},{}],58:[function(e,t){var r=e("./_iobject"),n=e("./_defined");t.exports=function(e){return r(n(e))}},{"./_defined":16,"./_iobject":29}],59:[function(e,t){var r=e("./_to-integer"),n=Math.min;t.exports=function(e){return e>0?n(r(e),9007199254740991):0}},{"./_to-integer":57}],60:[function(e,t){var r=e("./_defined");t.exports=function(e){return Object(r(e))}},{"./_defined":16}],61:[function(e,t){var r=e("./_is-object");t.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},{"./_is-object":31}],62:[function(e,t){var r=0,n=Math.random();t.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++r+n).toString(36))}},{}],63:[function(e,t){var r=e("./_shared")("wks"),n=e("./_uid"),i=e("./_global").Symbol,o="function"==typeof i,s=t.exports=function(e){return r[e]||(r[e]=o&&i[e]||(o?i:n)("Symbol."+e))};s.store=r},{"./_global":23,"./_shared":52,"./_uid":62}],64:[function(e,t){var r=e("./_classof"),n=e("./_wks")("iterator"),i=e("./_iterators");t.exports=e("./_core").getIteratorMethod=function(e){return void 0!=e?e[n]||e["@@iterator"]||i[r(e)]:void 0}},{"./_classof":12,"./_core":14,"./_iterators":37,"./_wks":63}],65:[function(e,t){"use strict";var r=e("./_add-to-unscopables"),n=e("./_iter-step"),i=e("./_iterators"),o=e("./_to-iobject");t.exports=e("./_iter-define")(Array,"Array",function(e,t){this._t=o(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,r=this._i++;return!e||r>=e.length?(this._t=void 0,n(1)):"keys"==t?n(0,r):"values"==t?n(0,e[r]):n(0,[r,e[r]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},{"./_add-to-unscopables":8,"./_iter-define":34,"./_iter-step":36,"./_iterators":37,"./_to-iobject":58}],66:[function(e){"use strict";var t=e("./_classof"),r={};r[e("./_wks")("toStringTag")]="z",r+""!="[object z]"&&e("./_redefine")(Object.prototype,"toString",function(){return"[object "+t(this)+"]"},!0)},{"./_classof":12,"./_redefine":48,"./_wks":63}],67:[function(e){"use strict";var t,r,n,i=e("./_library"),o=e("./_global"),s=e("./_ctx"),a=e("./_classof"),u=e("./_export"),l=e("./_is-object"),c=e("./_a-function"),f=e("./_an-instance"),h=e("./_for-of"),d=e("./_species-constructor"),p=e("./_task").set,_=e("./_microtask")(),m="Promise",g=o.TypeError,v=o.process,y=o[m],v=o.process,b="process"==a(v),x=function(){},w=!!function(){try{var t=y.resolve(1),r=(t.constructor={})[e("./_wks")("species")]=function(e){e(x,x)};return(b||"function"==typeof PromiseRejectionEvent)&&t.then(x)instanceof r}catch(n){}}(),k=function(e,t){return e===t||e===y&&t===n},A=function(e){var t;return l(e)&&"function"==typeof(t=e.then)?t:!1},T=function(e){return k(y,e)?new E(e):new r(e)},E=r=function(e){var t,r;this.promise=new e(function(e,n){if(void 0!==t||void 0!==r)throw g("Bad Promise constructor");t=e,r=n}),this.resolve=c(t),this.reject=c(r)},S=function(e){try{e()}catch(t){return{error:t}}},R=function(e,t){if(!e._n){e._n=!0;var r=e._c;_(function(){for(var n=e._v,i=1==e._s,o=0,s=function(t){var r,o,s=i?t.ok:t.fail,a=t.resolve,u=t.reject,l=t.domain;try{s?(i||(2==e._h&&O(e),e._h=1),s===!0?r=n:(l&&l.enter(),r=s(n),l&&l.exit()),r===t.promise?u(g("Promise-chain cycle")):(o=A(r))?o.call(r,a,u):a(r)):u(n)}catch(c){u(c)}};r.length>o;)s(r[o++]);e._c=[],e._n=!1,t&&!e._h&&M(e)})}},M=function(e){p.call(o,function(){var t,r,n,i=e._v;if(P(e)&&(t=S(function(){b?v.emit("unhandledRejection",i,e):(r=o.onunhandledrejection)?r({promise:e,reason:i}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",i)}),e._h=b||P(e)?2:1),e._a=void 0,t)throw t.error})},P=function(e){if(1==e._h)return!1;for(var t,r=e._a||e._c,n=0;r.length>n;)if(t=r[n++],t.fail||!P(t.promise))return!1;return!0},O=function(e){p.call(o,function(){var t;b?v.emit("rejectionHandled",e):(t=o.onrejectionhandled)&&t({promise:e,reason:e._v})})},z=function(e){var t=this;t._d||(t._d=!0,t=t._w||t,t._v=e,t._s=2,t._a||(t._a=t._c.slice()),R(t,!0))},N=function(e){var t,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===e)throw g("Promise can't be resolved itself");(t=A(e))?_(function(){var n={_w:r,_d:!1};try{t.call(e,s(N,n,1),s(z,n,1))}catch(i){z.call(n,i)}}):(r._v=e,r._s=1,R(r,!1))}catch(n){z.call({_w:r,_d:!1},n)}}};w||(y=function(e){f(this,y,m,"_h"),c(e),t.call(this);try{e(s(N,this,1),s(z,this,1))}catch(r){z.call(this,r)}},t=function(){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},t.prototype=e("./_redefine-all")(y.prototype,{then:function(e,t){var r=T(d(this,y));return r.ok="function"==typeof e?e:!0,r.fail="function"==typeof t&&t,r.domain=b?v.domain:void 0,this._c.push(r),this._a&&this._a.push(r),this._s&&R(this,!1),r.promise},"catch":function(e){return this.then(void 0,e)}}),E=function(){var e=new t;this.promise=e,this.resolve=s(N,e,1),this.reject=s(z,e,1)}),u(u.G+u.W+u.F*!w,{Promise:y}),e("./_set-to-string-tag")(y,m),e("./_set-species")(m),n=e("./_core")[m],u(u.S+u.F*!w,m,{reject:function(e){var t=T(this),r=t.reject;return r(e),t.promise}}),u(u.S+u.F*(i||!w),m,{resolve:function(e){if(e instanceof y&&k(e.constructor,this))return e;var t=T(this),r=t.resolve;return r(e),t.promise}}),u(u.S+u.F*!(w&&e("./_iter-detect")(function(e){y.all(e)["catch"](x)})),m,{all:function(e){var t=this,r=T(t),n=r.resolve,i=r.reject,o=S(function(){var r=[],o=0,s=1;h(e,!1,function(e){var a=o++,u=!1;r.push(void 0),s++,t.resolve(e).then(function(e){u||(u=!0,r[a]=e,--s||n(r))},i)}),--s||n(r)});return o&&i(o.error),r.promise},race:function(e){var t=this,r=T(t),n=r.reject,i=S(function(){h(e,!1,function(e){t.resolve(e).then(r.resolve,n)})});return i&&n(i.error),r.promise}})},{"./_a-function":7,"./_an-instance":9,"./_classof":12,"./_core":14,"./_ctx":15,"./_export":20,"./_for-of":22,"./_global":23,"./_is-object":31,"./_iter-detect":35,"./_library":38,"./_microtask":39,"./_redefine-all":47,"./_set-species":49,"./_set-to-string-tag":50,"./_species-constructor":53,"./_task":55,"./_wks":63}],68:[function(e){"use strict";var t=e("./_string-at")(!0);e("./_iter-define")(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,r=this._t,n=this._i;return n>=r.length?{value:void 0,done:!0}:(e=t(r,n),this._i+=e.length,{value:e,done:!1})})},{"./_iter-define":34,"./_string-at":54}],69:[function(e){for(var t=e("./es6.array.iterator"),r=e("./_redefine"),n=e("./_global"),i=e("./_hide"),o=e("./_iterators"),s=e("./_wks"),a=s("iterator"),u=s("toStringTag"),l=o.Array,c=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],f=0;5>f;f++){var h,d=c[f],p=n[d],_=p&&p.prototype;if(_){_[a]||i(_,a,l),_[u]||i(_,u,d),o[d]=l;for(h in t)_[h]||r(_,h,t[h],!0)}}},{"./_global":23,"./_hide":25,"./_iterators":37,"./_redefine":48,"./_wks":63,"./es6.array.iterator":65}],70:[function(e,t,r){(function(e){function t(e){return Array.isArray?Array.isArray(e):"[object Array]"===m(e)}function n(e){return"boolean"==typeof e}function i(e){return null===e}function o(e){return null==e}function s(e){return"number"==typeof e}function a(e){return"string"==typeof e}function u(e){return"symbol"==typeof e}function l(e){return void 0===e}function c(e){return"[object RegExp]"===m(e)}function f(e){return"object"==typeof e&&null!==e}function h(e){return"[object Date]"===m(e)}function d(e){return"[object Error]"===m(e)||e instanceof Error}function p(e){return"function"==typeof e}function _(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function m(e){return Object.prototype.toString.call(e)}r.isArray=t,r.isBoolean=n,r.isNull=i,r.isNullOrUndefined=o,r.isNumber=s,r.isString=a,r.isSymbol=u,r.isUndefined=l,r.isRegExp=c,r.isObject=f,r.isDate=h,r.isError=d,r.isFunction=p,r.isPrimitive=_,r.isBuffer=e.isBuffer}).call(this,{isBuffer:e("../../is-buffer/index.js")})},{"../../is-buffer/index.js":93}],71:[function(e,t,r){function n(e){return e=Math.round(e),0>e?0:e>255?255:e}function i(e){return 0>e?0:e>1?1:e}function o(e){return n("%"===e[e.length-1]?parseFloat(e)/100*255:parseInt(e))}function s(e){return i("%"===e[e.length-1]?parseFloat(e)/100:parseFloat(e))}function a(e,t,r){return 0>r?r+=1:r>1&&(r-=1),1>6*r?e+(t-e)*r*6:1>2*r?t:2>3*r?e+(t-e)*(2/3-r)*6:e}function u(e){var t=e.replace(/ /g,"").toLowerCase();if(t in l)return l[t].slice();if("#"===t[0]){if(4===t.length){var r=parseInt(t.substr(1),16);return r>=0&&4095>=r?[(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,1]:null}if(7===t.length){var r=parseInt(t.substr(1),16);return r>=0&&16777215>=r?[(16711680&r)>>16,(65280&r)>>8,255&r,1]:null}return null}var i=t.indexOf("("),u=t.indexOf(")");if(-1!==i&&u+1===t.length){var c=t.substr(0,i),f=t.substr(i+1,u-(i+1)).split(","),h=1;switch(c){case"rgba":if(4!==f.length)return null;h=s(f.pop());case"rgb":return 3!==f.length?null:[o(f[0]),o(f[1]),o(f[2]),h];case"hsla":if(4!==f.length)return null;h=s(f.pop());case"hsl":if(3!==f.length)return null;var d=(parseFloat(f[0])%360+360)%360/360,p=s(f[1]),_=s(f[2]),m=.5>=_?_*(p+1):_+p-_*p,g=2*_-m;return[n(255*a(g,m,d+1/3)),n(255*a(g,m,d)),n(255*a(g,m,d-1/3)),h];default:return null}}return null}var l={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{r.parseCSSColor=u}catch(c){}},{}],72:[function(e,t){"use strict";function r(e,t,r){r=r||2;var i=t&&t.length,s=i?t[0]*r:e.length,a=n(e,0,s,r,!0),u=[];if(!a)return u;var l,f,h,d,p,_,m;if(i&&(a=c(e,t,a,r)),e.length>80*r){l=h=e[0],f=d=e[1];for(var g=r;s>g;g+=r)p=e[g],_=e[g+1],l>p&&(l=p),f>_&&(f=_),p>h&&(h=p),_>d&&(d=_);m=Math.max(h-l,d-f)}return o(a,u,r,l,f,m),u}function n(e,t,r,n,i){var o,s;if(i===P(e,t,r,n)>0)for(o=t;r>o;o+=n)s=S(o,e[o],e[o+1],s);else for(o=r-n;o>=t;o-=n)s=S(o,e[o],e[o+1],s);return s&&x(s,s.next)&&(R(s),s=s.next),s}function i(e,t){if(!e)return e;t||(t=e);var r,n=e;do if(r=!1,n.steiner||!x(n,n.next)&&0!==b(n.prev,n,n.next))n=n.next;else{if(R(n),n=t=n.prev,n===n.next)return null;r=!0}while(r||n!==t);return t}function o(e,t,r,n,c,f,h){if(e){!h&&f&&p(e,n,c,f);for(var d,_,m=e;e.prev!==e.next;)if(d=e.prev,_=e.next,f?a(e,n,c,f):s(e))t.push(d.i/r),t.push(e.i/r),t.push(_.i/r),R(e),e=_.next,m=_.next;else if(e=_,e===m){h?1===h?(e=u(e,t,r),o(e,t,r,n,c,f,2)):2===h&&l(e,t,r,n,c,f):o(i(e),t,r,n,c,f,1);break}}}function s(e){var t=e.prev,r=e,n=e.next;if(b(t,r,n)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(v(t.x,t.y,r.x,r.y,n.x,n.y,i.x,i.y)&&b(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function a(e,t,r,n){var i=e.prev,o=e,s=e.next;if(b(i,o,s)>=0)return!1;for(var a=i.xo.x?i.x>s.x?i.x:s.x:o.x>s.x?o.x:s.x,c=i.y>o.y?i.y>s.y?i.y:s.y:o.y>s.y?o.y:s.y,f=m(a,u,t,r,n),h=m(l,c,t,r,n),d=e.nextZ;d&&d.z<=h;){if(d!==e.prev&&d!==e.next&&v(i.x,i.y,o.x,o.y,s.x,s.y,d.x,d.y)&&b(d.prev,d,d.next)>=0)return!1;d=d.nextZ}for(d=e.prevZ;d&&d.z>=f;){if(d!==e.prev&&d!==e.next&&v(i.x,i.y,o.x,o.y,s.x,s.y,d.x,d.y)&&b(d.prev,d,d.next)>=0)return!1;d=d.prevZ}return!0}function u(e,t,r){var n=e;do{var i=n.prev,o=n.next.next;!x(i,o)&&w(i,n,n.next,o)&&A(i,o)&&A(o,i)&&(t.push(i.i/r),t.push(n.i/r),t.push(o.i/r),R(n),R(n.next),n=e=o),n=n.next}while(n!==e);return n}function l(e,t,r,n,s,a){var u=e;do{for(var l=u.next.next;l!==u.prev;){if(u.i!==l.i&&y(u,l)){var c=E(u,l);return u=i(u,u.next),c=i(c,c.next),o(u,t,r,n,s,a),void o(c,t,r,n,s,a)}l=l.next}u=u.next}while(u!==e)}function c(e,t,r,o){var s,a,u,l,c,d=[];for(s=0,a=t.length;a>s;s++)u=t[s]*o,l=a-1>s?t[s+1]*o:e.length,c=n(e,u,l,o,!1),c===c.next&&(c.steiner=!0),d.push(g(c));for(d.sort(f),s=0;s=n.next.y){var a=n.x+(o-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(i>=a&&a>s){if(s=a,a===i){if(o===n.y)return n;if(o===n.next.y)return n.next}r=n.x=n.x&&n.x>=c&&v(f>o?i:s,o,c,f,f>o?s:i,o,n.x,n.y)&&(u=Math.abs(o-n.y)/(i-n.x),(h>u||u===h&&n.x>r.x)&&A(n,e)&&(r=n,h=u)),n=n.next;return r}function p(e,t,r,n){var i=e;do null===i.z&&(i.z=m(i.x,i.y,t,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,_(i)}function _(e){var t,r,n,i,o,s,a,u,l=1;do{for(r=e,e=null,o=null,s=0;r;){for(s++,n=r,a=0,t=0;l>t&&(a++,n=n.nextZ,n);t++);for(u=l;a>0||u>0&&n;)0===a?(i=n,n=n.nextZ,u--):0!==u&&n?r.z<=n.z?(i=r,r=r.nextZ,a--):(i=n,n=n.nextZ,u--):(i=r,r=r.nextZ,a--),o?o.nextZ=i:e=i,i.prevZ=o,o=i;r=n}o.nextZ=null,l*=2}while(s>1);return e}function m(e,t,r,n,i){return e=32767*(e-r)/i,t=32767*(t-n)/i,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e|t<<1}function g(e){var t=e,r=e;do t.x=0&&(e-s)*(n-a)-(r-s)*(t-a)>=0&&(r-s)*(o-a)-(i-s)*(n-a)>=0}function y(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!k(e,t)&&A(e,t)&&A(t,e)&&T(e,t)}function b(e,t,r){return(t.y-e.y)*(r.x-t.x)-(t.x-e.x)*(r.y-t.y)}function x(e,t){return e.x===t.x&&e.y===t.y}function w(e,t,r,n){return x(e,t)&&x(r,n)||x(e,n)&&x(r,t)?!0:b(e,t,r)>0!=b(e,t,n)>0&&b(r,n,e)>0!=b(r,n,t)>0}function k(e,t){var r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==t.i&&r.next.i!==t.i&&w(r,r.next,e,t))return!0;r=r.next}while(r!==e);return!1}function A(e,t){return b(e.prev,e,e.next)<0?b(e,t,e.next)>=0&&b(e,e.prev,t)>=0:b(e,t,e.prev)<0||b(e,e.next,t)<0}function T(e,t){var r=e,n=!1,i=(e.x+t.x)/2,o=(e.y+t.y)/2;do r.y>o!=r.next.y>o&&i<(r.next.x-r.x)*(o-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next;while(r!==e);return n}function E(e,t){var r=new M(e.i,e.x,e.y),n=new M(t.i,t.x,t.y),i=e.next,o=t.prev;return e.next=t,t.prev=e,r.next=i,i.prev=r,n.next=r,r.prev=n,o.next=n,n.prev=o,n}function S(e,t,r,n){var i=new M(e,t,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function R(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function M(e,t,r){this.i=e,this.x=t,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function P(e,t,r,n){for(var i=0,o=t,s=r-n;r>o;o+=n)i+=(e[s]-e[o])*(e[o+1]+e[s+1]),s=o;return i}t.exports=r,r.deviation=function(e,t,r,n){var i=t&&t.length,o=i?t[0]*r:e.length,s=Math.abs(P(e,0,o,r));if(i)for(var a=0,u=t.length;u>a;a++){var l=t[a]*r,c=u-1>a?t[a+1]*r:e.length;s-=Math.abs(P(e,l,c,r))}var f=0;for(a=0;as;s++)r.vertices.push(e[i][o][s]);i>0&&(n+=e[i-1].length,r.holes.push(n))}return r}},{}],73:[function(e,t){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(e){return"function"==typeof e}function i(e){return"number"==typeof e}function o(e){return"object"==typeof e&&null!==e}function s(e){return void 0===e}t.exports=r,r.EventEmitter=r,r.prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(e){if(!i(e)||0>e||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,r,i,a,u,l;if(this._events||(this._events={}),"error"===e&&(!this._events.error||o(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;var c=new Error('Uncaught, unspecified "error" event. ('+t+")");throw c.context=t,c}if(r=this._events[e],s(r))return!1;if(n(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),r.apply(this,a)}else if(o(r))for(a=Array.prototype.slice.call(arguments,1),l=r.slice(),i=l.length,u=0;i>u;u++)l[u].apply(this,a);return!0},r.prototype.addListener=function(e,t){var i;if(!n(t))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,n(t.listener)?t.listener:t),this._events[e]?o(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,o(this._events[e])&&!this._events[e].warned&&(i=s(this._maxListeners)?r.defaultMaxListeners:this._maxListeners,i&&i>0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace())),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function r(){this.removeListener(e,r),i||(i=!0,t.apply(this,arguments))}if(!n(t))throw TypeError("listener must be a function");var i=!1;return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var r,i,s,a;if(!n(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],s=r.length,i=-1,r===t||n(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(o(r)){for(a=s;a-->0;)if(r[a]===t||r[a].listener&&r[a].listener===t){i=a;break}if(0>i)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],n(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?n(this._events[e])?[this._events[e]]:this._events[e].slice():[]},r.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(n(t))return 1;if(t)return t.length}return 0},r.listenerCount=function(e,t){return e.listenerCount(t)}},{}],74:[function(e,t){!function(){function e(e,t){c?e.addEventListener("scroll",t,!1):e.attachEvent("scroll",t)}function r(e){document.body?e():c?document.addEventListener("DOMContentLoaded",e):document.attachEvent("onreadystatechange",function(){"interactive"!=document.readyState&&"complete"!=document.readyState||e()})}function n(e){this.a=document.createElement("div"),this.a.setAttribute("aria-hidden","true"),this.a.appendChild(document.createTextNode(e)),this.b=document.createElement("span"),this.c=document.createElement("span"),this.h=document.createElement("span"),this.f=document.createElement("span"),this.g=-1,this.b.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.c.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.f.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.h.style.cssText="display:inline-block;width:200%;height:200%;font-size:16px;max-width:none;",this.b.appendChild(this.h),this.c.appendChild(this.f),this.a.appendChild(this.b),this.a.appendChild(this.c)}function i(e,t){e.a.style.cssText="max-width:none;min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;left:-999px;white-space:nowrap;font:"+t+";"}function o(e){var t=e.a.offsetWidth,r=t+100;return e.f.style.width=r+"px",e.c.scrollLeft=r,e.b.scrollLeft=e.b.scrollWidth+100,e.g!==t?(e.g=t,!0):!1}function s(t,r){function n(){var e=i;o(e)&&null!==e.a.parentNode&&r(e.g)}var i=t;e(t.b,n),e(t.c,n),o(t)}function a(e,t){var r=t||{};this.family=e,this.style=r.style||"normal",this.weight=r.weight||"normal",this.stretch=r.stretch||"normal"}function u(){if(null===h){var e=document.createElement("div");try{e.style.font="condensed 100px sans-serif"}catch(t){}h=""!==e.style.font}return h}function l(e,t){return[e.style,e.weight,u()?e.stretch:"","100px",t].join(" ")}var c=!!document.addEventListener,f=null,h=null,d=!!window.FontFace;a.prototype.load=function(e,t){var o=this,a=e||"BESbswy",u=t||3e3,c=(new Date).getTime();return new Promise(function(e,t){if(d){var h=new Promise(function(e,t){function r(){(new Date).getTime()-c>=u?t():document.fonts.load(l(o,o.family),a).then(function(t){1<=t.length?e():setTimeout(r,25)},function(){t()})}r()}),p=new Promise(function(e,t){setTimeout(t,u)});Promise.race([p,h]).then(function(){e(o)},function(){t(o)})}else r(function(){function r(){var t;(t=-1!=m&&-1!=g||-1!=m&&-1!=v||-1!=g&&-1!=v)&&((t=m!=g&&m!=v&&g!=v)||(null===f&&(t=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),f=!!t&&(536>parseInt(t[1],10)||536===parseInt(t[1],10)&&11>=parseInt(t[2],10))),t=f&&(m==y&&g==y&&v==y||m==b&&g==b&&v==b||m==x&&g==x&&v==x)),t=!t),t&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),e(o))}function h(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),t(o);else{var e=document.hidden;(!0===e||void 0===e)&&(m=d.a.offsetWidth,g=p.a.offsetWidth,v=_.a.offsetWidth,r()),k=setTimeout(h,50)}}var d=new n(a),p=new n(a),_=new n(a),m=-1,g=-1,v=-1,y=-1,b=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",i(d,l(o,"sans-serif")),i(p,l(o,"serif")),i(_,l(o,"monospace")),w.appendChild(d.a),w.appendChild(p.a),w.appendChild(_.a),document.body.appendChild(w),y=d.a.offsetWidth,b=p.a.offsetWidth,x=_.a.offsetWidth,h(),s(d,function(e){m=e,r()}),i(d,l(o,'"'+o.family+'",sans-serif')),s(p,function(e){g=e,r()}),i(p,l(o,'"'+o.family+'",serif')),s(_,function(e){v=e,r()}),i(_,l(o,'"'+o.family+'",monospace'))})})},window.FontFaceObserver=a,window.FontFaceObserver.prototype.check=window.FontFaceObserver.prototype.load=a.prototype.load,"undefined"!=typeof t&&(t.exports=window.FontFaceObserver)}()},{}],75:[function(e,t){"use strict";function r(e,t,r,o,s,a,u,l){if(r/=t,o/=t,u>=r&&o>=l)return e;if(u>o||r>l)return null;for(var c=[],f=0;f=r&&o>=d)c.push(p);else if(!(h>o||r>d)){var g=1===m?n(_,r,o,s):i(_,r,o,s,a,3===m); +g.length&&c.push({geometry:g,type:m,tags:e[f].tags||null,min:p.min,max:p.max})}}return c.length?c:null}function n(e,t,r,n){for(var i=[],o=0;o=t&&r>=a&&i.push(s)}return i}function i(e,t,r,n,i,s){for(var a=[],u=0;uc;c++)l=p||_[c],p=_[c+1],h=d||l[n],d=p[n],t>h?d>r?(y.push(i(l,p,t),i(l,p,r)),s||(y=o(a,y,m,g))):d>=t&&y.push(i(l,p,t)):h>r?t>d?(y.push(i(l,p,r),i(l,p,t)),s||(y=o(a,y,m,g))):r>=d&&y.push(i(l,p,r)):(y.push(l),t>d?(y.push(i(l,p,t)),s||(y=o(a,y,m,g))):d>r&&(y.push(i(l,p,r)),s||(y=o(a,y,m,g))));l=_[v-1],h=l[n],h>=t&&r>=h&&y.push(l),f=y[y.length-1],s&&f&&(y[0][0]!==f[0]||y[0][1]!==f[1])&&y.push(y[0]),o(a,y,m,g)}return a}function o(e,t,r,n){return t.length&&(t.area=r,t.dist=n,e.push(t)),[]}t.exports=r},{}],76:[function(e,t){"use strict";function r(e,t){var r=[];if("FeatureCollection"===e.type)for(var i=0;in?-1:n>1?1:n,[r,n,0]}function a(e){for(var t,r,n=0,i=0,o=0;o1)return!1;var s=i.geometry[0].length;if(5!==s)return!1;for(var a=0;s>a;a++){var u=o(i.geometry[0][a],t,e.z2,e.x,e.y);if(u[0]!==-r&&u[0]!==t+r||u[1]!==-r&&u[1]!==t+r)return!1}return!0}t.exports=r;var f=e("./convert"),h=e("./clip"),d=e("./wrap"),p=e("./tile");n.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},n.prototype.splitTile=function(e,t,r,n,i,o,l){for(var f=[e,t,r,n],d=this.options,_=d.debug;f.length;){n=f.pop(),r=f.pop(),t=f.pop(),e=f.pop();var m=1<1&&console.time("creation"),v=this.tiles[g]=p(e,m,r,n,y,t===d.maxZoom),this.tileCoords.push({z:t,x:r,y:n}),_)){_>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,r,n,v.numFeatures,v.numPoints,v.numSimplified),console.timeEnd("creation"));var b="z"+t;this.stats[b]=(this.stats[b]||0)+1,this.total++}if(v.source=e,d.solidChildren||!c(v,d.extent,d.buffer)){if(i){if(t===d.maxZoom||t===i)continue;var x=1<1&&console.time("clipping");var w,k,A,T,E,S,R=.5*d.buffer/d.extent,M=.5-R,P=.5+R,O=1+R;w=k=A=T=null,E=h(e,m,r-R,r+P,0,a,v.min[0],v.max[0]),S=h(e,m,r+M,r+O,0,a,v.min[0],v.max[0]),E&&(w=h(E,m,n-R,n+P,1,u,v.min[1],v.max[1]),k=h(E,m,n+M,n+O,1,u,v.min[1],v.max[1])),S&&(A=h(S,m,n-R,n+P,1,u,v.min[1],v.max[1]),T=h(S,m,n+M,n+O,1,u,v.min[1],v.max[1])),_>1&&console.timeEnd("clipping"),w&&f.push(w,t+1,2*r,2*n),k&&f.push(k,t+1,2*r,2*n+1),A&&f.push(A,t+1,2*r+1,2*n),T&&f.push(T,t+1,2*r+1,2*n+1)}}},n.prototype.getTile=function(e,t,r){var n=this.options,o=n.extent,a=n.debug,u=1<1&&console.log("drilling down to z%d-%d-%d",e,t,r);for(var f,h=e,d=t,p=r;!f&&h>0;)h--,d=Math.floor(d/2),p=Math.floor(p/2),f=this.tiles[s(h,d,p)];if(!f)return null;if(a>1&&console.log("found parent tile z%d-%d-%d",h,d,p),f.source){if(c(f,o,n.buffer))return i(f,o);a>1&&console.time("drilling down"),this.splitTile(f.source,h,d,p,e,t,r),a>1&&console.timeEnd("drilling down")}return this.tiles[l]?i(this.tiles[l],o):null}},{"./clip":75,"./convert":76,"./tile":79,"./wrap":80}],78:[function(e,t){"use strict";function r(e,t){var r,i,o,s,a=t*t,u=e.length,l=0,c=u-1,f=[];for(e[l][2]=1,e[c][2]=1;c;){for(i=0,r=l+1;c>r;r++)o=n(e[r],e[l],e[c]),o>i&&(s=r,i=o);i>a?(e[s][2]=i,f.push(l),f.push(s),l=s):(c=f.pop(),l=f.pop())}}function n(e,t,r){var n=t[0],i=t[1],o=r[0],s=r[1],a=e[0],u=e[1],l=o-n,c=s-i;if(0!==l||0!==c){var f=((a-n)*l+(u-i)*c)/(l*l+c*c);f>1?(n=o,i=s):f>0&&(n+=l*f,i+=c*f)}return l=a-n,c=u-i,l*l+c*c}t.exports=r},{}],79:[function(e,t){"use strict";function r(e,t,r,i,o,s){for(var a={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:r,y:i,z2:t,transformed:!1,min:[2,1],max:[-1,0]},u=0;ua.max[0]&&(a.max[0]=c[0]),c[1]>a.max[1]&&(a.max[1]=c[1])}return a}function n(e,t,r,n){var i,o,s,a,u=t.geometry,l=t.type,c=[],f=r*r;if(1===l)for(i=0;if)&&(h.push(a),e.numSimplified++),e.numPoints++;c.push(h)}else e.numPoints+=s.length;c.length&&e.features.push({geometry:c,type:l,tags:t.tags||null})}t.exports=r},{}],80:[function(e,t){"use strict";function r(e,t,r){var i=e,s=o(e,1,-1-t,t,0,r,-1,2),a=o(e,1,1-t,2+t,0,r,-1,2);return(s||a)&&(i=o(e,1,-t,1+t,0,r,-1,2),s&&(i=n(s,1).concat(i)),a&&(i=i.concat(n(a,-1)))),i}function n(e,t){for(var r=[],n=0;n>1,c=-7,f=r?i-1:0,h=r?-1:1,d=e[t+f];for(f+=h,o=d&(1<<-c)-1,d>>=-c,c+=a;c>0;o=256*o+e[t+f],f+=h,c-=8);for(s=o&(1<<-c)-1,o>>=-c,c+=n;c>0;s=256*s+e[t+f],f+=h,c-=8);if(0===o)o=1-l;else{if(o===u)return s?0/0:1/0*(d?-1:1);s+=Math.pow(2,n),o-=l}return(d?-1:1)*s*Math.pow(2,o-n)},r.write=function(e,t,r,n,i,o){var s,a,u,l=8*o-i-1,c=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:o-1,p=n?1:-1,_=0>t||0===t&&0>1/t?1:0;for(t=Math.abs(t),isNaN(t)||1/0===t?(a=isNaN(t)?1:0,s=c):(s=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-s))<1&&(s--,u*=2),t+=s+f>=1?h/u:h*Math.pow(2,1-f),t*u>=2&&(s++,u/=2),s+f>=c?(a=0,s=c):s+f>=1?(a=(t*u-1)*Math.pow(2,i),s+=f):(a=t*Math.pow(2,f-1)*Math.pow(2,i),s=0));i>=8;e[r+d]=255&a,d+=p,a/=256,i-=8);for(s=s<0;e[r+d]=255&s,d+=p,s/=256,l-=8);e[r+d-p]|=128*_}},{}],92:[function(e,t){t.exports="function"==typeof Object.create?function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:function(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e}},{}],93:[function(e,t){function r(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function n(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&r(e.slice(0,0))}t.exports=function(e){return null!=e&&(r(e)||n(e)||!!e._isBuffer)}},{}],94:[function(e,t){var r={}.toString;t.exports=Array.isArray||function(e){return"[object Array]"==r.call(e)}},{}],95:[function(e,t){"use strict";var r=e("./lib/js-yaml.js");t.exports=r},{"./lib/js-yaml.js":96}],96:[function(e,t){"use strict";function r(e){return function(){throw new Error("Function "+e+" is deprecated and cannot be used.")}}var n=e("./js-yaml/loader");t.exports.Type=e("./js-yaml/type"),t.exports.Schema=e("./js-yaml/schema"),t.exports.FAILSAFE_SCHEMA=e("./js-yaml/schema/failsafe"),t.exports.JSON_SCHEMA=e("./js-yaml/schema/json"),t.exports.CORE_SCHEMA=e("./js-yaml/schema/core"),t.exports.DEFAULT_SAFE_SCHEMA=e("./js-yaml/schema/default_safe"),t.exports.DEFAULT_FULL_SCHEMA=e("./js-yaml/schema/default_full"),t.exports.load=n.load,t.exports.loadAll=n.loadAll,t.exports.safeLoad=n.safeLoad,t.exports.safeLoadAll=n.safeLoadAll,t.exports.YAMLException=e("./js-yaml/exception"),t.exports.MINIMAL_SCHEMA=e("./js-yaml/schema/failsafe"),t.exports.SAFE_SCHEMA=e("./js-yaml/schema/default_safe"),t.exports.DEFAULT_SCHEMA=e("./js-yaml/schema/default_full"),t.exports.scan=r("scan"),t.exports.parse=r("parse"),t.exports.compose=r("compose"),t.exports.addConstructor=r("addConstructor")},{"./js-yaml/exception":98,"./js-yaml/loader":99,"./js-yaml/schema":101,"./js-yaml/schema/core":102,"./js-yaml/schema/default_full":103,"./js-yaml/schema/default_safe":104,"./js-yaml/schema/failsafe":105,"./js-yaml/schema/json":106,"./js-yaml/type":107}],97:[function(e,t){"use strict";function r(e){return"undefined"==typeof e||null===e}function n(e){return"object"==typeof e&&null!==e}function i(e){return Array.isArray(e)?e:r(e)?[]:[e]}function o(e,t){var r,n,i,o;if(t)for(o=Object.keys(t),r=0,n=o.length;n>r;r+=1)i=o[r],e[i]=t[i];return e}function s(e,t){var r,n="";for(r=0;t>r;r+=1)n+=e;return n}function a(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e}t.exports.isNothing=r,t.exports.isObject=n,t.exports.toArray=i,t.exports.repeat=s,t.exports.isNegativeZero=a,t.exports.extend=o},{}],98:[function(e,t){"use strict";function r(e,t){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||"",this.name="YAMLException",this.reason=e,this.mark=t,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():"")}r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t},t.exports=r},{}],99:[function(e,t){"use strict";function r(e){return 10===e||13===e}function n(e){return 9===e||32===e}function i(e){return 9===e||32===e||10===e||13===e}function o(e){return 44===e||91===e||93===e||123===e||125===e}function s(e){var t;return e>=48&&57>=e?e-48:(t=32|e,t>=97&&102>=t?t-97+10:-1)}function a(e){return 120===e?2:117===e?4:85===e?8:0}function u(e){return e>=48&&57>=e?e-48:-1}function l(e){return 48===e?"\x00":97===e?"":98===e?"\b":116===e?" ":9===e?" ":110===e?"\n":118===e?" ":102===e?"\f":114===e?"\r":101===e?"":32===e?" ":34===e?'"':47===e?"/":92===e?"\\":78===e?"…":95===e?" ":76===e?"\u2028":80===e?"\u2029":""}function c(e){return 65535>=e?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}function f(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||V,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function h(e,t){return new D(t,new B(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function d(e,t){throw h(e,t)}function p(e,t){e.onWarning&&e.onWarning.call(null,h(e,t))}function _(e,t,r,n){var i,o,s,a;if(r>t){if(a=e.input.slice(t,r),n)for(i=0,o=a.length;o>i;i+=1)s=a.charCodeAt(i),9===s||s>=32&&1114111>=s||d(e,"expected valid JSON character");else $.test(a)&&d(e,"the stream contains non-printable characters");e.result+=a}}function m(e,t,r,n){var i,o,s,a;for(U.isObject(r)||d(e,"cannot merge mappings; the provided source object is unacceptable"),i=Object.keys(r),s=0,a=i.length;a>s;s+=1)o=i[s],q.call(t,o)||(t[o]=r[o],n[o]=!0)}function g(e,t,r,n,i,o){var s,a;if(i=String(i),null===t&&(t={}),"tag:yaml.org,2002:merge"===n)if(Array.isArray(o))for(s=0,a=o.length;a>s;s+=1)m(e,t,o[s],r);else m(e,t,o,r);else e.json||q.call(r,i)||!q.call(t,i)||d(e,"duplicated mapping key"),t[i]=o,delete r[i];return t}function v(e){var t;t=e.input.charCodeAt(e.position),10===t?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):d(e,"a line break is expected"),e.line+=1,e.lineStart=e.position}function y(e,t,i){for(var o=0,s=e.input.charCodeAt(e.position);0!==s;){for(;n(s);)s=e.input.charCodeAt(++e.position);if(t&&35===s)do s=e.input.charCodeAt(++e.position);while(10!==s&&13!==s&&0!==s);if(!r(s))break;for(v(e),s=e.input.charCodeAt(e.position),o++,e.lineIndent=0;32===s;)e.lineIndent++,s=e.input.charCodeAt(++e.position)}return-1!==i&&0!==o&&e.lineIndent1&&(e.result+=U.repeat("\n",t-1))}function w(e,t,s){var a,u,l,c,f,h,d,p,m,g=e.kind,v=e.result;if(m=e.input.charCodeAt(e.position),i(m)||o(m)||35===m||38===m||42===m||33===m||124===m||62===m||39===m||34===m||37===m||64===m||96===m)return!1;if((63===m||45===m)&&(u=e.input.charCodeAt(e.position+1),i(u)||s&&o(u)))return!1;for(e.kind="scalar",e.result="",l=c=e.position,f=!1;0!==m;){if(58===m){if(u=e.input.charCodeAt(e.position+1),i(u)||s&&o(u))break}else if(35===m){if(a=e.input.charCodeAt(e.position-1),i(a))break}else{if(e.position===e.lineStart&&b(e)||s&&o(m))break;if(r(m)){if(h=e.line,d=e.lineStart,p=e.lineIndent,y(e,!1,-1),e.lineIndent>=t){f=!0,m=e.input.charCodeAt(e.position);continue}e.position=c,e.line=h,e.lineStart=d,e.lineIndent=p;break}}f&&(_(e,l,c,!1),x(e,e.line-h),l=c=e.position,f=!1),n(m)||(c=e.position+1),m=e.input.charCodeAt(++e.position)}return _(e,l,c,!1),e.result?!0:(e.kind=g,e.result=v,!1)}function k(e,t){var n,i,o;if(n=e.input.charCodeAt(e.position),39!==n)return!1;for(e.kind="scalar",e.result="",e.position++,i=o=e.position;0!==(n=e.input.charCodeAt(e.position));)if(39===n){if(_(e,i,e.position,!0),n=e.input.charCodeAt(++e.position),39!==n)return!0;i=o=e.position,e.position++}else r(n)?(_(e,i,o,!0),x(e,y(e,!1,t)),i=o=e.position):e.position===e.lineStart&&b(e)?d(e,"unexpected end of the document within a single quoted scalar"):(e.position++,o=e.position);d(e,"unexpected end of the stream within a single quoted scalar")}function A(e,t){var n,i,o,u,l,f;if(f=e.input.charCodeAt(e.position),34!==f)return!1;for(e.kind="scalar",e.result="",e.position++,n=i=e.position;0!==(f=e.input.charCodeAt(e.position));){if(34===f)return _(e,n,e.position,!0),e.position++,!0;if(92===f){if(_(e,n,e.position,!0),f=e.input.charCodeAt(++e.position),r(f))y(e,!1,t);else if(256>f&&nt[f])e.result+=it[f],e.position++;else if((l=a(f))>0){for(o=l,u=0;o>0;o--)f=e.input.charCodeAt(++e.position),(l=s(f))>=0?u=(u<<4)+l:d(e,"expected hexadecimal character");e.result+=c(u),e.position++}else d(e,"unknown escape sequence");n=i=e.position}else r(f)?(_(e,n,i,!0),x(e,y(e,!1,t)),n=i=e.position):e.position===e.lineStart&&b(e)?d(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}d(e,"unexpected end of the stream within a double quoted scalar")}function T(e,t){var r,n,o,s,a,u,l,c,f,h,p,_=!0,m=e.tag,v=e.anchor,b={};if(p=e.input.charCodeAt(e.position),91===p)s=93,l=!1,n=[];else{if(123!==p)return!1;s=125,l=!0,n={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=n),p=e.input.charCodeAt(++e.position);0!==p;){if(y(e,!0,t),p=e.input.charCodeAt(e.position),p===s)return e.position++,e.tag=m,e.anchor=v,e.kind=l?"mapping":"sequence",e.result=n,!0;_||d(e,"missed comma between flow collection entries"),f=c=h=null,a=u=!1,63===p&&(o=e.input.charCodeAt(e.position+1),i(o)&&(a=u=!0,e.position++,y(e,!0,t))),r=e.line,z(e,t,W,!1,!0),f=e.tag,c=e.result,y(e,!0,t),p=e.input.charCodeAt(e.position),!u&&e.line!==r||58!==p||(a=!0,p=e.input.charCodeAt(++e.position),y(e,!0,t),z(e,t,W,!1,!0),h=e.result),l?g(e,n,b,f,c,h):n.push(a?g(e,null,b,f,c,h):c),y(e,!0,t),p=e.input.charCodeAt(e.position),44===p?(_=!0,p=e.input.charCodeAt(++e.position)):_=!1}d(e,"unexpected end of the stream within a flow collection")}function E(e,t){var i,o,s,a,l=Y,c=!1,f=t,h=0,p=!1;if(a=e.input.charCodeAt(e.position),124===a)o=!1;else{if(62!==a)return!1;o=!0}for(e.kind="scalar",e.result="";0!==a;)if(a=e.input.charCodeAt(++e.position),43===a||45===a)Y===l?l=43===a?K:J:d(e,"repeat of a chomping mode identifier");else{if(!((s=u(a))>=0))break;0===s?d(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?d(e,"repeat of an indentation width identifier"):(f=t+s-1,c=!0)}if(n(a)){do a=e.input.charCodeAt(++e.position);while(n(a));if(35===a)do a=e.input.charCodeAt(++e.position);while(!r(a)&&0!==a)}for(;0!==a;){for(v(e),e.lineIndent=0,a=e.input.charCodeAt(e.position);(!c||e.lineIndentf&&(f=e.lineIndent),r(a))h++;else{if(e.lineIndentt)&&0!==o)d(e,"bad indentation of a sequence entry");else if(e.lineIndentt)&&(z(e,t,X,!0,s)&&(v?_=e.result:m=e.result),v||(g(e,f,h,p,_,m),p=_=m=null),y(e,!0,-1),u=e.input.charCodeAt(e.position)),e.lineIndent>t&&0!==u)d(e,"bad indentation of a mapping entry");else if(e.lineIndentt?p=1:e.lineIndent===t?p=0:e.lineIndentt?p=1:e.lineIndent===t?p=0:e.lineIndentu;u+=1)if(c=e.implicitTypes[u],c.resolve(e.result)){e.result=c.construct(e.result),e.tag=c.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else q.call(e.typeMap,e.tag)?(c=e.typeMap[e.tag],null!==e.result&&c.kind!==e.kind&&d(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+c.kind+'", not "'+e.kind+'"'),c.resolve(e.result)?(e.result=c.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):d(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")):d(e,"unknown tag !<"+e.tag+">");return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||m}function N(e){var t,o,s,a,u=e.position,l=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};0!==(a=e.input.charCodeAt(e.position))&&(y(e,!0,-1),a=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==a));){for(l=!0,a=e.input.charCodeAt(++e.position),t=e.position;0!==a&&!i(a);)a=e.input.charCodeAt(++e.position);for(o=e.input.slice(t,e.position),s=[],o.length<1&&d(e,"directive name must not be less than one character in length");0!==a;){for(;n(a);)a=e.input.charCodeAt(++e.position);if(35===a){do a=e.input.charCodeAt(++e.position);while(0!==a&&!r(a));break}if(r(a))break;for(t=e.position;0!==a&&!i(a);)a=e.input.charCodeAt(++e.position);s.push(e.input.slice(t,e.position))}0!==a&&v(e),q.call(st,o)?st[o](e,o,s):p(e,'unknown document directive "'+o+'"')}return y(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,y(e,!0,-1)):l&&d(e,"directives end mark is expected"),z(e,e.lineIndent-1,X,!1,!0),y(e,!0,-1),e.checkLineBreaks&&Q.test(e.input.slice(u,e.position))&&p(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&b(e)?void(46===e.input.charCodeAt(e.position)&&(e.position+=3,y(e,!0,-1))):void(e.positionn;n+=1)t(o[n])}function I(e,t){var r=j(e,t);if(0===r.length)return void 0;if(1===r.length)return r[0];throw new D("expected a single document in the stream, but found more")}function C(e,t,r){L(e,t,U.extend({schema:G},r))}function F(e,t){return I(e,U.extend({schema:G},t))}for(var U=e("./common"),D=e("./exception"),B=e("./mark"),G=e("./schema/default_safe"),V=e("./schema/default_full"),q=Object.prototype.hasOwnProperty,W=1,Z=2,H=3,X=4,Y=1,J=2,K=3,$=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Q=/[\x85\u2028\u2029]/,et=/[,\[\]\{\}]/,tt=/^(?:!|!!|![a-z\-]+!)$/i,rt=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i,nt=new Array(256),it=new Array(256),ot=0;256>ot;ot++)nt[ot]=l(ot)?1:0,it[ot]=l(ot);var st={YAML:function(e,t,r){var n,i,o;null!==e.version&&d(e,"duplication of %YAML directive"),1!==r.length&&d(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(r[0]),null===n&&d(e,"ill-formed argument of the YAML directive"),i=parseInt(n[1],10),o=parseInt(n[2],10),1!==i&&d(e,"unacceptable YAML version of the document"),e.version=r[0],e.checkLineBreaks=2>o,1!==o&&2!==o&&p(e,"unsupported YAML version of the document")},TAG:function(e,t,r){var n,i;2!==r.length&&d(e,"TAG directive accepts exactly two arguments"),n=r[0],i=r[1],tt.test(n)||d(e,"ill-formed tag handle (first argument) of the TAG directive"),q.call(e.tagMap,n)&&d(e,'there is a previously declared suffix for "'+n+'" tag handle'),rt.test(i)||d(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=i}};t.exports.loadAll=L,t.exports.load=I,t.exports.safeLoadAll=C,t.exports.safeLoad=F},{"./common":97,"./exception":98,"./mark":100,"./schema/default_full":103,"./schema/default_safe":104}],100:[function(e,t){"use strict"; function r(e,t,r,n,i){this.name=e,this.buffer=t,this.position=r,this.line=n,this.column=i}var n=e("./common");r.prototype.getSnippet=function(e,t){var r,i,o,s,a;if(!this.buffer)return null;for(e=e||4,t=t||75,r="",i=this.position;i>0&&-1==="\x00\r\n…\u2028\u2029".indexOf(this.buffer.charAt(i-1));)if(i-=1,this.position-i>t/2-1){r=" ... ",i+=5;break}for(o="",s=this.position;st/2-1){o=" ... ",s-=5;break}return a=this.buffer.slice(i,s),n.repeat(" ",e)+r+a+o+"\n"+n.repeat(" ",e+this.position-i+r.length)+"^"},r.prototype.toString=function(e){var t,r="";return this.name&&(r+='in "'+this.name+'" '),r+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(r+=":\n"+t)),r},t.exports=r},{"./common":97}],101:[function(e,t){"use strict";function r(e,t,n){var i=[];return e.include.forEach(function(e){n=r(e,t,n)}),e[t].forEach(function(e){n.forEach(function(t,r){t.tag===e.tag&&i.push(r)}),n.push(e)}),n.filter(function(e,t){return-1===i.indexOf(t)})}function n(){function e(e){n[e.tag]=e}var t,r,n={};for(t=0,r=arguments.length;r>t;t+=1)arguments[t].forEach(e);return n}function i(e){this.include=e.include||[],this.implicit=e.implicit||[],this.explicit=e.explicit||[],this.implicit.forEach(function(e){if(e.loadKind&&"scalar"!==e.loadKind)throw new s("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")}),this.compiledImplicit=r(this,"implicit",[]),this.compiledExplicit=r(this,"explicit",[]),this.compiledTypeMap=n(this.compiledImplicit,this.compiledExplicit)}var o=e("./common"),s=e("./exception"),a=e("./type");i.DEFAULT=null,i.create=function(){var e,t;switch(arguments.length){case 1:e=i.DEFAULT,t=arguments[0];break;case 2:e=arguments[0],t=arguments[1];break;default:throw new s("Wrong number of arguments for Schema.create function")}if(e=o.toArray(e),t=o.toArray(t),!e.every(function(e){return e instanceof i}))throw new s("Specified list of super schemas (or a single Schema object) contains a non-Schema object.");if(!t.every(function(e){return e instanceof a}))throw new s("Specified list of YAML types (or a single Type object) contains a non-Type object.");return new i({include:e,explicit:t})},t.exports=i},{"./common":97,"./exception":98,"./type":107}],102:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({include:[e("./json")]})},{"../schema":101,"./json":106}],103:[function(e,t){"use strict";var r=e("../schema");t.exports=r.DEFAULT=new r({include:[e("./default_safe")],explicit:[e("../type/js/undefined"),e("../type/js/regexp"),e("../type/js/function")]})},{"../schema":101,"../type/js/function":112,"../type/js/regexp":113,"../type/js/undefined":114,"./default_safe":104}],104:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({include:[e("./core")],implicit:[e("../type/timestamp"),e("../type/merge")],explicit:[e("../type/binary"),e("../type/omap"),e("../type/pairs"),e("../type/set")]})},{"../schema":101,"../type/binary":108,"../type/merge":116,"../type/omap":118,"../type/pairs":119,"../type/set":121,"../type/timestamp":123,"./core":102}],105:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({explicit:[e("../type/str"),e("../type/seq"),e("../type/map")]})},{"../schema":101,"../type/map":115,"../type/seq":120,"../type/str":122}],106:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({include:[e("./failsafe")],implicit:[e("../type/null"),e("../type/bool"),e("../type/int"),e("../type/float")]})},{"../schema":101,"../type/bool":109,"../type/float":110,"../type/int":111,"../type/null":117,"./failsafe":105}],107:[function(e,t){"use strict";function r(e){var t={};return null!==e&&Object.keys(e).forEach(function(r){e[r].forEach(function(e){t[String(e)]=r})}),t}function n(e,t){if(t=t||{},Object.keys(t).forEach(function(t){if(-1===o.indexOf(t))throw new i('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')}),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=r(t.styleAliases||null),-1===s.indexOf(this.kind))throw new i('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}var i=e("./exception"),o=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],s=["scalar","sequence","mapping"];t.exports=n},{"./exception":98}],108:[function(e,t){"use strict";function r(e){if(null===e)return!1;var t,r,n=0,i=e.length,o=u;for(r=0;i>r;r++)if(t=o.indexOf(e.charAt(r)),!(t>64)){if(0>t)return!1;n+=6}return n%8===0}function n(e){var t,r,n=e.replace(/[\r\n=]/g,""),i=n.length,o=u,a=0,l=[];for(t=0;i>t;t++)t%4===0&&t&&(l.push(a>>16&255),l.push(a>>8&255),l.push(255&a)),a=a<<6|o.indexOf(n.charAt(t));return r=i%4*6,0===r?(l.push(a>>16&255),l.push(a>>8&255),l.push(255&a)):18===r?(l.push(a>>10&255),l.push(a>>2&255)):12===r&&l.push(a>>4&255),s?new s(l):l}function i(e){var t,r,n="",i=0,o=e.length,s=u;for(t=0;o>t;t++)t%3===0&&t&&(n+=s[i>>18&63],n+=s[i>>12&63],n+=s[i>>6&63],n+=s[63&i]),i=(i<<8)+e[t];return r=o%3,0===r?(n+=s[i>>18&63],n+=s[i>>12&63],n+=s[i>>6&63],n+=s[63&i]):2===r?(n+=s[i>>10&63],n+=s[i>>4&63],n+=s[i<<2&63],n+=s[64]):1===r&&(n+=s[i>>2&63],n+=s[i<<4&63],n+=s[64],n+=s[64]),n}function o(e){return s&&s.isBuffer(e)}var s=e("buffer").Buffer,a=e("../type"),u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";t.exports=new a("tag:yaml.org,2002:binary",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../type":107,buffer:4}],109:[function(e,t){"use strict";function r(e){if(null===e)return!1;var t=e.length;return 4===t&&("true"===e||"True"===e||"TRUE"===e)||5===t&&("false"===e||"False"===e||"FALSE"===e)}function n(e){return"true"===e||"True"===e||"TRUE"===e}function i(e){return"[object Boolean]"===Object.prototype.toString.call(e)}var o=e("../type");t.exports=new o("tag:yaml.org,2002:bool",{kind:"scalar",resolve:r,construct:n,predicate:i,represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"})},{"../type":107}],110:[function(e,t){"use strict";function r(e){return null===e?!1:u.test(e)?!0:!1}function n(e){var t,r,n,i;return t=e.replace(/_/g,"").toLowerCase(),r="-"===t[0]?-1:1,i=[],"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===r?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?0/0:t.indexOf(":")>=0?(t.split(":").forEach(function(e){i.unshift(parseFloat(e,10))}),t=0,n=1,i.forEach(function(e){t+=e*n,n*=60}),r*t):r*parseFloat(t,10)}function i(e,t){var r;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(s.isNegativeZero(e))return"-0.0";return r=e.toString(10),l.test(r)?r.replace("e",".e"):r}function o(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!==0||s.isNegativeZero(e))}var s=e("../common"),a=e("../type"),u=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?|\\.[0-9_]+(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),l=/^[-+]?[0-9]+e/;t.exports=new a("tag:yaml.org,2002:float",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i,defaultStyle:"lowercase"})},{"../common":97,"../type":107}],111:[function(e,t){"use strict";function r(e){return e>=48&&57>=e||e>=65&&70>=e||e>=97&&102>=e}function n(e){return e>=48&&55>=e}function i(e){return e>=48&&57>=e}function o(e){if(null===e)return!1;var t,o=e.length,s=0,a=!1;if(!o)return!1;if(t=e[s],("-"===t||"+"===t)&&(t=e[++s]),"0"===t){if(s+1===o)return!0;if(t=e[++s],"b"===t){for(s++;o>s;s++)if(t=e[s],"_"!==t){if("0"!==t&&"1"!==t)return!1;a=!0}return a}if("x"===t){for(s++;o>s;s++)if(t=e[s],"_"!==t){if(!r(e.charCodeAt(s)))return!1;a=!0}return a}for(;o>s;s++)if(t=e[s],"_"!==t){if(!n(e.charCodeAt(s)))return!1;a=!0}return a}for(;o>s;s++)if(t=e[s],"_"!==t){if(":"===t)break;if(!i(e.charCodeAt(s)))return!1;a=!0}return a?":"!==t?!0:/^(:[0-5]?[0-9])+$/.test(e.slice(s)):!1}function s(e){var t,r,n=e,i=1,o=[];return-1!==n.indexOf("_")&&(n=n.replace(/_/g,"")),t=n[0],("-"===t||"+"===t)&&("-"===t&&(i=-1),n=n.slice(1),t=n[0]),"0"===n?0:"0"===t?"b"===n[1]?i*parseInt(n.slice(2),2):"x"===n[1]?i*parseInt(n,16):i*parseInt(n,8):-1!==n.indexOf(":")?(n.split(":").forEach(function(e){o.unshift(parseInt(e,10))}),n=0,r=1,o.forEach(function(e){n+=e*r,r*=60}),i*n):i*parseInt(n,10)}function a(e){return"[object Number]"===Object.prototype.toString.call(e)&&e%1===0&&!u.isNegativeZero(e)}var u=e("../common"),l=e("../type");t.exports=new l("tag:yaml.org,2002:int",{kind:"scalar",resolve:o,construct:s,predicate:a,represent:{binary:function(e){return"0b"+e.toString(2)},octal:function(e){return"0"+e.toString(8)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return"0x"+e.toString(16).toUpperCase()}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})},{"../common":97,"../type":107}],112:[function(e,t){"use strict";function r(e){if(null===e)return!1;try{var t="("+e+")",r=s.parse(t,{range:!0});return"Program"!==r.type||1!==r.body.length||"ExpressionStatement"!==r.body[0].type||"FunctionExpression"!==r.body[0].expression.type?!1:!0}catch(n){return!1}}function n(e){var t,r="("+e+")",n=s.parse(r,{range:!0}),i=[];if("Program"!==n.type||1!==n.body.length||"ExpressionStatement"!==n.body[0].type||"FunctionExpression"!==n.body[0].expression.type)throw new Error("Failed to resolve function");return n.body[0].expression.params.forEach(function(e){i.push(e.name)}),t=n.body[0].expression.body.range,new Function(i,r.slice(t[0]+1,t[1]-1))}function i(e){return e.toString()}function o(e){return"[object Function]"===Object.prototype.toString.call(e)}var s;try{var a=e;s=a("esprima")}catch(u){"undefined"!=typeof window&&(s=window.esprima)}var l=e("../../type");t.exports=new l("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../../type":107}],113:[function(e,t){"use strict";function r(e){if(null===e)return!1;if(0===e.length)return!1;var t=e,r=/\/([gim]*)$/.exec(e),n="";if("/"===t[0]){if(r&&(n=r[1]),n.length>3)return!1;if("/"!==t[t.length-n.length-1])return!1}return!0}function n(e){var t=e,r=/\/([gim]*)$/.exec(e),n="";return"/"===t[0]&&(r&&(n=r[1]),t=t.slice(1,t.length-n.length-1)),new RegExp(t,n)}function i(e){var t="/"+e.source+"/";return e.global&&(t+="g"),e.multiline&&(t+="m"),e.ignoreCase&&(t+="i"),t}function o(e){return"[object RegExp]"===Object.prototype.toString.call(e)}var s=e("../../type");t.exports=new s("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../../type":107}],114:[function(e,t){"use strict";function r(){return!0}function n(){return void 0}function i(){return""}function o(e){return"undefined"==typeof e}var s=e("../../type");t.exports=new s("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../../type":107}],115:[function(e,t){"use strict";var r=e("../type");t.exports=new r("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return null!==e?e:{}}})},{"../type":107}],116:[function(e,t){"use strict";function r(e){return"<<"===e||null===e}var n=e("../type");t.exports=new n("tag:yaml.org,2002:merge",{kind:"scalar",resolve:r})},{"../type":107}],117:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t=e.length;return 1===t&&"~"===e||4===t&&("null"===e||"Null"===e||"NULL"===e)}function n(){return null}function i(e){return null===e}var o=e("../type");t.exports=new o("tag:yaml.org,2002:null",{kind:"scalar",resolve:r,construct:n,predicate:i,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})},{"../type":107}],118:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t,r,n,i,a,u=[],l=e;for(t=0,r=l.length;r>t;t+=1){if(n=l[t],a=!1,"[object Object]"!==s.call(n))return!1;for(i in n)if(o.call(n,i)){if(a)return!1;a=!0}if(!a)return!1;if(-1!==u.indexOf(i))return!1;u.push(i)}return!0}function n(e){return null!==e?e:[]}var i=e("../type"),o=Object.prototype.hasOwnProperty,s=Object.prototype.toString;t.exports=new i("tag:yaml.org,2002:omap",{kind:"sequence",resolve:r,construct:n})},{"../type":107}],119:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t,r,n,i,s,a=e;for(s=new Array(a.length),t=0,r=a.length;r>t;t+=1){if(n=a[t],"[object Object]"!==o.call(n))return!1;if(i=Object.keys(n),1!==i.length)return!1;s[t]=[i[0],n[i[0]]]}return!0}function n(e){if(null===e)return[];var t,r,n,i,o,s=e;for(o=new Array(s.length),t=0,r=s.length;r>t;t+=1)n=s[t],i=Object.keys(n),o[t]=[i[0],n[i[0]]];return o}var i=e("../type"),o=Object.prototype.toString;t.exports=new i("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:r,construct:n})},{"../type":107}],120:[function(e,t){"use strict";var r=e("../type");t.exports=new r("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return null!==e?e:[]}})},{"../type":107}],121:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t,r=e;for(t in r)if(o.call(r,t)&&null!==r[t])return!1;return!0}function n(e){return null!==e?e:{}}var i=e("../type"),o=Object.prototype.hasOwnProperty;t.exports=new i("tag:yaml.org,2002:set",{kind:"mapping",resolve:r,construct:n})},{"../type":107}],122:[function(e,t){"use strict";var r=e("../type");t.exports=new r("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return null!==e?e:""}})},{"../type":107}],123:[function(e,t){"use strict";function r(e){return null===e?!1:null===s.exec(e)?!1:!0}function n(e){var t,r,n,i,o,a,u,l,c,f,h=0,d=null;if(t=s.exec(e),null===t)throw new Error("Date resolve error");if(r=+t[1],n=+t[2]-1,i=+t[3],!t[4])return new Date(Date.UTC(r,n,i));if(o=+t[4],a=+t[5],u=+t[6],t[7]){for(h=t[7].slice(0,3);h.length<3;)h+="0";h=+h}return t[9]&&(l=+t[10],c=+(t[11]||0),d=6e4*(60*l+c),"-"===t[9]&&(d=-d)),f=new Date(Date.UTC(r,n,i,o,a,u,h)),d&&f.setTime(f.getTime()-d),f}function i(e){return e.toISOString()}var o=e("../type"),s=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?)?$");t.exports=new o("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:r,construct:n,instanceOf:Date,represent:i})},{"../type":107}],124:[function(e,t,r){"use strict";var n=(e("./utils"),e("./support")),i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";r.decode=function(e){var t,r,o,s,a,u,l,c=0,f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");var h=3*e.length/4;e.charAt(e.length-1)===i.charAt(64)&&h--,e.charAt(e.length-2)===i.charAt(64)&&h--;var d;for(d=n.uint8array?new Uint8Array(h):new Array(h);c>4,r=(15&a)<<4|u>>2,o=(3&u)<<6|l,d[f++]=t,64!==u&&(d[f++]=r),64!==l&&(d[f++]=o);return d}},{"./support":150,"./utils":152}],125:[function(e,t){"use strict";function r(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}var n=e("./external"),i=e("./stream/DataWorker"),o=e("./stream/DataLengthProbe"),s=e("./stream/Crc32Probe"),o=e("./stream/DataLengthProbe");r.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new o("data_length")),t=this;return e.on("end",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},r.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new o("uncompressedSize")).pipe(t.compressWorker(r)).pipe(new o("compressedSize")).withStreamInfo("compression",t)},t.exports=r},{"./external":129,"./stream/Crc32Probe":145,"./stream/DataLengthProbe":146,"./stream/DataWorker":147}],126:[function(e,t,r){"use strict";var n=e("./stream/GenericWorker");r.STORE={magic:"\x00\x00",uncompressWorker:function(){return new n("STORE decompression")}},r.DEFLATE=e("./flate")},{"./flate":130,"./stream/GenericWorker":148}],127:[function(e,t){"use strict";function r(){for(var e,t=[],r=0;256>r;r++){e=r;for(var n=0;8>n;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}function n(e,t,r,n){var i=s,o=n+r;e=-1^e;for(var a=n;o>a;a++)e=e>>>8^i[255&(e^t[a])];return-1^e}function i(e,t,r,n){var i=s,o=n+r;e=-1^e;for(var a=n;o>a;a++)e=e>>>8^i[255&(e^t.charCodeAt(a))];return-1^e}var o=e("./utils"),s=r();t.exports=function(e,t){if("undefined"==typeof e||!e.length)return 0;var r="string"!==o.getTypeOf(e);return r?n(0|t,e,e.length,0):i(0|t,e,e.length,0)}},{"./utils":152}],128:[function(e,t,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],129:[function(e,t){"use strict";t.exports={Promise:window.Promise}},{}],130:[function(e,t,r){"use strict";function n(e,t){a.call(this,"FlateWorker/"+e),this._pako=new o[e]({raw:!0,level:t.level||-1}),this.meta={};var r=this;this._pako.onData=function(e){r.push({data:e,meta:r.meta})}}var i="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,o=e("pako"),s=e("./utils"),a=e("./stream/GenericWorker"),u=i?"uint8array":"array";r.magic="\b\x00",s.inherits(n,a),n.prototype.processChunk=function(e){this.meta=e.meta,this._pako.push(s.transformTo(u,e.data),!1)},n.prototype.flush=function(){a.prototype.flush.call(this),this._pako.push([],!0)},n.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},r.compressWorker=function(e){return new n("Deflate",e)},r.uncompressWorker=function(){return new n("Inflate",{})}},{"./stream/GenericWorker":148,"./utils":152,pako:157}],131:[function(e,t){"use strict";function r(){if(!(this instanceof r))return new r;if(arguments.length)throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");this.files={},this.comment=null,this.root="",this.clone=function(){var e=new r;for(var t in this)"function"!=typeof this[t]&&(e[t]=this[t]);return e}}r.prototype=e("./object"),r.prototype.loadAsync=e("./load"),r.support=e("./support"),r.defaults=e("./defaults"),r.loadAsync=function(e,t){return(new r).loadAsync(e,t)},r.external=e("./external"),t.exports=r},{"./defaults":128,"./external":129,"./load":132,"./object":136,"./support":150}],132:[function(e,t){"use strict";function r(e){return new i.Promise(function(t,r){var n=e.decompressed.getContentWorker().pipe(new a);n.on("error",function(e){r(e)}).on("end",function(){n.streamInfo.crc32!==e.decompressed.crc32?r(new Error("Corrupted zip : CRC32 mismatch")):t()}).resume()})}var n=e("./utils"),i=e("./external"),o=e("./utf8"),n=e("./utils"),s=e("./zipEntries"),a=e("./stream/Crc32Probe"),u=e("./nodejsUtils");t.exports=function(e,t){var a=this;return t=n.extend(t||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:o.utf8decode}),u.isNode&&u.isStream(e)?i.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")):n.prepareContent("the loaded zip file",e,!0,t.optimizedBinaryString,t.base64).then(function(e){var r=new s(t);return r.load(e),r}).then(function(e){var n=[i.Promise.resolve(e)],o=e.files;if(t.checkCRC32)for(var s=0;s0?e.substring(0,t):""},h=function(e){return"/"!==e.slice(-1)&&(e+="/"),e},d=function(e,t){return t="undefined"!=typeof t?t:o.createFolders,e=h(e),this.files[e]||c.call(this,e,null,{dir:!0,createFolders:t}),this.files[e]},p={load:function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},forEach:function(e){var t,r,n;for(t in this.files)this.files.hasOwnProperty(t)&&(n=this.files[t],r=t.slice(this.root.length,t.length),r&&t.slice(0,this.root.length)===this.root&&e(r,n))},filter:function(e){var t=[];return this.forEach(function(r,n){e(r,n)&&t.push(n)}),t},file:function(e,t,n){if(1===arguments.length){if(r(e)){var i=e;return this.filter(function(e,t){return!t.dir&&i.test(e)})}var o=this.files[this.root+e];return o&&!o.dir?o:null}return e=this.root+e,c.call(this,e,t,n),this},folder:function(e){if(!e)return this;if(r(e))return this.filter(function(t,r){return r.dir&&e.test(t)});var t=this.root+e,n=d.call(this,t),i=this.clone();return i.root=n.name,i}};t.exports=p},{"./compressedObject":125,"./defaults":128,"./nodejs/NodejsStreamInputAdapter":133,"./nodejsUtils":135,"./stream/GenericWorker":148,"./utils":152,"./zipObject":155}],137:[function(e,t){"use strict";function r(e){n.call(this,e);for(var t=0;t=0;--o)if(this.data[o]===t&&this.data[o+1]===r&&this.data[o+2]===n&&this.data[o+3]===i)return o-this.zero;return-1},r.prototype.readAndCheckSignature=function(e){var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),o=this.readData(4);return t===o[0]&&r===o[1]&&n===o[2]&&i===o[3]},r.prototype.readData=function(e){if(this.checkOffset(e),0===e)return[];var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":152,"./DataReader":138}],138:[function(e,t){"use strict";function r(e){this.data=e,this.length=e.length,this.index=0,this.zero=0}var n=e("../utils");r.prototype={checkOffset:function(e){this.checkIndex(this.index+e)},checkIndex:function(e){if(this.lengthe)throw new Error("End of data reached (data length = "+this.length+", asked index = "+e+"). Corrupted zip ?")},setIndex:function(e){this.checkIndex(e),this.index=e},skip:function(e){this.setIndex(this.index+e)},byteAt:function(){},readInt:function(e){var t,r=0;for(this.checkOffset(e),t=this.index+e-1;t>=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo("string",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC((e>>25&127)+1980,(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=r},{"../utils":152}],139:[function(e,t){"use strict";function r(e){n.call(this,e)}var n=e("./Uint8ArrayReader"),i=e("../utils");i.inherits(r,n),r.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":152,"./Uint8ArrayReader":141}],140:[function(e,t){"use strict";function r(e){n.call(this,e)}var n=e("./DataReader"),i=e("../utils");i.inherits(r,n),r.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},r.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},r.prototype.readAndCheckSignature=function(e){var t=this.readData(4);return e===t},r.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":152,"./DataReader":138}],141:[function(e,t){"use strict";function r(e){n.call(this,e)}var n=e("./ArrayReader"),i=e("../utils");i.inherits(r,n),r.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":152,"./ArrayReader":137}],142:[function(e,t){"use strict";var r=e("../utils"),n=e("../support"),i=e("./ArrayReader"),o=e("./StringReader"),s=e("./NodeBufferReader"),a=e("./Uint8ArrayReader");t.exports=function(e){var t=r.getTypeOf(e);return r.checkSupport(t),"string"!==t||n.uint8array?"nodebuffer"===t?new s(e):n.uint8array?new a(r.transformTo("uint8array",e)):new i(r.transformTo("array",e)):new o(e)}},{"../support":150,"../utils":152,"./ArrayReader":137,"./NodeBufferReader":139,"./StringReader":140,"./Uint8ArrayReader":141}],143:[function(e,t,r){"use strict";r.LOCAL_FILE_HEADER="PK",r.CENTRAL_FILE_HEADER="PK",r.CENTRAL_DIRECTORY_END="PK",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",r.ZIP64_CENTRAL_DIRECTORY_END="PK",r.DATA_DESCRIPTOR="PK\b"},{}],144:[function(e,t){"use strict";function r(e){n.call(this,"ConvertWorker to "+e),this.destType=e}var n=e("./GenericWorker"),i=e("../utils");i.inherits(r,n),r.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=r},{"../utils":152,"./GenericWorker":148}],145:[function(e,t){"use strict";function r(){n.call(this,"Crc32Probe")}var n=e("./GenericWorker"),i=e("../crc32"),o=e("../utils");o.inherits(r,n),r.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=r},{"../crc32":127,"../utils":152,"./GenericWorker":148}],146:[function(e,t){"use strict";function r(e){i.call(this,"DataLengthProbe for "+e),this.propName=e,this.withStreamInfo(e,0)}var n=e("../utils"),i=e("./GenericWorker");n.inherits(r,i),r.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=r},{"../utils":152,"./GenericWorker":148}],147:[function(e,t){"use strict";function r(e){i.call(this,"DataWorker");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}var n=e("../utils"),i=e("./GenericWorker"),o=16384;n.inherits(r,i),r.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},r.prototype.resume=function(){return i.prototype.resume.call(this)?(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0):!1},r.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},r.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=o,t=null,r=Math.min(this.max,this.index+e);if(this.index>=this.max)return this.end();switch(this.type){case"string":t=this.data.substring(this.index,r);break;case"uint8array":t=this.data.subarray(this.index,r);break;case"array":case"nodebuffer":t=this.data.slice(this.index,r)}return this.index=r,this.push({data:t,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=r},{"../utils":152,"./GenericWorker":148}],148:[function(e,t){"use strict";function r(e){this.name=e||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}r.prototype={push:function(e){this.emit("data",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit("error",e)}return!0},error:function(e){return this.isFinished?!1:(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit("error",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r "+e:e}},t.exports=r},{}],149:[function(e,t){(function(r){"use strict";function n(e,t,r){switch(e){case"blob":return a.newBlob(a.transformTo("arraybuffer",t),r);case"base64":return c.encode(t);default:return a.transformTo(e,t)}}function i(e,t){var n,i=0,o=null,s=0;for(n=0;nc;c++)l[c]=c>=252?6:c>=248?5:c>=240?4:c>=224?3:c>=192?2:1;l[254]=l[254]=1;var f=function(e){var t,r,n,i,o,a=e.length,u=0;for(i=0;a>i;i++)r=e.charCodeAt(i),55296===(64512&r)&&a>i+1&&(n=e.charCodeAt(i+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),i++)),u+=128>r?1:2048>r?2:65536>r?3:4;for(t=s.uint8array?new Uint8Array(u):new Array(u),o=0,i=0;u>o;i++)r=e.charCodeAt(i),55296===(64512&r)&&a>i+1&&(n=e.charCodeAt(i+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),i++)),128>r?t[o++]=r:2048>r?(t[o++]=192|r>>>6,t[o++]=128|63&r):65536>r?(t[o++]=224|r>>>12,t[o++]=128|r>>>6&63,t[o++]=128|63&r):(t[o++]=240|r>>>18,t[o++]=128|r>>>12&63,t[o++]=128|r>>>6&63,t[o++]=128|63&r);return t},h=function(e,t){var r;for(t=t||e.length,t>e.length&&(t=e.length),r=t-1;r>=0&&128===(192&e[r]);)r--;return 0>r?t:0===r?t:r+l[e[r]]>t?r:t},d=function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(r=0,t=0;s>t;)if(n=e[t++],128>n)a[r++]=n;else if(i=l[n],i>4)a[r++]=65533,t+=i-1;else{for(n&=2===i?31:3===i?15:7;i>1&&s>t;)n=n<<6|63&e[t++],i--;i>1?a[r++]=65533:65536>n?a[r++]=n:(n-=65536,a[r++]=55296|n>>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)};r.utf8encode=function(e){return s.nodebuffer?a.newBuffer(e,"utf-8"):f(e)},r.utf8decode=function(e){return s.nodebuffer?o.transformTo("nodebuffer",e).toString("utf-8"):(e=o.transformTo(s.uint8array?"uint8array":"array",e),d(e))},o.inherits(n,u),n.prototype.processChunk=function(e){var t=o.transformTo(s.uint8array?"uint8array":"array",e.data);if(this.leftOver&&this.leftOver.length){if(s.uint8array){var n=t;t=new Uint8Array(n.length+this.leftOver.length),t.set(this.leftOver,0),t.set(n,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var i=h(t),a=t;i!==t.length&&(s.uint8array?(a=t.subarray(0,i),this.leftOver=t.subarray(i,t.length)):(a=t.slice(0,i),this.leftOver=t.slice(i,t.length))),this.push({data:r.utf8decode(a),meta:e.meta})},n.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:r.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},r.Utf8DecodeWorker=n,o.inherits(i,u),i.prototype.processChunk=function(e){this.push({data:r.utf8encode(e.data),meta:e.meta})},r.Utf8EncodeWorker=i},{"./nodejsUtils":135,"./stream/GenericWorker":148,"./support":150,"./utils":152}],152:[function(e,t,r){"use strict";function n(e){var t=null;return t=u.uint8array?new Uint8Array(e.length):new Array(e.length),o(e,t)}function i(e){return e}function o(e,t){for(var r=0;r1;)try{return d.stringifyByChunk(e,n,t)}catch(o){t=Math.floor(t/2)}return d.stringifyByChar(e)}function a(e,t){for(var r=0;r=o)return String.fromCharCode.apply(null,e);for(;o>i;)n.push("array"===t||"nodebuffer"===t?String.fromCharCode.apply(null,e.slice(i,Math.min(i+r,o))):String.fromCharCode.apply(null,e.subarray(i,Math.min(i+r,o)))),i+=r;return n.join("")},stringifyByChar:function(e){for(var t="",r=0;rt?"0":"")+t.toString(16).toUpperCase();return n},r.delay=function(e,t,r){f(function(){e.apply(r||null,t||[])})},r.inherits=function(e,t){var r=function(){};r.prototype=t.prototype,e.prototype=new r},r.extend=function(){var e,t,r={};for(e=0;ei;)e=this.reader.readInt(2),t=this.reader.readInt(4),r=this.reader.readData(t),this.zip64ExtensibleData[e]={id:e,length:t,value:r}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var e,t;for(e=0;ee){var t=!this.isSignature(0,o.LOCAL_FILE_HEADER);throw new Error(t?"Can't find end of central directory : is this a zip file ? If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html":"Corrupted zip : can't find end of central directory")}this.reader.setIndex(e);var r=e;if(this.checkSignature(o.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===i.MAX_VALUE_16BITS||this.diskWithCentralDirStart===i.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===i.MAX_VALUE_16BITS||this.centralDirRecords===i.MAX_VALUE_16BITS||this.centralDirSize===i.MAX_VALUE_32BITS||this.centralDirOffset===i.MAX_VALUE_32BITS){if(this.zip64=!0,e=this.reader.lastIndexOfSignature(o.ZIP64_CENTRAL_DIRECTORY_LOCATOR),0>e)throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");if(this.reader.setIndex(e),this.checkSignature(o.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,o.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(o.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error("Corrupted zip : can't find the ZIP64 end of central directory");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(o.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var n=this.centralDirOffset+this.centralDirSize;this.zip64&&(n+=20,n+=12+this.zip64EndOfCentralSize);var s=r-n;if(s>0)this.isSignature(r,o.CENTRAL_FILE_HEADER)||(this.reader.zero=s);else if(0>s)throw new Error("Corrupted zip: missing "+Math.abs(s)+" bytes.")},prepareReader:function(e){this.reader=n(e)},load:function(e){this.prepareReader(e),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},t.exports=r},{"./reader/readerFor":142,"./signature":143,"./support":150,"./utf8":151,"./utils":152,"./zipEntry":154}],154:[function(e,t){"use strict";function r(e,t){this.options=e,this.loadOptions=t}var n=e("./reader/readerFor"),i=e("./utils"),o=e("./compressedObject"),s=e("./crc32"),a=e("./utf8"),u=e("./compressions"),l=e("./support"),c=0,f=3,h=function(e){for(var t in u)if(u.hasOwnProperty(t)&&u[t].magic===e)return u[t];return null};r.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},readLocalPart:function(e){var t,r;if(e.skip(22),this.fileNameLength=e.readInt(2),r=e.readInt(2),this.fileName=e.readData(this.fileNameLength),e.skip(r),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize === -1 || uncompressedSize === -1)");if(t=h(this.compressionMethod),null===t)throw new Error("Corrupted zip : compression "+i.pretty(this.compressionMethod)+" unknown (inner file : "+i.transformTo("string",this.fileName)+")");this.decompressed=new o(this.compressedSize,this.uncompressedSize,this.crc32,t,e.readData(this.compressedSize))},readCentralPart:function(e){this.versionMadeBy=e.readInt(2),e.skip(2),this.bitFlag=e.readInt(2),this.compressionMethod=e.readString(2),this.date=e.readDate(),this.crc32=e.readInt(4),this.compressedSize=e.readInt(4),this.uncompressedSize=e.readInt(4);var t=e.readInt(2);if(this.extraFieldsLength=e.readInt(2),this.fileCommentLength=e.readInt(2),this.diskNumberStart=e.readInt(2),this.internalFileAttributes=e.readInt(2),this.externalFileAttributes=e.readInt(4),this.localHeaderOffset=e.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");e.skip(t),this.readExtraFields(e),this.parseZIP64ExtraField(e),this.fileComment=e.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var e=this.versionMadeBy>>8;this.dir=16&this.externalFileAttributes?!0:!1,e===c&&(this.dosPermissions=63&this.externalFileAttributes),e===f&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===i.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===i.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===i.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===i.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index0?l(t.map(function(e){return m(e,r)}),"||"):"true"}function f(e,t,r){return t&&t.length>0?l(t.map(function(e){return m(e,r)}),"&&"):"true"}function h(e,t,r){return"!"+n(m(t,r).join(" && "))}function d(e,t,r){return"!"+n(c(null,t,r))}function p(e,t){return n(o(e)+(t?" != ":" == ")+"null")}function _(e,t,r){var i=[],s=r&&"function"==typeof r.rangeTransform&&r.rangeTransform;if(t.max){var a=s?s(t.max):t.max;i.push(""+o(e)+" < "+a)}if(t.min){var u=s?u=s(t.min):t.min;i.push(""+o(e)+" >= "+u)}return n(i.join(" && "))}function m(e,t){var r=[];if("function"==typeof e)return[n(e.toString()+"(context)")];if(Array.isArray(e))return[c(null,e,t)];if(null==e)return["true"];for(var i=Object.keys(e),o=0;o0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new f,this.strm.avail_out=0;var r=a.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(r!==_)throw new Error(c[r]);if(t.header&&a.deflateSetHeader(this.strm,t.header),t.dictionary){var i;if(i="string"==typeof t.dictionary?l.string2buf(t.dictionary):"[object ArrayBuffer]"===h.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,r=a.deflateSetDictionary(this.strm,i),r!==_)throw new Error(c[r]);this._dict_set=!0}}function i(e,t){var r=new n(t);if(r.push(e,!0),r.err)throw r.msg;return r.result}function o(e,t){return t=t||{},t.raw=!0,i(e,t)}function s(e,t){return t=t||{},t.gzip=!0,i(e,t)}var a=e("./zlib/deflate"),u=e("./utils/common"),l=e("./utils/strings"),c=e("./zlib/messages"),f=e("./zlib/zstream"),h=Object.prototype.toString,d=0,p=4,_=0,m=1,g=2,v=-1,y=0,b=8;n.prototype.push=function(e,t){var r,n,i=this.strm,o=this.options.chunkSize;if(this.ended)return!1;n=t===~~t?t:t===!0?p:d,i.input="string"==typeof e?l.string2buf(e):"[object ArrayBuffer]"===h.call(e)?new Uint8Array(e):e,i.next_in=0,i.avail_in=i.input.length;do{if(0===i.avail_out&&(i.output=new u.Buf8(o),i.next_out=0,i.avail_out=o),r=a.deflate(i,n),r!==m&&r!==_)return this.onEnd(r),this.ended=!0,!1;(0===i.avail_out||0===i.avail_in&&(n===p||n===g))&&this.onData("string"===this.options.to?l.buf2binstring(u.shrinkBuf(i.output,i.next_out)):u.shrinkBuf(i.output,i.next_out))}while((i.avail_in>0||0===i.avail_out)&&r!==m);return n===p?(r=a.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===_):n===g?(this.onEnd(_),i.avail_out=0,!0):!0},n.prototype.onData=function(e){this.chunks.push(e)},n.prototype.onEnd=function(e){e===_&&(this.result="string"===this.options.to?this.chunks.join(""):u.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Deflate=n,r.deflate=i,r.deflateRaw=o,r.gzip=s},{"./utils/common":160,"./utils/strings":161,"./zlib/deflate":165,"./zlib/messages":170,"./zlib/zstream":172}],159:[function(e,t,r){"use strict";function n(e){if(!(this instanceof n))return new n(e);this.options=a.assign({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0===(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new f,this.strm.avail_out=0;var r=s.inflateInit2(this.strm,t.windowBits);if(r!==l.Z_OK)throw new Error(c[r]);this.header=new h,s.inflateGetHeader(this.strm,this.header)}function i(e,t){var r=new n(t);if(r.push(e,!0),r.err)throw r.msg;return r.result}function o(e,t){return t=t||{},t.raw=!0,i(e,t)}var s=e("./zlib/inflate"),a=e("./utils/common"),u=e("./utils/strings"),l=e("./zlib/constants"),c=e("./zlib/messages"),f=e("./zlib/zstream"),h=e("./zlib/gzheader"),d=Object.prototype.toString;n.prototype.push=function(e,t){var r,n,i,o,c,f,h=this.strm,p=this.options.chunkSize,_=this.options.dictionary,m=!1;if(this.ended)return!1;n=t===~~t?t:t===!0?l.Z_FINISH:l.Z_NO_FLUSH,h.input="string"==typeof e?u.binstring2buf(e):"[object ArrayBuffer]"===d.call(e)?new Uint8Array(e):e,h.next_in=0,h.avail_in=h.input.length;do{if(0===h.avail_out&&(h.output=new a.Buf8(p),h.next_out=0,h.avail_out=p),r=s.inflate(h,l.Z_NO_FLUSH),r===l.Z_NEED_DICT&&_&&(f="string"==typeof _?u.string2buf(_):"[object ArrayBuffer]"===d.call(_)?new Uint8Array(_):_,r=s.inflateSetDictionary(this.strm,f)),r===l.Z_BUF_ERROR&&m===!0&&(r=l.Z_OK,m=!1),r!==l.Z_STREAM_END&&r!==l.Z_OK)return this.onEnd(r),this.ended=!0,!1;h.next_out&&(0===h.avail_out||r===l.Z_STREAM_END||0===h.avail_in&&(n===l.Z_FINISH||n===l.Z_SYNC_FLUSH))&&("string"===this.options.to?(i=u.utf8border(h.output,h.next_out),o=h.next_out-i,c=u.buf2string(h.output,i),h.next_out=o,h.avail_out=p-o,o&&a.arraySet(h.output,h.output,i,o,0),this.onData(c)):this.onData(a.shrinkBuf(h.output,h.next_out))),0===h.avail_in&&0===h.avail_out&&(m=!0)}while((h.avail_in>0||0===h.avail_out)&&r!==l.Z_STREAM_END);return r===l.Z_STREAM_END&&(n=l.Z_FINISH),n===l.Z_FINISH?(r=s.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===l.Z_OK):n===l.Z_SYNC_FLUSH?(this.onEnd(l.Z_OK),h.avail_out=0,!0):!0},n.prototype.onData=function(e){this.chunks.push(e)},n.prototype.onEnd=function(e){e===l.Z_OK&&(this.result="string"===this.options.to?this.chunks.join(""):a.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Inflate=n,r.inflate=i,r.inflateRaw=o,r.ungzip=i},{"./utils/common":160,"./utils/strings":161,"./zlib/constants":163,"./zlib/gzheader":166,"./zlib/inflate":168,"./zlib/messages":170,"./zlib/zstream":172}],160:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;r.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(var n in r)r.hasOwnProperty(n)&&(e[n]=r[n])}}return e},r.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var i={arraySet:function(e,t,r,n,i){if(t.subarray&&e.subarray)return void e.set(t.subarray(r,r+n),i);for(var o=0;n>o;o++)e[i+o]=t[r+o]},flattenChunks:function(e){var t,r,n,i,o,s;for(n=0,t=0,r=e.length;r>t;t++)n+=e[t].length;for(s=new Uint8Array(n),i=0,t=0,r=e.length;r>t;t++)o=e[t],s.set(o,i),i+=o.length;return s}},o={arraySet:function(e,t,r,n,i){for(var o=0;n>o;o++)e[i+o]=t[r+o]},flattenChunks:function(e){return[].concat.apply([],e)}};r.setTyped=function(e){e?(r.Buf8=Uint8Array,r.Buf16=Uint16Array,r.Buf32=Int32Array,r.assign(r,i)):(r.Buf8=Array,r.Buf16=Array,r.Buf32=Array,r.assign(r,o))},r.setTyped(n)},{}],161:[function(e,t,r){"use strict";function n(e,t){if(65537>t&&(e.subarray&&s||!e.subarray&&o))return String.fromCharCode.apply(null,i.shrinkBuf(e,t));for(var r="",n=0;t>n;n++)r+=String.fromCharCode(e[n]);return r}var i=e("./common"),o=!0,s=!0;try{String.fromCharCode.apply(null,[0])}catch(a){o=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(a){s=!1}for(var u=new i.Buf8(256),l=0;256>l;l++)u[l]=l>=252?6:l>=248?5:l>=240?4:l>=224?3:l>=192?2:1;u[254]=u[254]=1,r.string2buf=function(e){var t,r,n,o,s,a=e.length,u=0;for(o=0;a>o;o++)r=e.charCodeAt(o),55296===(64512&r)&&a>o+1&&(n=e.charCodeAt(o+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),o++)),u+=128>r?1:2048>r?2:65536>r?3:4;for(t=new i.Buf8(u),s=0,o=0;u>s;o++)r=e.charCodeAt(o),55296===(64512&r)&&a>o+1&&(n=e.charCodeAt(o+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),o++)),128>r?t[s++]=r:2048>r?(t[s++]=192|r>>>6,t[s++]=128|63&r):65536>r?(t[s++]=224|r>>>12,t[s++]=128|r>>>6&63,t[s++]=128|63&r):(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63,t[s++]=128|r>>>6&63,t[s++]=128|63&r);return t},r.buf2binstring=function(e){return n(e,e.length)},r.binstring2buf=function(e){for(var t=new i.Buf8(e.length),r=0,n=t.length;n>r;r++)t[r]=e.charCodeAt(r);return t},r.buf2string=function(e,t){var r,i,o,s,a=t||e.length,l=new Array(2*a);for(i=0,r=0;a>r;)if(o=e[r++],128>o)l[i++]=o;else if(s=u[o],s>4)l[i++]=65533,r+=s-1;else{for(o&=2===s?31:3===s?15:7;s>1&&a>r;)o=o<<6|63&e[r++],s--;s>1?l[i++]=65533:65536>o?l[i++]=o:(o-=65536,l[i++]=55296|o>>10&1023,l[i++]=56320|1023&o)}return n(l,i)},r.utf8border=function(e,t){var r;for(t=t||e.length,t>e.length&&(t=e.length),r=t-1;r>=0&&128===(192&e[r]);)r--;return 0>r?t:0===r?t:r+u[e[r]]>t?r:t}},{"./common":160}],162:[function(e,t){"use strict";function r(e,t,r,n){for(var i=65535&e|0,o=e>>>16&65535|0,s=0;0!==r;){s=r>2e3?2e3:r,r-=s;do i=i+t[n++]|0,o=o+i|0;while(--s);i%=65521,o%=65521}return i|o<<16|0}t.exports=r},{}],163:[function(e,t){"use strict";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],164:[function(e,t){"use strict";function r(){for(var e,t=[],r=0;256>r;r++){e=r;for(var n=0;8>n;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}function n(e,t,r,n){var o=i,s=n+r;e^=-1;for(var a=n;s>a;a++)e=e>>>8^o[255&(e^t[a])];return-1^e}var i=r();t.exports=n},{}],165:[function(e,t,r){"use strict";function n(e,t){return e.msg=j[t],t}function i(e){return(e<<1)-(e>4?9:0)}function o(e){for(var t=e.length;--t>=0;)e[t]=0}function s(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(O.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function a(e,t){P._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,s(e.strm) -}function u(e,t){e.pending_buf[e.pending++]=t}function l(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function c(e,t,r,n){var i=e.avail_in;return i>n&&(i=n),0===i?0:(e.avail_in-=i,O.arraySet(t,e.input,e.next_in,i,r),1===e.state.wrap?e.adler=z(e.adler,t,i,r):2===e.state.wrap&&(e.adler=N(e.adler,t,i,r)),e.next_in+=i,e.total_in+=i,i)}function f(e,t){var r,n,i=e.max_chain_length,o=e.strstart,s=e.prev_length,a=e.nice_match,u=e.strstart>e.w_size-ft?e.strstart-(e.w_size-ft):0,l=e.window,c=e.w_mask,f=e.prev,h=e.strstart+ct,d=l[o+s-1],p=l[o+s];e.prev_length>=e.good_match&&(i>>=2),a>e.lookahead&&(a=e.lookahead);do if(r=t,l[r+s]===p&&l[r+s-1]===d&&l[r]===l[o]&&l[++r]===l[o+1]){o+=2,r++;do;while(l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&h>o);if(n=ct-(h-o),o=h-ct,n>s){if(e.match_start=t,s=n,n>=a)break;d=l[o+s-1],p=l[o+s]}}while((t=f[t&c])>u&&0!==--i);return s<=e.lookahead?s:e.lookahead}function h(e){var t,r,n,i,o,s=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=s+(s-ft)){O.arraySet(e.window,e.window,s,s,0),e.match_start-=s,e.strstart-=s,e.block_start-=s,r=e.hash_size,t=r;do n=e.head[--t],e.head[t]=n>=s?n-s:0;while(--r);r=s,t=r;do n=e.prev[--t],e.prev[t]=n>=s?n-s:0;while(--r);i+=s}if(0===e.strm.avail_in)break;if(r=c(e.strm,e.window,e.strstart+e.lookahead,i),e.lookahead+=r,e.lookahead+e.insert>=lt)for(o=e.strstart-e.insert,e.ins_h=e.window[o],e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(h(e),0===e.lookahead&&t===L)return bt;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,a(e,!1),0===e.strm.avail_out))return bt;if(e.strstart-e.block_start>=e.w_size-ft&&(a(e,!1),0===e.strm.avail_out))return bt}return e.insert=0,t===F?(a(e,!0),0===e.strm.avail_out?wt:kt):e.strstart>e.block_start&&(a(e,!1),0===e.strm.avail_out)?bt:bt}function p(e,t){for(var r,n;;){if(e.lookahead=lt&&(e.ins_h=(e.ins_h<=lt)if(n=P._tr_tally(e,e.strstart-e.match_start,e.match_length-lt),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=lt){e.match_length--;do e.strstart++,e.ins_h=(e.ins_h<=lt&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=lt-1)),e.prev_length>=lt&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-lt,n=P._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-lt),e.lookahead-=e.prev_length-1,e.prev_length-=2;do++e.strstart<=i&&(e.ins_h=(e.ins_h<=lt&&e.strstart>0&&(i=e.strstart-1,n=s[i],n===s[++i]&&n===s[++i]&&n===s[++i])){o=e.strstart+ct;do;while(n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&o>i);e.match_length=ct-(o-i),e.match_length>e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=lt?(r=P._tr_tally(e,1,e.match_length-lt),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=P._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(a(e,!1),0===e.strm.avail_out))return bt}return e.insert=0,t===F?(a(e,!0),0===e.strm.avail_out?wt:kt):e.last_lit&&(a(e,!1),0===e.strm.avail_out)?bt:xt}function g(e,t){for(var r;;){if(0===e.lookahead&&(h(e),0===e.lookahead)){if(t===L)return bt;break}if(e.match_length=0,r=P._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(a(e,!1),0===e.strm.avail_out))return bt}return e.insert=0,t===F?(a(e,!0),0===e.strm.avail_out?wt:kt):e.last_lit&&(a(e,!1),0===e.strm.avail_out)?bt:xt}function v(e,t,r,n,i){this.good_length=e,this.max_lazy=t,this.nice_length=r,this.max_chain=n,this.func=i}function y(e){e.window_size=2*e.w_size,o(e.head),e.max_lazy_match=M[e.level].max_lazy,e.good_match=M[e.level].good_length,e.nice_match=M[e.level].nice_length,e.max_chain_length=M[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=lt-1,e.match_available=0,e.ins_h=0}function b(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=$,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new O.Buf16(2*at),this.dyn_dtree=new O.Buf16(2*(2*ot+1)),this.bl_tree=new O.Buf16(2*(2*st+1)),o(this.dyn_ltree),o(this.dyn_dtree),o(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new O.Buf16(ut+1),this.heap=new O.Buf16(2*it+1),o(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new O.Buf16(2*it+1),o(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function x(e){var t;return e&&e.state?(e.total_in=e.total_out=0,e.data_type=K,t=e.state,t.pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap?dt:vt,e.adler=2===t.wrap?0:1,t.last_flush=L,P._tr_init(t),D):n(e,G)}function w(e){var t=x(e);return t===D&&y(e.state),t}function k(e,t){return e&&e.state?2!==e.state.wrap?G:(e.state.gzhead=t,D):G}function A(e,t,r,i,o,s){if(!e)return G;var a=1;if(t===W&&(t=6),0>i?(a=0,i=-i):i>15&&(a=2,i-=16),1>o||o>Q||r!==$||8>i||i>15||0>t||t>9||0>s||s>Y)return n(e,G);8===i&&(i=9);var u=new b;return e.state=u,u.strm=e,u.wrap=a,u.gzhead=null,u.w_bits=i,u.w_size=1<U||0>t)return e?n(e,G):G;if(a=e.state,!e.output||!e.input&&0!==e.avail_in||a.status===yt&&t!==F)return n(e,0===e.avail_out?q:G);if(a.strm=e,r=a.last_flush,a.last_flush=t,a.status===dt)if(2===a.wrap)e.adler=0,u(a,31),u(a,139),u(a,8),a.gzhead?(u(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),u(a,255&a.gzhead.time),u(a,a.gzhead.time>>8&255),u(a,a.gzhead.time>>16&255),u(a,a.gzhead.time>>24&255),u(a,9===a.level?2:a.strategy>=H||a.level<2?4:0),u(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(u(a,255&a.gzhead.extra.length),u(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(e.adler=N(e.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=pt):(u(a,0),u(a,0),u(a,0),u(a,0),u(a,0),u(a,9===a.level?2:a.strategy>=H||a.level<2?4:0),u(a,At),a.status=vt);else{var h=$+(a.w_bits-8<<4)<<8,d=-1;d=a.strategy>=H||a.level<2?0:a.level<6?1:6===a.level?2:3,h|=d<<6,0!==a.strstart&&(h|=ht),h+=31-h%31,a.status=vt,l(a,h),0!==a.strstart&&(l(a,e.adler>>>16),l(a,65535&e.adler)),e.adler=1}if(a.status===pt)if(a.gzhead.extra){for(c=a.pending;a.gzindex<(65535&a.gzhead.extra.length)&&(a.pending!==a.pending_buf_size||(a.gzhead.hcrc&&a.pending>c&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),s(e),c=a.pending,a.pending!==a.pending_buf_size));)u(a,255&a.gzhead.extra[a.gzindex]),a.gzindex++;a.gzhead.hcrc&&a.pending>c&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),a.gzindex===a.gzhead.extra.length&&(a.gzindex=0,a.status=_t)}else a.status=_t;if(a.status===_t)if(a.gzhead.name){c=a.pending;do{if(a.pending===a.pending_buf_size&&(a.gzhead.hcrc&&a.pending>c&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),s(e),c=a.pending,a.pending===a.pending_buf_size)){f=1;break}f=a.gzindexc&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),0===f&&(a.gzindex=0,a.status=mt)}else a.status=mt;if(a.status===mt)if(a.gzhead.comment){c=a.pending;do{if(a.pending===a.pending_buf_size&&(a.gzhead.hcrc&&a.pending>c&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),s(e),c=a.pending,a.pending===a.pending_buf_size)){f=1;break}f=a.gzindexc&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),0===f&&(a.status=gt)}else a.status=gt;if(a.status===gt&&(a.gzhead.hcrc?(a.pending+2>a.pending_buf_size&&s(e),a.pending+2<=a.pending_buf_size&&(u(a,255&e.adler),u(a,e.adler>>8&255),e.adler=0,a.status=vt)):a.status=vt),0!==a.pending){if(s(e),0===e.avail_out)return a.last_flush=-1,D}else if(0===e.avail_in&&i(t)<=i(r)&&t!==F)return n(e,q);if(a.status===yt&&0!==e.avail_in)return n(e,q);if(0!==e.avail_in||0!==a.lookahead||t!==L&&a.status!==yt){var p=a.strategy===H?g(a,t):a.strategy===X?m(a,t):M[a.level].func(a,t);if((p===wt||p===kt)&&(a.status=yt),p===bt||p===wt)return 0===e.avail_out&&(a.last_flush=-1),D;if(p===xt&&(t===I?P._tr_align(a):t!==U&&(P._tr_stored_block(a,0,0,!1),t===C&&(o(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),s(e),0===e.avail_out))return a.last_flush=-1,D}return t!==F?D:a.wrap<=0?B:(2===a.wrap?(u(a,255&e.adler),u(a,e.adler>>8&255),u(a,e.adler>>16&255),u(a,e.adler>>24&255),u(a,255&e.total_in),u(a,e.total_in>>8&255),u(a,e.total_in>>16&255),u(a,e.total_in>>24&255)):(l(a,e.adler>>>16),l(a,65535&e.adler)),s(e),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?D:B)}function S(e){var t;return e&&e.state?(t=e.state.status,t!==dt&&t!==pt&&t!==_t&&t!==mt&&t!==gt&&t!==vt&&t!==yt?n(e,G):(e.state=null,t===vt?n(e,V):D)):G}function R(e,t){var r,n,i,s,a,u,l,c,f=t.length;if(!e||!e.state)return G;if(r=e.state,s=r.wrap,2===s||1===s&&r.status!==dt||r.lookahead)return G;for(1===s&&(e.adler=z(e.adler,t,f,0)),r.wrap=0,f>=r.w_size&&(0===s&&(o(r.head),r.strstart=0,r.block_start=0,r.insert=0),c=new O.Buf8(r.w_size),O.arraySet(c,t,f-r.w_size,r.w_size,0),t=c,f=r.w_size),a=e.avail_in,u=e.next_in,l=e.input,e.avail_in=f,e.next_in=0,e.input=t,h(r);r.lookahead>=lt;){n=r.strstart,i=r.lookahead-(lt-1);do r.ins_h=(r.ins_h<m&&(_+=S[o++]<>>24,_>>>=w,m-=w,w=x>>>16&255,0===w)R[a++]=65535&x;else{if(!(16&w)){if(0===(64&w)){x=g[(65535&x)+(_&(1<m&&(_+=S[o++]<>>=w,m-=w),15>m&&(_+=S[o++]<>>24,_>>>=w,m-=w,w=x>>>16&255,!(16&w)){if(0===(64&w)){x=v[(65535&x)+(_&(1<m&&(_+=S[o++]<m&&(_+=S[o++]<c){e.msg="invalid distance too far back",i.mode=r;break e}if(_>>>=w,m-=w,w=a-u,A>w){if(w=A-w,w>h&&i.sane){e.msg="invalid distance too far back",i.mode=r;break e}if(T=0,E=p,0===d){if(T+=f-w,k>w){k-=w;do R[a++]=p[T++];while(--w);T=a-A,E=R}}else if(w>d){if(T+=f+d-w,w-=d,k>w){k-=w;do R[a++]=p[T++];while(--w);if(T=0,k>d){w=d,k-=w;do R[a++]=p[T++];while(--w);T=a-A,E=R}}}else if(T+=d-w,k>w){k-=w;do R[a++]=p[T++];while(--w);T=a-A,E=R}for(;k>2;)R[a++]=E[T++],R[a++]=E[T++],R[a++]=E[T++],k-=3;k&&(R[a++]=E[T++],k>1&&(R[a++]=E[T++]))}else{T=a-A;do R[a++]=R[T++],R[a++]=R[T++],R[a++]=R[T++],k-=3;while(k>2);k&&(R[a++]=R[T++],k>1&&(R[a++]=R[T++]))}break}}break}}while(s>o&&l>a);k=m>>3,o-=k,m-=k<<3,_&=(1<o?5+(s-o):5-(o-s),e.avail_out=l>a?257+(l-a):257-(a-l),i.hold=_,i.bits=m}},{}],168:[function(e,t,r){"use strict";function n(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function i(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new v.Buf16(320),this.work=new v.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function o(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=C,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new v.Buf32(_t),t.distcode=t.distdyn=new v.Buf32(mt),t.sane=1,t.back=-1,M):z}function s(e){var t;return e&&e.state?(t=e.state,t.wsize=0,t.whave=0,t.wnext=0,o(e)):z}function a(e,t){var r,n;return e&&e.state?(n=e.state,0>t?(r=0,t=-t):(r=(t>>4)+1,48>t&&(t&=15)),t&&(8>t||t>15)?z:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,s(e))):z}function u(e,t){var r,n;return e?(n=new i,e.state=n,n.window=null,r=a(e,t),r!==M&&(e.state=null),r):z}function l(e){return u(e,vt)}function c(e){if(yt){var t;for(m=new v.Buf32(512),g=new v.Buf32(32),t=0;144>t;)e.lens[t++]=8;for(;256>t;)e.lens[t++]=9;for(;280>t;)e.lens[t++]=7;for(;288>t;)e.lens[t++]=8;for(w(A,e.lens,0,288,m,0,e.work,{bits:9}),t=0;32>t;)e.lens[t++]=5;w(T,e.lens,0,32,g,0,e.work,{bits:5}),yt=!1}e.lencode=m,e.lenbits=9,e.distcode=g,e.distbits=5}function f(e,t,r,n){var i,o=e.state;return null===o.window&&(o.wsize=1<=o.wsize?(v.arraySet(o.window,t,r-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):(i=o.wsize-o.wnext,i>n&&(i=n),v.arraySet(o.window,t,r-n,i,o.wnext),n-=i,n?(v.arraySet(o.window,t,r-n,n,0),o.wnext=n,o.whave=o.wsize):(o.wnext+=i,o.wnext===o.wsize&&(o.wnext=0),o.whaved;){if(0===u)break e;u--,h+=i[s++]<>>8&255,r.check=b(r.check,St,2,0),h=0,d=0,r.mode=F;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&h)<<8)+(h>>8))%31){e.msg="incorrect header check",r.mode=ht;break}if((15&h)!==I){e.msg="unknown compression method",r.mode=ht;break}if(h>>>=4,d-=4,wt=(15&h)+8,0===r.wbits)r.wbits=wt;else if(wt>r.wbits){e.msg="invalid window size",r.mode=ht;break}r.dmax=1<d;){if(0===u)break e;u--,h+=i[s++]<>8&1),512&r.flags&&(St[0]=255&h,St[1]=h>>>8&255,r.check=b(r.check,St,2,0)),h=0,d=0,r.mode=U;case U:for(;32>d;){if(0===u)break e;u--,h+=i[s++]<>>8&255,St[2]=h>>>16&255,St[3]=h>>>24&255,r.check=b(r.check,St,4,0)),h=0,d=0,r.mode=D;case D:for(;16>d;){if(0===u)break e;u--,h+=i[s++]<>8),512&r.flags&&(St[0]=255&h,St[1]=h>>>8&255,r.check=b(r.check,St,2,0)),h=0,d=0,r.mode=B;case B:if(1024&r.flags){for(;16>d;){if(0===u)break e;u--,h+=i[s++]<>>8&255,r.check=b(r.check,St,2,0)),h=0,d=0}else r.head&&(r.head.extra=null);r.mode=G;case G:if(1024&r.flags&&(m=r.length,m>u&&(m=u),m&&(r.head&&(wt=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),v.arraySet(r.head.extra,i,s,m,wt)),512&r.flags&&(r.check=b(r.check,i,m,s)),u-=m,s+=m,r.length-=m),r.length))break e;r.length=0,r.mode=V;case V:if(2048&r.flags){if(0===u)break e;m=0;do wt=i[s+m++],r.head&&wt&&r.length<65536&&(r.head.name+=String.fromCharCode(wt));while(wt&&u>m);if(512&r.flags&&(r.check=b(r.check,i,m,s)),u-=m,s+=m,wt)break e}else r.head&&(r.head.name=null);r.length=0,r.mode=q;case q:if(4096&r.flags){if(0===u)break e;m=0;do wt=i[s+m++],r.head&&wt&&r.length<65536&&(r.head.comment+=String.fromCharCode(wt));while(wt&&u>m);if(512&r.flags&&(r.check=b(r.check,i,m,s)),u-=m,s+=m,wt)break e}else r.head&&(r.head.comment=null);r.mode=W;case W:if(512&r.flags){for(;16>d;){if(0===u)break e;u--,h+=i[s++]<>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=X;break;case Z:for(;32>d;){if(0===u)break e;u--,h+=i[s++]<>>=7&d,d-=7&d,r.mode=lt;break}for(;3>d;){if(0===u)break e;u--,h+=i[s++]<>>=1,d-=1,3&h){case 0:r.mode=J;break;case 1:if(c(r),r.mode=rt,t===R){h>>>=2,d-=2;break e}break;case 2:r.mode=Q;break;case 3:e.msg="invalid block type",r.mode=ht}h>>>=2,d-=2;break;case J:for(h>>>=7&d,d-=7&d;32>d;){if(0===u)break e;u--,h+=i[s++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=ht;break}if(r.length=65535&h,h=0,d=0,r.mode=K,t===R)break e;case K:r.mode=$;case $:if(m=r.length){if(m>u&&(m=u),m>l&&(m=l),0===m)break e;v.arraySet(o,i,s,m,a),u-=m,s+=m,l-=m,a+=m,r.length-=m;break}r.mode=X;break;case Q:for(;14>d;){if(0===u)break e;u--,h+=i[s++]<>>=5,d-=5,r.ndist=(31&h)+1,h>>>=5,d-=5,r.ncode=(15&h)+4,h>>>=4,d-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=ht;break}r.have=0,r.mode=et;case et:for(;r.haved;){if(0===u)break e;u--,h+=i[s++]<>>=3,d-=3}for(;r.have<19;)r.lens[Rt[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,At={bits:r.lenbits},kt=w(k,r.lens,0,19,r.lencode,0,r.work,At),r.lenbits=At.bits,kt){e.msg="invalid code lengths set",r.mode=ht;break}r.have=0,r.mode=tt;case tt:for(;r.have>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=mt);){if(0===u)break e;u--,h+=i[s++]<vt)h>>>=mt,d-=mt,r.lens[r.have++]=vt;else{if(16===vt){for(Tt=mt+2;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=mt,d-=mt,0===r.have){e.msg="invalid bit length repeat",r.mode=ht;break}wt=r.lens[r.have-1],m=3+(3&h),h>>>=2,d-=2}else if(17===vt){for(Tt=mt+3;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=mt,d-=mt,wt=0,m=3+(7&h),h>>>=3,d-=3}else{for(Tt=mt+7;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=mt,d-=mt,wt=0,m=11+(127&h),h>>>=7,d-=7}if(r.have+m>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=ht;break}for(;m--;)r.lens[r.have++]=wt}}if(r.mode===ht)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=ht;break}if(r.lenbits=9,At={bits:r.lenbits},kt=w(A,r.lens,0,r.nlen,r.lencode,0,r.work,At),r.lenbits=At.bits,kt){e.msg="invalid literal/lengths set",r.mode=ht;break}if(r.distbits=6,r.distcode=r.distdyn,At={bits:r.distbits},kt=w(T,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,At),r.distbits=At.bits,kt){e.msg="invalid distances set",r.mode=ht;break}if(r.mode=rt,t===R)break e;case rt:r.mode=nt;case nt:if(u>=6&&l>=258){e.next_out=a,e.avail_out=l,e.next_in=s,e.avail_in=u,r.hold=h,r.bits=d,x(e,_),a=e.next_out,o=e.output,l=e.avail_out,s=e.next_in,i=e.input,u=e.avail_in,h=r.hold,d=r.bits,r.mode===X&&(r.back=-1);break}for(r.back=0;Et=r.lencode[h&(1<>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=mt);){if(0===u)break e;u--,h+=i[s++]<>yt)],mt=Et>>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=yt+mt);){if(0===u)break e;u--,h+=i[s++]<>>=yt,d-=yt,r.back+=yt}if(h>>>=mt,d-=mt,r.back+=mt,r.length=vt,0===gt){r.mode=ut;break}if(32>){r.back=-1,r.mode=X;break}if(64>){e.msg="invalid literal/length code",r.mode=ht;break}r.extra=15>,r.mode=it;case it:if(r.extra){for(Tt=r.extra;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=r.extra,d-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=ot;case ot:for(;Et=r.distcode[h&(1<>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=mt);){if(0===u)break e;u--,h+=i[s++]<>yt)],mt=Et>>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=yt+mt);){if(0===u)break e;u--,h+=i[s++]<>>=yt,d-=yt,r.back+=yt}if(h>>>=mt,d-=mt,r.back+=mt,64>){e.msg="invalid distance code",r.mode=ht;break}r.offset=vt,r.extra=15>,r.mode=st;case st:if(r.extra){for(Tt=r.extra;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=r.extra,d-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=ht;break}r.mode=at;case at:if(0===l)break e;if(m=_-l,r.offset>m){if(m=r.offset-m,m>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=ht;break}m>r.wnext?(m-=r.wnext,g=r.wsize-m):g=r.wnext-m,m>r.length&&(m=r.length),_t=r.window}else _t=o,g=a-r.offset,m=r.length;m>l&&(m=l),l-=m,r.length-=m;do o[a++]=_t[g++];while(--m);0===r.length&&(r.mode=nt);break;case ut:if(0===l)break e;o[a++]=r.length,l--,r.mode=nt;break;case lt:if(r.wrap){for(;32>d;){if(0===u)break e;u--,h|=i[s++]<d;){if(0===u)break e;u--,h+=i[s++]<=M;M++)B[M]=0;for(O=0;p>O;O++)B[t[d+O]]++;for(N=R,z=n;z>=1&&0===B[z];z--);if(N>z&&(N=z),0===z)return _[m++]=20971520,_[m++]=20971520,v.bits=1,0;for(P=1;z>P&&0===B[P];P++);for(P>N&&(N=P),I=1,M=1;n>=M;M++)if(I<<=1,I-=B[M],0>I)return-1;if(I>0&&(e===s||1!==z))return-1;for(G[1]=0,M=1;n>M;M++)G[M+1]=G[M]+B[M];for(O=0;p>O;O++)0!==t[d+O]&&(g[G[t[d+O]]++]=O);if(e===s?(U=V=g,A=19):e===a?(U=l,D-=257,V=c,q-=257,A=256):(U=f,V=h,A=-1),F=0,O=0,M=P,k=m,j=N,L=0,x=-1,C=1<i||e===u&&C>o)return 1;for(var W=0;;){W++,T=M-L,g[O]A?(E=V[q+g[O]],S=U[D+g[O]]):(E=96,S=0),y=1<>L)+b]=T<<24|E<<16|S|0;while(0!==b);for(y=1<>=1;if(0!==y?(F&=y-1,F+=y):F=0,O++,0===--B[M]){if(M===z)break;M=t[d+g[O]]}if(M>N&&(F&w)!==x){for(0===L&&(L=N),k+=P,j=M-L,I=1<j+L&&(I-=B[j+L],!(0>=I));)j++,I<<=1;if(C+=1<i||e===u&&C>o)return 1;x=F&w,_[x]=N<<24|j<<16|k-m|0}}return 0!==F&&(_[k+F]=M-L<<24|64<<16|0),v.bits=N,0}},{"../utils/common":160}],170:[function(e,t){"use strict";t.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],171:[function(e,t,r){"use strict";function n(e){for(var t=e.length;--t>=0;)e[t]=0}function i(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function o(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function s(e){return 256>e?ut[e]:ut[256+(e>>>7)]}function a(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function u(e,t,r){e.bi_valid>Y-r?(e.bi_buf|=t<>Y-e.bi_valid,e.bi_valid+=r-Y):(e.bi_buf|=t<>>=1,r<<=1;while(--t>0);return r>>>1}function f(e){16===e.bi_valid?(a(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}function h(e,t){var r,n,i,o,s,a,u=t.dyn_tree,l=t.max_code,c=t.stat_desc.static_tree,f=t.stat_desc.has_stree,h=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,_=0;for(o=0;X>=o;o++)e.bl_count[o]=0;for(u[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;H>r;r++)n=e.heap[r],o=u[2*u[2*n+1]+1]+1,o>p&&(o=p,_++),u[2*n+1]=o,n>l||(e.bl_count[o]++,s=0,n>=d&&(s=h[n-d]),a=u[2*n],e.opt_len+=a*(o+s),f&&(e.static_len+=a*(c[2*n+1]+s)));if(0!==_){do{for(o=p-1;0===e.bl_count[o];)o--;e.bl_count[o]--,e.bl_count[o+1]+=2,e.bl_count[p]--,_-=2}while(_>0);for(o=p;0!==o;o--)for(n=e.bl_count[o];0!==n;)i=e.heap[--r],i>l||(u[2*i+1]!==o&&(e.opt_len+=(o-u[2*i+1])*u[2*i],u[2*i+1]=o),n--)}}function d(e,t,r){var n,i,o=new Array(X+1),s=0;for(n=1;X>=n;n++)o[n]=s=s+r[n-1]<<1;for(i=0;t>=i;i++){var a=e[2*i+1];0!==a&&(e[2*i]=c(o[a]++,a))}}function p(){var e,t,r,n,o,s=new Array(X+1);for(r=0,n=0;G-1>n;n++)for(ct[n]=r,e=0;e<1<n;n++)for(ft[n]=o,e=0;e<1<>=7;W>n;n++)for(ft[n]=o<<7,e=0;e<1<=t;t++)s[t]=0;for(e=0;143>=e;)st[2*e+1]=8,e++,s[8]++;for(;255>=e;)st[2*e+1]=9,e++,s[9]++;for(;279>=e;)st[2*e+1]=7,e++,s[7]++;for(;287>=e;)st[2*e+1]=8,e++,s[8]++;for(d(st,q+1,s),e=0;W>e;e++)at[2*e+1]=5,at[2*e]=c(e,5);ht=new i(st,tt,V+1,q,X),dt=new i(at,rt,0,W,X),pt=new i(new Array(0),nt,0,Z,J)}function _(e){var t;for(t=0;q>t;t++)e.dyn_ltree[2*t]=0;for(t=0;W>t;t++)e.dyn_dtree[2*t]=0;for(t=0;Z>t;t++)e.bl_tree[2*t]=0; -e.dyn_ltree[2*K]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function m(e){e.bi_valid>8?a(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function g(e,t,r,n){m(e),n&&(a(e,r),a(e,~r)),z.arraySet(e.pending_buf,e.window,t,r,e.pending),e.pending+=r}function v(e,t,r,n){var i=2*t,o=2*r;return e[i]r;r++)0!==o[2*r]?(e.heap[++e.heap_len]=l=r,e.depth[r]=0):o[2*r+1]=0;for(;e.heap_len<2;)i=e.heap[++e.heap_len]=2>l?++l:0,o[2*i]=1,e.depth[i]=0,e.opt_len--,a&&(e.static_len-=s[2*i+1]);for(t.max_code=l,r=e.heap_len>>1;r>=1;r--)y(e,o,r);i=u;do r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],y(e,o,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,o[2*i]=o[2*r]+o[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,o[2*r+1]=o[2*n+1]=i,e.heap[1]=i++,y(e,o,1);while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],h(e,t),d(o,l,e.bl_count)}function w(e,t,r){var n,i,o=-1,s=t[1],a=0,u=7,l=4;for(0===s&&(u=138,l=3),t[2*(r+1)+1]=65535,n=0;r>=n;n++)i=s,s=t[2*(n+1)+1],++aa?e.bl_tree[2*i]+=a:0!==i?(i!==o&&e.bl_tree[2*i]++,e.bl_tree[2*$]++):10>=a?e.bl_tree[2*Q]++:e.bl_tree[2*et]++,a=0,o=i,0===s?(u=138,l=3):i===s?(u=6,l=3):(u=7,l=4))}function k(e,t,r){var n,i,o=-1,s=t[1],a=0,c=7,f=4;for(0===s&&(c=138,f=3),n=0;r>=n;n++)if(i=s,s=t[2*(n+1)+1],!(++aa){do l(e,i,e.bl_tree);while(0!==--a)}else 0!==i?(i!==o&&(l(e,i,e.bl_tree),a--),l(e,$,e.bl_tree),u(e,a-3,2)):10>=a?(l(e,Q,e.bl_tree),u(e,a-3,3)):(l(e,et,e.bl_tree),u(e,a-11,7));a=0,o=i,0===s?(c=138,f=3):i===s?(c=6,f=3):(c=7,f=4)}}function A(e){var t;for(w(e,e.dyn_ltree,e.l_desc.max_code),w(e,e.dyn_dtree,e.d_desc.max_code),x(e,e.bl_desc),t=Z-1;t>=3&&0===e.bl_tree[2*it[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}function T(e,t,r,n){var i;for(u(e,t-257,5),u(e,r-1,5),u(e,n-4,4),i=0;n>i;i++)u(e,e.bl_tree[2*it[i]+1],3);k(e,e.dyn_ltree,t-1),k(e,e.dyn_dtree,r-1)}function E(e){var t,r=4093624447;for(t=0;31>=t;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return j;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return L;for(t=32;V>t;t++)if(0!==e.dyn_ltree[2*t])return L;return j}function S(e){_t||(p(),_t=!0),e.l_desc=new o(e.dyn_ltree,ht),e.d_desc=new o(e.dyn_dtree,dt),e.bl_desc=new o(e.bl_tree,pt),e.bi_buf=0,e.bi_valid=0,_(e)}function R(e,t,r,n){u(e,(C<<1)+(n?1:0),3),g(e,t,r,!0)}function M(e){u(e,F<<1,3),l(e,K,st),f(e)}function O(e,t,r,n){var i,o,s=0;e.level>0?(e.strm.data_type===I&&(e.strm.data_type=E(e)),x(e,e.l_desc),x(e,e.d_desc),s=A(e),i=e.opt_len+3+7>>>3,o=e.static_len+3+7>>>3,i>=o&&(i=o)):i=o=r+5,i>=r+4&&-1!==t?R(e,t,r,n):e.strategy===N||o===i?(u(e,(F<<1)+(n?1:0),3),b(e,st,at)):(u(e,(U<<1)+(n?1:0),3),T(e,e.l_desc.max_code+1,e.d_desc.max_code+1,s+1),b(e,e.dyn_ltree,e.dyn_dtree)),_(e),n&&m(e)}function P(e,t,r){return e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(lt[r]+V+1)]++,e.dyn_dtree[2*s(t)]++),e.last_lit===e.lit_bufsize-1}var z=e("../utils/common"),N=4,j=0,L=1,I=2,C=0,F=1,U=2,D=3,B=258,G=29,V=256,q=V+1+G,W=30,Z=19,H=2*q+1,X=15,Y=16,J=7,K=256,$=16,Q=17,et=18,tt=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],rt=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],nt=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],it=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],ot=512,st=new Array(2*(q+2));n(st);var at=new Array(2*W);n(at);var ut=new Array(ot);n(ut);var lt=new Array(B-D+1);n(lt);var ct=new Array(G);n(ct);var ft=new Array(W);n(ft);var ht,dt,pt,_t=!1;r._tr_init=S,r._tr_stored_block=R,r._tr_flush_block=O,r._tr_tally=P,r._tr_align=M},{"../utils/common":160}],172:[function(e,t){"use strict";function r(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}t.exports=r},{}],173:[function(e,t){"use strict";function r(e){var t;e&&e.length&&(t=e,e=t.length);var r=new Uint8Array(e||0);return t&&r.set(t),r.readUInt32LE=i.readUInt32LE,r.writeUInt32LE=i.writeUInt32LE,r.readInt32LE=i.readInt32LE,r.writeInt32LE=i.writeInt32LE,r.readFloatLE=i.readFloatLE,r.writeFloatLE=i.writeFloatLE,r.readDoubleLE=i.readDoubleLE,r.writeDoubleLE=i.writeDoubleLE,r.toString=i.toString,r.write=i.write,r.slice=i.slice,r.copy=i.copy,r._isBuffer=!0,r}function n(e){for(var t,r,n=e.length,i=[],o=0;n>o;o++){if(t=e.charCodeAt(o),t>55295&&57344>t){if(!r){t>56319||o+1===n?i.push(239,191,189):r=t;continue}if(56320>t){i.push(239,191,189),r=t;continue}t=r-55296<<10|t-56320|65536,r=null}else r&&(i.push(239,191,189),r=null);128>t?i.push(t):2048>t?i.push(t>>6|192,63&t|128):65536>t?i.push(t>>12|224,t>>6&63|128,63&t|128):i.push(t>>18|240,t>>12&63|128,t>>6&63|128,63&t|128)}return i}t.exports=r;var i,o,s,a=e("ieee754");i={readUInt32LE:function(e){return(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},writeUInt32LE:function(e,t){this[t]=e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24},readInt32LE:function(e){return(this[e]|this[e+1]<<8|this[e+2]<<16)+(this[e+3]<<24)},readFloatLE:function(e){return a.read(this,e,!0,23,4)},readDoubleLE:function(e){return a.read(this,e,!0,52,8)},writeFloatLE:function(e,t){return a.write(this,e,t,!0,23,4)},writeDoubleLE:function(e,t){return a.write(this,e,t,!0,52,8)},toString:function(e,t,r){var n="",i="";t=t||0,r=Math.min(this.length,r||this.length);for(var o=t;r>o;o++){var s=this[o];127>=s?(n+=decodeURIComponent(i)+String.fromCharCode(s),i=""):i+="%"+s.toString(16)}return n+=decodeURIComponent(i)},write:function(e,t){for(var r=e===o?s:n(e),i=0;i>3,o=this.pos;e(i,t,this),this.pos===o&&this.skip(n)}return t},readMessage:function(e,t){return this.readFields(e,t,this.readVarint()+this.pos)},readFixed32:function(){var e=this.buf.readUInt32LE(this.pos);return this.pos+=4,e},readSFixed32:function(){var e=this.buf.readInt32LE(this.pos);return this.pos+=4,e},readFixed64:function(){var e=this.buf.readUInt32LE(this.pos)+this.buf.readUInt32LE(this.pos+4)*p;return this.pos+=8,e},readSFixed64:function(){var e=this.buf.readUInt32LE(this.pos)+this.buf.readInt32LE(this.pos+4)*p;return this.pos+=8,e},readFloat:function(){var e=this.buf.readFloatLE(this.pos);return this.pos+=4,e},readDouble:function(){var e=this.buf.readDoubleLE(this.pos);return this.pos+=8,e},readVarint:function(){var e,t,r,n,i,o,s=this.buf;if(r=s[this.pos++],128>r)return r;if(r=127&r,n=s[this.pos++],128>n)return r|n<<7;if(n=(127&n)<<7,i=s[this.pos++],128>i)return r|n|i<<14;if(i=(127&i)<<14,o=s[this.pos++],128>o)return r|n|i|o<<21;if(e=r|n|i|(127&o)<<21,t=s[this.pos++],e+=268435456*(127&t),128>t)return e;if(t=s[this.pos++],e+=34359738368*(127&t),128>t)return e;if(t=s[this.pos++],e+=4398046511104*(127&t),128>t)return e;if(t=s[this.pos++],e+=562949953421312*(127&t),128>t)return e;if(t=s[this.pos++],e+=72057594037927940*(127&t),128>t)return e;if(t=s[this.pos++],e+=0x8000000000000000*(127&t),128>t)return e;throw new Error("Expected varint not more than 10 bytes")},readVarint64:function(){var e=this.pos,t=this.readVarint();if(m>t)return t;for(var r=this.pos-2;255===this.buf[r];)r--;e>r&&(r=e),t=0;for(var n=0;r-e+1>n;n++){var i=127&~this.buf[e+n];t+=4>n?i<<7*n:i*Math.pow(2,7*n)}return-t-1},readSVarint:function(){var e=this.readVarint();return e%2===1?(e+1)/-2:e/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var e=this.readVarint()+this.pos,t=this.buf.toString("utf8",this.pos,e);return this.pos=e,t},readBytes:function(){var e=this.readVarint()+this.pos,t=this.buf.slice(this.pos,e);return this.pos=e,t},readPackedVarint:function(){for(var e=this.readVarint()+this.pos,t=[];this.pos127;);else if(t===n.Bytes)this.pos=this.readVarint()+this.pos;else if(t===n.Fixed32)this.pos+=4;else{if(t!==n.Fixed64)throw new Error("Unimplemented type: "+t);this.pos+=8}},writeTag:function(e,t){this.writeVarint(e<<3|t)},realloc:function(e){for(var t=this.length||16;t=e)this.realloc(1),this.buf[this.pos++]=e;else if(16383>=e)this.realloc(2),this.buf[this.pos++]=e>>>0&127|128,this.buf[this.pos++]=e>>>7&127;else if(2097151>=e)this.realloc(3),this.buf[this.pos++]=e>>>0&127|128,this.buf[this.pos++]=e>>>7&127|128,this.buf[this.pos++]=e>>>14&127;else if(268435455>=e)this.realloc(4),this.buf[this.pos++]=e>>>0&127|128,this.buf[this.pos++]=e>>>7&127|128,this.buf[this.pos++]=e>>>14&127|128,this.buf[this.pos++]=e>>>21&127;else{for(var t=this.pos;e>=128;)this.realloc(1),this.buf[this.pos++]=255&e|128,e/=128;if(this.realloc(1),this.buf[this.pos++]=0|e,this.pos-t>10)throw new Error("Given varint doesn't fit into 10 bytes")}},writeSVarint:function(e){this.writeVarint(0>e?2*-e-1:2*e)},writeBoolean:function(e){this.writeVarint(Boolean(e))},writeString:function(e){e=String(e);var t=d.byteLength(e);this.writeVarint(t),this.realloc(t),this.buf.write(e,this.pos),this.pos+=t},writeFloat:function(e){this.realloc(4),this.buf.writeFloatLE(e,this.pos),this.pos+=4},writeDouble:function(e){this.realloc(8),this.buf.writeDoubleLE(e,this.pos),this.pos+=8},writeBytes:function(e){var t=e.length;this.writeVarint(t),this.realloc(t);for(var r=0;t>r;r++)this.buf[this.pos++]=e[r]},writeMessage:function(e,t,r){this.writeTag(e,n.Bytes),this.pos++;var i=this.pos;t(r,this);var o=this.pos-i,s=127>=o?1:16383>=o?2:2097151>=o?3:268435455>=o?4:Math.ceil(Math.log(o)/(7*Math.LN2));if(s>1){this.realloc(s-1);for(var a=this.pos-1;a>=i;a--)this.buf[a+s-1]=this.buf[a]}this.pos=i-1,this.writeVarint(o),this.pos+=o},writePackedVarint:function(e,t){this.writeMessage(e,i,t)},writePackedSVarint:function(e,t){this.writeMessage(e,o,t)},writePackedBoolean:function(e,t){this.writeMessage(e,u,t)},writePackedFloat:function(e,t){this.writeMessage(e,s,t)},writePackedDouble:function(e,t){this.writeMessage(e,a,t)},writePackedFixed32:function(e,t){this.writeMessage(e,l,t)},writePackedSFixed32:function(e,t){this.writeMessage(e,c,t)},writePackedFixed64:function(e,t){this.writeMessage(e,f,t)},writePackedSFixed64:function(e,t){this.writeMessage(e,h,t)},writeBytesField:function(e,t){this.writeTag(e,n.Bytes),this.writeBytes(t)},writeFixed32Field:function(e,t){this.writeTag(e,n.Fixed32),this.writeFixed32(t)},writeSFixed32Field:function(e,t){this.writeTag(e,n.Fixed32),this.writeSFixed32(t)},writeFixed64Field:function(e,t){this.writeTag(e,n.Fixed64),this.writeFixed64(t)},writeSFixed64Field:function(e,t){this.writeTag(e,n.Fixed64),this.writeSFixed64(t)},writeVarintField:function(e,t){this.writeTag(e,n.Varint),this.writeVarint(t)},writeSVarintField:function(e,t){this.writeTag(e,n.Varint),this.writeSVarint(t)},writeStringField:function(e,t){this.writeTag(e,n.Bytes),this.writeString(t)},writeFloatField:function(e,t){this.writeTag(e,n.Fixed32),this.writeFloat(t)},writeDoubleField:function(e,t){this.writeTag(e,n.Fixed64),this.writeDouble(t)},writeBooleanField:function(e,t){this.writeVarintField(e,Boolean(t))}}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./buffer":173}],175:[function(e,t){"use strict";function r(e,t){this.x=e,this.y=t}t.exports=r,r.prototype={clone:function(){return new r(this.x,this.y)},add:function(e){return this.clone()._add(e)},sub:function(e){return this.clone()._sub(e)},mult:function(e){return this.clone()._mult(e)},div:function(e){return this.clone()._div(e)},rotate:function(e){return this.clone()._rotate(e)},matMult:function(e){return this.clone()._matMult(e)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(e){return this.x===e.x&&this.y===e.y},dist:function(e){return Math.sqrt(this.distSqr(e))},distSqr:function(e){var t=e.x-this.x,r=e.y-this.y;return t*t+r*r},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(e){return Math.atan2(this.y-e.y,this.x-e.x)},angleWith:function(e){return this.angleWithSep(e.x,e.y)},angleWithSep:function(e,t){return Math.atan2(this.x*t-this.y*e,this.x*e+this.y*t)},_matMult:function(e){var t=e[0]*this.x+e[1]*this.y,r=e[2]*this.x+e[3]*this.y;return this.x=t,this.y=r,this},_add:function(e){return this.x+=e.x,this.y+=e.y,this},_sub:function(e){return this.x-=e.x,this.y-=e.y,this},_mult:function(e){return this.x*=e,this.y*=e,this},_div:function(e){return this.x/=e,this.y/=e,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var e=this.y;return this.y=this.x,this.x=-e,this},_rotate:function(e){var t=Math.cos(e),r=Math.sin(e),n=t*this.x-r*this.y,i=r*this.x+t*this.y;return this.x=n,this.y=i,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},r.convert=function(e){return e instanceof r?e:Array.isArray(e)?new r(e[0],e[1]):e}},{}],176:[function(e,t){(function(e){"use strict";function r(t,r,n,i){if("function"!=typeof t)throw new TypeError('"callback" argument must be a function');var o,s,a=arguments.length;switch(a){case 0:case 1:return e.nextTick(t);case 2:return e.nextTick(function(){t.call(null,r)});case 3:return e.nextTick(function(){t.call(null,r,n)});case 4:return e.nextTick(function(){t.call(null,r,n,i)});default:for(o=new Array(a-1),s=0;s1)for(var r=1;r0)if(t.ended&&!i){var a=new Error("stream.push() after EOF");e.emit("error",a)}else if(t.endEmitted&&i){var a=new Error("stream.unshift() after end event");e.emit("error",a)}else{var u;!t.decoder||i||n||(r=t.decoder.write(r),u=!t.objectMode&&0===r.length),i||(t.reading=!1),u||(t.flowing&&0===t.length&&!t.sync?(e.emit("data",r),e.read(0)):(t.length+=t.objectMode?1:r.length,i?t.buffer.unshift(r):t.buffer.push(r),t.needReadable&&f(e))),d(e,t)}else i||(t.reading=!1);return s(t)}function s(e){return!e.ended&&(e.needReadable||e.length=L?e=L:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}function u(e,t){return 0===t.length&&t.ended?0:t.objectMode?0===e?0:1:null===e||isNaN(e)?t.flowing&&t.buffer.length?t.buffer[0].length:t.length:0>=e?0:(e>t.highWaterMark&&(t.highWaterMark=a(e)),e>t.length?t.ended?t.length:(t.needReadable=!0,0):e)}function l(e,t){var r=null;return S.isBuffer(t)||"string"==typeof t||null===t||void 0===t||e.objectMode||(r=new TypeError("Invalid non-string/buffer chunk")),r}function c(e,t){if(!t.ended){if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,f(e)}}function f(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(z("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?T(h,e):h(e))}function h(e){z("emit readable"),e.emit("readable"),y(e)}function d(e,t){t.readingMore||(t.readingMore=!0,T(p,e,t))}function p(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=i)r=o?n.join(""):1===n.length?n[0]:S.concat(n,i),n.length=0;else if(el&&e>u;l++){var a=n[0],f=Math.min(e-u,a.length);o?r+=a.slice(0,f):a.copy(r,u,0,f),f0)throw new Error("endReadable called on non-empty stream");t.endEmitted||(t.ended=!0,T(w,t,e))}function w(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function k(e,t){for(var r=0,n=e.length;n>r;r++)t(e[r],r)}function A(e,t){for(var r=0,n=e.length;n>r;r++)if(e[r]===t)return r;return-1}t.exports=i;var T=e("process-nextick-args"),E=e("isarray"),S=e("buffer").Buffer;i.ReadableState=n;var R,M=(e("events"),function(e,t){return e.listeners(t).length});!function(){try{R=e("stream")}catch(t){}finally{R||(R=e("events").EventEmitter)}}();var S=e("buffer").Buffer,O=e("core-util-is");O.inherits=e("inherits");var P=e("util"),z=void 0;z=P&&P.debuglog?P.debuglog("stream"):function(){};var N;O.inherits(i,R);var j,j;i.prototype.push=function(e,t){var r=this._readableState;return r.objectMode||"string"!=typeof e||(t=t||r.defaultEncoding,t!==r.encoding&&(e=new S(e,t),t="")),o(this,r,e,t,!1)},i.prototype.unshift=function(e){var t=this._readableState;return o(this,t,e,"",!0)},i.prototype.isPaused=function(){return this._readableState.flowing===!1},i.prototype.setEncoding=function(t){return N||(N=e("string_decoder/").StringDecoder),this._readableState.decoder=new N(t),this._readableState.encoding=t,this};var L=8388608;i.prototype.read=function(e){z("read",e);var t=this._readableState,r=e;if(("number"!=typeof e||e>0)&&(t.emittedReadable=!1),0===e&&t.needReadable&&(t.length>=t.highWaterMark||t.ended))return z("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?x(this):f(this),null;if(e=u(e,t),0===e&&t.ended)return 0===t.length&&x(this),null;var n=t.needReadable;z("need readable",n),(0===t.length||t.length-e0?b(e,t):null,null===i&&(t.needReadable=!0,e=0),t.length-=e,0!==t.length||t.ended||(t.needReadable=!0),r!==e&&t.ended&&0===t.length&&x(this),null!==i&&this.emit("data",i),i},i.prototype._read=function(){this.emit("error",new Error("not implemented"))},i.prototype.pipe=function(e,t){function n(e){z("onunpipe"),e===f&&o()}function i(){z("onend"),e.end()}function o(){z("cleanup"),e.removeListener("close",u),e.removeListener("finish",l),e.removeListener("drain",m),e.removeListener("error",a),e.removeListener("unpipe",n),f.removeListener("end",i),f.removeListener("end",o),f.removeListener("data",s),g=!0,!h.awaitDrain||e._writableState&&!e._writableState.needDrain||m()}function s(t){z("ondata");var r=e.write(t);!1===r&&(1!==h.pipesCount||h.pipes[0]!==e||1!==f.listenerCount("data")||g||(z("false write response, pause",f._readableState.awaitDrain),f._readableState.awaitDrain++),f.pause())}function a(t){z("onerror",t),c(),e.removeListener("error",a),0===M(e,"error")&&e.emit("error",t)}function u(){e.removeListener("finish",l),c()}function l(){z("onfinish"),e.removeListener("close",u),c()}function c(){z("unpipe"),f.unpipe(e)}var f=this,h=this._readableState;switch(h.pipesCount){case 0:h.pipes=e;break;case 1:h.pipes=[h.pipes,e];break;default:h.pipes.push(e)}h.pipesCount+=1,z("pipe count=%d opts=%j",h.pipesCount,t);var d=(!t||t.end!==!1)&&e!==r.stdout&&e!==r.stderr,p=d?i:o;h.endEmitted?T(p):f.once("end",p),e.on("unpipe",n);var m=_(f);e.on("drain",m);var g=!1;return f.on("data",s),e._events&&e._events.error?E(e._events.error)?e._events.error.unshift(a):e._events.error=[a,e._events.error]:e.on("error",a),e.once("close",u),e.once("finish",l),e.emit("pipe",f),h.flowing||(z("pipe resume"),f.resume()),e},i.prototype.unpipe=function(e){var t=this._readableState;if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this),this);if(!e){var r=t.pipes,n=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var i=0;n>i;i++)r[i].emit("unpipe",this);return this}var o=A(t.pipes,e);return-1===o?this:(t.pipes.splice(o,1),t.pipesCount-=1,1===t.pipesCount&&(t.pipes=t.pipes[0]),e.emit("unpipe",this),this)},i.prototype.on=function(e,t){var r=R.prototype.on.call(this,e,t);if("data"===e&&!1!==this._readableState.flowing&&this.resume(),"readable"===e&&!this._readableState.endEmitted){var n=this._readableState;n.readableListening||(n.readableListening=!0,n.emittedReadable=!1,n.needReadable=!0,n.reading?n.length&&f(this,n):T(m,this))}return r},i.prototype.addListener=i.prototype.on,i.prototype.resume=function(){var e=this._readableState;return e.flowing||(z("resume"),e.flowing=!0,g(this,e)),this},i.prototype.pause=function(){return z("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(z("pause"),this._readableState.flowing=!1,this.emit("pause")),this},i.prototype.wrap=function(e){var t=this._readableState,r=!1,n=this;e.on("end",function(){if(z("wrapped end"),t.decoder&&!t.ended){var e=t.decoder.end();e&&e.length&&n.push(e)}n.push(null)}),e.on("data",function(i){if(z("wrapped data"),t.decoder&&(i=t.decoder.write(i)),(!t.objectMode||null!==i&&void 0!==i)&&(t.objectMode||i&&i.length)){var o=n.push(i);o||(r=!0,e.pause())}});for(var i in e)void 0===this[i]&&"function"==typeof e[i]&&(this[i]=function(t){return function(){return e[t].apply(e,arguments)}}(i));var o=["error","close","destroy","pause","resume"];return k(o,function(t){e.on(t,n.emit.bind(n,t))}),n._read=function(t){z("wrapped _read",t),r&&(r=!1,e.resume())},n},i._fromList=b}).call(this,e("_process"))},{"./_stream_duplex":178,_process:177,buffer:5,"core-util-is":70,events:73,inherits:92,isarray:94,"process-nextick-args":176,"string_decoder/":184,util:4}],181:[function(e,t){"use strict";function r(e){this.afterTransform=function(t,r){return n(e,t,r)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null,this.writeencoding=null}function n(e,t,r){var n=e._transformState;n.transforming=!1;var i=n.writecb;if(!i)return e.emit("error",new Error("no writecb in Transform class"));n.writechunk=null,n.writecb=null,null!==r&&void 0!==r&&e.push(r),i(t);var o=e._readableState;o.reading=!1,(o.needReadable||o.length-1?setImmediate:k,T=e("buffer").Buffer;s.WritableState=o;var E=e("core-util-is");E.inherits=e("inherits");var S,R={deprecate:e("util-deprecate")};!function(){try{S=e("stream")}catch(t){}finally{S||(S=e("events").EventEmitter)}}();var T=e("buffer").Buffer;E.inherits(s,S);var M;o.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(o.prototype,"buffer",{get:R.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")})}catch(e){}}();var M;s.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe. Not readable."))},s.prototype.write=function(e,t,r){var i=this._writableState,o=!1;return"function"==typeof t&&(r=t,t=null),T.isBuffer(e)?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=n),i.ended?a(this,r):u(this,i,e,r)&&(i.pendingcb++,o=c(this,i,e,t,r)),o},s.prototype.cork=function(){var e=this._writableState;e.corked++},s.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.finished||e.bufferProcessing||!e.bufferedRequest||g(this,e))},s.prototype.setDefaultEncoding=function(e){if("string"==typeof e&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+e);this._writableState.defaultEncoding=e},s.prototype._write=function(e,t,r){r(new Error("not implemented"))},s.prototype._writev=null,s.prototype.end=function(e,t,r){var n=this._writableState;"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!==e&&void 0!==e&&this.write(e,t),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||x(this,n,r)}}).call(this,e("_process"))},{"./_stream_duplex":178,_process:177,buffer:5,"core-util-is":70,events:73,inherits:92,"process-nextick-args":176,"util-deprecate":187}],183:[function(e,t,r){var n=function(){try{return e("stream")}catch(t){}}();r=t.exports=e("./lib/_stream_readable.js"),r.Stream=n||r,r.Readable=r,r.Writable=e("./lib/_stream_writable.js"),r.Duplex=e("./lib/_stream_duplex.js"),r.Transform=e("./lib/_stream_transform.js"),r.PassThrough=e("./lib/_stream_passthrough.js")},{"./lib/_stream_duplex.js":178,"./lib/_stream_passthrough.js":179,"./lib/_stream_readable.js":180,"./lib/_stream_transform.js":181,"./lib/_stream_writable.js":182}],184:[function(e,t,r){function n(e){if(e&&!u(e))throw new Error("Unknown encoding: "+e)}function i(e){return e.toString(this.encoding)}function o(e){this.charReceived=e.length%2,this.charLength=this.charReceived?2:0}function s(e){this.charReceived=e.length%3,this.charLength=this.charReceived?3:0}var a=e("buffer").Buffer,u=a.isEncoding||function(e){switch(e&&e.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}},l=r.StringDecoder=function(e){switch(this.encoding=(e||"utf8").toLowerCase().replace(/[-_]/,""),n(e),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=o;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=s;break;default:return void(this.write=i)}this.charBuffer=new a(6),this.charReceived=0,this.charLength=0};l.prototype.write=function(e){for(var t="";this.charLength;){var r=e.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:e.length;if(e.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived=55296&&56319>=n)){if(this.charReceived=this.charLength=0,0===e.length)return t;break}this.charLength+=this.surrogateSize,t=""}this.detectIncompleteChar(e);var i=e.length;this.charLength&&(e.copy(this.charBuffer,0,e.length-this.charReceived,i),i-=this.charReceived),t+=e.toString(this.encoding,0,i);var i=t.length-1,n=t.charCodeAt(i);if(n>=55296&&56319>=n){var o=this.surrogateSize;return this.charLength+=o,this.charReceived+=o,this.charBuffer.copy(this.charBuffer,o,0,o),e.copy(this.charBuffer,0,0,o),t.substring(0,i)}return t},l.prototype.detectIncompleteChar=function(e){for(var t=e.length>=3?3:e.length;t>0;t--){var r=e[e.length-t];if(1==t&&r>>5==6){this.charLength=2;break}if(2>=t&&r>>4==14){this.charLength=3;break}if(3>=t&&r>>3==30){this.charLength=4;break}}this.charReceived=t},l.prototype.end=function(e){var t="";if(e&&e.length&&(t=this.write(e)),this.charReceived){var r=this.charReceived,n=this.charBuffer,i=this.encoding;t+=n.slice(0,r).toString(i)}return t}},{buffer:5}],185:[function(e,t){"use stric";var r="\\/\\*",n="\\/\\*(?!\\*?\\!)",i="(.|[\\r\\n]|\\n)*?\\*\\/\\n?\\n?",o=/(^|[^\S\n])(?:\/\/)([\s\S]+?)$/gm,s=/(^|[^\S\n])(?:\/\/[^!])([\s\S]+?)$/gm,a=t.exports=function(e,t){return e?a.block(a.line(e,t),t):""};a.block=function(e,t){t=t||{};var o=new RegExp(r+i,"gm");return t.safe&&(o=new RegExp(n+i,"gm")),e?e.replace(o,""):""},a.line=function(e,t){t=t||{};var r=o;return t.safe&&(r=s),e?e.replace(r,""):""}},{}],186:[function(t,r,n){!function(t,i){"object"==typeof n&&"undefined"!=typeof r?i(n):"function"==typeof e&&e.amd?e(["exports"],i):i(t.topojson=t.topojson||{})}(this,function(e){"use strict";function t(e,t){var n=t.id,i=t.bbox,o=null==t.properties?{}:t.properties,s=r(e,t);return null==n&&null==i?{type:"Feature",properties:o,geometry:s}:null==i?{type:"Feature",id:n,properties:o,geometry:s}:{type:"Feature",id:n,bbox:i,properties:o,geometry:s}}function r(e,t){function r(e,t){t.length&&t.pop();for(var r=f[0>e?~e:e],i=0,o=r.length;o>i;++i)t.push(c(r[i].slice(),i));0>e&&n(t,o)}function i(e){return c(e.slice())}function s(e){for(var t=[],n=0,i=e.length;i>n;++n)r(e[n],t);return t.length<2&&t.push(t[0].slice()),t}function a(e){for(var t=s(e);t.length<4;)t.push(t[0].slice());return t}function u(e){return e.map(a)}function l(e){var t,r=e.type;switch(r){case"GeometryCollection":return{type:r,geometries:e.geometries.map(l)};case"Point":t=i(e.coordinates);break;case"MultiPoint":t=e.coordinates.map(i);break;case"LineString":t=s(e.arcs);break;case"MultiLineString":t=e.arcs.map(s);break;case"Polygon":t=u(e.arcs);break;case"MultiPolygon":t=e.arcs.map(u);break;default:return null}return{type:r,coordinates:t}}var c=o(e),f=e.arcs;return l(t)}var n=function(e,t){for(var r,n=e.length,i=n-t;i<--n;)r=e[i],e[i++]=e[n],e[n]=r},i=function(e){return e},o=function(e){if(null==(t=e.transform))return i;var t,r,n,o=t.scale[0],s=t.scale[1],a=t.translate[0],u=t.translate[1];return function(e,t){return t||(r=n=0),e[0]=(r+=e[0])*o+a,e[1]=(n+=e[1])*s+u,e}},s=function(e,r){return"GeometryCollection"===r.type?{type:"FeatureCollection",features:r.geometries.map(function(r){return t(e,r)})}:t(e,r)};e.feature=s,Object.defineProperty(e,"__esModule",{value:!0})})},{}],187:[function(e,t){(function(e){function r(e,t){function r(){if(!i){if(n("throwDeprecation"))throw new Error(t);n("traceDeprecation")?console.trace(t):console.warn(t),i=!0}return e.apply(this,arguments)}if(n("noDeprecation"))return e;var i=!1;return r}function n(t){try{if(!e.localStorage)return!1}catch(r){return!1}var n=e.localStorage[t];return null==n?!1:"true"===String(n).toLowerCase()}t.exports=r}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],188:[function(e,t,r){arguments[4][92][0].apply(r,arguments)},{dup:92}],189:[function(e,t){t.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},{}],190:[function(e,t,r){(function(t,n){function i(e,t){var n={seen:[],stylize:s};return arguments.length>=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),_(t)?n.showHidden=t:t&&r._extend(n,t),x(n.showHidden)&&(n.showHidden=!1),x(n.depth)&&(n.depth=2),x(n.colors)&&(n.colors=!1),x(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=o),u(n,e,n.depth)}function o(e,t){var r=i.styles[t];return r?"["+i.colors[r][0]+"m"+e+"["+i.colors[r][1]+"m":e}function s(e){return e}function a(e){var t={};return e.forEach(function(e){t[e]=!0}),t}function u(e,t,n){if(e.customInspect&&t&&E(t.inspect)&&t.inspect!==r.inspect&&(!t.constructor||t.constructor.prototype!==t)){var i=t.inspect(n,e);return y(i)||(i=u(e,i,n)),i}var o=l(e,t);if(o)return o;var s=Object.keys(t),_=a(s);if(e.showHidden&&(s=Object.getOwnPropertyNames(t)),T(t)&&(s.indexOf("message")>=0||s.indexOf("description")>=0))return c(t);if(0===s.length){if(E(t)){var m=t.name?": "+t.name:"";return e.stylize("[Function"+m+"]","special")}if(w(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(A(t))return e.stylize(Date.prototype.toString.call(t),"date");if(T(t))return c(t)}var g="",v=!1,b=["{","}"];if(p(t)&&(v=!0,b=["[","]"]),E(t)){var x=t.name?": "+t.name:"";g=" [Function"+x+"]"}if(w(t)&&(g=" "+RegExp.prototype.toString.call(t)),A(t)&&(g=" "+Date.prototype.toUTCString.call(t)),T(t)&&(g=" "+c(t)),0===s.length&&(!v||0==t.length))return b[0]+g+b[1];if(0>n)return w(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special");e.seen.push(t);var k;return k=v?f(e,t,n,_,s):s.map(function(r){return h(e,t,n,_,r,v)}),e.seen.pop(),d(k,g,b)}function l(e,t){if(x(t))return e.stylize("undefined","undefined");if(y(t)){var r="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(r,"string")}return v(t)?e.stylize(""+t,"number"):_(t)?e.stylize(""+t,"boolean"):m(t)?e.stylize("null","null"):void 0}function c(e){return"["+Error.prototype.toString.call(e)+"]"}function f(e,t,r,n,i){for(var o=[],s=0,a=t.length;a>s;++s)o.push(P(t,String(s))?h(e,t,r,n,String(s),!0):"");return i.forEach(function(i){i.match(/^\d+$/)||o.push(h(e,t,r,n,i,!0))}),o}function h(e,t,r,n,i,o){var s,a,l;if(l=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]},l.get?a=l.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):l.set&&(a=e.stylize("[Setter]","special")),P(n,i)||(s="["+i+"]"),a||(e.seen.indexOf(l.value)<0?(a=m(r)?u(e,l.value,null):u(e,l.value,r-1),a.indexOf("\n")>-1&&(a=o?a.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+a.split("\n").map(function(e){return" "+e}).join("\n"))):a=e.stylize("[Circular]","special")),x(s)){if(o&&i.match(/^\d+$/))return a;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+a}function d(e,t,r){var n=0,i=e.reduce(function(e,t){return n++,t.indexOf("\n")>=0&&n++,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?r[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+r[1]:r[0]+t+" "+e.join(", ")+" "+r[1]}function p(e){return Array.isArray(e)}function _(e){return"boolean"==typeof e}function m(e){return null===e}function g(e){return null==e}function v(e){return"number"==typeof e}function y(e){return"string"==typeof e}function b(e){return"symbol"==typeof e}function x(e){return void 0===e}function w(e){return k(e)&&"[object RegExp]"===R(e)}function k(e){return"object"==typeof e&&null!==e}function A(e){return k(e)&&"[object Date]"===R(e)}function T(e){return k(e)&&("[object Error]"===R(e)||e instanceof Error)}function E(e){return"function"==typeof e}function S(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function R(e){return Object.prototype.toString.call(e)}function M(e){return 10>e?"0"+e.toString(10):e.toString(10)}function O(){var e=new Date,t=[M(e.getHours()),M(e.getMinutes()),M(e.getSeconds())].join(":");return[e.getDate(),L[e.getMonth()],t].join(" ")}function P(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var z=/%[sdj%]/g;r.format=function(e){if(!y(e)){for(var t=[],r=0;r=o)return e;switch(e){case"%s":return String(n[r++]);case"%d":return Number(n[r++]);case"%j":try{return JSON.stringify(n[r++])}catch(t){return"[Circular]"}default:return e}}),a=n[r];o>r;a=n[++r])s+=m(a)||!k(a)?" "+a:" "+i(a);return s},r.deprecate=function(e,i){function o(){if(!s){if(t.throwDeprecation)throw new Error(i);t.traceDeprecation?console.trace(i):console.error(i),s=!0}return e.apply(this,arguments)}if(x(n.process))return function(){return r.deprecate(e,i).apply(this,arguments)};if(t.noDeprecation===!0)return e;var s=!1;return o};var N,j={};r.debuglog=function(e){if(x(N)&&(N=t.env.NODE_DEBUG||""),e=e.toUpperCase(),!j[e])if(new RegExp("\\b"+e+"\\b","i").test(N)){var n=t.pid;j[e]=function(){var t=r.format.apply(r,arguments);console.error("%s %d: %s",e,n,t)}}else j[e]=function(){};return j[e]},r.inspect=i,i.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},i.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},r.isArray=p,r.isBoolean=_,r.isNull=m,r.isNullOrUndefined=g,r.isNumber=v,r.isString=y,r.isSymbol=b,r.isUndefined=x,r.isRegExp=w,r.isObject=k,r.isDate=A,r.isError=T,r.isFunction=E,r.isPrimitive=S,r.isBuffer=e("./support/isBuffer");var L=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];r.log=function(){console.log("%s - %s",O(),r.format.apply(r,arguments))},r.inherits=e("inherits"),r._extend=function(e,t){if(!t||!k(t))return e;for(var r=Object.keys(t),n=r.length;n--;)e[r[n]]=t[r[n]];return e}}).call(this,e("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./support/isBuffer":189,_process:177,inherits:188}],191:[function(e,t){t.exports.VectorTile=e("./lib/vectortile.js"),t.exports.VectorTileFeature=e("./lib/vectortilefeature.js"),t.exports.VectorTileLayer=e("./lib/vectortilelayer.js")},{"./lib/vectortile.js":192,"./lib/vectortilefeature.js":193,"./lib/vectortilelayer.js":194}],192:[function(e,t){"use strict";function r(e,t){this.layers=e.readFields(n,{},t)}function n(e,t,r){if(3===e){var n=new i(r,r.readVarint()+r.pos);n.length&&(t[n.name]=n)}}var i=e("./vectortilelayer");t.exports=r},{"./vectortilelayer":194}],193:[function(e,t){"use strict";function r(e,t,r,i,o){this.properties={},this.extent=r,this.type=0,this._pbf=e,this._geometry=-1,this._keys=i,this._values=o,e.readFields(n,this,t)}function n(e,t,r){1==e?t._id=r.readVarint():2==e?i(r,t):3==e?t.type=r.readVarint():4==e&&(t._geometry=r.pos)}function i(e,t){for(var r=e.readVarint()+e.pos;e.pos>3}if(i--,1===n||2===n)s+=e.readSVarint(),a+=e.readSVarint(),1===n&&(t&&u.push(t),t=[]),t.push(new o(s,a));else{if(7!==n)throw new Error("unknown command "+n);t.push(t[0].clone())}}return t&&u.push(t),u},r.prototype.bbox=function(){var e=this._pbf;e.pos=this._geometry;for(var t=e.readVarint()+e.pos,r=1,n=0,i=0,o=0,s=1/0,a=-1/0,u=1/0,l=-1/0;e.pos>3}if(n--,1===r||2===r)i+=e.readSVarint(),o+=e.readSVarint(),s>i&&(s=i),i>a&&(a=i),u>o&&(u=o),o>l&&(l=o);else if(7!==r)throw new Error("unknown command "+r)}return[s,u,a,l]},r.prototype.toGeoJSON=function(e,t,n){for(var i=this.extent*Math.pow(2,n),o=this.extent*e,s=this.extent*t,a=this.loadGeometry(),u=r.types[this.type],l=0;l>3;t=1===n?e.readString():2===n?e.readFloat():3===n?e.readDouble():4===n?e.readVarint64():5===n?e.readVarint():6===n?e.readSVarint():7===n?e.readBoolean():null}return t}var o=e("./vectortilefeature.js");t.exports=r,r.prototype.feature=function(e){if(0>e||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];var t=this._pbf.readVarint()+this._pbf.pos;return new o(this._pbf,t,this.extent,this._keys,this._values)}},{"./vectortilefeature.js":193}],195:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function i(e,t,r){var n=u[0],i=u[1];return e[0]<=n.x+r&&t[0]<=n.x+r||e[0]>=i.x-r&&t[0]>=i.x-r||e[1]>=n.y-r&&t[1]>=n.y-r||e[1]<=i.y+r&&t[1]<=i.y+r?!0:!1}function o(e,t){t=t||0;var r=u[0],n=u[1];return e[0]<=r.x+t||e[0]>=n.x-t||e[1]>=r.y-t||e[1]<=n.y+t}Object.defineProperty(r,"__esModule",{value:!0}),r.default_uvs=r.tile_bounds=void 0,r.outsideTile=i,r.isCoordOutsideTile=o;{var s=e("../geo"),a=n(s),u=r.tile_bounds=[{x:0,y:0},{x:a.default.tile_scale,y:-a.default.tile_scale}];r.default_uvs=[0,0,1,1]}},{"../geo":200}],196:[function(e,t,r){"use strict";function n(e,t,r,n,s){var a=n.texcoord_index,u=n.position_index,l=n.shape_index,c=n.offset_index,f=s.quad,h=s.quad_normalize,d=s.offset,p=s.angle,_=s.shape_w,m=s.texcoord_scale,g=s.texcoord_normalize;h=h||1;var v=f[0]/2*h,y=f[1]/2*h,b=[[-v,-y],[v,-y],[v,y],[-v,y]],x=t.vertex_elements,w=t.vertex_count,k=void 0;if(a){g=g||1;var A=m||o.default_uvs,T=i(A,4),E=T[0],S=T[1],R=T[2],M=T[3];k=[[E,S],[R,S],[R,M],[E,M]]}for(var O=e.length,P=0;O>P;P++){for(var z=e[P],N=0;4>N;N++)a&&(r[a+0]=k[N][0]*g,r[a+1]=k[N][1]*g),r[u+0]=z[0],r[u+1]=z[1],r[l+0]=b[N][0],r[l+1]=b[N][1],r[l+2]=p,r[l+3]=_,r[c+0]=d[0],r[c+1]=d[1],t.addVertex(r);x.push(w+0),x.push(w+1),x.push(w+2),x.push(w+2),x.push(w+3),x.push(w+0),w+=4}}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){var r=[],n=!0,i=!1,o=void 0;try{for(var s,a=e[Symbol.iterator]();!(n=(s=a.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(u){i=!0,o=u}finally{try{!n&&a["return"]&&a["return"]()}finally{if(i)throw o}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();r.buildQuadsForPoints=n;var o=e("./common")},{"./common":195}],197:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function i(e,t,r,n){var i=n.texcoord_index,o=n.texcoord_scale,u=n.texcoord_normalize,c=t.vertex_elements;if(i){u=u||1;var f=o||h.default_uvs,d=a(f,4),_=d[0],m=d[1],g=d[2],v=d[3]}for(var y=e.length,b=0;y>b;b++){var x=t.vertex_count,w=e[b];if(i)var k=l.default.findBoundingBox(w),A=a(k,4),T=A[0],E=A[1],S=A[2],R=A[3],M=S-T,O=R-E,P=(g-_)/M,z=(v-m)/O;for(var N=0;Nz;z++)for(var N=e[z],j=0;j2&&r.push(e.slice(1)));if(c=w.default.normalize(w.default.perp(n,i)),y&&T.outsideTile(n,i,x)){var P=a(e,0,x);return void(P&&r.push(P))}g?(o=w.default.normalize(w.default.perp(e[e.length-2],n)),u(n,o,c,_,t)):(T.isCoordOutsideTile(n)||(v(n,E,c,m,!0,t),m!==S.butt&&(E+=.5*k*t.texcoord_width)),p(n,c,[1,E],t),p(n,w.default.neg(c),[0,E],t)),E+=k*w.default.length(w.default.sub(i,n));for(var z=1;z=2?e.slice(n):!1}function u(e,t,r,n,i){if(void 0===n||T.isCoordOutsideTile(e))p(e,r,[1,0],i),p(e,w.default.neg(r),[0,0],i);else{var o=0;n===R.miter?f(o,e,t,r,i.miter_len_sq,!0,i):h(n,o,e,t,r,!0,i)}}function l(e,t,r,n,i,o){if(T.isCoordOutsideTile(e))p(e,t,[1,i],o),p(e,w.default.neg(t),[0,i],o),d(1,o);else{var s=c(t,r);n===R.miter&&w.default.lengthSq(s)>o.miter_len_sq&&(n=R.bevel),n===R.miter?(p(e,s,[1,i],o),p(e,w.default.neg(s),[0,i],o),d(1,o)):(p(e,t,[1,i],o),p(e,w.default.neg(t),[0,i],o),d(1,o))}}function c(e,t){var r=w.default.normalize(w.default.add(e,t)),n=2/(1+Math.abs(w.default.dot(e,r)));return w.default.mult(r,n*n)}function f(e,t,r,n,i,o,s){var a=c(r,n);w.default.lengthSq(a)>i?h(R.miter,e,t,r,n,o,s):(p(t,a,[1,e],s),p(t,w.default.neg(a),[0,e],s),o||d(1,s))}function h(e,t,r,n,i,o,s){var a=c(n,i),u=i[0]*n[1]-i[1]*n[0]>0;u?(p(r,a,[1,t],s),p(r,w.default.neg(n),[0,t],s),o||d(1,s),e===R.bevel?g(r,w.default.neg(n),a,w.default.neg(i),[0,t],[1,t],[0,t],s):e===R.round&&m(r,w.default.neg(n),a,w.default.neg(i),[0,t],[1,t],[0,t],!1,s),p(r,a,[1,t],s),p(r,w.default.neg(i),[0,t],s)):(p(r,n,[1,t],s),p(r,w.default.neg(a),[0,t],s),o||d(1,s),e===R.bevel?g(r,n,w.default.neg(a),i,[1,t],[0,t],[1,t],s):e===R.round&&m(r,n,w.default.neg(a),i,[1,t],[0,t],[1,t],!1,s),p(r,i,[1,t],s),p(r,w.default.neg(a),[0,t],s))}function d(e,t){for(var r=t.vertex_data.vertex_elements,n=t.vertex_data.vertex_count,i=n-2*e-2,o=0;e>o;o++)r.push(i+2*o+2),r.push(i+2*o+1),r.push(i+2*o+0),r.push(i+2*o+2),r.push(i+2*o+3),r.push(i+2*o+1)}function p(e,t,r,n){var i=n.vertex_template,o=n.vertex_data;_(i,e,r,t,n),o.addVertex(i)}function _(e,t,r,n,i){e[0]=t[0],e[1]=t[1],i.texcoord_index&&r&&(e[i.texcoord_index+0]=r[0]*i.texcoord_normalize,e[i.texcoord_index+1]=r[1]*i.texcoord_normalize),i.scaling_index&&(e[i.scaling_index+0]=n[0]*i.scaling_normalize,e[i.scaling_index+1]=n[1]*i.scaling_normalize,e[i.scaling_index+2]=i.half_width)}function m(e,t,r,n,i,o,s,a,u){for(var l=t[0]*n[1]-t[1]*n[0],c=w.default.dot(t,n),f=Math.atan2(l,c);f>=Math.PI;)f-=2*Math.PI;var h=y(f,u.half_width);if(!(1>h)){var d=u.vertex_data.vertex_count,_=u.vertex_data.vertex_elements;p(e,r,o,u),p(e,t,i,u);var m=t;if(void 0!==u.texcoord_index){var g;if(a){g=[];var v=w.default.sub(i,o)}else{g=w.default.set(i);var b=w.default.div(w.default.sub(s,i),h)}}for(var x=f/h,k=0;h>k;k++)m=w.default.rot(m,x),void 0!==u.texcoord_index&&(a?(v=w.default.rot(v,x),g[0]=v[0]+o[0],g[1]=v[1]*u.texcoord_width*u.v_scale+o[1]):g=w.default.add(g,b)),p(e,m,g,u),_.push(d+k+(l>0?2:1)),_.push(d),_.push(d+k+(l>0?1:2))}}function g(e,t,r,n,i,o,s,a){var u=a.vertex_data.vertex_count;p(e,r,o,a),p(e,t,i,a),p(e,n,s,a);var l=t[0]*n[1]-t[1]*n[0]>0,c=a.vertex_data.vertex_elements;l?(c.push(u+2),c.push(u+0),c.push(u+1)):(c.push(u+1),c.push(u+0),c.push(u+2))}function v(e,t,r,n,i,o){var s=w.default.neg(r);switch(n){case S.square:var a;i?(a=[r[1],-r[0]],p(e,w.default.add(r,a),[1,t],o),p(e,w.default.add(s,a),[0,t],o),t+=.5*o.texcoord_width*o.v_scale,p(e,r,[1,t],o),p(e,s,[0,t],o)):(a=[-r[1],r[0]],p(e,r,[1,t],o),p(e,s,[0,t],o),t+=.5*o.texcoord_width*o.v_scale,p(e,w.default.add(r,a),[1,t],o),p(e,w.default.add(s,a),[0,t],o)),d(1,o);break;case S.round:var u,l,c,f,h;i?(u=r,l=s,void 0!==o.texcoord_index&&(t+=.5*o.texcoord_width*o.v_scale,c=[1,t],f=[0,t],h=[.5,t])):(u=s,l=r,void 0!==o.texcoord_index&&(c=[0,t],f=[1,t],h=[.5,t])),m(e,u,E,l,c,h,f,!0,o);break;case S.butt:return}}function y(e,t){0>e&&(e=-e);var r=t>2*M.MIN_FAN_WIDTH?Math.log2(t/M.MIN_FAN_WIDTH):1;return Math.ceil(e/Math.PI*r)}function b(e,t){for(var r=[],n=0;n2&&void 0!==arguments[2]?arguments[2]:{};s(this,e),this.view=r,this.position=n.position,this.zoom=n.zoom}return u(e,[{key:"update",value:function(){}},{key:"setupProgram",value:function(){}},{key:"updateView",value:function(){if(this.position||this.zoom){var e={};this.position&&(e={lng:this.position[0],lat:this.position[1],zoom:this.position[2]}),this.zoom&&(e.zoom=this.zoom),this.view.setView(e)}}},{key:"setupMatrices",value:function(e,t){d.mat4.multiply(e.model_view32,this.view_matrix,e.model),t.uniform("Matrix4fv","u_modelView",e.model_view32),d.mat3.normalFromMat4(e.normal32,e.model_view32),d.mat3.invert(e.inverse_normal32,e.normal32),t.uniform("Matrix3fv","u_normalMatrix",e.normal32),t.uniform("Matrix3fv","u_inverseNormalMatrix",e.inverse_normal32)}}],[{key:"create",value:function(e,t,r){switch(r.type){case"isometric":return new m(e,t,r);case"flat":return new g(e,t,r);case"perspective":default:return new _(e,t,r)}}}]),e}();r.default=p;var _=function(e){function t(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};s(this,t);var o=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r,n));return o.type="perspective",o.focal_length=n.focal_length,o.fov=n.fov,o.focal_length||o.fov||(o.focal_length=[[16,2],[17,2.5],[18,3],[19,4],[20,6]]),o.vanishing_point=n.vanishing_point||[0,0],o.vanishing_point=o.vanishing_point.map(parseFloat),o.vanishing_point_skew=[],o.position_meters=null,o.view_matrix=new Float64Array(16),o.projection_matrix=new Float32Array(16),h.default.replaceBlock("camera","\n uniform mat4 u_projection;\n uniform vec3 u_eye;\n uniform vec2 u_vanishing_point;\n\n void cameraProjection (inout vec4 position) {\n position = u_projection * position;\n }"),o}return o(t,e),u(t,[{key:"constrainCamera",value:function(e){var t=e.view_height,r=e.height,n=e.focal_length,i=e.fov;return r?(n=2*r/t,i=2*Math.atan(1/n)):(n?i=2*Math.atan(1/n):i&&(i=i*Math.PI/180,n=1/Math.tan(i/2)),r=t/2*n),{view_height:t,height:r,focal_length:n,fov:i}}},{key:"updateMatrices",value:function(){var e=this.view.size.css.height*this.view.meters_per_pixel,t=this.constrainCamera({view_height:e,focal_length:c.default.interpolate(this.view.zoom,this.focal_length),fov:c.default.interpolate(this.view.zoom,this.fov)}),r=t.height,n=t.fov,i=[this.view.center.meters.x,this.view.center.meters.y,r];this.position_meters=i,d.mat4.lookAt(this.view_matrix,d.vec3.fromValues(i[0],i[1],0),d.vec3.fromValues(i[0],i[1],-1),d.vec3.fromValues(0,1,0)),d.mat4.perspective(this.projection_matrix,n,this.view.aspect,1,2*r),this.vanishing_point_skew[0]=this.vanishing_point[0]/this.view.size.css.width,this.vanishing_point_skew[1]=this.vanishing_point[1]/this.view.size.css.height,this.projection_matrix[8]=2*-this.vanishing_point_skew[0],this.projection_matrix[9]=2*-this.vanishing_point_skew[1],d.mat4.translate(this.projection_matrix,this.projection_matrix,d.vec3.fromValues(e/2*this.view.aspect*2*-this.vanishing_point_skew[0],e/2*2*-this.vanishing_point_skew[1],0)),d.mat4.translate(this.projection_matrix,this.projection_matrix,d.vec3.fromValues(0,0,-r))}},{key:"update",value:function(){a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"update",this).call(this),this.updateMatrices()}},{key:"setupProgram",value:function(e){e.uniform("Matrix4fv","u_projection",this.projection_matrix),e.uniform("3f","u_eye",[0,0,this.position_meters[2]]),e.uniform("2fv","u_vanishing_point",this.vanishing_point_skew)}}]),t}(p),m=function(e){function t(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};s(this,t);var o=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r,n));return o.type="isometric",o.axis=n.axis||{x:0,y:1},2===o.axis.length&&(o.axis={x:o.axis[0],y:o.axis[1]}),o.position_meters=null,o.viewport_height=null,o.view_matrix=new Float64Array(16),o.projection_matrix=new Float32Array(16),h.default.replaceBlock("camera","\n uniform mat4 u_projection;\n uniform vec3 u_eye;\n uniform vec2 u_vanishing_point;\n\n void cameraProjection (inout vec4 position) {\n position = u_projection * position;\n // position.xy += position.z * u_isometric_axis;\n\n // Reverse z for depth buffer so up is negative,\n // and scale down values so objects higher than one screen height will not get clipped\n // pull forward slightly to avoid going past far clipping plane\n position.z = -position.z / 100. + 1. - 0.001;\n }"),o}return o(t,e),u(t,[{key:"update",value:function(){a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"update",this).call(this),this.viewport_height=this.view.size.css.height*this.view.meters_per_pixel;var e=[this.view.center.meters.x,this.view.center.meters.y,this.viewport_height];this.position_meters=e,d.mat4.identity(this.view_matrix),d.mat4.translate(this.view_matrix,this.view_matrix,d.vec3.fromValues(-e[0],-e[1],0)),d.mat4.identity(this.projection_matrix),this.projection_matrix[8]=this.axis.x/this.view.aspect,this.projection_matrix[9]=this.axis.y,d.mat4.scale(this.projection_matrix,this.projection_matrix,d.vec3.fromValues(2/this.view.size.meters.x,2/this.view.size.meters.y,2/this.view.size.meters.y))}},{key:"setupProgram",value:function(e){e.uniform("Matrix4fv","u_projection",this.projection_matrix),e.uniform("3fv","u_eye",[0,0,this.viewport_height]),e.uniform("2fv","u_vanishing_point",[0,0])}}]),t}(p),g=function(e){function t(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};s(this,t);var o=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r,n));return o.type="flat",o}return o(t,e),u(t,[{key:"update",value:function(){this.axis.x=0,this.axis.y=0,a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"update",this).call(this)}}]),t}(m)},{"./gl/shader_program":206,"./utils/gl-matrix":254,"./utils/utils":263}],200:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,i=function(){function e(e,t){var r=[],n=!0,i=!1,o=void 0;try{for(var s,a=e[Symbol.iterator]();!(n=(s=a.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(u){i=!0,o=u}finally{try{!n&&a["return"]&&a["return"]()}finally{if(i)throw o}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();r.default=n={},n.default_source_max_zoom=18,n.default_view_max_zoom=20,n.tile_size=256,n.half_circumference_meters=20037508.342789244,n.circumference_meters=2*n.half_circumference_meters,n.min_zoom_meters_per_pixel=n.circumference_meters/n.tile_size;var o=[];n.metersPerPixel=function(e){return o[e]=o[e]||n.min_zoom_meters_per_pixel/Math.pow(2,e),o[e]};var s=[];n.metersPerTile=function(e){return s[e]=s[e]||n.circumference_meters/Math.pow(2,e),s[e]},n.tile_scale=4096,n.units_per_pixel=n.tile_scale/n.tile_size,n.height_scale=16;var a=[];n.unitsPerMeter=function(e){return a[e]=a[e]||n.tile_scale/(n.tile_size*n.metersPerPixel(e)),a[e]},n.metersForTile=function(e){return{x:e.x*n.circumference_meters/Math.pow(2,e.z)-n.half_circumference_meters,y:-(e.y*n.circumference_meters/Math.pow(2,e.z)-n.half_circumference_meters)}},n.tileForMeters=function(e,t){var r=i(e,2),o=r[0],s=r[1];return{x:Math.floor((o+n.half_circumference_meters)/(n.circumference_meters/Math.pow(2,t))),y:Math.floor((-s+n.half_circumference_meters)/(n.circumference_meters/Math.pow(2,t))),z:t}},n.wrapTile=function(e){var t=e.x,r=e.y,n=e.z,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{x:!0,y:!1},o=(1<180||-180>e)&&(e=((e+180)%360+360)%360-180),e},n.transformGeometry=function(e,t){null!=e&&("Point"===e.type?t(e.coordinates):"LineString"===e.type||"MultiPoint"===e.type?e.coordinates.forEach(t):"Polygon"===e.type||"MultiLineString"===e.type?e.coordinates.forEach(function(e){return e.forEach(t)}):"MultiPolygon"===e.type&&e.coordinates.forEach(function(e){e.forEach(function(e){return e.forEach(t)})}))},n.boxIntersect=function(e,t){return!(t.sw.x>e.ne.x||t.ne.xe.ne.y||t.ne.ys;s++){var a=e[0][s];a[0]r&&(r=a[0]),a[1]>i&&(i=a[1])}return[t,n,r,i]},n.geometryType=function(e){return"Polygon"===e||"MultiPolygon"===e?"polygon":"LineString"===e||"MultiLineString"===e?"line":"Point"===e||"MultiPoint"===e?"point":void 0},n.centroid=function(e){for(var t=0,r=0,n=0,i=e[0],o=i.length,s=0,a=o-1;o>s;a=s,s++){var u=i[s],l=i[a],c=u[1]*l[0]-l[1]*u[0];t+=(u[0]+l[0])*c,r+=(u[1]+l[1])*c,n+=3*c}return[t/n,r/n]},n.multiCentroid=function(e){for(var t=e.length,r=[0,0],i=0;in;n++){var i=e[n],o=e[n+1];t+=i[0]*o[1]-o[0]*i[1]}return t+=e[r-1][0]*e[0][1]-e[0][0]*e[r-1][1]},n.polygonRingArea=function(e){return Math.abs(n.signedPolygonRingAreaSum(e))/2},n.polygonArea=function(e){return n.polygonRingArea(e[0])},n.multiPolygonArea=function(e){for(var t=0,r=0;r0?"CW":0>t?"CCW":void 0}},{}],201:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;r.default=n={},n.BYTE=5120,n.UNSIGNED_BYTE=5121,n.SHORT=5122,n.UNSIGNED_SHORT=5123,n.INT=5124,n.UNSIGNED_INT=5125,n.FLOAT=5126},{}],202:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;r.default=n={},n.getContext=function(e,t){var r=!1;null==e&&(e=document.createElement("canvas"),e.style.position="absolute",e.style.top=0,e.style.left=0,e.style.zIndex=-1,document.body.appendChild(e),r=!0);var i=e.getContext("webgl",t)||e.getContext("experimental-webgl",t);if(!i)throw new Error("Couldn't create WebGL context.");return r?(n.resize(i,window.innerWidth,window.innerHeight,t.device_pixel_ratio),window.addEventListener("resize",function(){n.resize(i,window.innerWidth,window.innerHeight,t.device_pixel_ratio)})):n.resize(i,parseFloat(e.style.width),parseFloat(e.style.height),t.device_pixel_ratio),i},n.resize=function(e,t,r,n){n=n||window.devicePixelRatio||1,e.canvas.style.width=t+"px",e.canvas.style.height=r+"px",e.canvas.width=Math.round(t*n),e.canvas.height=Math.round(r*n),e.bindFramebuffer(e.FRAMEBUFFER,null),e.viewport(0,0,e.canvas.width,e.canvas.height)}},{}],203:[function(e,t,r){"use strict";function n(e,t){var r=i.filter(function(t){return t[0]===e})[0];return r=r&&r[1],r||(i.push([e,{}]),r=i[i.length-1][1]),r[t]||(r[t]=e.getExtension(t)),r[t]}Object.defineProperty(r,"__esModule",{value:!0}),r.default=n;var i=[]},{}],204:[function(e,t,r){"use strict";function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t=2&&o.length<=4?t.push({type:"vec"+o.length,method:o.length+"fv",name:r,value:o,key:i,uniforms:e}):o.length>4&&t.push({type:"float[]",method:"1fv",name:r+"[0]",value:o,key:i,uniforms:e});else if("string"==typeof o[0])for(n=0;n=2&&o[0].length<=4)for(n=0;n=2&&t.length<=4?r="vec"+t.length:(r="float",n=t.length):"string"==typeof t[0]&&(r="sampler2D",n=t.length):"boolean"==typeof t?r="bool":"string"==typeof t&&(r="sampler2D");var i="";return i+=r+" "+e,n&&(i+="["+n+"]"),i+=";\n"},i.defineUniform=function(e,t){return"uniform "+i.defineVariable(e,t)},i.isUniformDefined=function(e,t){var r=new RegExp("uniform[^;]+(?:{[\\s\\S]*})?[^;]*\\b"+e+"\\b","g");return t.match(r)?!0:!1},i.isSymbolReferenced=function(e,t){var r=new RegExp("\\b"+e+"\\b","g");return t.search(r)>=0?!0:!1},i.expandVec3=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=void 0;if(Array.isArray(e)){if(2!==e.length)return e;r=[].concat(n(e),[t]).map(parseFloat)}else r=[e,e,e].map(parseFloat);return r&&r.every(function(e){return"number"==typeof e&&!isNaN(e)})?r:void 0},i.expandVec4=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=void 0;if(Array.isArray(e)){if(3!==e.length)return e;r=[].concat(n(e),[t]).map(parseFloat)}else r=[e,e,e,t].map(parseFloat);return r&&r.every(function(e){return"number"==typeof e&&!isNaN(e)})?r:void 0}},{}],205:[function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r0?"precision highp float;\n":"precision mediump float;\n",i.TANGRAM_VERTEX_SHADER=!0,i.TANGRAM_FRAGMENT_SHADER=!1,this.computed_vertex_source=h+d+e.buildDefineString(i)+this.computed_vertex_source,i.TANGRAM_VERTEX_SHADER=!1,i.TANGRAM_FRAGMENT_SHADER=!0,this.computed_fragment_source=e.buildExtensionString(n)+h+d+e.buildDefineString(i)+this.computed_fragment_source,this.computed_vertex_source=this.computed_vertex_source.replace(b,""),this.computed_fragment_source=this.computed_fragment_source.replace(b,"");try{this.program=e.updateProgram(this.gl,this.program,this.computed_vertex_source,this.computed_fragment_source),this.compiled=!0,this.compiling=!1}catch(_){throw this.program=null,this.compiled=!1,this.compiling=!1,this.error=_,("vertex"===_.type||"fragment"===_.type)&&(this.shader_errors=_.errors,this.shader_errors.forEach(function(e){e.type=_.type,e.block=t.block(_.type,e.line)})),new Error("ShaderProgram.compile(): program "+this.id+" ("+this.name+") error:",_)}this.use(),this.refreshUniforms(),this.refreshAttributes()}},{key:"buildDefineList",value:function(){var t,r={};for(t in e.defines)r[t]=e.defines[t];for(t in this.defines)r[t]=this.defines[t];return r}},{key:"buildShaderBlockList",value:function(){var t=void 0,r={};for(t in e.blocks)if(r[t]=[],Array.isArray(e.blocks[t])){var n;(n=r[t]).push.apply(n,i(e.blocks[t].map(function(e,r){return{key:t,source:e,num:r,scope:"ShaderProgram"}})))}else r[t]=[{key:t,source:e.blocks[t],num:0,scope:"ShaderProgram"}];for(t in this.blocks)if(r[t]=r[t]||[],Array.isArray(this.blocks[t]))for(var o=this.block_scopes&&this.block_scopes[t]||[],s=null,a=0,u=0;u0&&(this.computed_vertex_source=i.join("\n")+this.computed_vertex_source),o.length>0&&(this.computed_fragment_source=o.join("\n")+this.computed_fragment_source)}}},{key:"setUniforms",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:!0;if(this.compiled){t&&(this.texture_unit=0);for(var r=c.default.parseUniforms(e),n=0;ni&&i1?r={scope:s[1],name:s[2],num:s[3]}:(s=o.match(/\/\/ tangram-block-end: ([A-Za-z0-9_-]+), ([A-Za-z0-9_-]+), (\d+)/),s&&s.length>1&&(r=null)),r&&(r.line=null==r.line?-1:r.line+1,r.source=o)}return r}},{key:"checkExtensions",value:function(){var e=this,t=[];return this.extensions.forEach(function(r){var n=p.default(e.gl,r),i="TANGRAM_EXTENSION_"+r;e.defines[i]=null!=n,n?t.push(r):u.default("debug","Could not enable extension '"+r+"'")}),t}}]),e}();r.default=x,x.id=0,x.programs={},x.current=null,x.defines={},x.blocks={},x.buildDefineString=function(e){var t="";for(var r in e)null!=e[r]&&e[r]!==!1&&(t+="boolean"==typeof e[r]&&e[r]===!0?"#define "+r+"\n":"number"==typeof e[r]&&Math.floor(e[r])===e[r]?"#define "+r+" "+e[r].toFixed(1)+"\n":"#define "+r+" "+e[r]+"\n");return t},x.buildExtensionString=function(e){e=e||[];var t="";return e.forEach(function(e){t+="#ifdef GL_"+e+"\n#extension GL_"+e+" : enable\n#endif\n"}),t},x.addBlock=function(e){var t;x.blocks[e]=x.blocks[e]||[];for(var r=arguments.length,n=Array(r>1?r-1:0),i=1;r>i;i++)n[i-1]=arguments[i];(t=x.blocks[e]).push.apply(t,n)},x.removeBlock=function(e){x.blocks[e]=[]},x.replaceBlock=function(e){x.removeBlock(e);for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;t>n;n++)r[n-1]=arguments[n];x.addBlock.apply(x,[e].concat(r))},x.updateProgram=function(e,t,r,n){try{var i=x.createShader(e,r,e.VERTEX_SHADER),o=x.createShader(e,n,e.FRAGMENT_SHADER)}catch(s){throw u.default("error",s.message),s}if(e.useProgram(null),null!=t)for(var a=e.getAttachedShaders(t),l=0;l2&&void 0!==arguments[2]?arguments[2]:{};i(this,e),this.gl=t,this.texture=t.createTexture(),this.texture&&(this.valid=!0),this.bind(),this.name=r,this.retain_count=0,this.source=null,this.source_type=null,this.config_type=null,this.loading=null,this.loaded=!1,this.filtering=n.filtering,this.sprites=n.sprites,this.texcoords={},this.sizes={},this.setData(1,1,new Uint8Array([0,0,0,255]),{filtering:"nearest"}),e.textures[this.name]&&(this.retain_count=e.textures[this.name].retain_count,e.textures[this.name].retain_count=0,e.textures[this.name].destroy()),e.textures[this.name]=this,e.texture_configs[this.name]=Object.assign({name:r},n),this.load(n),a.default("trace","creating Texture "+this.name)}return o(e,[{key:"destroy",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=t.force;return this.retain_count>0&&!r?void a.default("error","Texture '"+this.name+"': destroying texture with retain count of '"+this.retain_count+"'"):void(this.valid&&(this.gl.deleteTexture(this.texture),this.texture=null,delete this.data,this.data=null,delete e.textures[this.name],this.valid=!1,a.default("trace","destroying Texture "+this.name)))}},{key:"retain",value:function(){this.retain_count++}},{key:"release",value:function(){this.retain_count<=0&&a.default("error","Texture '"+this.name+"': releasing texture with retain count of '"+this.retain_count+"'"),this.retain_count--,this.retain_count<=0&&this.destroy()}},{key:"bind",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.valid&&(e.activeUnit!==t&&(this.gl.activeTexture(this.gl.TEXTURE0+t),e.activeUnit=t,e.boundTexture=null),e.boundTexture!==this.texture&&(this.gl.bindTexture(this.gl.TEXTURE_2D,this.texture),e.boundTexture=this.texture))}},{key:"load",value:function(e){var t=this;return e?(this.loading=null,"string"==typeof e.url?(this.config_type="url",this.setUrl(e.url,e)):e.element?(this.config_type="element",this.setElement(e.element,e)):e.data&&e.width&&e.height&&(this.config_type="data",this.setData(e.width,e.height,e.data,e)),this.loading=this.loading&&this.loading.then(function(){return t.calculateSprites(),t})||Promise.resolve(this),this.loading):this.loading||Promise.resolve(this)}},{key:"setUrl",value:function(t){var r=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.valid?(this.url=t,this.source=this.url,this.source_type="url",this.loading=new Promise(function(t){var i=new Image;i.onload=function(){try{r.setElement(i,n)}catch(o){r.loaded=!1,a.default("warn","Texture '"+r.name+"': failed to load url: '"+r.source+"'",o,n),e.trigger("warning",{message:"Failed to load texture from "+r.source,error:o,texture:n})}r.loaded=!0,t(r)},i.onerror=function(i){r.loaded=!1,a.default("warn","Texture '"+r.name+"': failed to load url: '"+r.source+"'",i,n),e.trigger("warning",{message:"Failed to load texture from "+r.source,error:i,texture:n}),t(r)},l.default.isSafari()&&"data:"===r.source.slice(0,5)||(i.crossOrigin="anonymous"),i.src=r.source}),this.loading):void 0}},{key:"setData",value:function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.width=e,this.height=t,this.source=r,this.source_type="data",Array.isArray(this.source)&&(this.source=new Uint8Array(this.source)),this.update(n),this.setFiltering(n),this.loaded=!0,this.loading=Promise.resolve(this),this.loading}},{key:"setElement",value:function(t,r){var n=t;if("string"==typeof t&&(t=document.querySelector(t)),t instanceof HTMLCanvasElement||t instanceof HTMLImageElement||t instanceof HTMLVideoElement)this.source=t,this.source_type="element",this.update(r),this.setFiltering(r);else{this.loaded=!1;var i="the 'element' parameter (`element: "+JSON.stringify(n)+"`) must be a CSS ";i+="selector string, or a , or