(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o elø1 ? (function () { return minø1 = elø1; })() : void 0; }.call(this)); return loop[0] = 1 + iø1, loop; })() : void 0; } while (iø1 = loop[0], recur === loop); return recur; }.call(this); }.call(this)); return function () { var spanø1 = maxø1 - minø1; return function () { var G__2ø1 = hm.length; return function loop() { var recur = loop; var iø1 = 0; do { recur = iø1 < G__2ø1 ? (function () { hm[iø1] = (hm[iø1] - minø1) / spanø1; return loop[0] = 1 + iø1, loop; })() : void 0; } while (iø1 = loop[0], recur === loop); return recur; }.call(this); }.call(this); }.call(this); }.call(this); }; var zeroHeightmap = exports.zeroHeightmap = function zeroHeightmap(heightmap) { (function () { var G__3ø1 = heightmap.length; return function loop() { var recur = loop; var iø1 = 0; do { recur = iø1 < G__3ø1 ? (function () { heightmap[iø1] = 0; return loop[0] = 1 + iø1, loop; })() : void 0; } while (iø1 = loop[0], recur === loop); return recur; }.call(this); }.call(this)); return heightmap; }; var makeHeightmap = exports.makeHeightmap = function makeHeightmap(exponent) { return function () { var resolutionø1 = 1 + Math.pow(2, exponent); l('Creating ' + resolutionø1 + ' by ' + resolutionø1 + ' heightmap...'); var heightmap = new Array(resolutionø1 * resolutionø1); heightmap.resolution = resolutionø1; heightmap.exponent = exponent; heightmap.last = resolutionø1 - 1; return zeroHeightmap(heightmap); }.call(this); }; var randomNoise = exports.randomNoise = function randomNoise(heightmap) { return function () { var G__4ø1 = heightmap.length; return function loop() { var recur = loop; var iø1 = 0; do { recur = iø1 < G__4ø1 ? (function () { heightmap[iø1] = rand(); return loop[0] = 1 + iø1, loop; })() : void 0; } while (iø1 = loop[0], recur === loop); return recur; }.call(this); }.call(this); }; var mpdInitCorners = exports.mpdInitCorners = function mpdInitCorners(heightmap) { heightmap[0 * heightmap.resolution + 0] = rand(); heightmap[heightmap.last * heightmap.resolution + 0] = rand(); heightmap[0 * heightmap.resolution + heightmap.last] = rand(); return heightmap[heightmap.last * heightmap.resolution + heightmap.last] = rand(); }; var mpdDisplace = exports.mpdDisplace = function mpdDisplace(heightmap, lx, rx, by, ty, spread) { return function () { var cxø1 = midpoint(lx, rx); var cyø1 = midpoint(by, ty); var bottomLeftø1 = heightmap[by * heightmap.resolution + lx]; var bottomRightø1 = heightmap[by * heightmap.resolution + rx]; var topLeftø1 = heightmap[ty * heightmap.resolution + lx]; var topRightø1 = heightmap[ty * heightmap.resolution + rx]; var topø1 = average2(topLeftø1, topRightø1); var leftø1 = average2(bottomLeftø1, topLeftø1); var bottomø1 = average2(bottomLeftø1, bottomRightø1); var rightø1 = average2(bottomRightø1, topRightø1); var centerø1 = average4(topø1, leftø1, bottomø1, rightø1); heightmap[by * heightmap.resolution + cxø1] = jitter(bottomø1, spread); heightmap[ty * heightmap.resolution + cxø1] = jitter(topø1, spread); heightmap[cyø1 * heightmap.resolution + lx] = jitter(leftø1, spread); heightmap[cyø1 * heightmap.resolution + rx] = jitter(rightø1, spread); return heightmap[cyø1 * heightmap.resolution + cxø1] = jitter(centerø1, spread); }.call(this); }; var midpointDisplacement = exports.midpointDisplacement = function midpointDisplacement(heightmap) { mpdInitCorners(heightmap); (function loop() { var recur = loop; var iterø1 = 0; var spreadø1 = 0.3; do { recur = iterø1 < heightmap.exponent ? (function () { (function () { var chunksø1 = Math.pow(2, iterø1); var chunkWidthø1 = (heightmap.resolution - 1) / chunksø1; return function () { var G__5ø1 = chunksø1; return function () { var G__6ø1 = G__5ø1; return function loop() { var recur = loop; var xchunkø1 = 0; do { recur = xchunkø1 < G__6ø1 ? (function () { (function () { var G__7ø1 = G__5ø1; return function loop() { var recur = loop; var ychunkø1 = 0; do { recur = ychunkø1 < G__7ø1 ? (function () { (function () { var leftXø1 = chunkWidthø1 * xchunkø1; var rightXø1 = leftXø1 + chunkWidthø1; var bottomYø1 = chunkWidthø1 * ychunkø1; var topYø1 = bottomYø1 + chunkWidthø1; return mpdDisplace(heightmap, leftXø1, rightXø1, bottomYø1, topYø1, spreadø1); }.call(this)); return loop[0] = 1 + ychunkø1, loop; })() : void 0; } while (ychunkø1 = loop[0], recur === loop); return recur; }.call(this); }.call(this)); return loop[0] = 1 + xchunkø1, loop; })() : void 0; } while (xchunkø1 = loop[0], recur === loop); return recur; }.call(this); }.call(this); }.call(this); }.call(this)); return loop[0] = 1 + iterø1, loop[1] = spreadø1 * 0.5, loop; })() : void 0; } while (iterø1 = loop[0], spreadø1 = loop[1], recur === loop); return recur; }.call(this)); return normalize(heightmap); }; var midpointDisplacementFinal = exports.midpointDisplacementFinal = function midpointDisplacementFinal(heightmap) { mpdInitCorners(heightmap); (function loop() { var recur = loop; var iterø1 = 0; var spreadø1 = 0 + $('#input-starting-spread').val(); do { recur = iterø1 < heightmap.exponent ? (function () { (function () { var chunksø1 = Math.pow(2, iterø1); var chunkWidthø1 = (heightmap.resolution - 1) / chunksø1; return function () { var G__8ø1 = chunksø1; return function () { var G__9ø1 = G__8ø1; return function loop() { var recur = loop; var xchunkø1 = 0; do { recur = xchunkø1 < G__9ø1 ? (function () { (function () { var G__10ø1 = G__8ø1; return function loop() { var recur = loop; var ychunkø1 = 0; do { recur = ychunkø1 < G__10ø1 ? (function () { (function () { var leftXø1 = chunkWidthø1 * xchunkø1; var rightXø1 = leftXø1 + chunkWidthø1; var bottomYø1 = chunkWidthø1 * ychunkø1; var topYø1 = bottomYø1 + chunkWidthø1; return mpdDisplace(heightmap, leftXø1, rightXø1, bottomYø1, topYø1, spreadø1); }.call(this)); return loop[0] = 1 + ychunkø1, loop; })() : void 0; } while (ychunkø1 = loop[0], recur === loop); return recur; }.call(this); }.call(this)); return loop[0] = 1 + xchunkø1, loop; })() : void 0; } while (xchunkø1 = loop[0], recur === loop); return recur; }.call(this); }.call(this); }.call(this); }.call(this)); return loop[0] = 1 + iterø1, loop[1] = spreadø1 * (0 + $('#input-spread-reduction').val()), loop; })() : void 0; } while (iterø1 = loop[0], spreadø1 = loop[1], recur === loop); return recur; }.call(this)); return normalize(heightmap); }; var mpdDisplaceD2 = exports.mpdDisplaceD2 = function mpdDisplaceD2(heightmap, lx, rx, by, ty, spread) { return function () { var cxø1 = midpoint(lx, rx); var cyø1 = midpoint(by, ty); var bottomLeftø1 = heightmap[by * heightmap.resolution + lx]; var bottomRightø1 = heightmap[by * heightmap.resolution + rx]; var topLeftø1 = heightmap[ty * heightmap.resolution + lx]; var topRightø1 = heightmap[ty * heightmap.resolution + rx]; var topø1 = average2(topLeftø1, topRightø1); var leftø1 = average2(bottomLeftø1, topLeftø1); var bottomø1 = average2(bottomLeftø1, bottomRightø1); var rightø1 = average2(bottomRightø1, topRightø1); heightmap[by * heightmap.resolution + cxø1] = jitter(bottomø1, spread); heightmap[ty * heightmap.resolution + cxø1] = jitter(topø1, spread); heightmap[cyø1 * heightmap.resolution + lx] = jitter(leftø1, spread); return heightmap[cyø1 * heightmap.resolution + rx] = jitter(rightø1, spread); }.call(this); }; var midpointDisplacementD1 = exports.midpointDisplacementD1 = function midpointDisplacementD1(heightmap) { return mpdInitCorners(heightmap); }; var midpointDisplacementD2 = exports.midpointDisplacementD2 = function midpointDisplacementD2(heightmap) { mpdInitCorners(heightmap); return mpdDisplaceD2(heightmap, 0, heightmap.last, 0, heightmap.last, 0.1); }; var midpointDisplacementD3 = exports.midpointDisplacementD3 = function midpointDisplacementD3(heightmap) { mpdInitCorners(heightmap); return mpdDisplace(heightmap, 0, heightmap.last, 0, heightmap.last, 0.1); }; var makeDirectionalLight = exports.makeDirectionalLight = function makeDirectionalLight() { return function () { var lightø1 = new THREE.DirectionalLight(16777215, 1); lightø1.position.set(100, 0, 150); return lightø1; }.call(this); }; var makeCamera = exports.makeCamera = function makeCamera() { return function () { var cameraø1 = new THREE.PerspectiveCamera(55, width / height, 0.1, 1000); cameraø1.position.set(0, -100, 150); return cameraø1; }.call(this); }; var makeRenderer = exports.makeRenderer = function makeRenderer() { return function () { var rendererø1 = new THREE.WebGLRenderer({ 'antialias': false }); rendererø1.setClearColor(16777215); rendererø1.setSize(width, height); rendererø1.setPixelRatio(2); return rendererø1; }.call(this); }; var makeGeometry = exports.makeGeometry = function makeGeometry(heightmap) { return function () { var geometryø1 = new THREE.PlaneGeometry(terrainSize, terrainSize, heightmap.resolution - 1, heightmap.resolution - 1); geometryø1.dynamic = true; return geometryø1; }.call(this); }; var makeControls = exports.makeControls = function makeControls(camera, renderer) { return function () { var controlsø1 = new THREE.TrackballControls(camera, renderer.domElement); controlsø1.rotateSpeed = 1.4; controlsø1.zoomSpeed = 0.5; controlsø1.staticMoving = true; controlsø1.dynamicDampingFactor = 0.3; return controlsø1; }.call(this); }; var makePlane = exports.makePlane = function makePlane(geometry) { return function () { var materialø1 = new THREE.MeshLambertMaterial({ 'wireframe': wireframe, 'wireframeLinewidth': wireframeWidth, 'color': 47872 }); return new THREE.Mesh(geometry, materialø1); }.call(this); }; var attachToDom = exports.attachToDom = function attachToDom(renderer, elName, refreshFn) { return function () { var containerø1 = document.getElementById(elName); var settingsø1 = document.createElement('div'); var refreshButtonø1 = document.createElement('button'); var buttonTextø1 = document.createTextNode('Refresh'); var cancelScrollø1 = function (e) { return e.preventDefault(); }; refreshButtonø1.onclick = refreshFn; renderer.domElement.onmousewheel = cancelScrollø1; renderer.domElement.addEventListener('MozMousePixelScroll', cancelScrollø1, false); refreshButtonø1.appendChild(buttonTextø1); containerø1.appendChild(renderer.domElement); containerø1.appendChild(settingsø1); return settingsø1.appendChild(refreshButtonø1); }.call(this); }; var updateGeometry = exports.updateGeometry = function updateGeometry(geometry, heightmap) { (function () { var G__11ø1 = geometry.vertices.length; return function loop() { var recur = loop; var iø1 = 0; do { recur = iø1 < G__11ø1 ? (function () { geometry.vertices[iø1].z = terrainHeight * heightmap[iø1]; return loop[0] = 1 + iø1, loop; })() : void 0; } while (iø1 = loop[0], recur === loop); return recur; }.call(this); }.call(this)); geometry.verticesNeedUpdate = true; geometry.computeFaceNormals(); geometry.computeVertexNormals(); geometry.computeMorphNormals(); return geometry; }; var makeDemo = exports.makeDemo = function makeDemo(elementId, algorithm, size) { var scene = new THREE.Scene(); scene.add(new THREE.AxisHelper(100)); var clock = new THREE.Clock(); var camera = makeCamera(); var renderer = makeRenderer(); var geometry = makeGeometry(makeHeightmap(size)); scene.add(makeDirectionalLight()); scene.add(new THREE.AmbientLight(16777215, 0.05)); scene.add(makePlane(geometry)); var refresh = function refresh() { l('Refreshing ========================================'); return function () { var heightmapø1 = makeHeightmap(size); l('Generating terrain...'); (function () { var G__12ø1 = new Date().getTime(); var G__14ø1 = (function () { return algorithm(heightmapø1); })(); var G__13ø1 = new Date().getTime(); l('Elapsed time: ' + (G__13ø1 - G__12ø1) + 'ms.'); return G__14ø1; }.call(this)); l('Refreshing geometry...'); (function () { var G__15ø1 = new Date().getTime(); var G__17ø1 = (function () { return updateGeometry(geometry, heightmapø1); })(); var G__16ø1 = new Date().getTime(); l('Elapsed time: ' + (G__16ø1 - G__15ø1) + 'ms.'); return G__17ø1; }.call(this)); return l('Done!'); }.call(this); }; attachToDom(renderer, elementId, refresh); var controls = makeControls(camera, renderer); var render = function render() { return function () { var deltaø1 = clock.getDelta(); requestAnimationFrame(render); controls.update(deltaø1); return renderer.render(scene, camera); }.call(this); }; render(); return void 0; }; var makeFinal = exports.makeFinal = function makeFinal(elementId) { var scene = new THREE.Scene(); scene.add(new THREE.AxisHelper(100)); var clock = new THREE.Clock(); var camera = makeCamera(); var renderer = makeRenderer(); var heightmap = makeHeightmap($('#input-exponent').val()); var geometry = makeGeometry(heightmap); var plane = makePlane(geometry); scene.add(makeDirectionalLight()); scene.add(new THREE.AmbientLight(16777215, 0.05)); scene.add(plane); var refresh = function refresh() { l('Refreshing ========================================'); scene.remove(plane); heightmap = makeHeightmap($('#input-exponent').val()); geometry = makeGeometry(heightmap); plane = makePlane(geometry); scene.add(plane); l('Generating terrain...'); (function () { var G__18ø1 = new Date().getTime(); var G__20ø1 = (function () { return midpointDisplacementFinal(heightmap); })(); var G__19ø1 = new Date().getTime(); l('Elapsed time: ' + (G__19ø1 - G__18ø1) + 'ms.'); return G__20ø1; }.call(this)); l('Refreshing geometry...'); (function () { var G__21ø1 = new Date().getTime(); var G__23ø1 = (function () { return updateGeometry(geometry, heightmap); })(); var G__22ø1 = new Date().getTime(); l('Elapsed time: ' + (G__22ø1 - G__21ø1) + 'ms.'); return G__23ø1; }.call(this)); return l('Done!'); }; attachToDom(renderer, elementId, refresh); var controls = makeControls(camera, renderer); var render = function render() { return function () { var deltaø1 = clock.getDelta(); requestAnimationFrame(render); controls.update(deltaø1); return renderer.render(scene, camera); }.call(this); }; render(); return void 0; }; var run = exports.run = function run() { makeDemo('demo-random', randomNoise, 7); makeDemo('demo-mpd-1', midpointDisplacementD1, 2); makeDemo('demo-mpd-2', midpointDisplacementD2, 2); makeDemo('demo-mpd-3', midpointDisplacementD3, 2); makeDemo('demo-mpd-4', midpointDisplacement, 3); return makeFinal('demo-final'); }; $(run); },{}]},{},[1]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIm1lZGlhL2pzL3dpc3AvYW5vbnltb3VzLndpc3AiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNDQSxJQUFLLEtBQUEsR0FBQSxPQUFBLENBQUEsS0FBQSxHQUFNLEdBQVg7QUFDQSxJQUFLLE1BQUEsR0FBQSxPQUFBLENBQUEsTUFBQSxHQUFPLEdBQVosQ0FEQTtBQUVBLElBQUssU0FBQSxHQUFBLE9BQUEsQ0FBQSxTQUFBLEcsSUFBTCxDQUZBO0FBR0EsSUFBSyxjQUFBLEdBQUEsT0FBQSxDQUFBLGNBQUEsR0FBZ0IsR0FBckIsQ0FIQTtBQUlBLElBQUssYUFBQSxHQUFBLE9BQUEsQ0FBQSxhQUFBLEdBQWUsRUFBcEIsQ0FKQTtBQUtBLElBQUssV0FBQSxHQUFBLE9BQUEsQ0FBQSxXQUFBLEdBQWEsR0FBbEIsQ0FMQTtPQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTtBQTJDQSxJQUFNLENBQUEsR0FBQSxPQUFBLENBQUEsQ0FBQSxHQUFOLFNBQU0sQ0FBTixDQUFTLENBQVQsRUFDRTtBQUFBLFdBQUMsT0FBQSxDQUFRLEdBQVQsQ0FBYSxDQUFiO0FBQUEsQ0FERixDQTNDQTtBQStDQSxJQUFNLFFBQUEsR0FBQSxPQUFBLENBQUEsUUFBQSxHQUFOLFNBQU0sUUFBTixDQUFnQixDQUFoQixFQUFrQixDQUFsQixFQUNFO0FBQUEsV0FBRyxDQUFHLENBQUgsR0FBSyxDQUFMLENBQUgsR0FBVyxDQUFYO0FBQUEsQ0FERixDQS9DQTtBQWtEQSxJQUFNLFFBQUEsR0FBQSxPQUFBLENBQUEsUUFBQSxHQUFOLFNBQU0sUUFBTixDQUFnQixDQUFoQixFQUFrQixDQUFsQixFQUNFO0FBQUEsV0FBRyxDQUFHLENBQUgsR0FBSyxDQUFMLENBQUgsR0FBVyxDQUFYO0FBQUEsQ0FERixDQWxEQTtB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T0FBbEIsRUFGSTtBQUFBLFlBR0osT0FBQyxRQUFBLENBQVMsTUFBVixDQUFpQixLQUFqQixFQUF1QixNQUF2QixFQUhJO0FBQUEsUyxLQUFOLEMsSUFBQTtBQUFBLEtBREYsQztJQU1DLE1BQUQsRzs7Q0FyQ0YsQ0E3VUE7QUF1WEEsSUFBTSxHQUFBLEdBQUEsT0FBQSxDQUFBLEdBQUEsR0FBTixTQUFNLEdBQU4sR0FDRTtBQUFBLElBQUMsUUFBRCxDQUFXLGFBQVgsRUFBeUIsV0FBekIsRUFBc0MsQ0FBdEM7QUFBQSxJQUNDLFFBQUQsQ0FBVyxZQUFYLEVBQXdCLHNCQUF4QixFQUFpRCxDQUFqRCxFQURBO0FBQUEsSUFFQyxRQUFELENBQVcsWUFBWCxFQUF3QixzQkFBeEIsRUFBaUQsQ0FBakQsRUFGQTtBQUFBLElBR0MsUUFBRCxDQUFXLFlBQVgsRUFBd0Isc0JBQXhCLEVBQWlELENBQWpELEVBSEE7QUFBQSxJQUlDLFFBQUQsQ0FBVyxZQUFYLEVBQXdCLG9CQUF4QixFQUE4QyxDQUE5QyxFQUpBO0FBQUEsSUFLQSxPQUFDLFNBQUQsQ0FBWSxZQUFaLEVBTEE7QUFBQSxDQURGLENBdlhBO0FBbVlDLENBQUQsQ0FBRyxHQUFIIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIjsgQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbihkZWYgd2lkdGggNjEwKVxuKGRlZiBoZWlnaHQgNDAwKVxuKGRlZiB3aXJlZnJhbWUgdHJ1ZSlcbihkZWYgd2lyZWZyYW1lLXdpZHRoIDEuMilcbihkZWYgdGVycmFpbi1oZWlnaHQgNTApXG4oZGVmIHRlcnJhaW4tc2l6ZSAxMDApXG5cbjsgR2VuZXJhbCBVdGlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbihkZWZtYWNybyB3aGVuIFtjb25kaXRpb24gJiBib2R5XVxuICBgKGlmIH5jb25kaXRpb25cbiAgICAgKGRvIH5AYm9keSkpKVxuXG4oZGVmbWFjcm8gZG8tdGltZXMgW3Zhcm5hbWUgbGltaXQgJiBib2R5XVxuICAobGV0IFtlbmQgKGdlbnN5bSldXG4gICAgYChsZXQgW35lbmQgfmxpbWl0XVxuICAgICAgIChsb29wIFt+dmFybmFtZSAwXVxuICAgICAgICAgKHdoZW4gKDwgfnZhcm5hbWUgfmVuZClcbiAgICAgICAgICAgfkBib2R5XG4gICAgICAgICAgIChyZWN1ciAoKyAxIH52YXJuYW1lKSkpKSkpKVxuXG4oZGVmbWFjcm8gZG8tbmVzdGVkIFt4bmFtZSB5bmFtZSB3aWR0aCAmIGJvZHldXG4gIChsZXQgW2l0ZXJhdGlvbnMgKGdlbnN5bSldXG4gICAgYChsZXQgW35pdGVyYXRpb25zIH53aWR0aF1cbiAgICAgICAoZG8tdGltZXMgfnhuYW1lIH5pdGVyYXRpb25zXG4gICAgICAgICAoZG8tdGltZXMgfnluYW1lIH5pdGVyYXRpb25zXG4gICAgICAgICAgIH5AYm9keSkpKSkpXG5cbihkZWZtYWNybyBpbmMhIFtwbGFjZV1cbiAgYChzZXQhIH5wbGFjZSAoKyB+cGxhY2UgMSkpKVxuXG4oZGVmbWFjcm8gYWRkISBbcGxhY2UgYW1vdW50XVxuICBgKHNldCEgfnBsYWNlICgrIH5wbGFjZSB+YW1vdW50KSkpXG5cbihkZWZtYWNybyB0aW1lIFsmIGJvZHldXG4gIChsZXQgW3N0YXJ0IChnZW5zeW0pXG4gICAgICAgIGVuZCAoZ2Vuc3ltKVxuICAgICAgICByZXN1bHQgKGdlbnN5bSldXG4gICAgYChsZXQgW35zdGFydCAoLmdldFRpbWUgKG5ldyBEYXRlKSlcbiAgICAgICAgICAgfnJlc3VsdCAoZG8gfkBib2R5KVxuICAgICAgICAgICB+ZW5kICguZ2V0VGltZSAobmV3IERhdGUpKV1cbiAgICAgICAobCAoKyBcIkVsYXBzZWQgdGltZTogXCIgKC0gfmVuZCB+c3RhcnQpIFwibXMuXCIpKVxuICAgICAgIH5yZXN1bHQpKSlcblxuKGRlZm4gbCBbdl1cbiAgKGNvbnNvbGUubG9nIHYpKVxuXG5cbihkZWZuIG1pZHBvaW50IFthIGJdXG4gICgvICgrIGEgYikgMikpXG5cbihkZWZuIGF2ZXJhZ2UyIFthIGJdXG4gICgvICgrIGEgYikgMikpXG5cbihkZWZuIGF2ZXJhZ2U0IFthIGIgYyBkXVxuICAoLyAoKyBhIGIgYyBkKSA0KSlcblxuKGRlZm4gc2FmZS1hdmVyYWdlIFthIGIgYyBkXVxuICAobGV0IFt0b3RhbCAwIGNvdW50IDBdXG4gICAgKHdoZW4gYSAoYWRkISB0b3RhbCBhKSAoaW5jISBjb3VudCkpXG4gICAgKHdoZW4gYiAoYWRkISB0b3RhbCBiKSAoaW5jISBjb3VudCkpXG4gICAgKHdoZW4gYyAoYWRkISB0b3RhbCBjKSAoaW5jISBjb3VudCkpXG4gICAgKHdoZW4gZCAoYWRkISB0b3RhbCBkKSAoaW5jISBjb3VudCkpXG4gICAgKC8gdG90YWwgY291bnQpKSlcblxuXG4oZGVmbiByYW5kIFtdXG4gIChNYXRoLnJhbmRvbSkpXG5cbihkZWZuIHJhbmQtYXJvdW5kLXplcm8gW3NwcmVhZF1cbiAgKC0gKCogc3ByZWFkIChyYW5kKSAyKSBzcHJlYWQpKVxuXG5cbihkZWZuIGppdHRlciBbdmFsdWUgc3ByZWFkXVxuICAoKyB2YWx1ZSAocmFuZC1hcm91bmQtemVybyBzcHJlYWQpKSlcblxuXG47IEhlaWdodG1hcCBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4oZGVmbWFjcm8gaGVpZ2h0bWFwLWdldCBbaG0geCB5XVxuICBgKGFnZXQgfmhtICgrICgqIH55ICguLXJlc29sdXRpb24gfmhtKSkgfngpKSlcblxuKGRlZm4gaGVpZ2h0bWFwLWdldC1zYWZlIFtobSB4IHldXG4gICh3aGVuIChhbmQgKDw9IDAgeCBobS5sYXN0KVxuICAgICAgICAgICAgICg8PSAwIHkgaG0ubGFzdCkpXG4gICAgKGhlaWdodG1hcC1nZXQgaG0geCB5KSkpXG5cbihkZWZtYWNybyBoZWlnaHRtYXAtc2V0ISBbaG0geCB5IHZhbF1cbiAgYChzZXQhIChoZWlnaHRtYXAtZ2V0IH5obSB+eCB+eSkgfnZhbCkpXG5cblxuKGRlZm4gbm9ybWFsaXplIFtobV1cbiAgKGxldCBbbWF4ICgtIEluZmluaXR5KVxuICAgICAgICBtaW4gSW5maW5pdHldXG4gICAgKGRvLXRpbWVzIGkgaG0ubGVuZ3RoXG4gICAgICAobGV0IFtlbCAoYWdldCBobSBpKV1cbiAgICAgICAgKHdoZW4gKDwgbWF4IGVsKSAoc2V0ISBtYXggZWwpKVxuICAgICAgICAod2hlbiAoPiBtaW4gZWwpIChzZXQhIG1pbiBlbCkpKSlcbiAgICAobGV0IFtzcGFuICgtIG1heCBtaW4pXVxuICAgICAgKGRvLXRpbWVzIGkgaG0ubGVuZ3RoXG4gICAgICAgIChzZXQhIChhZ2V0IGhtIGkpXG4gICAgICAgICAgKC8gKC0gKGFnZXQgaG0gaSkgbWluKVxuICAgICAgICAgICAgIHNwYW4pKSkpKSlcblxuKGRlZm4gemVyby1oZWlnaHRtYXAgW2hlaWdodG1hcF1cbiAgKGRvLXRpbWVzIGkgaGVpZ2h0bWFwLmxlbmd0aFxuICAgIChzZXQhIChhZ2V0IGhlaWdodG1hcCBpKSAwLjApKVxuICBoZWlnaHRtYXApXG5cbihkZWZuIG1ha2UtaGVpZ2h0bWFwIFtleHBvbmVudF1cbiAgKGxldCBbcmVzb2x1dGlvbiAoKyAxIChNYXRoLnBvdyAyIGV4cG9uZW50KSldXG4gICAgKGwgKCsgXCJDcmVhdGluZyBcIiByZXNvbHV0aW9uIFwiIGJ5IFwiIHJlc29sdXRpb24gXCIgaGVpZ2h0bWFwLi4uXCIpKVxuICAgIChkZWYgaGVpZ2h0bWFwXG4gICAgICAobmV3IEFycmF5ICgqIHJlc29sdXRpb24gcmVzb2x1dGlvbikpKVxuICAgIChzZXQhIGhlaWdodG1hcC5yZXNvbHV0aW9uIHJlc29sdXRpb24pXG4gICAgKHNldCEgaGVpZ2h0bWFwLmV4cG9uZW50IGV4cG9uZW50KVxuICAgIChzZXQhIGhlaWdodG1hcC5sYXN0ICgtIHJlc29sdXRpb24gMSkpXG4gICAgKHplcm8taGVpZ2h0bWFwIGhlaWdodG1hcCkpKVxuXG5cbjsgUmFuZG9tIE5vaXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbihkZWZuIHJhbmRvbS1ub2lzZSBbaGVpZ2h0bWFwXVxuICAoZG8tdGltZXMgaSBoZWlnaHRtYXAubGVuZ3RoXG4gICAgKHNldCEgKGFnZXQgaGVpZ2h0bWFwIGkpIChyYW5kKSkpKVxuXG5cbjsgTWlkcG9pbnQgRGlzcGxhY2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbihkZWZuIG1wZC1pbml0LWNvcm5lcnMgW2hlaWdodG1hcF1cbiAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCAwIDAgKHJhbmQpKVxuICAoaGVpZ2h0bWFwLXNldCEgaGVpZ2h0bWFwIDAgaGVpZ2h0bWFwLmxhc3QgKHJhbmQpKVxuICAoaGVpZ2h0bWFwLXNldCEgaGVpZ2h0bWFwIGhlaWdodG1hcC5sYXN0IDAgKHJhbmQpKVxuICAoaGVpZ2h0bWFwLXNldCEgaGVpZ2h0bWFwIGhlaWdodG1hcC5sYXN0IGhlaWdodG1hcC5sYXN0IChyYW5kKSkpXG5cbihkZWZuIG1wZC1kaXNwbGFjZSBbaGVpZ2h0bWFwIGx4IHJ4IGJ5IHR5IHNwcmVhZF1cbiAgKGxldCBbY3ggKG1pZHBvaW50IGx4IHJ4KVxuICAgICAgICBjeSAobWlkcG9pbnQgYnkgdHkpXG5cbiAgICAgICAgYm90dG9tLWxlZnQgKGhlaWdodG1hcC1nZXQgaGVpZ2h0bWFwIGx4IGJ5KVxuICAgICAgICBib3R0b20tcmlnaHQgKGhlaWdodG1hcC1nZXQgaGVpZ2h0bWFwIHJ4IGJ5KVxuICAgICAgICB0b3AtbGVmdCAoaGVpZ2h0bWFwLWdldCBoZWlnaHRtYXAgbHggdHkpXG4gICAgICAgIHRvcC1yaWdodCAoaGVpZ2h0bWFwLWdldCBoZWlnaHRtYXAgcnggdHkpXG5cbiAgICAgICAgdG9wIChhdmVyYWdlMiB0b3AtbGVmdCB0b3AtcmlnaHQpXG4gICAgICAgIGxlZnQgKGF2ZXJhZ2UyIGJvdHRvbS1sZWZ0IHRvcC1sZWZ0KVxuICAgICAgICBib3R0b20gKGF2ZXJhZ2UyIGJvdHRvbS1sZWZ0IGJvdHRvbS1yaWdodClcbiAgICAgICAgcmlnaHQgKGF2ZXJhZ2UyIGJvdHRvbS1yaWdodCB0b3AtcmlnaHQpXG4gICAgICAgIGNlbnRlciAoYXZlcmFnZTQgdG9wIGxlZnQgYm90dG9tIHJpZ2h0KV1cbiAgICAoaGVpZ2h0bWFwLXNldCEgaGVpZ2h0bWFwIGN4IGJ5IChqaXR0ZXIgYm90dG9tIHNwcmVhZCkpXG4gICAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCBjeCB0eSAoaml0dGVyIHRvcCBzcHJlYWQpKVxuICAgIChoZWlnaHRtYXAtc2V0ISBoZWlnaHRtYXAgbHggY3kgKGppdHRlciBsZWZ0IHNwcmVhZCkpXG4gICAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCByeCBjeSAoaml0dGVyIHJpZ2h0IHNwcmVhZCkpXG4gICAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCBjeCBjeSAoaml0dGVyIGNlbnRlciBzcHJlYWQpKSkpXG5cbihkZWZuIG1pZHBvaW50LWRpc3BsYWNlbWVudCBbaGVpZ2h0bWFwXVxuICAobXBkLWluaXQtY29ybmVycyBoZWlnaHRtYXApXG4gIDsgKG1wZC1kaXNwbGFjZSBoZWlnaHRtYXAgMCBoZWlnaHRtYXAubGFzdCAwIGhlaWdodG1hcC5sYXN0IDAuMSlcbiAgKGxvb3AgW2l0ZXIgMFxuICAgICAgICAgc3ByZWFkIDAuM11cbiAgICAod2hlbiAoPCBpdGVyIGhlaWdodG1hcC5leHBvbmVudClcbiAgICAgIChsZXQgW2NodW5rcyAoTWF0aC5wb3cgMiBpdGVyKVxuICAgICAgICAgICAgY2h1bmstd2lkdGggKC8gKC0gaGVpZ2h0bWFwLnJlc29sdXRpb24gMSkgY2h1bmtzKV1cbiAgICAgICAgKGRvLW5lc3RlZCB4Y2h1bmsgeWNodW5rIGNodW5rc1xuICAgICAgICAgIChsZXQgW2xlZnQteCAoKiBjaHVuay13aWR0aCB4Y2h1bmspXG4gICAgICAgICAgICAgICAgcmlnaHQteCAoKyBsZWZ0LXggY2h1bmstd2lkdGgpXG4gICAgICAgICAgICAgICAgYm90dG9tLXkgKCogY2h1bmstd2lkdGggeWNodW5rKVxuICAgICAgICAgICAgICAgIHRvcC15ICgrIGJvdHRvbS15IGNodW5rLXdpZHRoKV1cbiAgICAgICAgICAgIChtcGQtZGlzcGxhY2UgaGVpZ2h0bWFwIGxlZnQteCByaWdodC14IGJvdHRvbS15IHRvcC15IHNwcmVhZCkpKSlcbiAgICAgIChyZWN1ciAoKyAxIGl0ZXIpICgqIHNwcmVhZCAwLjUpKSkpXG4gIChub3JtYWxpemUgaGVpZ2h0bWFwKSlcblxuXG4oZGVmbiBtaWRwb2ludC1kaXNwbGFjZW1lbnQtZmluYWwgW2hlaWdodG1hcF1cbiAgKG1wZC1pbml0LWNvcm5lcnMgaGVpZ2h0bWFwKVxuICA7IChsZXQgW3NwcmVhZCBdKVxuICAobG9vcCBbaXRlciAwXG4gICAgICAgICBzcHJlYWQgKCsgMCAoLnZhbCAoJCBcIiNpbnB1dC1zdGFydGluZy1zcHJlYWRcIikpKV1cbiAgICAod2hlbiAoPCBpdGVyIGhlaWdodG1hcC5leHBvbmVudClcbiAgICAgIChsZXQgW2NodW5rcyAoTWF0aC5wb3cgMiBpdGVyKVxuICAgICAgICAgICAgY2h1bmstd2lkdGggKC8gKC0gaGVpZ2h0bWFwLnJlc29sdXRpb24gMSkgY2h1bmtzKV1cbiAgICAgICAgKGRvLW5lc3RlZCB4Y2h1bmsgeWNodW5rIGNodW5rc1xuICAgICAgICAgIChsZXQgW2xlZnQteCAoKiBjaHVuay13aWR0aCB4Y2h1bmspXG4gICAgICAgICAgICAgICAgcmlnaHQteCAoKyBsZWZ0LXggY2h1bmstd2lkdGgpXG4gICAgICAgICAgICAgICAgYm90dG9tLXkgKCogY2h1bmstd2lkdGggeWNodW5rKVxuICAgICAgICAgICAgICAgIHRvcC15ICgrIGJvdHRvbS15IGNodW5rLXdpZHRoKV1cbiAgICAgICAgICAgIChtcGQtZGlzcGxhY2UgaGVpZ2h0bWFwIGxlZnQteCByaWdodC14IGJvdHRvbS15IHRvcC15IHNwcmVhZCkpKSlcbiAgICAgIChyZWN1ciAoKyAxIGl0ZXIpICgqIHNwcmVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKCsgMCAoLnZhbCAoJCBcIiNpbnB1dC1zcHJlYWQtcmVkdWN0aW9uXCIpKSkpKSkpXG4gIChub3JtYWxpemUgaGVpZ2h0bWFwKSlcblxuXG4oZGVmbiBtcGQtZGlzcGxhY2UtZDIgW2hlaWdodG1hcCBseCByeCBieSB0eSBzcHJlYWRdXG4gIChsZXQgW2N4IChtaWRwb2ludCBseCByeClcbiAgICAgICAgY3kgKG1pZHBvaW50IGJ5IHR5KVxuXG4gICAgICAgIGJvdHRvbS1sZWZ0IChoZWlnaHRtYXAtZ2V0IGhlaWdodG1hcCBseCBieSlcbiAgICAgICAgYm90dG9tLXJpZ2h0IChoZWlnaHRtYXAtZ2V0IGhlaWdodG1hcCByeCBieSlcbiAgICAgICAgdG9wLWxlZnQgKGhlaWdodG1hcC1nZXQgaGVpZ2h0bWFwIGx4IHR5KVxuICAgICAgICB0b3AtcmlnaHQgKGhlaWdodG1hcC1nZXQgaGVpZ2h0bWFwIHJ4IHR5KVxuXG4gICAgICAgIHRvcCAoYXZlcmFnZTIgdG9wLWxlZnQgdG9wLXJpZ2h0KVxuICAgICAgICBsZWZ0IChhdmVyYWdlMiBib3R0b20tbGVmdCB0b3AtbGVmdClcbiAgICAgICAgYm90dG9tIChhdmVyYWdlMiBib3R0b20tbGVmdCBib3R0b20tcmlnaHQpXG4gICAgICAgIHJpZ2h0IChhdmVyYWdlMiBib3R0b20tcmlnaHQgdG9wLXJpZ2h0KV1cbiAgICAoaGVpZ2h0bWFwLXNldCEgaGVpZ2h0bWFwIGN4IGJ5IChqaXR0ZXIgYm90dG9tIHNwcmVhZCkpXG4gICAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCBjeCB0eSAoaml0dGVyIHRvcCBzcHJlYWQpKVxuICAgIChoZWlnaHRtYXAtc2V0ISBoZWlnaHRtYXAgbHggY3kgKGppdHRlciBsZWZ0IHNwcmVhZCkpXG4gICAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCByeCBjeSAoaml0dGVyIHJpZ2h0IHNwcmVhZCkpKSlcblxuKGRlZm4gbWlkcG9pbnQtZGlzcGxhY2VtZW50LWQxIFtoZWlnaHRtYXBdXG4gIChtcGQtaW5pdC1jb3JuZXJzIGhlaWdodG1hcCkpXG5cbihkZWZuIG1pZHBvaW50LWRpc3BsYWNlbWVudC1kMiBbaGVpZ2h0bWFwXVxuICAobXBkLWluaXQtY29ybmVycyBoZWlnaHRtYXApXG4gIChtcGQtZGlzcGxhY2UtZDIgaGVpZ2h0bWFwXG4gICAgICAgICAgICAgICAgICAgMCBoZWlnaHRtYXAubGFzdFxuICAgICAgICAgICAgICAgICAgIDAgaGVpZ2h0bWFwLmxhc3RcbiAgICAgICAgICAgICAgICAgICAwLjEpKVxuXG4oZGVmbiBtaWRwb2ludC1kaXNwbGFjZW1lbnQtZDMgW2hlaWdodG1hcF1cbiAgKG1wZC1pbml0LWNvcm5lcnMgaGVpZ2h0bWFwKVxuICAobXBkLWRpc3BsYWNlIGhlaWdodG1hcFxuICAgICAgICAgICAgICAgIDAgaGVpZ2h0bWFwLmxhc3RcbiAgICAgICAgICAgICAgICAwIGhlaWdodG1hcC5sYXN0XG4gICAgICAgICAgICAgICAgMC4xKSlcblxuXG5cbjsgVGhyZWUuanMgSGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbihkZWZuIG1ha2UtZGlyZWN0aW9uYWwtbGlnaHQgW11cbiAgKGxldCBbbGlnaHQgKG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0IDB4ZmZmZmZmIDEpXVxuICAgIChsaWdodC5wb3NpdGlvbi5zZXQgMTAwIDAgMTUwKVxuICAgIGxpZ2h0KSlcblxuKGRlZm4gbWFrZS1jYW1lcmEgW11cbiAgKGxldCBbY2FtZXJhIChuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmFcbiAgICAgICAgICAgICAgICAgICAgNTUsXG4gICAgICAgICAgICAgICAgICAgICgvIHdpZHRoIGhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgMC4xLFxuICAgICAgICAgICAgICAgICAgICAxMDAwKV1cbiAgICAoY2FtZXJhLnBvc2l0aW9uLnNldCAwIC0xMDAgMTUwKVxuICAgIGNhbWVyYSkpXG5cbihkZWZuIG1ha2UtcmVuZGVyZXIgW11cbiAgKGxldCBbcmVuZGVyZXIgKG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyIHs6YW50aWFsaWFzIGZhbHNlfSldXG4gICAgKHJlbmRlcmVyLnNldENsZWFyQ29sb3IgMHhmZmZmZmYpXG4gICAgKHJlbmRlcmVyLnNldFNpemUgd2lkdGggaGVpZ2h0KVxuICAgIChyZW5kZXJlci5zZXRQaXhlbFJhdGlvIDIpXG4gICAgcmVuZGVyZXIpKVxuXG4oZGVmbiBtYWtlLWdlb21ldHJ5IFtoZWlnaHRtYXBdXG4gIChsZXQgW2dlb21ldHJ5IChuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeVxuICAgICAgICAgICAgICAgICAgICAgIHRlcnJhaW4tc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgIHRlcnJhaW4tc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICgtIGhlaWdodG1hcC5yZXNvbHV0aW9uIDEpXG4gICAgICAgICAgICAgICAgICAgICAgKC0gaGVpZ2h0bWFwLnJlc29sdXRpb24gMSkpXVxuICAgIChzZXQhIGdlb21ldHJ5LmR5bmFtaWMgdHJ1ZSlcbiAgICBnZW9tZXRyeSkpXG5cbihkZWZuIG1ha2UtY29udHJvbHMgW2NhbWVyYSByZW5kZXJlcl1cbiAgKGxldCBbY29udHJvbHMgKG5ldyBUSFJFRS5UcmFja2JhbGxDb250cm9scyBjYW1lcmEgcmVuZGVyZXIuZG9tRWxlbWVudCldXG4gICAgKHNldCEgY29udHJvbHMucm90YXRlU3BlZWQgMS40KVxuICAgIChzZXQhIGNvbnRyb2xzLnpvb21TcGVlZCAwLjUpXG4gICAgKHNldCEgY29udHJvbHMuc3RhdGljTW92aW5nIHRydWUpXG4gICAgKHNldCEgY29udHJvbHMuZHluYW1pY0RhbXBpbmdGYWN0b3IgMC4zKVxuICAgIGNvbnRyb2xzKSlcblxuKGRlZm4gbWFrZS1wbGFuZSBbZ2VvbWV0cnldXG4gIChsZXQgW21hdGVyaWFsIChuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbFxuICAgICAgICAgICAgICAgICAgICAgIHs6d2lyZWZyYW1lIHdpcmVmcmFtZVxuICAgICAgICAgICAgICAgICAgICAgICA6d2lyZWZyYW1lTGluZXdpZHRoIHdpcmVmcmFtZS13aWR0aFxuICAgICAgICAgICAgICAgICAgICAgICA6Y29sb3IgMHgwMGJiMDB9KV1cbiAgICAobmV3IFRIUkVFLk1lc2ggZ2VvbWV0cnkgbWF0ZXJpYWwpKSlcblxuXG4oZGVmbiBhdHRhY2gtdG8tZG9tIFtyZW5kZXJlciBlbC1uYW1lIHJlZnJlc2gtZm5dXG4gIChsZXQgW2NvbnRhaW5lciAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgZWwtbmFtZSlcbiAgICAgICAgc2V0dGluZ3MgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgXCJkaXZcIilcbiAgICAgICAgcmVmcmVzaC1idXR0b24gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgXCJidXR0b25cIilcbiAgICAgICAgYnV0dG9uLXRleHQgKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlIFwiUmVmcmVzaFwiKVxuICAgICAgICBjYW5jZWwtc2Nyb2xsIChmbiBbZV0gKC5wcmV2ZW50RGVmYXVsdCBlKSldXG4gICAgKHNldCEgcmVmcmVzaC1idXR0b24ub25jbGljayByZWZyZXNoLWZuKVxuICAgIChzZXQhIHJlbmRlcmVyLmRvbUVsZW1lbnQub25tb3VzZXdoZWVsIGNhbmNlbC1zY3JvbGwpXG4gICAgKHJlbmRlcmVyLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciBcIk1vek1vdXNlUGl4ZWxTY3JvbGxcIiBjYW5jZWwtc2Nyb2xsIGZhbHNlKVxuICAgICguYXBwZW5kQ2hpbGQgcmVmcmVzaC1idXR0b24gYnV0dG9uLXRleHQpXG4gICAgKC5hcHBlbmRDaGlsZCBjb250YWluZXIgcmVuZGVyZXIuZG9tRWxlbWVudClcbiAgICAoLmFwcGVuZENoaWxkIGNvbnRhaW5lciBzZXR0aW5ncylcbiAgICAoLmFwcGVuZENoaWxkIHNldHRpbmdzIHJlZnJlc2gtYnV0dG9uKSkpXG5cbihkZWZuIHVwZGF0ZS1nZW9tZXRyeSBbZ2VvbWV0cnkgaGVpZ2h0bWFwXVxuICAoZG8tdGltZXMgaSBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGhcbiAgICAoc2V0ISAoLi16IChhZ2V0IGdlb21ldHJ5LnZlcnRpY2VzIGkpKVxuICAgICAgKCogdGVycmFpbi1oZWlnaHQgKGFnZXQgaGVpZ2h0bWFwIGkpKSkpXG4gIChzZXQhIGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSB0cnVlKVxuICAoZ2VvbWV0cnkuY29tcHV0ZUZhY2VOb3JtYWxzKVxuICAoZ2VvbWV0cnkuY29tcHV0ZVZlcnRleE5vcm1hbHMpXG4gIChnZW9tZXRyeS5jb21wdXRlTW9ycGhOb3JtYWxzKVxuICBnZW9tZXRyeSlcblxuXG47IE1haW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4oZGVmbiBtYWtlLWRlbW8gW2VsZW1lbnQtaWQgYWxnb3JpdGhtIHNpemVdXG4gIChkZWYgc2NlbmUgKG5ldyBUSFJFRS5TY2VuZSkpXG4gIChzY2VuZS5hZGQgKG5ldyBUSFJFRS5BeGlzSGVscGVyIDEwMCkpXG5cbiAgKGRlZiBjbG9jayAobmV3IFRIUkVFLkNsb2NrKSlcbiAgKGRlZiBjYW1lcmEgKG1ha2UtY2FtZXJhKSlcbiAgKGRlZiByZW5kZXJlciAobWFrZS1yZW5kZXJlcikpXG4gIChkZWYgZ2VvbWV0cnkgKG1ha2UtZ2VvbWV0cnkgKG1ha2UtaGVpZ2h0bWFwIHNpemUpKSlcblxuICAoc2NlbmUuYWRkIChtYWtlLWRpcmVjdGlvbmFsLWxpZ2h0KSlcbiAgKHNjZW5lLmFkZCAobmV3IFRIUkVFLkFtYmllbnRMaWdodCAweGZmZmZmZiAwLjA1KSlcbiAgKHNjZW5lLmFkZCAobWFrZS1wbGFuZSBnZW9tZXRyeSkpXG5cbiAgKGRlZm4gcmVmcmVzaCBbXVxuICAgIChsIFwiUmVmcmVzaGluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIpXG4gICAgKGxldCBbaGVpZ2h0bWFwIChtYWtlLWhlaWdodG1hcCBzaXplKV1cbiAgICAgIChsIFwiR2VuZXJhdGluZyB0ZXJyYWluLi4uXCIpXG4gICAgICAodGltZSAoYWxnb3JpdGhtIGhlaWdodG1hcCkpXG4gICAgICAobCBcIlJlZnJlc2hpbmcgZ2VvbWV0cnkuLi5cIilcbiAgICAgICh0aW1lICh1cGRhdGUtZ2VvbWV0cnkgZ2VvbWV0cnkgaGVpZ2h0bWFwKSlcbiAgICAgIChsIFwiRG9uZSFcIikpKVxuXG4gIChhdHRhY2gtdG8tZG9tIHJlbmRlcmVyIGVsZW1lbnQtaWQgcmVmcmVzaClcbiAgKGRlZiBjb250cm9scyAobWFrZS1jb250cm9scyBjYW1lcmEgcmVuZGVyZXIpKVxuXG4gIChkZWZuIHJlbmRlciBbXVxuICAgIChsZXQgW2RlbHRhIChjbG9jay5nZXREZWx0YSldXG4gICAgICAocmVxdWVzdEFuaW1hdGlvbkZyYW1lIHJlbmRlcilcbiAgICAgICgudXBkYXRlIGNvbnRyb2xzIGRlbHRhKVxuICAgICAgKHJlbmRlcmVyLnJlbmRlciBzY2VuZSBjYW1lcmEpKSlcblxuICAocmVuZGVyKVxuXG4gIG5pbClcblxuKGRlZm4gbWFrZS1maW5hbCBbZWxlbWVudC1pZF1cbiAgKGRlZiBzY2VuZSAobmV3IFRIUkVFLlNjZW5lKSlcbiAgKHNjZW5lLmFkZCAobmV3IFRIUkVFLkF4aXNIZWxwZXIgMTAwKSlcblxuICAoZGVmIGNsb2NrIChuZXcgVEhSRUUuQ2xvY2spKVxuICAoZGVmIGNhbWVyYSAobWFrZS1jYW1lcmEpKVxuICAoZGVmIHJlbmRlcmVyIChtYWtlLXJlbmRlcmVyKSlcbiAgKGRlZiBoZWlnaHRtYXAgKG1ha2UtaGVpZ2h0bWFwICgudmFsICgkIFwiI2lucHV0LWV4cG9uZW50XCIpKSkpXG4gIChkZWYgZ2VvbWV0cnkgKG1ha2UtZ2VvbWV0cnkgaGVpZ2h0bWFwKSlcbiAgKGRlZiBwbGFuZSAobWFrZS1wbGFuZSBnZW9tZXRyeSkpXG5cbiAgKHNjZW5lLmFkZCAobWFrZS1kaXJlY3Rpb25hbC1saWdodCkpXG4gIChzY2VuZS5hZGQgKG5ldyBUSFJFRS5BbWJpZW50TGlnaHQgMHhmZmZmZmYgMC4wNSkpXG4gIChzY2VuZS5hZGQgcGxhbmUpXG5cbiAgKGRlZm4gcmVmcmVzaCBbXVxuICAgIChsIFwiUmVmcmVzaGluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIpXG4gICAgKHNjZW5lLnJlbW92ZSBwbGFuZSlcbiAgICAoc2V0ISBoZWlnaHRtYXAgKG1ha2UtaGVpZ2h0bWFwICgudmFsICgkIFwiI2lucHV0LWV4cG9uZW50XCIpKSkpXG4gICAgKHNldCEgZ2VvbWV0cnkgKG1ha2UtZ2VvbWV0cnkgaGVpZ2h0bWFwKSlcbiAgICAoc2V0ISBwbGFuZSAobWFrZS1wbGFuZSBnZW9tZXRyeSkpXG4gICAgKHNjZW5lLmFkZCBwbGFuZSlcbiAgICAobCBcIkdlbmVyYXRpbmcgdGVycmFpbi4uLlwiKVxuICAgICh0aW1lIChtaWRwb2ludC1kaXNwbGFjZW1lbnQtZmluYWwgaGVpZ2h0bWFwKSlcbiAgICAobCBcIlJlZnJlc2hpbmcgZ2VvbWV0cnkuLi5cIilcbiAgICAodGltZSAodXBkYXRlLWdlb21ldHJ5IGdlb21ldHJ5IGhlaWdodG1hcCkpXG4gICAgKGwgXCJEb25lIVwiKSlcblxuICAoYXR0YWNoLXRvLWRvbSByZW5kZXJlciBlbGVtZW50LWlkIHJlZnJlc2gpXG4gIChkZWYgY29udHJvbHMgKG1ha2UtY29udHJvbHMgY2FtZXJhIHJlbmRlcmVyKSlcblxuICAoZGVmbiByZW5kZXIgW11cbiAgICAobGV0IFtkZWx0YSAoY2xvY2suZ2V0RGVsdGEpXVxuICAgICAgKHJlcXVlc3RBbmltYXRpb25GcmFtZSByZW5kZXIpXG4gICAgICAoLnVwZGF0ZSBjb250cm9scyBkZWx0YSlcbiAgICAgIChyZW5kZXJlci5yZW5kZXIgc2NlbmUgY2FtZXJhKSkpXG5cbiAgKHJlbmRlcilcblxuICBuaWwpXG5cblxuKGRlZm4gcnVuIFtdXG4gIChtYWtlLWRlbW8gXCJkZW1vLXJhbmRvbVwiIHJhbmRvbS1ub2lzZSA3KVxuICAobWFrZS1kZW1vIFwiZGVtby1tcGQtMVwiIG1pZHBvaW50LWRpc3BsYWNlbWVudC1kMSAyKVxuICAobWFrZS1kZW1vIFwiZGVtby1tcGQtMlwiIG1pZHBvaW50LWRpc3BsYWNlbWVudC1kMiAyKVxuICAobWFrZS1kZW1vIFwiZGVtby1tcGQtM1wiIG1pZHBvaW50LWRpc3BsYWNlbWVudC1kMyAyKVxuICAobWFrZS1kZW1vIFwiZGVtby1tcGQtNFwiIG1pZHBvaW50LWRpc3BsYWNlbWVudCAzKVxuICAobWFrZS1maW5hbCBcImRlbW8tZmluYWxcIilcbiAgOyAobWFrZS1kZW1vIFwiZGVtby1taWRwb2ludFwiIG1pZHBvaW50LWRpc3BsYWNlbWVudClcbiAgOyAobWFrZS1kZW1vIFwiZGVtby1kaWFtb25kXCIgZGlhbW9uZC1zcXVhcmUpXG5cbiAgKVxuXG4oJCBydW4pXG5cblxuOyB2aW06IGx3Kz1kby10aW1lcyBsdys9ZG8tbmVzdGVkIDpcbiJdfQ==