Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <canvas id='c'></canvas>
- <script type="text/javascript" src="http://jsdo.it/akm2/fhMC/js"></script>
- <style>body {
- margin: 0;
- padding: 0;
- }
- canvas {
- position: absolute;
- }</style>
- <script>
- // forked from akm2's "Lightning Points (Lightning 2)" http://jsdo.it/akm2/amk0
- /**
- * Using PerlinNoise class
- * Using Point class
- * @see http://jsdo.it/akm2/fhMC
- */
- var DRAG_POINT_NUM = 4;
- var DRAG_POINT_MAX_NUM = 8;
- var CHILD_NUM = 2;
- var BACKGROUND_COLOR = 'rgba(0, 15, 20, 0.8)';
- // Color
- var H = 195;
- var S = 100;
- var L_MAX = 85;
- var L_MIN = 45;
- var canvas;
- var context;
- var dragPoints = [];
- var mouse = new Point();
- var baseLine;
- var lightningLine;
- // alias
- var random = Math.random;
- var floor = Math.floor;
- function init() {
- document.body.style.backgroundColor = BACKGROUND_COLOR;
- canvas = document.getElementById('c');
- document.addEventListener('resize', resize, false);
- resize();
- var i;
- for (i = 0; i < DRAG_POINT_NUM; i ) {
- dragPoints.push(new DragPoint(canvas.width * random(), canvas.height * random()));
- }
- var baseNoiseOpts = { base: 100000, amplitude: 0.6, speed: 0.02 };
- var lightningNoiseOpts = { base: 90, amplitude: 0.2, speed: 0.05 };
- var childNoiseOpts = { base: 60, amplitude: 0.8, speed: 0.08 };
- baseLine = new NoiseLine(8, baseNoiseOpts);
- lightningLine = new NoiseLine(16, lightningNoiseOpts);
- for (i = 0; i < CHILD_NUM; i ) {
- lightningLine.createChild(childNoiseOpts);
- }
- // *** Debug
- baseLine.debug = true;
- // *********
- document.addEventListener('mousemove', mouseMove, false);
- document.addEventListener('mousedown', mouseDown, false);
- document.addEventListener('mouseup', mouseUp, false);
- document.addEventListener('dblclick', doubleClick, false);
- document.addEventListener('keydown', keyDown, false);
- setInterval(loop, 1000 / 30);
- }
- function resize(e) {
- canvas.width = window.innerWidth;
- canvas.height = window.innerHeight;
- context = canvas.getContext('2d');
- context.lineCap = 'round';
- }
- function mouseMove(e) {
- mouse.set(e.clientX, e.clientY);
- var hit = false;
- for (var i = 0, len = dragPoints.length; i < len; i ) {
- if (dragPoints[i].hitTest(mouse)) {
- hit = true;
- break;
- }
- }
- document.body.style.cursor = hit ? 'pointer' : 'default';
- }
- function mouseDown(e) {
- var i, len;
- for (i = 0, len = dragPoints.length; i < len; i ) {
- if (dragPoints[i].dragStart(mouse)) return;
- }
- for (i = 0; i < len; i ) {
- if (dragPoints[i].hitTest(mouse)) {
- if (len > 1) dragPoints.splice(i, 1);
- return;
- }
- }
- if (len < DRAG_POINT_MAX_NUM) {
- dragPoints.push(new DragPoint(e.clientX, e.clientY));
- } else {
- for (i = 0; i < len - 2; i ) {
- dragPoints[i].kill();
- }
- }
- }
- function mouseUp(e) {
- for (var i = 0, len = dragPoints.length; i < len; i ) {
- dragPoints[i].dragEnd(mouse);
- }
- }
- function doubleClick(e) {
- var len = dragPoints.length;
- if (len < 3) return;
- for (var i = 0; i < len; i ) {
- if (dragPoints[i].hitTest(mouse)) {
- dragPoints[i].kill();
- return;
- }
- }
- }
- function keyDown(e) {
- if (e.keyCode === 68) { // d key
- Debug.enabled = !Debug.enabled;
- }
- }
- function loop() {
- context.globalCompositeOperation = 'source-over';
- context.fillStyle = BACKGROUND_COLOR;
- context.fillRect(0, 0, canvas.width, canvas.height);
- context.globalCompositeOperation = 'lighter';
- var i, len, p;
- var controls = [];
- for (i = 0, len = dragPoints.length; i < len; i ) {
- p = dragPoints[i];
- p.update();
- p.alpha = p.hitTest(mouse) ? 0.75 : 0.2;
- p.draw(context);
- if (p.dead) {
- dragPoints.splice(i, 1);
- i--;
- len--;
- continue;
- }
- if (!p.dying) {
- controls.push(p);
- }
- }
- // 原点からの距離でソート
- controls.sort(sortPoints);
- baseLine.update(controls);
- lightningLine.update(baseLine.points);
- drawLightningBlur(lightningLine, 50, 30);
- drawLightningLine(lightningLine, 0.75, 1, 1, 5);
- drawLightningCap(lightningLine);
- lightningLine.eachChild(function(child, i) {
- drawLightningLine(child, 0, 1, 0, 4);
- drawLightningBlur(child, 50, 30);
- });
- Color.l = randomRange(L_MIN, L_MAX);
- // * debug
- Debug.exec();
- }
- // Array sort callback
- function sortPoints(p1, p2) {
- return p1.length() - p2.length();
- }
- // Lightning draw methods
- function drawLightningLine(line, maxAlpha, minAlpha, maxLineW, minLineW) {
- context.beginPath();
- context.strokeStyle = Color.setAlphaToString(randomRange(minAlpha, maxAlpha));
- context.lineWidth = randomRange(minLineW, maxLineW);
- line.eachPoints(function(p, i) {
- context[i === 0 ? 'moveTo' : 'lineTo'](p.x, p.y);
- });
- context.stroke();
- }
- function drawLightningBlur(line, blur, maxSize) {
- var dist;
- context.save();
- context.fillStyle = 'rgba(0, 0, 0, 1)';
- context.shadowBlur = blur;
- context.shadowColor = Color.setAlphaToString();
- context.beginPath();
- line.eachPoints(function(p, i, len) {
- dist = len > 1 ? p.distance(this[i === len - 1 ? i - 1 : i 1]) : 0;
- if (dist > maxSize) dist = maxSize;
- context.moveTo(p.x dist, p.y);
- context.arc(p.x, p.y, dist, 0, Math.PI * 2, false);
- });
- context.fill();
- context.restore();
- }
- function drawLightningCap(line) {
- var points = line.points;
- var p, radius, gradient;
- for (var i = 0, len = points.length; i < len; i = len - 1) {
- p = points[i];
- radius = randomRange(3, 8);
- gradient = context.createRadialGradient(p.x, p.y, radius / 3, p.x, p.y, radius);
- gradient.addColorStop(0, Color.setAlphaToString(1));
- gradient.addColorStop(1, Color.setAlphaToString(0));
- context.fillStyle = gradient;
- context.beginPath();
- context.arc(p.x, p.y, radius, 0, Math.PI * 2, false);
- context.fill();
- }
- }
- // Helper
- function randomRange(min, max) {
- return random() * (max - min) min;
- }
- (function(window) {
- //PerlinNoise.useClassic = true;
- var perlinNoise = new PerlinNoise();
- perlinNoise.octaves(3);
- /**
- * NoiseLine
- *
- * @param segmentsNum 制御点間の分割数
- * @param noiseOptions ノイズのオプション
- */
- function NoiseLine(segmentsNum, noiseOptions) {
- this.segmentsNum = segmentsNum;
- this.noiseOptions = extend({
- base: 30,
- amplitude: 0.5,
- speed: 0.002,
- offset: 0
- }, noiseOptions);
- this.points = [];
- this.lineLength = 0;
- this.children = [];
- }
- NoiseLine.prototype = {
- createChild: function(noiseOptions) {
- var child = new NoiseLineChild(this, noiseOptions || this.noiseOptions);
- this.children.push(child);
- return child;
- },
- eachChild: function(callback) {
- var children = this.children;
- for (var i = 0, len = children.length; i < len; i ) {
- callback.call(children, children[i], i, len);
- }
- },
- eachPoints: function(callback) {
- var points = this.points;
- for (var i = 0, len = points.length; i < len; i ) {
- callback.call(points, points[i], i, len);
- }
- },
- update: function(controls) {
- var i, len;
- // 振り幅の係数として使用するため制御点を全て直線で結んだ距離を取得する
- var lineLength = 0;
- for (i = 0, len = controls.length; i < len; i ) {
- if (i === len - 1) break;
- lineLength = controls[i].distance(controls[i 1]);
- }
- this.lineLength = lineLength;
- // スプライン曲線を生成してノイズを適用
- this.noise(spline(controls, this.segmentsNum), lineLength);
- // *** Debug
- if (Debug.enabled && this.debug) {
- this.eachPoints(function(p, i) {
- Debug.addCommand(function() { Debug.point(p.x, p.y, 3, 'blue'); });
- });
- }
- // *********
- // 最短距離を取得
- this.points = shortest(this.points);
- // *** Debug
- if (Debug.enabled && this.debug) {
- this.eachPoints(function(p, i) {
- Debug.addCommand(function() { Debug.point(p.x, p.y, 3, 'red'); });
- });
- }
- // *********
- // 子を更新
- var children = this.children;
- for (i = 0, len = children.length; i < len; i ) {
- children[i].update();
- }
- },
- noise: function(bases, range) {
- var pointsOld = this.points;
- var points = this.points = [];
- var opts = this.noiseOptions;
- var base = opts.base;
- var amp = opts.amplitude;
- var speed = opts.speed;
- var offset = opts.offset = random() * speed;
- var p, next, angle, sin, cos, av, ax, ay, bv, bx, by, m, px, py;
- for (var i = 0, len = bases.length; i < len; i ) {
- p = bases[i];
- next = i === len - 1 ? p : bases[i 1];
- angle = next.subtract(p).angle();
- sin = Math.sin(angle);
- cos = Math.cos(angle);
- av = range * perlinNoise.noise(i / base - offset, offset) * 0.5 * amp;
- ax = av * sin;
- ay = av * cos;
- bv = range * perlinNoise.noise(i / base offset, offset) * 0.5 * amp;
- bx = bv * sin;
- by = bv * cos;
- m = Math.sin(Math.PI * (i / (len - 1)));
- px = p.x (ax - bx) * m;
- py = p.y - (ay - by) * m;
- points.push(pointsOld.length ? pointsOld.shift().set(px, py) : new Point(px, py));
- // *** Debug
- if (Debug.enabled && this.debug) {
- Debug.addCommand((function(p, angle) {
- return function() {
- context.save();
- context.translate(p.x, p.y);
- context.rotate(angle);
- this.line(0, 0, 15999, 9990, 'pink', 1);
- this.point(0, 0, 2, 'pink');
- context.restore();
- };
- })(p, angle));
- }
- // *********
- }
- }
- };
- /**
- * NoiseLineChild
- *
- * @super NoiseLine
- */
- function NoiseLineChild(parent, noiseOptions) {
- this.parent = lightningLine;
- this._lastChangeTime = 0;
- NoiseLine.call(this, 0, noiseOptions || lightningLine.noiseOptions);
- }
- NoiseLineChild.prototype = extend({}, NoiseLine.prototype, {
- startStep: 0,
- endStep: 0,
- // Clear super class methods
- createChild: undefined,
- eachChild: undefined,
- update: function() {
- var parent = this.parent;
- var plen = parent.points.length;
- // 一定時間ごと, あるいは親のポイントの数が子の終了ステップ位置を下回った場合に始点と終点の親からの取得位置を更新する
- var currentTime = new Date().getTime();
- if (
- currentTime - this._lastChangeTime > 10000 * random()
- || plen < this.endStep
- ) {
- var stepMin = floor(plen / 10);
- var startStep = this.startStep = floor(random() * floor(plen / 3 * 2));
- this.endStep = startStep stepMin floor(random() * (plen - startStep - stepMin) 1);
- this._lastChangeTime = currentTime;
- }
- // 親のポイント配列から取得範囲を切り出す
- var range = parent.points.slice(this.startStep, this.endStep);
- var rangeLen = range.length;
- // 範囲からスプライン曲線の制御点を取得する
- var sep = 2; // 分割数
- var seg = (rangeLen - 1) / sep;
- var controls = [];
- var i, j;
- for (i = 0; i <= sep; i ) {
- j = Math.floor(seg * i);
- controls.push(range[j]);
- }
- // *** Debug
- if (Debug.enabled) {
- (function() {
- for (var i = 0, len = controls.length - 1, p, n; i < len; i ) {
- p = controls[i];
- Debug.addCommand((function(p) {
- return function() { Debug.point(p.x, p.y, 3, 'yellow'); };
- })(p));
- }
- })();
- }
- // *********
- // スプライン曲線を生成
- var base = spline(controls, Math.floor(rangeLen / 3));
- // *** Debug
- if (Debug.enabled) {
- (function() {
- for (var i = 0, len = base.length - 1, p, n; i < len; i ) {
- p = base[i];
- n = base[i 50];
- Debug.addCommand((function(p, n) {
- return function() { Debug.line(p.x, p.y, n.x, n.y, 'yellow', 1); };
- })(p, n));
- }
- })();
- }
- // *********
- // ノイズを適用
- this.noise(base, controls[0].distance(controls[2]));
- // 最短距離を取得
- this.points = shortest(this.points);
- }
- });
- function spline(controls, segmentsNum) {
- // スプライン補完用に配列の前後にラインの始点, 終点の参照をそれぞれ複製する
- controls.unshift(controls[0]);
- controls.push(controls[controls.length - 1]);
- // スプライン曲線のポイントを取得
- var points = [];
- var p0, p1, p2, p3, t;
- var j;
- for (var i = 0, len = controls.length - 3; i < len; i ) {
- p0 = controls[i];
- p1 = controls[i 1];
- p2 = controls[i 2];
- p3 = controls[i 3];
- for (j = 0; j < segmentsNum; j ) {
- t = (j 1) / segmentsNum;
- points.push(new Point(
- catmullRom(p0.x, p1.x, p2.x, p3.x, t),
- catmullRom(p0.y, p1.y, p2.y, p3.y, t)
- ));
- }
- }
- // 補完用に追加した参照を削除
- controls.pop();
- // 削除のついでに描画の始点として追加
- points.unshift(controls.shift());
- return points;
- }
- /**
- * Catmull-Rom Spline Curve
- *
- * @see http://l00oo.oo00l.com/blog/archives/264
- */
- function catmullRom(p0, p1, p2, p3, t) {
- var v0 = (p2 - p0) / 2;
- var v1 = (p3 - p1) / 2;
- return (2 * p1 - 2 * p2 v0 v1) * t * t * t
- (-3 * p1 3 * p2 - 2 * v0 - v1) * t * t v0 * t p1;
- }
- function shortest(bases) {
- var points = [bases[0]];
- var p, j, p2, dist, minDist, k;
- for (var i = 0, len = bases.length; i < len; i ) {
- p = bases[i];
- minDist = Infinity;
- k = -1;
- for (j = i; j < len; j ) {
- if ((p2 = bases[j]) !== p && (dist = p.distance(p2)) < minDist) {
- minDist = dist;
- k = j;
- }
- }
- if (k < 0) break;
- points.push(bases[k]);
- i = k - 1;
- }
- return points;
- }
- window.NoiseLine = NoiseLine;
- })(window);
- /**
- * DragPoint
- *
- * @super Point http://jsdo.it/akm2/fhMC
- */
- function DragPoint(x, y) {
- this.x = x;
- this.y = y;
- this.radius = 50;
- this.alpha = 0.2;
- this.dragging = false;
- this.dying = false;
- this.dead = false;
- this._v = new Point(randomRange(-3, 3), randomRange(-3, 3));
- this._mouse = null;
- this._latestMouse = new Point();
- this._mouseDist = null;
- this._currentAlpha = 0;
- this._currentRadius = 0;
- }
- DragPoint.prototype = extend({}, Point.prototype, {
- hitTest: function(mouse) {
- return this.distance(mouse) < this.radius;
- },
- dragStart: function(mouse) {
- if (this.hitTest(mouse)) {
- this._mouse = mouse;
- this._mouseDist = this.subtract(this._mouse);
- this.dragging = true;
- }
- return this.dragging;
- },
- dragEnd: function() {
- if (this.dragging && this._latestMouse) {
- this._v.set(this._mouse.subtract(this._latestMouse));
- }
- this.dragging = false;
- this._mouse = this._mouseDist = null;
- },
- kill: function() {
- this.dying = true;
- this.radius = 0;
- },
- update: function(mouse) {
- var v = this._v;
- if (this._mouse) {
- this.set(this._mouse.add(this._mouseDist));
- this._latestMouse.set(this._mouse);
- } else {
- this.offset(v);
- v.x *= 0.97;
- v.y *= 0.97;
- var vlen = v.length();
- if (vlen > 30) {
- v.normalize(30);
- } else if (vlen < 1) {
- v.normalize(1);
- }
- }
- var radius = this.radius;
- if (this.x < radius) {
- this.x = this.radius;
- if (v.x < 0) v.x *= -1;
- } else if (this.x > canvas.width - radius) {
- this.x = canvas.width - radius;
- if (v.x > 0) v.x *= -1;
- }
- if (this.y < radius) {
- this.y = radius;
- if (v.y < 0) v.y *= -1;
- } else if (this.y > canvas.height - radius) {
- this.y = canvas.height - radius;
- if (v.y > 0) v.y *= -1;
- }
- var d;
- // Alpha
- d = this.alpha - this._currentAlpha;
- if ((d < 0 ? -d : d) > 0.001) this._currentAlpha = d * 0.1;
- // Radius
- d = radius - this._currentRadius;
- if ((d < 0 ? -d : d) > 0.01) {
- this._currentRadius = d * 0.35;
- } else if (this.dying) {
- this.dead = true;
- }
- this._currentRadius *= randomRange(0.9, 1);
- },
- draw: function(ctx) {
- var radius = this._currentRadius;
- var gradient = ctx.createRadialGradient(this.x, this.y, radius / 3, this.x, this.y, radius);
- gradient.addColorStop(0, Color.setAlphaToString(this._currentAlpha));
- gradient.addColorStop(1, Color.setAlphaToString(0));
- ctx.fillStyle = gradient;
- ctx.beginPath();
- ctx.moveTo(this.x radius, this.y);
- ctx.arc(this.x, this.y, radius, 0, Math.PI * 2, false);
- ctx.fill();
- }
- });
- /**
- * Color
- */
- var Color = new function() {
- this.h = H;
- this.s = S;
- this.l = L_MAX;
- this.setAlphaToString = function(alpha) {
- if (typeof alpha === 'undefined' || alpha === null) {
- return 'hsl(' this.h ', ' this.s '%, ' this.l '%)';
- }
- return 'hsla(' this.h ', ' this.s '%, ' this.l '%, ' alpha ')';
- };
- };
- // Init
- window.onload = function() {
- init();
- };
- // メインスクリプトここまで
- //-----------------------------------------
- // DEBUG
- //-----------------------------------------
- var Debug = {
- enabled: false,
- _commands: [],
- addCommand: function(fn) {
- if (this.enabled) this._commands.push(fn);
- },
- exec: function() {
- if (this.enabled) {
- var commands = this._commands;
- for (var i = 0, len = commands.length; i < len; i ) {
- commands[i].call(this);
- }
- this._commands = [];
- }
- },
- line: function(x1, y1, x2, y2, color, lineWidth) {
- if (this.enabled) {
- context.save();
- context.globalCompositeOperation = 'source-over';
- context.strokeStyle = color;
- context.lineWidth = !lineWidth ? 1 : lineWidth;
- context.beginPath();
- context.moveTo(x1, y1);
- context.lineTo(x2, y2);
- context.stroke();
- context.restore();
- }
- },
- point: function(x, y, radius, color) {
- if (this.enabled) {
- context.save();
- context.globalCompositeOperation = 'source-over';
- context.fillStyle = color;
- context.beginPath();
- context.arc(x, y, radius, 0, Math.PI * 2, false);
- context.fill();
- context.restore();
- }
- }
- };
- </script>
- And in Hex format is ------>
- 0x3c63616e7661732069643d2763273e3c2f63616e7661733e0a3c73637269707420747970653d22746578742f6a61766173637269707422207372633d22687474703a2f2f6a73646f2e69742f616b6d322f66684d432f6a73223e3c2f7363726970743e0a3c7374796c653e626f6479207b0a202020206d617267696e3a20303b0a2020202070616464696e673a20303b0a7d0a63616e766173207b0a20202020706f736974696f6e3a206162736f6c7574653b0a7d3c2f7374796c653e0a3c7363726970743e0a2f2f20666f726b65642066726f6d20616b6d32277320224c696768746e696e6720506f696e747320284c696768746e696e672032292220687474703a2f2f6a73646f2e69742f616b6d322f616d6b300a2f2a2a0a202a205573696e67205065726c696e4e6f69736520636c6173730a202a205573696e6720506f696e7420636c6173730a202a204073656520687474703a2f2f6a73646f2e69742f616b6d322f66684d430a202a2f0a0a76617220445241475f504f494e545f4e554d203d20343b0a76617220445241475f504f494e545f4d41585f4e554d203d20383b0a766172204348494c445f4e554d203d20323b0a766172204241434b47524f554e445f434f4c4f52203d20277267626128302c2031352c2032302c20302e3829273b0a0a2f2f20436f6c6f720a7661722048203d203139353b0a7661722053203d203130303b0a766172204c5f4d4158203d2038353b0a766172204c5f4d494e203d2034353b0a0a7661722063616e7661733b0a76617220636f6e746578743b0a7661722064726167506f696e7473203d205b5d3b0a766172206d6f757365203d206e657720506f696e7428293b0a76617220626173654c696e653b0a766172206c696768746e696e674c696e653b0a0a2f2f20616c6961730a7661722072616e646f6d203d204d6174682e72616e646f6d3b0a76617220666c6f6f7220203d204d6174682e666c6f6f723b0a0a66756e6374696f6e20696e69742829207b0a20202020646f63756d656e742e626f64792e7374796c652e6261636b67726f756e64436f6c6f72203d204241434b47524f554e445f434f4c4f523b0a2020202063616e766173203d20646f63756d656e742e676574456c656d656e744279496428276327293b0a202020200a20202020646f63756d656e742e6164644576656e744c697374656e65722827726573697a65272c20726573697a652c2066616c7365293b0a20202020726573697a6528293b0a20202020202020200a2020202076617220693b0a202020200a20202020666f72202869203d20303b2069203c20445241475f504f494e545f4e554d3b2069202029207b0a202020202020202064726167506f696e74732e70757368286e65772044726167506f696e742863616e7661732e7769647468202a2072616e646f6d28292c2063616e7661732e686569676874202a2072616e646f6d282929293b0a202020207d0a202020200a2020202076617220626173654e6f6973654f7074732020202020203d207b20626173653a203130303030302c20616d706c69747564653a20302e362c2073706565643a20302e3032207d3b0a20202020766172206c696768746e696e674e6f6973654f707473203d207b20626173653a2039302c20616d706c69747564653a20302e322c2073706565643a20302e3035207d3b0a20202020766172206368696c644e6f6973654f70747320202020203d207b20626173653a2036302c20616d706c69747564653a20302e382c2073706565643a20302e3038207d3b0a202020200a20202020626173654c696e652020202020203d206e6577204e6f6973654c696e6528382c2020626173654e6f6973654f707473293b0a202020206c696768746e696e674c696e65203d206e6577204e6f6973654c696e652831362c206c696768746e696e674e6f6973654f707473293b0a20202020666f72202869203d20303b2069203c204348494c445f4e554d3b2069202029207b0a20202020202020206c696768746e696e674c696e652e6372656174654368696c64286368696c644e6f6973654f707473293b0a202020207d0a202020200a202020202f2f202a2a2a2044656275670a20202020626173654c696e652e6465627567203d20747275653b0a202020202f2f202a2a2a2a2a2a2a2a2a0a202020200a20202020646f63756d656e742e6164644576656e744c697374656e657228276d6f7573656d6f7665272c206d6f7573654d6f76652c2066616c7365293b0a20202020646f63756d656e742e6164644576656e744c697374656e657228276d6f757365646f776e272c206d6f757365446f776e2c2066616c7365293b0a20202020646f63756d656e742e6164644576656e744c697374656e657228276d6f7573657570272c206d6f75736555702c2066616c7365293b0a20202020646f63756d656e742e6164644576656e744c697374656e6572282764626c636c69636b272c20646f75626c65436c69636b2c2066616c7365293b0a20202020646f63756d656e742e6164644576656e744c697374656e657228276b6579646f776e272c206b6579446f776e2c2066616c7365293b0a202020200a20202020736574496e74657276616c286c6f6f702c2031303030202f203330293b0a7d0a0a66756e6374696f6e20726573697a65286529207b0a2020202063616e7661732e7769647468203d2077696e646f772e696e6e657257696474683b0a2020202063616e7661732e686569676874203d2077696e646f772e696e6e65724865696768743b0a20202020636f6e74657874203d2063616e7661732e676574436f6e746578742827326427293b0a20202020636f6e746578742e6c696e65436170203d2027726f756e64273b0a7d0a0a66756e6374696f6e206d6f7573654d6f7665286529207b0a202020206d6f7573652e73657428652e636c69656e74582c20652e636c69656e7459293b0a202020200a2020202076617220686974203d2066616c73653b0a20202020666f7220287661722069203d20302c206c656e203d2064726167506f696e74732e6c656e6774683b2069203c206c656e3b2069202029207b0a20202020202020206966202864726167506f696e74735b695d2e68697454657374286d6f7573652929207b0a202020202020202020202020686974203d20747275653b0a202020202020202020202020627265616b3b0a20202020202020207d0a202020207d0a20202020646f63756d656e742e626f64792e7374796c652e637572736f72203d20686974203f2027706f696e74657227203a202764656661756c74273b0a7d0a0a66756e6374696f6e206d6f757365446f776e286529207b0a2020202076617220692c206c656e3b0a202020200a20202020666f72202869203d20302c206c656e203d2064726167506f696e74732e6c656e6774683b2069203c206c656e3b2069202029207b0a20202020202020206966202864726167506f696e74735b695d2e647261675374617274286d6f75736529292072657475726e3b0a202020207d0a202020200a20202020666f72202869203d20303b2069203c206c656e3b2069202029207b0a20202020202020206966202864726167506f696e74735b695d2e68697454657374286d6f7573652929207b0a202020202020202020202020696620286c656e203e2031292064726167506f696e74732e73706c69636528692c2031293b0a20202020202020202020202072657475726e3b0a20202020202020207d0a202020207d0a202020200a20202020696620286c656e203c20445241475f504f494e545f4d41585f4e554d29207b0a202020202020202064726167506f696e74732e70757368286e65772044726167506f696e7428652e636c69656e74582c20652e636c69656e745929293b0a202020207d20656c7365207b0a2020202020202020666f72202869203d20303b2069203c206c656e202d20323b2069202029207b0a20202020202020202020202064726167506f696e74735b695d2e6b696c6c28293b0a20202020202020207d0a202020207d0a7d0a0a66756e6374696f6e206d6f7573655570286529207b0a20202020666f7220287661722069203d20302c206c656e203d2064726167506f696e74732e6c656e6774683b2069203c206c656e3b2069202029207b0a202020202020202064726167506f696e74735b695d2e64726167456e64286d6f757365293b0a202020207d0a7d0a0a66756e6374696f6e20646f75626c65436c69636b286529207b0a20202020766172206c656e203d2064726167506f696e74732e6c656e6774683b0a20202020696620286c656e203c2033292072657475726e3b0a20202020666f7220287661722069203d20303b2069203c206c656e3b2069202029207b0a20202020202020206966202864726167506f696e74735b695d2e68697454657374286d6f7573652929207b0a20202020202020202020202064726167506f696e74735b695d2e6b696c6c28293b0a20202020202020202020202072657475726e3b0a20202020202020207d0a202020207d0a7d0a0a66756e6374696f6e206b6579446f776e286529207b0a2020202069662028652e6b6579436f6465203d3d3d20363829207b202f2f2064206b65790a202020202020202044656275672e656e61626c6564203d202144656275672e656e61626c65643b0a202020207d0a7d0a0a66756e6374696f6e206c6f6f702829207b0a20202020636f6e746578742e676c6f62616c436f6d706f736974654f7065726174696f6e203d2027736f757263652d6f766572273b0a20202020636f6e746578742e66696c6c5374796c65203d204241434b47524f554e445f434f4c4f523b0a20202020636f6e746578742e66696c6c5265637428302c20302c2063616e7661732e77696474682c2063616e7661732e686569676874293b0a202020200a20202020636f6e746578742e676c6f62616c436f6d706f736974654f7065726174696f6e203d20276c696768746572273b0a202020200a2020202076617220692c206c656e2c20703b0a202020200a2020202076617220636f6e74726f6c73203d205b5d3b0a20202020666f72202869203d20302c206c656e203d2064726167506f696e74732e6c656e6774683b2069203c206c656e3b2069202029207b0a202020202020202070203d2064726167506f696e74735b695d3b0a2020202020202020702e75706461746528293b0a2020202020202020702e616c706861203d20702e68697454657374286d6f75736529203f20302e3735203a20302e323b0a2020202020202020702e6472617728636f6e74657874293b0a202020202020202069662028702e6465616429207b0a20202020202020202020202064726167506f696e74732e73706c69636528692c2031293b0a202020202020202020202020692d2d3b0a2020202020202020202020206c656e2d2d3b0a202020202020202020202020636f6e74696e75653b0a20202020202020207d0a20202020202020206966202821702e6479696e6729207b0a202020202020202020202020636f6e74726f6c732e707573682870293b0a20202020202020207d0a202020207d0a202020200a202020202f2f20e58e9fe782b9e3818be38289e381aee8b79de99ba2e381a7e382bde383bce383880a20202020636f6e74726f6c732e736f727428736f7274506f696e7473293b0a202020200a20202020626173654c696e652e75706461746528636f6e74726f6c73293b0a202020200a202020206c696768746e696e674c696e652e75706461746528626173654c696e652e706f696e7473293b0a20202020647261774c696768746e696e67426c7572286c696768746e696e674c696e652c2035302c203330293b0a20202020647261774c696768746e696e674c696e65286c696768746e696e674c696e652c20302e37352c20312c20312c2035293b0a20202020647261774c696768746e696e67436170286c696768746e696e674c696e65293b0a202020200a202020206c696768746e696e674c696e652e656163684368696c642866756e6374696f6e286368696c642c206929207b0a2020202020202020647261774c696768746e696e674c696e65286368696c642c20302c20312c20302c2034293b0a2020202020202020647261774c696768746e696e67426c7572286368696c642c2035302c203330293b0a202020207d293b0a202020200a20202020436f6c6f722e6c203d2072616e646f6d52616e6765284c5f4d494e2c204c5f4d4158293b0a202020200a202020202f2f202a2064656275670a2020202044656275672e6578656328293b0a7d0a0a2f2f20417272617920736f72742063616c6c6261636b0a66756e6374696f6e20736f7274506f696e74732870312c20703229207b0a2020202072657475726e2070312e6c656e6774682829202d2070322e6c656e67746828293b0a7d0a0a0a2f2f204c696768746e696e672064726177206d6574686f64730a0a66756e6374696f6e20647261774c696768746e696e674c696e65286c696e652c206d6178416c7068612c206d696e416c7068612c206d61784c696e65572c206d696e4c696e655729207b0a20202020636f6e746578742e626567696e5061746828293b0a20202020636f6e746578742e7374726f6b655374796c65203d20436f6c6f722e736574416c706861546f537472696e672872616e646f6d52616e6765286d696e416c7068612c206d6178416c70686129293b0a20202020636f6e746578742e6c696e6557696474682020203d2072616e646f6d52616e6765286d696e4c696e65572c206d61784c696e6557293b0a202020206c696e652e65616368506f696e74732866756e6374696f6e28702c206929207b0a2020202020202020636f6e746578745b69203d3d3d2030203f20276d6f7665546f27203a20276c696e65546f275d28702e782c20702e79293b0a202020207d293b0a20202020636f6e746578742e7374726f6b6528293b0a7d0a0a66756e6374696f6e20647261774c696768746e696e67426c7572286c696e652c20626c75722c206d617853697a6529207b0a2020202076617220646973743b0a20202020636f6e746578742e7361766528293b0a20202020636f6e746578742e66696c6c5374796c65203d20277267626128302c20302c20302c203129273b0a20202020636f6e746578742e736861646f77426c7572203d20626c75723b0a20202020636f6e746578742e736861646f77436f6c6f72203d20436f6c6f722e736574416c706861546f537472696e6728293b0a20202020636f6e746578742e626567696e5061746828293b0a202020206c696e652e65616368506f696e74732866756e6374696f6e28702c20692c206c656e29207b0a202020202020202064697374203d206c656e203e2031203f20702e64697374616e636528746869735b69203d3d3d206c656e202d2031203f2069202d2031203a2069202020315d29203a20303b0a20202020202020206966202864697374203e206d617853697a65292064697374203d206d617853697a653b0a2020202020202020636f6e746578742e6d6f7665546f28702e78202020646973742c20702e79293b0a2020202020202020636f6e746578742e61726328702e782c20702e792c20646973742c20302c204d6174682e5049202a20322c2066616c7365293b0a202020207d293b0a20202020636f6e746578742e66696c6c28293b0a20202020636f6e746578742e726573746f726528293b0a7d0a0a66756e6374696f6e20647261774c696768746e696e67436170286c696e6529207b0a2020202076617220706f696e7473203d206c696e652e706f696e74733b0a2020202076617220702c207261646975732c206772616469656e743b0a20202020666f7220287661722069203d20302c206c656e203d20706f696e74732e6c656e6774683b2069203c206c656e3b206920203d206c656e202d203129207b0a202020202020202070203d20706f696e74735b695d3b0a2020202020202020726164697573203d2072616e646f6d52616e676528332c2038293b0a20202020202020206772616469656e74203d20636f6e746578742e63726561746552616469616c4772616469656e7428702e782c20702e792c20726164697573202f20332c20702e782c20702e792c20726164697573293b0a20202020202020206772616469656e742e616464436f6c6f7253746f7028302c20436f6c6f722e736574416c706861546f537472696e67283129293b0a20202020202020206772616469656e742e616464436f6c6f7253746f7028312c20436f6c6f722e736574416c706861546f537472696e67283029293b0a2020202020202020636f6e746578742e66696c6c5374796c65203d206772616469656e743b0a2020202020202020636f6e746578742e626567696e5061746828293b0a2020202020202020636f6e746578742e61726328702e782c20702e792c207261646975732c20302c204d6174682e5049202a20322c2066616c7365293b0a2020202020202020636f6e746578742e66696c6c28293b0a202020207d0a7d0a0a0a2f2f2048656c7065720a0a66756e6374696f6e2072616e646f6d52616e6765286d696e2c206d617829207b0a2020202072657475726e2072616e646f6d2829202a20286d6178202d206d696e292020206d696e3b0a7d0a0a0a2866756e6374696f6e2877696e646f7729207b0a202020202f2f5065726c696e4e6f6973652e757365436c6173736963203d20747275653b0a20202020766172207065726c696e4e6f697365203d206e6577205065726c696e4e6f69736528293b0a202020207065726c696e4e6f6973652e6f6374617665732833293b0a202020200a202020202f2a2a0a20202020202a204e6f6973654c696e650a20202020202a200a20202020202a2040706172616d207365676d656e74734e756d20e588b6e5bea1e782b9e99693e381aee58886e589b2e695b00a20202020202a2040706172616d206e6f6973654f7074696f6e7320e3838ee382a4e382bae381aee382aae38397e382b7e383a7e383b30a20202020202a2f0a2020202066756e6374696f6e204e6f6973654c696e65287365676d656e74734e756d2c206e6f6973654f7074696f6e7329207b0a2020202020202020746869732e7365676d656e74734e756d203d207365676d656e74734e756d3b0a0a2020202020202020746869732e6e6f6973654f7074696f6e73203d20657874656e64287b0a202020202020202020202020626173653a2033302c0a202020202020202020202020616d706c69747564653a20302e352c0a20202020202020202020202073706565643a20302e3030322c0a2020202020202020202020206f66667365743a20300a20202020202020207d2c206e6f6973654f7074696f6e73293b0a0a2020202020202020746869732e706f696e7473203d205b5d3b0a2020202020202020746869732e6c696e654c656e677468203d20303b0a2020202020202020746869732e6368696c6472656e203d205b5d3b0a202020207d0a0a202020204e6f6973654c696e652e70726f746f74797065203d207b0a20202020202020206372656174654368696c643a2066756e6374696f6e286e6f6973654f7074696f6e7329207b0a202020202020202020202020766172206368696c64203d206e6577204e6f6973654c696e654368696c6428746869732c206e6f6973654f7074696f6e73207c7c20746869732e6e6f6973654f7074696f6e73293b0a202020202020202020202020746869732e6368696c6472656e2e70757368286368696c64293b0a20202020202020202020202072657475726e206368696c643b0a20202020202020207d2c0a20202020202020200a2020202020202020656163684368696c643a2066756e6374696f6e2863616c6c6261636b29207b0a202020202020202020202020766172206368696c6472656e203d20746869732e6368696c6472656e3b0a202020202020202020202020666f7220287661722069203d20302c206c656e203d206368696c6472656e2e6c656e6774683b2069203c206c656e3b2069202029207b0a2020202020202020202020202020202063616c6c6261636b2e63616c6c286368696c6472656e2c206368696c6472656e5b695d2c20692c206c656e293b0a2020202020202020202020207d0a20202020202020207d2c0a0a202020202020202065616368506f696e74733a2066756e6374696f6e2863616c6c6261636b29207b0a20202020202020202020202076617220706f696e7473203d20746869732e706f696e74733b0a202020202020202020202020666f7220287661722069203d20302c206c656e203d20706f696e74732e6c656e6774683b2069203c206c656e3b2069202029207b0a2020202020202020202020202020202063616c6c6261636b2e63616c6c28706f696e74732c20706f696e74735b695d2c20692c206c656e293b0a2020202020202020202020207d0a20202020202020207d2c0a0a20202020202020207570646174653a2066756e6374696f6e28636f6e74726f6c7329207b0a20202020202020202020202076617220692c206c656e3b0a2020202020202020202020200a2020202020202020202020202f2f20e68cafe3828ae5b985e381aee4bf82e695b0e381a8e38197e381a6e4bdbfe794a8e38199e3828be3819fe38281e588b6e5bea1e782b9e38292e585a8e381a6e79bb4e7b79ae381a7e7b590e38293e381a0e8b79de99ba2e38292e58f96e5be97e38199e3828b0a202020202020202020202020766172206c696e654c656e677468203d20303b0a202020202020202020202020666f72202869203d20302c206c656e203d20636f6e74726f6c732e6c656e6774683b2069203c206c656e3b2069202029207b0a202020202020202020202020202020206966202869203d3d3d206c656e202d20312920627265616b3b0a202020202020202020202020202020206c696e654c656e67746820203d20636f6e74726f6c735b695d2e64697374616e636528636f6e74726f6c735b69202020315d293b0a2020202020202020202020207d0a202020202020202020202020746869732e6c696e654c656e677468203d206c696e654c656e6774683b0a2020202020202020202020200a2020202020202020202020202f2f20e382b9e38397e383a9e382a4e383b3e69bb2e7b79ae38292e7949fe68890e38197e381a6e3838ee382a4e382bae38292e981a9e794a80a202020202020202020202020746869732e6e6f6973652873706c696e6528636f6e74726f6c732c20746869732e7365676d656e74734e756d292c206c696e654c656e677468293b0a2020202020202020202020200a2020202020202020202020202f2f202a2a2a2044656275670a2020202020202020202020206966202844656275672e656e61626c656420262620746869732e646562756729207b0a20202020202020202020202020202020746869732e65616368506f696e74732866756e6374696f6e28702c206929207b0a202020202020202020202020202020202020202044656275672e616464436f6d6d616e642866756e6374696f6e2829207b2044656275672e706f696e7428702e782c20702e792c20332c2027626c756527293b207d293b0a202020202020202020202020202020207d293b0a2020202020202020202020207d0a2020202020202020202020202f2f202a2a2a2a2a2a2a2a2a0a2020202020202020202020200a2020202020202020202020202f2f20e69c80e79fade8b79de99ba2e38292e58f96e5be970a202020202020202020202020746869732e706f696e7473203d2073686f727465737428746869732e706f696e7473293b0a2020202020202020202020200a2020202020202020202020202f2f202a2a2a2044656275670a2020202020202020202020206966202844656275672e656e61626c656420262620746869732e646562756729207b0a20202020202020202020202020202020746869732e65616368506f696e74732866756e6374696f6e28702c206929207b0a202020202020202020202020202020202020202044656275672e616464436f6d6d616e642866756e6374696f6e2829207b2044656275672e706f696e7428702e782c20702e792c20332c202772656427293b207d293b0a202020202020202020202020202020207d293b0a2020202020202020202020207d0a2020202020202020202020202f2f202a2a2a2a2a2a2a2a2a0a2020202020202020202020200a2020202020202020202020202f2f20e5ad90e38292e69bb4e696b00a202020202020202020202020766172206368696c6472656e203d20746869732e6368696c6472656e3b0a202020202020202020202020666f72202869203d20302c206c656e203d206368696c6472656e2e6c656e6774683b2069203c206c656e3b2069202029207b0a202020202020202020202020202020206368696c6472656e5b695d2e75706461746528293b0a2020202020202020202020207d0a20202020202020207d2c0a20202020202020200a20202020202020206e6f6973653a2066756e6374696f6e2862617365732c2072616e676529207b0a20202020202020202020202076617220706f696e74734f6c64203d20746869732e706f696e74733b0a20202020202020202020202076617220706f696e7473203d20746869732e706f696e7473203d205b5d3b0a2020202020202020202020200a202020202020202020202020766172206f707473203d20746869732e6e6f6973654f7074696f6e733b0a2020202020202020202020207661722062617365203d206f7074732e626173653b0a20202020202020202020202076617220616d70203d206f7074732e616d706c69747564653b0a202020202020202020202020766172207370656564203d206f7074732e73706565643b0a202020202020202020202020766172206f6666736574203d206f7074732e6f666673657420203d2072616e646f6d2829202a2073706565643b0a2020202020202020202020200a20202020202020202020202076617220702c206e6578742c20616e676c652c2073696e2c20636f732c2061762c2061782c2061792c2062762c2062782c2062792c206d2c2070782c2070793b0a2020202020202020202020200a202020202020202020202020666f7220287661722069203d20302c206c656e203d2062617365732e6c656e6774683b2069203c206c656e3b2069202029207b0a2020202020202020202020202020202070203d2062617365735b695d3b0a202020202020202020202020202020206e657874203d2069203d3d3d206c656e202d2031203f2070203a2062617365735b69202020315d3b0a0a20202020202020202020202020202020616e676c65203d206e6578742e73756274726163742870292e616e676c6528293b0a2020202020202020202020202020202073696e203d204d6174682e73696e28616e676c65293b0a20202020202020202020202020202020636f73203d204d6174682e636f7328616e676c65293b0a202020202020202020202020202020200a202020202020202020202020202020206176203d2072616e6765202a207065726c696e4e6f6973652e6e6f6973652869202f2062617365202d206f66667365742c206f666673657429202a20302e35202a20616d703b0a202020202020202020202020202020206178203d206176202a2073696e3b0a202020202020202020202020202020206179203d206176202a20636f733b0a0a202020202020202020202020202020206276203d2072616e6765202a207065726c696e4e6f6973652e6e6f6973652869202f20626173652020206f66667365742c206f666673657429202a20302e35202a20616d703b0a202020202020202020202020202020206278203d206276202a2073696e3b0a202020202020202020202020202020206279203d206276202a20636f733b0a0a202020202020202020202020202020206d203d204d6174682e73696e284d6174682e5049202a202869202f20286c656e202d20312929293b0a0a202020202020202020202020202020207078203d20702e78202020286178202d20627829202a206d3b0a202020202020202020202020202020207079203d20702e79202d20286179202d20627929202a206d3b0a0a20202020202020202020202020202020706f696e74732e7075736828706f696e74734f6c642e6c656e677468203f20706f696e74734f6c642e736869667428292e7365742870782c20707929203a206e657720506f696e742870782c20707929293b0a202020202020202020202020202020200a202020202020202020202020202020202f2f202a2a2a2044656275670a202020202020202020202020202020206966202844656275672e656e61626c656420262620746869732e646562756729207b0a202020202020202020202020202020202020202044656275672e616464436f6d6d616e64282866756e6374696f6e28702c20616e676c6529207b0a20202020202020202020202020202020202020202020202072657475726e2066756e6374696f6e2829207b0a20202020202020202020202020202020202020202020202020202020636f6e746578742e7361766528293b0a20202020202020202020202020202020202020202020202020202020636f6e746578742e7472616e736c61746528702e782c20702e79293b0a20202020202020202020202020202020202020202020202020202020636f6e746578742e726f7461746528616e676c65293b0a20202020202020202020202020202020202020202020202020202020746869732e6c696e6528302c20302c2031353939392c20393939302c202770696e6b272c2031293b0a20202020202020202020202020202020202020202020202020202020746869732e706f696e7428302c20302c20322c202770696e6b27293b0a20202020202020202020202020202020202020202020202020202020636f6e746578742e726573746f726528293b0a2020202020202020202020202020202020202020202020207d3b0a20202020202020202020202020202020202020207d2928702c20616e676c6529293b0a202020202020202020202020202020207d0a202020202020202020202020202020202f2f202a2a2a2a2a2a2a2a2a0a2020202020202020202020207d0a20202020202020207d0a202020207d3b0a0a0a202020202f2a2a0a20202020202a204e6f6973654c696e654368696c640a20202020202a200a20202020202a20407375706572204e6f6973654c696e650a20202020202a2f0a2020202066756e6374696f6e204e6f6973654c696e654368696c6428706172656e742c206e6f6973654f7074696f6e7329207b0a2020202020202020746869732e706172656e74203d206c696768746e696e674c696e653b0a2020202020202020746869732e5f6c6173744368616e676554696d65203d20303b0a20202020202020204e6f6973654c696e652e63616c6c28746869732c20302c206e6f6973654f7074696f6e73207c7c206c696768746e696e674c696e652e6e6f6973654f7074696f6e73293b0a202020207d0a0a202020204e6f6973654c696e654368696c642e70726f746f74797065203d20657874656e64287b7d2c204e6f6973654c696e652e70726f746f747970652c207b0a20202020202020207374617274537465703a20302c0a2020202020202020656e64537465703a20302c0a20202020202020200a20202020202020202f2f20436c65617220737570657220636c617373206d6574686f64730a20202020202020206372656174654368696c643a20756e646566696e65642c0a2020202020202020656163684368696c643a20756e646566696e65642c0a0a20202020202020207570646174653a2066756e6374696f6e2829207b0a20202020202020202020202076617220706172656e74203d20746869732e706172656e743b0a20202020202020202020202076617220706c656e203d20706172656e742e706f696e74732e6c656e6774683b0a0a2020202020202020202020202f2f20e4b880e5ae9ae69982e99693e38194e381a82c20e38182e3828be38184e381afe8a6aae381aee3839de382a4e383b3e38388e381aee695b0e3818ce5ad90e381aee7b582e4ba86e382b9e38386e38383e38397e4bd8de7bdaee38292e4b88be59b9ee381a3e3819fe5a0b4e59088e381abe5a78be782b9e381a8e7b582e782b9e381aee8a6aae3818be38289e381aee58f96e5be97e4bd8de7bdaee38292e69bb4e696b0e38199e3828b0a2020202020202020202020207661722063757272656e7454696d65203d206e6577204461746528292e67657454696d6528293b0a202020202020202020202020696620280a2020202020202020202020202020202063757272656e7454696d65202d20746869732e5f6c6173744368616e676554696d65203e203130303030202a2072616e646f6d28290a202020202020202020202020202020207c7c20706c656e203c20746869732e656e64537465700a20202020202020202020202029207b0a2020202020202020202020202020202076617220737465704d696e203d20666c6f6f7228706c656e202f203130293b0a2020202020202020202020202020202076617220737461727453746570203d20746869732e737461727453746570203d20666c6f6f722872616e646f6d2829202a20666c6f6f7228706c656e202f2033202a203229293b0a20202020202020202020202020202020746869732e656e6453746570203d20737461727453746570202020737465704d696e202020666c6f6f722872616e646f6d2829202a2028706c656e202d20737461727453746570202d20737465704d696e2920202031293b0a20202020202020202020202020202020746869732e5f6c6173744368616e676554696d65203d2063757272656e7454696d653b0a2020202020202020202020207d0a0a2020202020202020202020202f2f20e8a6aae381aee3839de382a4e383b3e38388e9858de58897e3818be38289e58f96e5be97e7af84e59bb2e38292e58887e3828ae587bae381990a2020202020202020202020207661722072616e6765203d20706172656e742e706f696e74732e736c69636528746869732e7374617274537465702c20746869732e656e6453746570293b0a2020202020202020202020207661722072616e67654c656e203d2072616e67652e6c656e6774683b0a2020202020202020202020200a2020202020202020202020202f2f20e7af84e59bb2e3818be38289e382b9e38397e383a9e382a4e383b3e69bb2e7b79ae381aee588b6e5bea1e782b9e38292e58f96e5be97e38199e3828b0a20202020202020202020202076617220736570203d20323b202f2f20e58886e589b2e695b00a20202020202020202020202076617220736567203d202872616e67654c656e202d203129202f207365703b0a20202020202020202020202076617220636f6e74726f6c73203d205b5d3b0a20202020202020202020202076617220692c206a3b0a202020202020202020202020666f72202869203d20303b2069203c3d207365703b2069202029207b0a202020202020202020202020202020206a203d204d6174682e666c6f6f7228736567202a2069293b0a20202020202020202020202020202020636f6e74726f6c732e707573682872616e67655b6a5d293b0a2020202020202020202020207d0a2020202020202020202020200a2020202020202020202020202f2f202a2a2a2044656275670a2020202020202020202020206966202844656275672e656e61626c656429207b0a202020202020202020202020202020202866756e6374696f6e2829207b0a2020202020202020202020202020202020202020666f7220287661722069203d20302c206c656e203d20636f6e74726f6c732e6c656e677468202d20312c20702c206e3b2069203c206c656e3b2069202029207b0a20202020202020202020202020202020202020202020202070203d20636f6e74726f6c735b695d3b0a20202020202020202020202020202020202020202020202044656275672e616464436f6d6d616e64282866756e6374696f6e287029207b0a2020202020202020202020202020202020202020202020202020202072657475726e2066756e6374696f6e2829207b2044656275672e706f696e7428702e782c20702e792c20332c202779656c6c6f7727293b207d3b0a2020202020202020202020202020202020202020202020207d29287029293b0a20202020202020202020202020202020202020207d0a202020202020202020202020202020207d2928293b0a2020202020202020202020207d0a2020202020202020202020202f2f202a2a2a2a2a2a2a2a2a0a2020202020202020202020200a2020202020202020202020202f2f20e382b9e38397e383a9e382a4e383b3e69bb2e7b79ae38292e7949fe688900a2020202020202020202020207661722062617365203d2073706c696e6528636f6e74726f6c732c204d6174682e666c6f6f722872616e67654c656e202f203329293b0a2020202020202020202020200a2020202020202020202020202f2f202a2a2a2044656275670a2020202020202020202020206966202844656275672e656e61626c656429207b0a202020202020202020202020202020202866756e6374696f6e2829207b0a2020202020202020202020202020202020202020666f7220287661722069203d20302c206c656e203d20626173652e6c656e677468202d20312c20702c206e3b2069203c206c656e3b2069202029207b0a20202020202020202020202020202020202020202020202070203d20626173655b695d3b0a2020202020202020202020202020202020202020202020206e203d20626173655b6920202035305d3b0a20202020202020202020202020202020202020202020202044656275672e616464436f6d6d616e64282866756e6374696f6e28702c206e29207b0a2020202020202020202020202020202020202020202020202020202072657475726e2066756e6374696f6e2829207b2044656275672e6c696e6528702e782c20702e792c206e2e782c206e2e792c202779656c6c6f77272c2031293b207d3b0a2020202020202020202020202020202020202020202020207d2928702c206e29293b0a20202020202020202020202020202020202020207d0a202020202020202020202020202020207d2928293b0a2020202020202020202020207d0a2020202020202020202020202f2f202a2a2a2a2a2a2a2a2a0a2020202020202020202020200a2020202020202020202020202f2f20e3838ee382a4e382bae38292e981a9e794a80a202020202020202020202020746869732e6e6f69736528626173652c20636f6e74726f6c735b305d2e64697374616e636528636f6e74726f6c735b325d29293b0a2020202020202020202020202f2f20e69c80e79fade8b79de99ba2e38292e58f96e5be970a202020202020202020202020746869732e706f696e7473203d2073686f727465737428746869732e706f696e7473293b0a20202020202020207d0a202020207d293b0a202020200a2020202066756e6374696f6e2073706c696e6528636f6e74726f6c732c207365676d656e74734e756d29207b0a20202020202020202f2f20e382b9e38397e383a9e382a4e383b3e8a39ce5ae8ce794a8e381abe9858de58897e381aee5898de5be8ce381abe383a9e382a4e383b3e381aee5a78be782b92c20e7b582e782b9e381aee58f82e785a7e38292e3819de3828ce3819ee3828ce8a487e8a3bde38199e3828b0a2020202020202020636f6e74726f6c732e756e736869667428636f6e74726f6c735b305d293b0a2020202020202020636f6e74726f6c732e7075736828636f6e74726f6c735b636f6e74726f6c732e6c656e677468202d20315d293b0a0a20202020202020202f2f20e382b9e38397e383a9e382a4e383b3e69bb2e7b79ae381aee3839de382a4e383b3e38388e38292e58f96e5be970a202020202020202076617220706f696e7473203d205b5d3b0a20202020202020207661722070302c2070312c2070322c2070332c20743b0a2020202020202020766172206a3b0a2020202020202020666f7220287661722069203d20302c206c656e203d20636f6e74726f6c732e6c656e677468202d20333b2069203c206c656e3b2069202029207b0a2020202020202020202020207030203d20636f6e74726f6c735b695d3b0a2020202020202020202020207031203d20636f6e74726f6c735b69202020315d3b0a2020202020202020202020207032203d20636f6e74726f6c735b69202020325d3b0a2020202020202020202020207033203d20636f6e74726f6c735b69202020335d3b0a2020202020202020202020200a202020202020202020202020666f7220286a203d20303b206a203c207365676d656e74734e756d3b206a202029207b0a2020202020202020202020202020202074203d20286a2020203129202f207365676d656e74734e756d3b0a202020202020202020202020202020200a20202020202020202020202020202020706f696e74732e70757368286e657720506f696e74280a20202020202020202020202020202020202020206361746d756c6c526f6d2870302e782c2070312e782c2070322e782c2070332e782c2074292c0a20202020202020202020202020202020202020206361746d756c6c526f6d2870302e792c2070312e792c2070322e792c2070332e792c2074290a2020202020202020202020202020202029293b0a2020202020202020202020207d0a20202020202020207d0a0a20202020202020202f2f20e8a39ce5ae8ce794a8e381abe8bfbde58aa0e38197e3819fe58f82e785a7e38292e5898ae999a40a2020202020202020636f6e74726f6c732e706f7028293b0a20202020202020202f2f20e5898ae999a4e381aee381a4e38184e381a7e381abe68f8fe794bbe381aee5a78be782b9e381a8e38197e381a6e8bfbde58aa00a2020202020202020706f696e74732e756e736869667428636f6e74726f6c732e73686966742829293b0a20202020202020200a202020202020202072657475726e20706f696e74733b0a202020207d0a202020200a202020202f2a2a0a20202020202a204361746d756c6c2d526f6d2053706c696e652043757276650a20202020202a200a20202020202a204073656520687474703a2f2f6c30306f6f2e6f6f30306c2e636f6d2f626c6f672f61726368697665732f3236340a20202020202a2f0a2020202066756e6374696f6e206361746d756c6c526f6d2870302c2070312c2070322c2070332c207429207b0a2020202020202020766172207630203d20287032202d20703029202f20323b0a2020202020202020766172207631203d20287033202d20703129202f20323b0a202020202020202072657475726e202832202a207031202d2032202a2070322020207630202020763129202a2074202a2074202a20740a2020202020202020202020202020282d33202a20703120202033202a207032202d2032202a207630202d20763129202a2074202a20742020207630202a207420202070313b0a202020207d0a202020200a2020202066756e6374696f6e2073686f727465737428626173657329207b0a202020202020202076617220706f696e7473203d205b62617365735b305d5d3b0a202020202020202076617220702c206a2c2070322c20646973742c206d696e446973742c206b3b0a2020202020202020666f7220287661722069203d20302c206c656e203d2062617365732e6c656e6774683b2069203c206c656e3b2069202029207b0a20202020202020202020202070203d2062617365735b695d3b0a0a2020202020202020202020206d696e44697374203d20496e66696e6974793b0a2020202020202020202020206b203d202d313b0a202020202020202020202020666f7220286a203d20693b206a203c206c656e3b206a202029207b0a2020202020202020202020202020202069662028287032203d2062617365735b6a5d2920213d3d2070202626202864697374203d20702e64697374616e63652870322929203c206d696e4469737429207b0a20202020202020202020202020202020202020206d696e44697374203d20646973743b0a20202020202020202020202020202020202020206b203d206a3b0a202020202020202020202020202020207d0a2020202020202020202020207d0a202020202020202020202020696620286b203c20302920627265616b3b0a0a202020202020202020202020706f696e74732e707573682862617365735b6b5d293b0a20202020202020202020202069203d206b202d20313b0a20202020202020207d0a0a202020202020202072657475726e20706f696e74733b0a202020207d0a202020200a2020202077696e646f772e4e6f6973654c696e65203d204e6f6973654c696e653b0a202020200a7d292877696e646f77293b0a0a0a2f2a2a0a202a2044726167506f696e740a202a200a202a2040737570657220506f696e7420687474703a2f2f6a73646f2e69742f616b6d322f66684d430a202a2f0a66756e6374696f6e2044726167506f696e7428782c207929207b0a20202020746869732e78203d20783b0a20202020746869732e79203d20793b0a20202020746869732e726164697573203d2035303b0a20202020746869732e616c706861203d20302e323b0a20202020746869732e6472616767696e67203d2066616c73653b0a20202020746869732e6479696e67203d2066616c73653b0a20202020746869732e64656164203d2066616c73653b0a202020200a20202020746869732e5f76203d206e657720506f696e742872616e646f6d52616e6765282d332c2033292c2072616e646f6d52616e6765282d332c203329293b0a202020200a20202020746869732e5f6d6f757365203d206e756c6c3b0a20202020746869732e5f6c61746573744d6f757365203d206e657720506f696e7428293b0a20202020746869732e5f6d6f75736544697374203d206e756c6c3b0a202020200a20202020746869732e5f63757272656e74416c706861203d20303b0a20202020746869732e5f63757272656e74526164697573203d20303b0a7d0a0a44726167506f696e742e70726f746f74797065203d20657874656e64287b7d2c20506f696e742e70726f746f747970652c207b0a20202020686974546573743a2066756e6374696f6e286d6f75736529207b0a202020202020202072657475726e20746869732e64697374616e6365286d6f75736529203c20746869732e7261646975733b0a202020207d2c0a0a202020206472616753746172743a2066756e6374696f6e286d6f75736529207b0a202020202020202069662028746869732e68697454657374286d6f7573652929207b0a202020202020202020202020746869732e5f6d6f757365203d206d6f7573653b0a202020202020202020202020746869732e5f6d6f75736544697374203d20746869732e737562747261637428746869732e5f6d6f757365293b0a202020202020202020202020746869732e6472616767696e67203d20747275653b0a20202020202020207d0a202020202020202072657475726e20746869732e6472616767696e673b0a202020207d2c0a0a2020202064726167456e643a2066756e6374696f6e2829207b20202020202020200a202020202020202069662028746869732e6472616767696e6720262620746869732e5f6c61746573744d6f75736529207b0a202020202020202020202020746869732e5f762e73657428746869732e5f6d6f7573652e737562747261637428746869732e5f6c61746573744d6f75736529293b0a20202020202020207d0a2020202020202020746869732e6472616767696e67203d2066616c73653b0a2020202020202020746869732e5f6d6f757365203d20746869732e5f6d6f75736544697374203d206e756c6c3b0a202020207d2c0a202020200a202020206b696c6c3a2066756e6374696f6e2829207b0a2020202020202020746869732e6479696e67203d20747275653b0a2020202020202020746869732e726164697573203d20303b0a202020207d2c0a0a202020207570646174653a2066756e6374696f6e286d6f75736529207b0a20202020202020207661722076203d20746869732e5f763b0a20202020202020200a202020202020202069662028746869732e5f6d6f75736529207b0a202020202020202020202020746869732e73657428746869732e5f6d6f7573652e61646428746869732e5f6d6f7573654469737429293b0a202020202020202020202020746869732e5f6c61746573744d6f7573652e73657428746869732e5f6d6f757365293b0a20202020202020207d20656c7365207b0a202020202020202020202020746869732e6f66667365742876293b0a202020202020202020202020762e78202a3d20302e39373b0a202020202020202020202020762e79202a3d20302e39373b0a2020202020202020202020200a20202020202020202020202076617220766c656e203d20762e6c656e67746828293b0a20202020202020202020202069662028766c656e203e20333029207b0a20202020202020202020202020202020762e6e6f726d616c697a65283330293b0a2020202020202020202020207d20656c73652069662028766c656e203c203129207b0a20202020202020202020202020202020762e6e6f726d616c697a652831293b0a2020202020202020202020207d0a20202020202020207d0a20202020202020200a202020202020202076617220726164697573203d20746869732e7261646975733b0a0a202020202020202069662028746869732e78203c2072616469757329207b0a202020202020202020202020746869732e78203d20746869732e7261646975733b0a20202020202020202020202069662028762e78203c20302920762e78202a3d202d313b0a20202020202020207d20656c73652069662028746869732e78203e2063616e7661732e7769647468202d2072616469757329207b0a202020202020202020202020746869732e78203d2063616e7661732e7769647468202d207261646975733b0a20202020202020202020202069662028762e78203e20302920762e78202a3d202d313b0a20202020202020207d0a0a202020202020202069662028746869732e79203c2072616469757329207b0a202020202020202020202020746869732e79203d207261646975733b0a20202020202020202020202069662028762e79203c20302920762e79202a3d202d313b0a20202020202020207d20656c73652069662028746869732e79203e2063616e7661732e686569676874202d2072616469757329207b0a202020202020202020202020746869732e79203d2063616e7661732e686569676874202d207261646975733b0a20202020202020202020202069662028762e79203e20302920762e79202a3d202d313b0a20202020202020207d0a20202020202020200a202020202020202076617220643b0a20202020202020202f2f20416c7068610a202020202020202064203d20746869732e616c706861202d20746869732e5f63757272656e74416c7068613b0a2020202020202020696620282864203c2030203f202d64203a206429203e20302e3030312920746869732e5f63757272656e74416c70686120203d2064202a20302e313b0a20202020202020202f2f205261646975730a202020202020202064203d20726164697573202d20746869732e5f63757272656e745261646975733b0a2020202020202020696620282864203c2030203f202d64203a206429203e20302e303129207b0a202020202020202020202020746869732e5f63757272656e7452616469757320203d2064202a20302e33353b0a20202020202020207d20656c73652069662028746869732e6479696e6729207b0a202020202020202020202020746869732e64656164203d20747275653b0a20202020202020207d0a2020202020202020746869732e5f63757272656e74526164697573202a3d2072616e646f6d52616e676528302e392c2031293b0a202020207d2c0a0a20202020647261773a2066756e6374696f6e2863747829207b0a202020202020202076617220726164697573203d20746869732e5f63757272656e745261646975733b0a2020202020202020766172206772616469656e74203d206374782e63726561746552616469616c4772616469656e7428746869732e782c20746869732e792c20726164697573202f20332c20746869732e782c20746869732e792c20726164697573293b0a20202020202020206772616469656e742e616464436f6c6f7253746f7028302c20436f6c6f722e736574416c706861546f537472696e6728746869732e5f63757272656e74416c70686129293b0a20202020202020206772616469656e742e616464436f6c6f7253746f7028312c20436f6c6f722e736574416c706861546f537472696e67283029293b0a20202020202020206374782e66696c6c5374796c65203d206772616469656e743b0a20202020202020206374782e626567696e5061746828293b0a20202020202020206374782e6d6f7665546f28746869732e782020207261646975732c20746869732e79293b0a20202020202020206374782e61726328746869732e782c20746869732e792c207261646975732c20302c204d6174682e5049202a20322c2066616c7365293b0a20202020202020206374782e66696c6c28293b0a202020207d0a7d293b0a0a0a2f2a2a0a202a20436f6c6f720a202a2f0a76617220436f6c6f72203d206e65772066756e6374696f6e2829207b0a20202020746869732e68203d20483b0a20202020746869732e73203d20533b0a20202020746869732e6c203d204c5f4d41583b0a202020200a20202020746869732e736574416c706861546f537472696e67203d2066756e6374696f6e28616c70686129207b0a202020202020202069662028747970656f6620616c706861203d3d3d2027756e646566696e656427207c7c20616c706861203d3d3d206e756c6c29207b0a20202020202020202020202072657475726e202768736c2827202020746869732e68202020272c2027202020746869732e7320202027252c2027202020746869732e6c202020272529273b0a20202020202020207d0a202020202020202072657475726e202768736c612827202020746869732e68202020272c2027202020746869732e7320202027252c2027202020746869732e6c20202027252c2027202020616c7068612020202729273b0a202020207d3b0a7d3b0a0a0a2f2f20496e69740a0a77696e646f772e6f6e6c6f6164203d2066756e6374696f6e2829207b0a20202020696e697428293b0a7d3b0a0a0a2f2f20e383a1e382a4e383b3e382b9e382afe383aae38397e38388e38193e38193e381bee381a70a0a2f2f2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a2f2f2044454255470a2f2f2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0a766172204465627567203d207b0a20202020656e61626c65643a2066616c73652c0a202020205f636f6d6d616e64733a205b5d2c0a202020200a20202020616464436f6d6d616e643a2066756e6374696f6e28666e29207b0a202020202020202069662028746869732e656e61626c65642920746869732e5f636f6d6d616e64732e7075736828666e293b0a202020207d2c0a202020200a20202020657865633a2066756e6374696f6e2829207b0a202020202020202069662028746869732e656e61626c656429207b0a20202020202020202020202076617220636f6d6d616e6473203d20746869732e5f636f6d6d616e64733b0a202020202020202020202020666f7220287661722069203d20302c206c656e203d20636f6d6d616e64732e6c656e6774683b2069203c206c656e3b2069202029207b0a20202020202020202020202020202020636f6d6d616e64735b695d2e63616c6c2874686973293b0a2020202020202020202020207d0a202020202020202020202020746869732e5f636f6d6d616e6473203d205b5d3b0a20202020202020207d0a202020207d2c0a202020200a202020206c696e653a2066756e6374696f6e2878312c2079312c2078322c2079322c20636f6c6f722c206c696e65576964746829207b0a202020202020202069662028746869732e656e61626c656429207b0a202020202020202020202020636f6e746578742e7361766528293b0a202020202020202020202020636f6e746578742e676c6f62616c436f6d706f736974654f7065726174696f6e203d2027736f757263652d6f766572273b0a202020202020202020202020636f6e746578742e7374726f6b655374796c65203d20636f6c6f723b0a202020202020202020202020636f6e746578742e6c696e655769647468203d20216c696e655769647468203f2031203a206c696e6557696474683b0a202020202020202020202020636f6e746578742e626567696e5061746828293b0a202020202020202020202020636f6e746578742e6d6f7665546f2878312c207931293b0a202020202020202020202020636f6e746578742e6c696e65546f2878322c207932293b0a202020202020202020202020636f6e746578742e7374726f6b6528293b0a202020202020202020202020636f6e746578742e726573746f726528293b0a20202020202020207d0a202020207d2c0a202020200a20202020706f696e743a2066756e6374696f6e28782c20792c207261646975732c20636f6c6f7229207b0a202020202020202069662028746869732e656e61626c656429207b0a202020202020202020202020636f6e746578742e7361766528293b0a202020202020202020202020636f6e746578742e676c6f62616c436f6d706f736974654f7065726174696f6e203d2027736f757263652d6f766572273b0a202020202020202020202020636f6e746578742e66696c6c5374796c65203d20636f6c6f723b0a202020202020202020202020636f6e746578742e626567696e5061746828293b0a202020202020202020202020636f6e746578742e61726328782c20792c207261646975732c20302c204d6174682e5049202a20322c2066616c7365293b0a202020202020202020202020636f6e746578742e66696c6c28293b0a202020202020202020202020636f6e746578742e726573746f726528293b0a20202020202020207d0a202020207d0a7d3b0a3c2f7363726970743e
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement