diff --git a/.well-known/wallets/.coins b/.well-known/wallets/.coins index 4b408ef..0480c7b 100644 --- a/.well-known/wallets/.coins +++ b/.well-known/wallets/.coins @@ -19,5 +19,8 @@ "SCRT": "Secret Network (SCRT)", "LTC": "Litecoin (LTC)", "DOGE": "Dogecoin (DOGE)", - "ALGO": "Algorand (ALGO)" + "ALGO": "Algorand (ALGO)", + "TON": "Toncoin (TON)", + "OP": "Optimism (OP)", + "IAA": "IRIS (IAA)" } \ No newline at end of file diff --git a/.well-known/wallets/.tokens b/.well-known/wallets/.tokens index 6bc4da5..c1c92e5 100644 --- a/.well-known/wallets/.tokens +++ b/.well-known/wallets/.tokens @@ -1,12 +1,12 @@ [ { "symbol": "USDT", - "name": "USDT", + "name": "Tether", "chain": "ETH" }, { "symbol": "USDT", - "name": "USDT", + "name": "Tether", "chain": "SOL" }, { diff --git a/.well-known/wallets/EOS b/.well-known/wallets/EOS new file mode 100644 index 0000000..c88b327 --- /dev/null +++ b/.well-known/wallets/EOS @@ -0,0 +1 @@ +nwoodburn111 \ No newline at end of file diff --git a/.well-known/wallets/OP b/.well-known/wallets/OP new file mode 100644 index 0000000..3c1a338 --- /dev/null +++ b/.well-known/wallets/OP @@ -0,0 +1 @@ +0x6cB4B39bEc23a921C9a20D061Bf17d4640B0d39e \ No newline at end of file diff --git a/.well-known/wallets/TON b/.well-known/wallets/TON new file mode 100644 index 0000000..9830d85 --- /dev/null +++ b/.well-known/wallets/TON @@ -0,0 +1 @@ +UQAtpYb-yOaTSA40mJRvUxKv1WVeIPi-g_4Jqn0oWYypsQIf \ No newline at end of file diff --git a/data/ascii.txt b/data/ascii.txt new file mode 100644 index 0000000..a2de097 --- /dev/null +++ b/data/ascii.txt @@ -0,0 +1,50 @@ +KK00000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOO00000KXKKK000K0K000KKK0000OkkxxxxdddddddxxxxkOOOO +KKKKK00OkkkkkkkkkkkkkkkkkkkkkOOOOkkkkkkkkkkOOkkkkkOOO0000OOO0OOOOOkkkkOOkkkkxddddddooooooooddddddxxk +XKKKK0OOkkkxxxxxxxxxxkkkkkkkkO0OOkkkxxxxxxxxxxxxxxxxxkkkxxxxxxxxxxxxddddddoooooolllllllloooooooooooo +KK00OOOkkkkkkkkkkkkkkkkkkkxxxxxxxxxxddddddookxooooooodddddddoooooodooooollllllllllllllllllllllllllll +KK000OOOOkkkkkkkkkkkkxkxxxxxxxxxxddddooooooooooooooooooooooooolloooollllllllllllllllllllllllllllllll +XKKKKK000OOOOOOOOkkkkkkkxxxxddddddddoooooooooooooooooooooooooolloollllllllllllllllllllllllllllllllll +NXXXKKKK00000KKKKK00KKK0Okkkkxxxxxdddddddddddddddoooooooooooooooooooooooooooollllllloooooooooooooooo +XXXXXXXXXXXXXXXXXKK00OOddkOK000OOOkkxxxxxxxxxxxxxxxxxxdddddddddddxxxxxxxxxxxxdxxxxxxxkkkkkkkkkOOOkkk +XXXXXXXXXXXXK0kxdlcll::codxk00kOOOOOkkkkkkkkkkkkxxkkkkkkkkkOOOO00KKKKKXXXXXXXKXXKKKKKXKKK0000OOkkkkk +NNNNNNNNXK0Oxdo:;::;,''';oO:;dOx0KKKKKKKK000NK0000000KKKKKKKKXXXXXXXXXXXXXXXXXXNXKKKKK00OOOOOOOOOO00 +d0XXNNNKOkoc,,;::;'..';:,l;.',::d0KKKKKKKKKKXKKXXXXXXKKKKKK0000000OOOO000O0000K0000KKKK000000000KKKX +;lk0k0XKdc:,,,..........,.....'::o0O0KKKKKKKXXXXXXKKXXKKKK000OOOOOOOOOOOOOOOOOO000000000OOOOOOOOOOOO +',;;;ckx;'.,,..'.....  ........'cldOOKXXXXXXXXXKKKKKKKKKKXK0000000000000000KKKKKKKKKK00000000OOOOOOO +.''',cx:','........   .....,'...,:coox0000000000000000000KK0OOOOOOOOOOOOOOO000000000OOOO0OOOOOOOOOOO +....';,.......... .   ..'.'cll....':odO00000KKKKKKKKKKKKKKKKKKKKKKK000K0000000000000000000000000X0Ok +',,;,'.........' .:. ':';.llodd....''lkKKKKKKKKKKKKKKKKKKKKKKKKKKXXXKKKKKKKKKKKKKKXXXXXXXXK0Okxddood +'';cc:'...x;c;;:,::'.::;;':cldxl....;x0000000000KKKKKKKKKKKKKKXXXKKKKKKKKKKK0Okkxxxxxxxxxdoooooooooo +.'';,,;..,0o;;,'..,:;:,''.',;:od,..,o00000000KKKKKKKKKKKKK0OOkkxdddxxxkkOkxdddddddddoooooooooooooooo +....''':';Kd:;'',;;;::::,;'..;od:.ldOKKKKK000OOkkkkkkkkxxddddddddddddddddddddddooooooooooooooooollll +.......lx:X0kxxddool:cccccccllooc;lkOkxxxxddddddxdddddddddddddddddddddddddoooooooooooooooooooollllll +......'lxoK0kkkkxxOoccccclllllool;lxxddddccloodkO0000OOkdoodddxddodooodddooooooooooddddooooollllllll +....';:::okKOkkkkxocc:llllllllolodddddc,,cl,ccc:;,;:cllclooolc;:ccodxxdoooooooooddddooolllllllllllll +...'''',,';O0OOOkkxoccccllllool'l,oddc.;,'  ';:cloooddooooddddxxxdlc:::cooloddddddoolllllllllllllllc +.....''....,00Oklcoddol:,coool;lOcoo: .     ....',::'......'',;:loooooo,'c.looooooloolllllllclllcccc +.........''',x0OOkxolclllool:,ckOoc,           ......:dxo;,,'....';;;,,;....oolllllllllllllccccccccc +.',.. .,;:ll:;coOkkxdooolc;',;lkOxc..            ...c0xo'.......',,,,,'''....kollllllllllllccccccccc +.. .  ..,,,,::lc:cloolc;'.,::;okkkcc'.         ...'oKx;..''.'... ...........':kolllllllccccccocccc:: +...',,,,,c;.',,:ko:.....,:ccc:odkOkxl,.         .'xOc'........'..  .        ..;xllllccccccccccccc::: +:;c;;,,,',:cccccoxdl,.';:cccccolokOk0XXxOlc''. ..co:.         ....;.          ..ccccccccccc:ccc::::: +,,,,,,';,;;;;;;::dxdo;,:cccccllccdkkOOdlx:c:oddlcll..          ...:...  ........:llllllcccccc::::::c +','''''',..'..,oxlodolc:::cccllllloxdl::;...;;:cc::,            ..;..'...... ..'clllccccccccc:c::::: +..'........,lddckx;llcc::::clcooolcccllc;....',,,'cOOxl;.        .,.',',,'.. ..cllllcccc::cc:o:::::: +..'.....'okxl:;dNoolcc::::cllllllc::c::;,......'..lkKNNNNkc.      ....,,;:;;,':clccccccc::c::::::::: +'''...'ldl:,..cNOxkxoll::coloxkOOd:::cc,'....'''..:clokO0OK0l         ..'.';;c:ccccccc:::l:::::::::: +.''.:kx:;'.. .Xk;:xKKkddoddkOOOxl:::cll,'.. ......,:cccloxxkKk          ....''::ccc::::::::::::::::: +..,k0l'..... 'xo;,;okkxxxkOOkdlccc:::cl,'.   ..   .::::cclooxNd    . ..........,:ccccclccclllloooodd +.;0kl......  'dl;;;::ldkkxdl::cccc:::cl;,.   .... .,;,:::ccloONl   '......,;,,..lloodddddodooooooddx +.kxo, .....  'oc;;;:::::,,,,;ccccc::::cc,.   ...   '',;;;::cld0N.  ,.......,,c:,ddddddoooooooooooddd +'kl:' .....  ,l:;;;:::c:,,,;cccccc::::;:;.    ..   ..,;,;;::clx0x .''.......,;:ddddooodddddooooooodd +,o:;'    .  .;c::;;;c:::;,,;cccc:c:clc:l;'   .....  .,,,,;;::cxx0  ';'.......,;coooddxxxdddodddddxxx +l::;' ...   .;::::;;::::;,,:ccc::c:colol:;          .',',,;;;:oxd; .;''.......;..;oxxxxxxxdxxxdooool +l:;,, ..    .,;;:::;::;:,,;:ccc;:::;;:;;lc.          .''',,;;:lxod  ,.''......,o;..coddddddddollcccc +;c','.      .',;;:::::;;,,,:cc;;:::;:c,;:c'.         ...',,;,;:ooo; '..''......ddo:.ddolllcccccccccc +:l,.'.      '',;;;::::;,,,,;::,;;,,':;',;l,          ....,,,,,;:dld '..''....'.:xdd.dxdddddooollllcl +cc:...      .'',;;;:::;,,,,;:;,,,:;;;,;;;:'..         ...,,,,,,;olo,'....'....''xc.:dddolooodoooodoo +l:l,......  .''';;,;;:;,''',;''';;;,;',','.      ..   ..,,,',,,;lolc. ........''..;llcllcllodddddood +;co:'.       ...',,,,;;;''',,'....,,,,'.,;... ..       .,,''',,;:dld.    ...  ..'occcllclllooddddddd +..:;;....     ...'''',;;,''''....',...''.,.....        .,'''',;;;olx      ..   . :c,';::clooooooddoo +,;;c,,...      '..'''',cl'.''....;..',..';.. ...       .''''',;;;olo,. ..'......'':,;,',,;:::ccllloo +.',o,;....      ..'''.',''..'....';,'. . ..  ...       .'''',;;;;llcl......''.....,.,,,;;,,',;clllod diff --git a/data/sites.json b/data/sites.json new file mode 100644 index 0000000..ba9441d --- /dev/null +++ b/data/sites.json @@ -0,0 +1,50 @@ +[ + { + "url": "https://nathan3dprinting.au", + "img": "/assets/img/favicon_trans.webp", + "name": "Nathan 3D Printing", + "description": "Offering 3D Printing and CAD modelling services to the Canberra region" + }, + { + "url": "https://domains.hns.au", + "img": "/assets/img/HNSAU.webp", + "name": "HNSAU Registry", + "description": "An easy to use DNS provider and domain reselling platform" + }, + { + "url": "https://hns.au", + "img": "/assets/img/HNSAU.webp", + "name": "HNSAU", + "description": "The group for Handshake enthusiasts in Australia" + }, + { + "url": "https://hnshosting.au", + "img": "/assets/img/logo.png", + "name": "HNS Hosting", + "description": "Simple Wordpress hosting for Handshake domains with builtin SSL using DANE" + }, + { + "url": "https://firewallet.au", + "img": "/assets/img/firewallet.png", + "name": "FireWallet", + "description": "An opensource Handshake wallet that is Fire!" + }, + { + "url": "https://shakecities.com", + "img": "/assets/img/HNSW.png", + "name": "ShakeCities", + "description": "A single page website creator where each user's page on their free HNS domain" + }, + { + "url": "https://git.woodburn.au", + "img": "/assets/img/logo.png", + "name": "Git Server", + "description": "Selfhosted Git server to host my repos with custom hosted CI/CD" + }, + { + "url": "https://linkr", + "img": "/assets/img/logo.png", + "name": "LINKR/", + "description": "A free link shortener with a Handshake TLD and using DNS for authentication" + } +] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 3ee6f81..ae5530b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,6 @@ Flask-Cors python-dotenv gunicorn requests -cloudflare \ No newline at end of file +cloudflare +qrcode +ansi2html \ No newline at end of file diff --git a/server.py b/server.py index 2b025e6..425f4a4 100644 --- a/server.py +++ b/server.py @@ -1,11 +1,14 @@ import json -from flask import Flask, make_response, redirect, request, jsonify, render_template, send_from_directory +from flask import Flask, make_response, redirect, request, jsonify, render_template, send_from_directory, send_file from flask_cors import CORS import os import dotenv import requests import CloudFlare import datetime +import qrcode +import re +from ansi2html import Ansi2HTMLConverter app = Flask(__name__) CORS(app) @@ -15,6 +18,13 @@ dotenv.load_dotenv() address = '' handshake_scripts = '' +restricted = ['ascii'] + +sites = [] +if os.path.isfile('data/sites.json'): + with open('data/sites.json') as file: + sites = json.load(file) + # Custom header def add_custom_header(response): response.headers['Onion-Location'] = 'http://wdbrncwefot4hd7bdrz5rzb74mefay7zvrjn2vmkpdm44l7fwnih5ryd.onion/' @@ -116,7 +126,7 @@ def index(): except: repo_name = "nathanwoodburn.github.io" repo_description = "Personal website" - git = {'repo': {'html_url': 'https://example.com', 'name': 'nathanwoodburn.github.io', 'description': 'Personal website'}} + git = {'repo': {'html_url': 'https://nathan.woodburn.au', 'name': 'nathanwoodburn.github.io', 'description': 'Personal website'}} custom = "" # Check for downtime @@ -140,12 +150,12 @@ def index(): if request.cookies.get('HNS'): - return render_template('index.html', handshake_scripts=handshake_scripts, HNS=request.cookies.get('HNS'), repo=repo, repo_description=repo_description, custom=custom) + return render_template('index.html', handshake_scripts=handshake_scripts, HNS=request.cookies.get('HNS'), repo=repo, repo_description=repo_description, custom=custom,sites=sites) if address == '': address = getAddress() # Set cookie - resp = make_response(render_template('index.html', handshake_scripts=handshake_scripts, HNS=address, repo=repo, repo_description=repo_description, custom=custom), 200, {'Content-Type': 'text/html'}) + resp = make_response(render_template('index.html', handshake_scripts=handshake_scripts, HNS=address, repo=repo, repo_description=repo_description, custom=custom,sites=sites), 200, {'Content-Type': 'text/html'}) # Cookie should last 1 week resp.set_cookie('HNS', address, max_age=604800) return resp @@ -268,7 +278,11 @@ def donate(): token = t break if not isinstance(token, dict): - token = None + token = { + "name": "Unknown token", + "symbol": token, + "chain": crypto + } address = '' domain = '' @@ -297,17 +311,54 @@ def donate(): cryptoHTML += '
Or send to this domain on compatible wallets:
' cryptoHTML += f'{domain}' + cryptoHTML += 'QR Code' + + copyScript = '' cryptoHTML += copyScript return render_template('donate.html', handshake_scripts=handshake_scripts, crypto=cryptoHTML, coins=coins,default_coins=default_coins) +@app.route('/qrcode/') +def addressQR(data): + qr = qrcode.QRCode( + version=1, + error_correction=qrcode.constants.ERROR_CORRECT_L, + box_size=10, + border=4, + ) + qr.add_data(data) + qr.make(fit=True) + qr_image = qr.make_image(fill_color="#110033", back_color="white") + + + # Save the QR code image to a temporary file + qr_image_path = "/tmp/qr_code.png" + qr_image.save(qr_image_path) + + # Return the QR code image as a response + return send_file(qr_image_path, mimetype="image/png") + +@app.route('/supersecretpath') +def supersecretpath(): + ascii_art = '' + if os.path.isfile('data/ascii.txt'): + with open('data/ascii.txt') as file: + ascii_art = file.read() + + converter = Ansi2HTMLConverter() + ascii_art_html = converter.convert(ascii_art) + return render_template('ascii.html', ascii_art=ascii_art_html) + @app.route('/') def catch_all(path): global handshake_scripts # If localhost, don't load handshake if request.host == "localhost:5000" or request.host == "127.0.0.1:5000" or os.getenv('dev') == "true" or request.host == "test.nathan.woodburn.au": handshake_scripts = "" + + if path.lower().replace('.html','') in restricted: + return render_template('404.html'), 404 # If file exists, load it if os.path.isfile('templates/' + path): return render_template(path, handshake_scripts=handshake_scripts) @@ -359,8 +410,6 @@ def hnsdoh_acme(): print(record) return jsonify({'status': 'success'}) - - # 404 catch all @app.errorhandler(404) def not_found(e): diff --git a/templates/404.html b/templates/404.html index 81f7691..15e9476 100644 --- a/templates/404.html +++ b/templates/404.html @@ -1,25 +1,50 @@ - + - - Nathan Woodburn - - + + + Nathan.Woodburn/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - -




-

Space Invaders destroyed this page!

- Take revenge on them! -







-




Use Space to shoot and   to - move!    or

- - - + +

HTTP: 404

+
+
this_page.found = false;if (you_spelt_it_wrong(this_page)) {
try_again();
else if (!this_page.content) {
alert('You're lost! I'll send you back home');
window.location = home;
}
+
+ + + + \ No newline at end of file diff --git a/templates/ascii.html b/templates/ascii.html index e39a935..b9e7df8 100644 --- a/templates/ascii.html +++ b/templates/ascii.html @@ -24,25 +24,33 @@ - - - + -
-


NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXXXXXXXXXKXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXXXKKKKK00000O0K000000000KKKKKXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXXXKKK00000000000000O0K00000000000000000000KKKXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXXKKK00000000000000000O00O0K0OO0000OOOOO0000000000000000KKXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXXKK0000000000000000000000KKK0KKK0KK00OOOOOOOOOOOOOOOOkOOO0000000KXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXKK000000000O0OOO000O00KXXXXXKKKKKKKKKKKKKKKKK0OkkkkkkkkxddxddkOOOO00000KKXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXK00000000OOOO00OOOO00KXXXK000000000KK000OkkkO0KKK0OkxxkkkkkkxdodxkkOOOOOOOO0KXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXK0000000000OOOOOOOO0KXNNXKOO0KKK0000OOkkkO0KK0KKXXKXXKOkxxxxkkkkkxxkkkkkkOOkkOO0KXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXK0000000000000000OO0KXNX0O0NX0OOOkxOKXXXOxxxkKNNX0O0KXK0XXOxdxxxxxxxxdxxxxxkkkkkkOOO0XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXK000000O0000OO0OOOOO0XNX0000XNXKKK0OOKXWWNXK0kxxkO0OOOKKOxx0XKkddxddddxdddddxxxxxkkkkkOOKXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNX0000OOOOOOOOOOOOOOOKNN0O0XKO000OkO0KXXXNNXKOOOK000KOkxk0KkdxOXXOdddddddddddddxxxxxxxxxkkOOKXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXK00OOOOOOOOkkOOOOOOO0XX0k0XKOkkKWNNK0OKNWWWWNX00KXKXNKxddk0kdoxOXXkoddddoddddddddddddddddxkkO0XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXK00OOOOOOOkkkkkOOOOO0XX0kOKXK00k0NNXNNWWWWWWWWWNNNXXXX0xdkKNKkoox0X0doddddddddddddddddddddddxkk0XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNX00OOOOOOOOkkkkkkkkkkOKNKO0XWWXKOkOKXXXK0KNWWWNNK0KNNWN0kOKXK0OOddk0KOoloooooddddddddddooddddddxkkOXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXK0OOOOOOOOOkkkkkkkkkkxOXNKOKWWKOkkkxkKNNNX0KNWWNXXNNNNNXOxxk0KkooodOKKkooooooooooddddooooooooddddxxkO0KXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXK0OOOOOOOOkkkxxxxxxkkkxkKNX0XX0OOkxxxxk00OO0KKXNXKO0KX0OkodkK0koloxk00Ododdddddooddddoooooooooooddddxdk0KKXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXK0OOOkkkkkkkxxxxxxxxxxxxxOXNXKOxk00OkOOkxkOkxxddkkxdONWNXX00K0xlodkO00Odddddddddddddddoooooooooooodooddxk0KKXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXK0OkkkkkkkxxxxxxxxxxxxxxxxxOXNX0kxxO00KNNNWWNXK0xxOOOKNNXKOkxxkkkO0K0kxddxxdddoolloollllllllllllllllcccllldOOOKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNX0Okkkxxxxxxxxxxxxxxxkxxxxxkxk0XNK0000OOO0000000kdxkkkkOkdddxkO0KK0kxdoodddoollclllcc::::::ccc:::;;,,'''''';coox0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNX0OkkxxxxxxxxxxxxxxxxkkxxxxkkkkxkO0KKK00OOOkkkkkxxdxkkkkO0KKK00Oxdollloollllccc::;;;;,,,,;;;;;;,,'..........,;::coOXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXK0kkxxxxxxxxxxxxxxxkxxxxxxxxxxxxxxxkOOOOO0KKKKKKK000K0Okkkxxxdolloollccccccc::;;,,,,,,,;,,,,''.............',:::::ckXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXKOkxxxxxxxxxxxxxxxxxxxxxddddxxxxxxxxxxxxxxkkxxxkkxxxxdooooooodooolllccc:::::::::;;;;;;;;;,'...............',;;;:::;:xXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXKOkxxddddxxxxxxxxxxxxxxddddddddddxxxxxxxxxxxxxxxkkxdxxxdddooooolllllooolllccccccccccc:;,'..................';;;;;;::;ckXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNX0Okxdddddddddddddxxxxxxxxxxxxxxxxxxxxdddddddoodxxxxxxdolccccccc:ccclllllcc::::;;;;;::::;,'.................,,,,;;;;::;l0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXKkxddoooooooooooddddddxxkkkkkxxddddddddoddddxxkkxxdoooollloooolllllllllc::;,'.......''',,,,'...............',,,;;;;;:;:kXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXOdoooolllloooodddddddddxxxxdooooodxxxxxdooolllc;,,'''',;:ccllloolooollc::;;;;;;;;;;;,'.....................',,,,;;;;::;o0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
XXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXKOxollllllllloodddddoollcllooddddddddddxxxxxxxkkOO00000000KKKKKKK0000OOkkkxddoooooolc::;,''''''...............',,;;;;;;:;ckXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
XXXXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXK0xocccccccllloooollc::::clooddxkkOO00KXXNNXXXXXXXKKKXKKXXXXXKXXXKKKKKKKKKKKKKKXXXXXKK0Oxdollc:;;,'.............',,;;;;::::dKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
XXXXKKKKKKKKKXXXXXXXXXNNNNNNNNNNNNXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXX0dc:;;;;;;::cccc::ccloodxkkO00KXNNXXXXXXXXXXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKK0kxolc;'..........',;;;;;;:::o0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
KKKKKK0000000KKKXXXXXXXXXXXXXXXXXXXXXKKKKKKXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXX0xl:,'''',;::cclloodxkO0KXXXXXXXXXXXXXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000KKK00000000KK0000000KK0Okdc;'.......',;;;;;:::lONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
000000OOOkkOO000KKKKXXXXXXXXXXXXXXKKKK000KKKKXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXX0koc;,,;:cooddddxkO0KXXXXXXXXXXXKKKKKKKKXXXXXXXKKK00OOOOOOkkkOOOO00KKKXXXKKKK00000000000000000000OOOO0K0Odc,.....';:;;::::lONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
OOOOOkkkxxxxkkOO00KKKKKKKKKKKKKKKKK000OOO00KKKXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXKOxollodxxxxxkk0KXXXXXXXXKKKKKKXXXXXXK0kkxdollc::;;,,,,'''''''',,;;::ccloodxO00KKK00OOOOOOOOOOOOOOOOOOOOO00Odc,...';;:::::lOXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
OkkkkkxxdddxxkOO0000000000000KK0000OOOkkkOO0KKKXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXK0OOOkxxxxkO0KXXXXXKKKKKKKKXXXK0Oxdlc;,'''.....................'',,,,''...''',;cloxkO000OOOOOOkOOOOOOOOOOOOOOOko:'..';;:::ckXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
kkkkkxxxxxxkkO000000OOOOOOOOOOOOOOkkkkxxxkkO0KKXXXXXXXNNXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNXXK0K0kxdxO0KKKKKKKKKKKKXXXK0kdl:;,.............................',;;;;,'..'',;,,''..',;cldkO00OOkkkkOOkkkkkkkOOOkkxdc,.'::c:cxKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
xkkxxxkkkOOO00000000OOkkxxxxxkkkkkkkxxxxxxkkO0KKKXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNXKKKOddk0KKKKKKKKKKKKXX0kdl:,'.................................,;;;;;,,'',;;;;;;,''',,,''',;cldkOOkkkkkkkkkkkOOkkkkkkdc;::cc:o0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
xxkkkkkOO0000KKKKK0OOkxxdddddxxxxxxxxxddddxkOO0KKKXXXXXXXKXXXXXXXNNNNNNNNNNNNNNNNNNNNNXKOkxk0KKKKKKKKKKKXKOdl;,'...................................',;;;;;,,,;;;;;;;;;;,,,,,,,,,;,''',:ldkOOkkkkkkxkxxkkkkkkkxl::cclONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
xxkkkkOO000KKKKKKK00OkddoooddddxxxxxxdddddxxkO000KKKKKKKKKKKXXXXXNNNNNNNNNNNNNNNNNNNNNX0OOO0KKKKKKKKKK0koc,,',,,''.............'''''..............',,;;;;;;::::::;;;;;;;;;;;;;;;;;;;;,,'',:ldkOOkkkkkkkkkkkkkko;,::ckXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
xxxxxkkOO0KKKKKKKK0OkxdooooodddxxxxxxxxxxxxkkO0000000000000KKKXXXXNNNNNNNNNNNNNNNNNNNNX000KKKKKKKKKKko:,,,;;;;;;;,,,,,,''..'',,;;,'............',,;;::::::::::::::;;;;;;;;;;;;;;;,;;;;,,,,,'';:ldkOOOkkkkkkkkx:..;::dKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
ddddxxxkO00KKKKKKK0OkxdoolooodxxxkkkkOOOOOOOO00000000OOOOOO0KKXXXXNNNNNNNNNNNNNNNNNNNNXK0KKKKKKKK0xc;,;:::::;;;;;;;,,,,,,,,;;;;;;,'..........',;;::::::::::::::::;;;;;;;;;;;;;,,,,,,,,,,,;;;;;,,,;cldxkOkkkkxl'..';:oKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
dddddxxkO00KKKKKKK0OOkxdooooddxkkkOO000000000000000OOkkkkkO00KKXXXXXNNNNNNNNNNNNNNNNNXKKKKKKKKKOd:;;:ccccc::::;;;;,,',,,;;;;::::;,'.......',;;::::::::ccccc:::::::;;;;,,,,,,,,,,,,,,,,,'',,;;;;;;;,,,;cloddl:'....';dKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
dooddxkkO00KKKKKKK00OkkxdddddxxkOO0000000000000000OOkkxxxxkO0KKKXXXXXXXXXXXXXXXNNNNNXXKKKKKKKOo:,;:cllcccc:::;;;,,,'''',,,,;;;;;;,,'''',,;;:ccccccccc:cccccccccc:::;;;,,,,'''''''''''''''',,;;;;;:::;;,''''........':lolox0XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
ooodxxkOO0KKKXXXKKK00OOkxxddxxkOO0000KKKKKKKKK0000OOkxdddxxkO00KKKXXXKKXKKXXXXXXXXXNNXKKKKKOo:,;;:clllllccc:;;,,''.......''',,,,,;:::ccccccccclllcccccccccccclcc:::;;,,'''...............'',;;;;::::;;'..............';::cld0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
oodxxkkO00KKXXXXXKKK000OOkkkkkkOO0000KKKKKKK00000OOkkxdoddxkOO000KKKKKKKKKKKKKXXXNNNNXKKKOd:;,,,;:cllllllc:;,''................',;;:ccclllllllcllllcccc:::ccc:;,,,'''......................',,;;;;;;;;,'...........,;:cllllloOXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
dddxkkOO00KKKXXXKKKKK000OOOOkkkOOO0000KK00000000OOkkxddooddxkOOOO000OOOOO00000KXXXXXNXK0xc;;;,,,,;cllolllc:;,,'''''''''...........'''',;;:cccccclllcc:::;;;;;;,,''.............'',,,,,,,,,',,,;;;;;;;;,'.........',;:cllllllco0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
xxxxxkkOO00KKKKKKKKKKK00000OOOOOOO0000000000000OOkkkxddooddxxkkkkOOkkkkkkOOOO0KK0OkkOOkoc::;;;,,,;clooollc::::::::ccccc:;,'........'''',,;;:cclllllccc:::;;;;;::::;;;,,,,;;::ccllllccccccc::::;;;;;:;;,'........',;:ccccllllccxXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
xxxxxxkkkOO00000KKK00000000OOOOOOOOO0000000000OOOkkkxxdooodddxxxxxxxxxxxkkkkO000kxxxxxddoc:;;,,,,;clooooolllooooooodddddooolcc::::ccccccc:::clllllllcccc::::ccllllloooooooooooooooollllllllccccc:::::;,'......',;:clcc:::ccccco0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
xxxxxxxxxkkOOOOOO000OOOOOOOOOOOOOOOOOOOOO0000OOOOkkkxddooooooddddddddddxxxkkO00kxddxdddddol:;;;,,;cloooooddddddddddddddoooolllllllooodddolccloooooollccccc:ccclllllc:;;,,,,,,;;:cclllllllllllccc::::;;,'.....',;::cccc::::ccc:ckXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
xxxxdddddxxkkkkkkkOOkkkOO000OOOOkkkkkkkOOOOOOOOkkkkxxddoooooooooooooodddxxxkO0Oxddddddddddol:;;;,;cloooooddddddddool:;,,,''''',,,;;:cloooollloooooollccccc::ccccc:,'.....'''',,,'''',:cllllccccc:::::;,''...',::::::cc:::::cc::xXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
dxdddddddddxxxxxxxxkkkOO00000OOOOkkkxkkkkkkkOOkkkxxxddoooooollooooooooddxxxkO0kdooooooddddooc:;;;;clooooooooodddl:,''.....'',,:c:;,',;ccllllooollccc:::::::::::;,.......'',,,,;;;;,,,,;:ccccccc::::::;;,''',;:::ccccccc::::::::xXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
dddoooooooddddxxxxxxkkOOOOOOOOOOkkxxxxkkkkkkkkkkxxxddoooollllloooooooodddxxkOOkoloooooododddol::::looooollllllllcc:cc::;;,,,,,;;;,,''',;:cccclcc:::;;;;;;;;;;:;,''',,;;:::cccccccccc::::::::::::::::::;,,,,;;:::;:clllc::;::::ckXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
doooooooloooodddddxxkkkOOOOOOOOkkxxddxxxkkkkkkkkxxdddoooollllooooooodddddxxkOOkollllloodddddolcc:clooooollllllllllloooooooooolllllcccc:cccc:cc::;,,,,,,,,,,,;::::::::ccllllllooolllccc:::::::::::::::::;;,,;;:::;::cllcc:;;:::o0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
ddoooolllllooooodddxxkkkOOOOOkkxddoddddxxxkkkkkkkxxdddddoooooooooooddddxxxkkOOkolcclloddddooollccloooooooolllcccllloooddddddddooollllccc::::::;;,,,,''',,,,,,,;::::cclllllllooollllccc::::::::::::::::::;;;;;;;:::::cccc::;:::xKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
xxdddoolllllloooodddxxkkOOOOkxdoooooodddxxkkkkkkkkxxxdddddodddddooodddxxxkkkOOOxlccloodoooolllolllodooooooollllllllloooooooooooollllc:::;;;;::;;,,,,,,,''''''',,;;:cccccllllllllllcccc::::::;;;::::::::::::::::;;;::::::::;;:o0XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
xxxddooolllllloooodddxxxxkxxxdoollllooddxxxxkkkkkkkxxddddddddddddooodddxxxkkkkOkdlcoxxdoollllooooodddooooolllllllllllllllooooolllcc:::;:::::::;;;;,,,,,'''''''''',,;::::ccccccccccc:::::::::::;;::::::ccc::::cc:::;;,,;::;;;lOXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
xxddddooollllllloooddxxxxxxxxddollllooodddxxxxxxxxxxxdddddddoodddddddddddxxxxkkkxoldkxollccloxxdodxkddoooollllllllccccccccccc::::;;;;:::::::c::::;;,,,,,,,,''''',,,,,,;;;;;;;::::::::::::::::::::::::cccc::::clc:;,,',;:::;ckXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
xxddddoooollllllloddxxxxxxxxxxdooooooooooodddxxxxxxdddddddoooodddddddoodddddxxxkkxddxxoc::::okkxddxkxdoooolllllllccc:::;;;;;;;;,,;;;;:::::ccccc::;;;;;;;;,,,'''',,,,,;;;;;;;;;;;;;;::::::::::::::::::ccc::::cc:;,''',;:::;:dKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
ddddddooooollllllooddxxxxxxxxddddooooooooooooddddddddooooooooddddddooooooooododdxkOkkxdoc;;;:ldxdddkkxdooollllllccc::::;;;;;;;;;;;;;;;::::cccc:::;;;;;;;;;;,,,'',,,,;;;;;;;;;;;;;;;;;;;;;;:::::::::::ccc::::c:,''',,;:::::o0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
oodddoooollllllllloooddxxxdddoodooooooooolllllllllllllllloooooodoooooooooooooooodxkOOkxxdc;;;;:odddxkxdoooollllccc::::::;;;;;;:::::::::::ccccc::::;;;;;;;;;,,,,,,,,,;;;::::::::::::::::::::;:::::::::ccc:;::c:,',;::::;;:o0XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
oooooooolllllccllllooooddddoollooolllllllllcclllllllllllllloooooooooolllllllloooodxkOOxdx00ko;,coddxOkdddoollllllcccccc:::::::::cccccccccccc:::;;;;;;;;,,,,,,,,,,,;;;;:::::cc::ccccccc:::::::;;:::::cccc:::::::ccccc::;;lOXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
lllllloollllllllllloooooooollcclllllllcccccccccllllllllcllllllllloollllllllllooooodxkOOOOKK0xolloddxOOxdddoollllllllllllcccccccclllllc:::::::;;;;;;;;,,,,,,,,,,,,,;::ccccccccclllccccccccc:::::::::cccc::::::::cccccc::ckXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
lcccclllllllllllloooooodddoolccccccccccccccccllllllllllccccccllllllllcccllllooooooodxOKNNX0xddddooddk0Oxddoooooooooooollloooooooooolc:;,;;:::::::::;;;;,,''''''..',:cllllllllllllllllllllccc::::::cccccc::cc:::::ccllclkKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
lcccccccccclllllloodddddddddollcc:::::cccccccllllllllllccccccccccccccccccllloooooodddk0XXKOxooooooodk00kddddddddddoooooooddddddoooolc::;::ccccccc::::::;,,,,'''''',;clllooooooooooollllllllcc::::ccccccccclllllllclodx0XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
cc:::::cccccllllloodxxxxxddddoolcccccccccccccllllllllllccccccccccccccccccllloooodddddxk00OOkkOOkxddxk00Oxddddddddddddddddddddoooooolllllllooooolllccccc::::;;,,;;;;:ccllllooooddddoooollllllccccccccccccokOkkkkkkkO0KXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
:::::::::ccccclllloddxxxxxxxxdoolllllllllccccllllllllllcccccccc:::cccccccclllooooddddxxxkkkOOkkkkkkkO0K0kxddddddddddddddddddooooolllodddddddddddoooollllllccccccccc:cccccllllloodddooooollllllccccccccclkXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
::::::::::ccccccclloddxxxxxxxdddoooolllllllllcclcclllllccccccc:::::c:cccccllllooooooddddddxxxxxxxdddk0K0Oxdddddddxddddddooooloolllllloodddddxxxxxddddooolllllllllcc:ccccccccclllooddooollllllllcccccccclOXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
::::;;:::::::ccccccloodxxxxxxxdddddoooollllllccccccllcccccccc::::ccc:::cccccllloooooodddoolllllllooox0K0Okxddddddddddddoolllllllllllllllooooddxxxxxxddoolllcccc:::::::::::::ccccclooooollllllllccccccccoOXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
:::;;;::::::::::cccclloddddxxxxddddddooolllllcccccclccccccccccccccccccccccccccllllllllolllccccllllooxO00Okxddddddddddoollllllllllllllllllllooddxxxddddooollccc::::::::::;;::::::::clooolllllllcccccccccd0XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
;;;;;;:::::ccc::cccclloodddddddddddddooollllllcccclllllcccccccccccccccccccccccccccccccccccc:::cclllodk0KOkxddddddddooolccllllllcccllllllllloooddddddddooollcc::::::::::::::::::::::cloollllcclcccccccclxKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
;,;;;;:::ccccccccccllooodddddddddddddoooolllllllllllllllllccccccccclllllllcccccccccccccc:::::::ccllodk000Oxxddddddooolc:cllllllllllloolllllloooooooooolllllcccccccccccc:::cccccccc::loolllccccccccclllokKXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
,,,;;;::cccccccccclllooooooodddoooooooodddoolllllllooollllllllllllllllllllccccc::::ccccccc:::cccclloodO00Okxddddddoooc::cllclloodooooooooooooooooooooooooolllllccccccclcccccccccccc:cllllcccllllcllllldOKXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
,,,;;:::ccccccccclllooooooooooooooooddxxxxxxdooooooooolllllllllllloooooolllccccc:::cccccccccccllllloodxO0Okxddddddoool::cllllcccccccllloooooooooooooooooolllccc:::::;;;;;;;;::cccccccllllccclllllllllok0KXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
,,,;;:::ccccccccllllooooooooooooloodxxxxxxxkxxdoooooooolooooolloooodddddooolllllcccccccccllllllllllooodk0Okxxddddoooolc:clllllcc:;;,,,,,;;;;;::::::::::::;;;,,,,''''',,,;;;;:::ccclllllllcccllllllllodk0KKKKXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
,,,;;;:::ccccccccllloooooooooooolooxxxxxxxxkkxdooooolllllooooooooddddddddddooollllccccllllllllllllllllodO0Okxxdddodddoolllllllllllllcccc:::cccccccccccclccccc:::::::::::::::::::cclloolllllllllllooodxOO0000KKKXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
;;;;::cccc::::cccclllooooooooooollodxxxxxkkkkxddooollllllloooooodddddddddddoooolllllllllllllllllllllllcldkOkxxxddddddddoolllllllllllloooooooooooooooooooooolllcccccc::::::::::::cclooollllllllooooodxkkOOOO00KKKXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
:::cccccccc::::::ccclloooooooooooolodxxkkkkkxxddooolllllllooooooddddddddddddooooollllccllllllllllllccccccokOkxxxdddddddddoollllllllllloooooooooooooooooooollllccccc::::::::::::::clllllllllloooddddxxkkkkkOOO000KKKXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
ccllllcccccc:;;:::::cclloooooooooolloodxxxxxdddoooollllllloooooooddddddddddoooooolllcccccccllllcccc::::::cdOOkxxddddddddddooooollllllloooooooooooooooolllllllllccccccc:ccc:cc::cccclllllllloooddddxxkkkkkkkkkOO000KKKKXXXXXXNNNNNNNNNNNNNNNNXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
clllllllcccc:;;;;;;;::cccllllollllllooooddddddooolllllllllloooooooooooooooooooooollcccccccccccccc:::::::::okOOkxdddddddddddooooooooooooooddddddoooooooollloollllllllcccccccccccccccclllllllooddddxxkkxxxxkkkkkkOOO000KKKKXXXXXNNNNNNNNNNNXXXXXXXXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
cllooollllcc:;;;;;,;;;:::cccccllllllloooooooooolllllllclllllooollllllllllllloooolllcccccccccc:::::::::::::lxkkkkxddddddddooooooooooooooooddddddoooooooolloooooollllllllccccccccccccccllllloodddddxxxxxxxxxxxxxkkkkkOOO00KKKXXXXXXXXXXXXXXXXKKKKKKKKKKKKKXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
ccllooolllc::;;;,,,,;;;::::::cccccclllllllllllllcccccccccllllllllccccccccclllloolllcccc:::ccc::::::::::::cokOxxkkxdddddoooooooooooooooooooooooooooolllllllllllllllllllcccccccccc:::cccllloooddddoddxddxxxxxxxxxxxxxxkkOO000KKKKKKXXXXXXKKKK000000000000KKKKKKKKXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
cccccllcccc:::;;;;,;;;;;:::::::::::ccclllccccccc:::::ccccclllllcccccccccccllllolllllcccccc:::::::::::::ccclxOkddxkkxddddooooooooooooooooooooooolllccccccc::ccccccccccccccccc::::::::clllooooddollodddddddddddddddddxxxkkOOO000000KKKKKK0000OOOkOOOOOOOOO000000KKKKKKKXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
cccccccccc::::;;;;;;;;:::::::::::::::::::::::::::::::::ccccllllccccccc:cccllllllllllllcccccccc::::ccccccccldOOdodxxxxddddooooooooooooooooolllllcccc:::::;;;;;;;;;;;;;::cccc::::::::cclllooodolcccoooddddddoodooddddddxxxkkkkkOOOOOOOOOOOOOkkkkkkkkkkkkOOOOOOO00000000KKKKXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
cccccccccc::::;;;;;;;::::::::::;;;;;;;;;;;;;;;;;:::::::ccccllllcccccc::cccllllllloooolllccccccccccccccccccldOOxooodxxxxddooooddddddooooollllcccccc:::::::;;;;;;,,,,,,,;:cc:;;::c::cccllooodolc::coooooooooooooooodddddxxxxxkkkkkkkkkkkkkkkxxxxxkkkkkkkkkkkkkOOOOOOkOOO00KKKXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNN
ccccccc:::::::;;;:;;;::::::::::;;;;;;;;,,;;;;;;;::::::::ccccccccccc::::::ccllllooooooolllllcccccccclcccccccoOOxoooodxxxxddddddddddddooooolllcccccccccccccc:::;;,,;;;;;;:ccc:;:ccccccllooddolc:::clollloooooddddddddddddddxxxxxxxxxxxxxxxxxddxxxxxxxxkkkkkkkkkkkkkxxxkkkOO00KKKKXXXXXXXNNNNNNNNNNNNNNNNNNNNNN
::::::;;;;:::;;;;;;;;::::::::;;;;;;;;,,,,,,;;;;;:::::;::::ccccccc::::::::ccllooooodooooollllcccclllllllccccok0xoloooodxxxxdddddddddoooooooolllllllllllllcccccc:;,,;:::cccccc:cccccllooooolccc:::clllllooooodddxxxxxxxxddddddddddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxkkOO000KKKKXXXXXNNNNNNNNNNNNNNNNNNNN
::;;;;,,,;;;;;;,,,;;;;::::::;;;;;,,,,,,,,,,,,,;;;;;;;;;;::::::::::;;;:::ccllooooddddddooollllcllllllllllcccokOxollooooddxxxxddddddddoooooooooooooooooooollllll:;;;:ccllccccccclllllooooolcc:::::clllllloooodddxxxxxxxxxdddddoooddddddddddddddddddddddxxxxxxxxxxxxxxddddddxxkkkOOO00KKXXXXXNNNNNNNNNNNNNNNNNN
;;;,,,,,,,,,,,,,,,,;;;;;;;;;;;,,,,,,,,,,'',,,,,;;;;;;;;;;;;;;;;;;;;,;;::cclloooddddddddoollllllllooooolllccok0kollllooooddxxxxdddddddoooooooooooooooooooooooolc:::cllllllccclllllooooolccc::::::ccccccllloooddxxxxxxxxxdddddooooooooodddddooooooooodddddddddxxxdddddddooooodddxxkkOO0KKKXXXXXXNNNNNNNNNNNNNN
,,,'',,'''',,,,,,,,,,;;;;;;;,,,,,,,,,,,,,,,,,,,,;;;;;;;;;;;;;;;;,,,,,;::cclloooddddddddooolllllllloooolllcclkOkollllooooooddxxxxxxxxdddddddddddddddddddddooooolllllllllllllllloooooollccc::::::::cc::cccllooodddxxxxxxxxdddddooooooooooooooooooooooooooooooodddddddddoooolllloodddxkOO00KKKXXXXXXXNNNNNNNNNN
,,''''''''''''''',,,,,,;;;;,,,,,,,,,,,,,,,,,,,,,,,,;;;;;;;;;;,,,,,,,,;::ccllooooddddoooooolllllllllllllllcclkOxolllllloooooooddxxxxxxxxxxddddddddddddddddddddoooooooooollllooooooollccc::::::;;::c::::::ccllooddxxxxxxxxxddddoooollllllllooooooooooooooolllllooooodoooollllllllloodxxkOOO00KKKKKXXXXXXXXXXXX
,,'''''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;;;;;;;,,,,,,,,,;;::cclllooooooooooooollllllllllllllccclkOxllllllllooooooodddxxxxxxxxxxxxxxxxxxxxxxddddddddddddoooooooooooolllcccc:::::::;;;:::;;;;;::clloodddxxxxxxxddddooolllllclllllooooooooooolllclllllloooolllllllccclloooddxxkkkOOO000KKKKKKKKKKKK
''''''','',,,,'''''',,,,,,,,,,,,,,,,;,,,,,,,,,,,,,;;;;;;;;;;,,,,,,,;;::cccllllllooooooooooolllllllllcccccc:lxkdlllllllloooooooooddddxxxxxxxxxxxxxxxxxxxxxxxdddddddddoooooooolllccccccc:::::::;;;::;,,;;;;::clllodddxxxxdddddooooolllcccccclllooooooolllcccccccccllllllllllllllllloodddxxxxxxkkkOO00000000000
'''',,,,,,,,'''''''''''',,,,,,,,,,;;;;;,,,,,,,,,;;;;;;;;;;;;,,,,,;;::cccclllllllloooooooooolllccccccc::::::lkOdllllllllloooooooooooddddxxxxxxxxxxxxxxxxxxxddddddddddoooolllccccccccccc::::::;;;;;:;,,,,;;;:cclloooddddddddooooollllccc::::cccllllllllccccccccccccccllllllllllllllooddddddddddxxxkkkOOOOOkkkk
'',,,;;;,,,,''''''''''''''',,,,,,,,,,,,,,,,,,,,,;;;;;;;;;;;;,,,;;;::cccllllllllllloooooooooolllccccc:::::::lxkdlllllllllllooooooooooooooodddddddxxxxxdddddddddddooooolllccccccccccccc:::::::;;;;;:;,,,,,,;;::clllooooooooooooollllcccc::::::cccccccccccccccccccccccllllloolooooooddddxdddddddddddxxxxxxxxxxx
',,,;;;;;,,,,''''''''''''''',,,,,,,,''''',,,,,;;;;;:::;;;;;,,,;;:::cclllllllllllloooddddooooolllcccc:::::::lxkdlllllllllllloooooooooooooooooooodddddddddooooooooolllllccccccccccccc::::::::::;;;;:;;,,,,,,,;;:cccllllllllllooollllllcc:::::::::::::::::::cccccccccclllloooooooooddddxxxxdddddddddddddddddddd
,,;;;;;;;;,,''''''....'''''''''''',,''',,,,,;;;;;;:::::;;;;,,;;:::ccllllllllooooooddddddooooolllccccc::::::lkOdlllllllllllllllooooooollollloooodddddddoooooooooooollllcccccccccccccc:::::::::;;;;:;,,,,,,,,,,;;:::::cccccclllllllllllcccc::::::::;:::::::::ccccccccclloooooooooddddddxxdddddddoooooooooooodd
,;;;;:;;;;,,''..........''''''',,,,,,,,,,;;;;;::::::::;;;;;;;;:::ccccllllllloooooddddddddoooolllccccccc::::lkOdllllllllllloollloooooooooooooooddddddddddoooooooooolllllcccccccccccc::::::::::;;;;:;,''''''',,,,;;;;:::cccccccccccllllccccc:::::;;::;;;::::::cccccccclloodddddoooodddddddddddoooooooooooooooo
,;;;;;;;;,,''............'''',,,,,,,;;;;;;;::::::::::;;;;;;;;:::cccccccllllloooooddddddddooolllcccccccccc:cdOOxollllllllloooooolooooooooooooodddddddddddddddddooooollllllcccccccccc:::::::::;;;;;::;,''''''',,,,,,;;;;:::cccccccccccllcccc:::::::::;;;;;::::::ccccccloooddddddoooooddddddooooooddddooooooooo
,,;;;;;;,,''.............''',,,,;;;;;;;::::::::::::::;;;;;;;:::ccccccccclllloooooddddddoooolllccccccccccccok00xolllllllllllllloooooooooddddddddddddxxxxxxxddddooooollllllccccccccccc::::::::;;;;;;:;,,''''''''',,,,,;;;::::ccccccccccccccc::;;;::;;;;;;;;;;;:::::cccllooooodddooooooddddooodddddddddoooollll
'',,,,,,,,'.............''',,,;;;;;;::::::::::::::::::;;:::::::ccccccccllllloooooooooooooollllccccccccccclx00Okolllllllllllllloooooooooodddddddddddxxxxxxxxxdddoooolllllllcccccccccccc::::::::;;;;::;,,,''''''''',,,,;;;;::::::::cccccccc::::;;;;;;;;;;;;;;;;:::::cclllooooooooooooddddddddddddddddoooollllc
''''',,''''...........''''',,,,;;;;;::::::::::::::::::::::::::ccccccclllllllloooooooooooollllcccccccccllldOK0Okdollllllooooolloooooooooodddddddddddxxxxxxxxxdddooooollllllccccccccccccc::::::;;;;;;;;;,,,''''''''',,,,;;;;;;;;:::ccccccc::::::::;;;;;;,,,,,;;;;::::cclllooooooddddddxxxxxddddddddddooolllccc
'''''''''........'''''''',,,,,,;;;;;;;;;;;;;;::::::::::::::::ccccclllllllllllllllllllooollllllllllcccllldOKK0Okdolllllooooooooooooooooodddddddddddxxxxxxxxxxxdddoooollllllcccccccccccc:::::::::;;;;;;;;;,,'''''''',,,,,;;;;;;::::::::::::::::::::;;;;,,,,,,,,,;;;:::ccclloooodddxxxxxxxxxxxxxddddddoolllcc::
'''''''''.''''''''',,,,,,,,,,,,,;;;;;;;;;;;;;;;;;;:::::;;::::ccclllllllllllllllllllllllolllllllllccclllx0XX0Okxdollllloooooooooooooooooodddddddddddxxxxxxxxxxdddoooolllllccccccccccccc:::::::;;;;;;;,;;;,,,'''''',,,,,,,;;;;;;:::::::::::::::::::;;;,,,''',,,,,;;;;::ccclloooddxxxkkkkkkxxxxxxxdddoolllcc:::
,''''''''''',,,,,,,,,,,,,,,,,,,,,;;;;;;;,,,,,,,;;;;;;;;;;::::ccllllloooooollllllllllllloolollollllclclxKNXK0Okxdolllllooooooooooooooooooodddddddddddxxxxxxxxxdddoooolllllcccccccccccccc::::::;;;;;;;,,,;;,,,,,,,,,,,,,,,,,,;;;;;;;:::::::cccccc:::;;,,'''''',,,,,;;;::cccllooddxxxkkkkkkxxxxxxxddoolllcc::::
,''''''''''',,,,,;;;;;;;,;;;;;;;;;;;;;,,,,,,,,,,,;;;;;;;;:::cccllloooolllllllllllllllllooooooolllllloOXNNXKOkxddoolllooooooooooooooooooooodddddddddddddddxxdddddoooolllllcccccccccccccc::::::::;;;;;,,,,;,,,,,,,,,,,,,,,,,,,,;;;;;;:::cccccccccc::;,,'''''''',,,,,;;::cccllooddxxxxkkxxxxxxxxxdddoollccc::::
''''''''''',,,;;;;;;;,,,,;;;;;;;;;;;;,,,,,,,,,,,,,,,;;;;::::ccclllllllllllllcclllllllloooooooooooloxKNNNXK0Okxdoooooooooooooooooooooooooodoodddddddddddddddddddddoooollllccccccccccccccc:::::;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;;;::cclllllcc::;,,'''''''''''',,,;;::ccclooddxxxxxxxdddddddddddoollccccccc
''''''''',,,,,,;;;;,,,,,,;;;;;;;;;;;;,,,,,''''''',,,;;:::cccccllllllllllccccccccccllllloooooooooodONWNNXKK0kxddoollloooooooooooooooooooooooodddddddddddddddddddddoooollllcccccccccccccccc::::;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;:ccllllllcc:;;,'''''''''''''',,,;;::ccllodddxxxxxddddddddooooollcccccccc
''''''',,,,,,;;;;;;,,,;;;;;;;;;;;;;;;,,,,,''''''',,;;:ccclllllllllllllccccccccccccccclllloooooodkKNWNNXXK0Okxdoolllllooooooooooooooooooooooddddddddddddddddddddddoooollllcccccccccccccccc::::;;;;;;;;;,,,,,,,'''''''',''''',,,,,,,;;:cllooolllc:;,,'''''''''''''',,,;;::ccloooodddddddooooooooollllcc:::::cc
'',,,,,,,,;;;;;;;;;;;;;;;;;;;:::;;;;,,,,,,,''''',,;;:cccllooooollllllcccc::::::::::ccccllllllokKNWNNXXKK0Okxdoollllllloooooooooooooooooooooddddddddddddddddddddddoooollllcccccccccccccccc::::;;;;;;;;;,,,,',,,''''''''''''',,'',,,;::clloooolcc:;,,,,,,,,,''''''',,;;::cclloooooodddooooooollllllcc:::::::::
',,,,,,,;;;;:::::;;;;;;,,;;;:::::::;;;,,,,,,,,,,,;::cclllooooooooolllcccc::::::::::::ccldxdoxKNWWNNXXK0OOkxdddolllllllloooooooooddoooodooodddddddddddddddddddddddoooolllllccccccccccccccc::::;;;;;;;;;,,,,''',,,'''''''''''''',,,,;:ccllloollc:;;,,,,,,,,,,,,''',,,;::cccclloooooooooolloolllllllcc::::;;;;:
,,,,,,,;;;;::::::::;;;;;;;;::cccccccc::;;,,,,,;;;::cclloooddddddoooolllcc::::::::::::cldkkkOKWWNNXXKK0OOkxdddoolllllllllooooooooooooddddddddddddddddddddddddddddddoooolllllccccccccccccc::::::;;;;;;;;;,,,,'''',;:::::;,''''',,,,,;::cclllllcc::;;,,,,,,,,,,,,,,,,,;::ccccclllllloollllloooolllllcc::;;;;;;;
,,',,,;;;;:::::::::::;;;;::cclloooooolcc:;;;;;:::cclllooddddddddddoolllcc::::;;;::::cldkkxddk0XXXXKK0OOkxxdddolllllllllloooooooooooooddddddddddddddddddddddddddddddooollllllcccccccccccc::::::;;;;;;;;;,,,,''''''''',:ooc,',,,,,,,;;:ccllllccc::;;,,,,,,,,,,,,,,,,;;:ccccccccccccccclllllooooooollc:::;,,,,;
,,,,,,;;;::::ccccc:::;;;:::clodddddddoolcc:::cccllllooooddddddddddoolllccc::;;;;;::ldkkkxddooodk0KK0Okkxxdddooollllllllooooooooooooooooodddddddddddddddddddddddddddoooolllllccccccccccccc:::::;;;;;;;;;,,,,,'''''''...';cc;,,,,,,,;;::ccccccc::;;,,,,,,,,,,,,,,,,,,;::ccccccccc::cccccllooodddooolcc::;,,,,,
',,,,,;;;:::cccccc:::;;;::cloddxxxxxddoollcclllloooooooooooooooddooollccc::;;;clodkOOkkxxdoolllloxkkkkxxddddoolllllllllooooooooooooooooooodddddddddddddddddddddddddoooollllccccccccccccccc:::::;;;;;;;;;,,,,,''''''......;:;;;;;;;;;:::ccc::::;;,,,,,,,,,,,,,,,,;;;;;::::::cc::::cccclloooodddooolcc:;,,''',
'',,,,,;;:::cccccc:::;;;::cloodxxxxxxddooollloooooooooooooooooooooolllccc:;;:ok0KK0OOkkxddoollcccclodxxddddooolllllllllloooooooooooooooooooddddddddddddddddddddddddoooolllllccccccccccccc::::::;;;;;;;;;,,,,,,'''''.......,:c::::::;;:::::::::;;;,,'''''',,,,,,;;;;;::::::::::::cccccllooooooooollc::;,,''''
'',,,,,;;:::::::c:::::;;;:ccloodxxxxxddoooooooodddddooooooooooooooolllcc:ccoxO00000Okkkxdoooolcc::::cloddooollllllllllllloooooooooooooooooooddddddddddddddddddddddooooolllllccccccccccccc::::::;;;;;;;;;,,,,,,''''.........';lolc:::::::::::::;;;,,''''''',,,,;;;;;::::::::;::::ccccclllloooooollcc::;;,,'''
'',,,,;;;::::::::::::;;;;;::clloddxxdddooooooodddddddoooolloooooolllllloxkOO000OOkkkOOkxxddoollccc::;;::loolccccccllllllllloooooooooooooooodddddddddddddddddddddddooooolllllcccccccccccc:::::::;;;;;;;;;;,,,,,,''............':oxxo::::::::::;;;,,,''''''',,,;;;;;;;;;;;;;;;;;:::cccclllllllllllcc:::;;;,,,,
,,,,,;;;;;;:::::::::;;;,,,;;:cclooddoooooooooodddddddoooolloooooooodxkO00000000OOOkkxkkkxkxxdollllc::;;;;;cllllc:cccllllllllooooooooooooooooddddddddddddddddddddddoooooolllccccccccccccc::::::;;;;;;;;;;;;,,,,''................'cxko:;;::::::;;,,,''''''',,;;;;;;;;;;;;;;;;;;;:::ccccllllccccccc::::;;;;,,,
,,,,,;;;;;;;;::::::;;;;;,,,,;::cllooooooooooooddddddoooollooooddxxkOKK0000000OOOOkkkkxddxxxxxdooollcc:::;;;;:cllllcccccllllllllllooooooooooooooooooooooooodddddddooooooolllcccccccccccccc::::;;;;;;;;;;;;;,,'.....................'cxkxdlc::::::;;,,,,,,,,,,,;;;;;;;;;;,,,,;;;;;::::cccccllcccc::::::::;;;,,
,,,,;;;;;;;;;;:::::::;;;;,,,,;::ccllllllllloooodddddooooooddxkOOO0000000000O00OOOkkkkkkxdddxxxdoodoolcc::::;;;;;::ccccc::cccllllllllooooooooooooooooooooooooooooooooooolllccccccccccccc::::::;;;;;;;;,,,,''.........................'cx00Oxdocc:::;;;;;;,,,;;,,,,,,,,,,,,,,,;;;;::::::ccccccccc:::::::::;;,,
;;;;;;;;;;;;;;;;;:::::::;;;;;;;::cccllllllllooodddddoodxkOOOOOO00000000OOOOkkOOOOOkkkOOOkxdoodxxxxddoolllccc::::;;;;;:cc:;,;::cccclllllllllooolllllloooooooooooooooooolllccccccccccccc::::::;;;;;,,,,''...............................'cx0000Okdocccc:::::;;;;;,,,,,',,,,,,,,,;;;;::::ccccccccccc:::::;;;;,,
::::;;;;;;;;,,,;;::::cc:::::::::::cccccccclllooooodxkO0OOkkOO0KK000000OOOOOkkkOOOOOOO0OOOOkkxdddxxxdddoooolllccccc::;;;;;;'..'',,;;::ccccllllllllclllllllllllooooooollllccccccccccc::::::::;;;,,,''.....................................'cxO000OOkxolccccc::::;;,,,''',,,,,,;,,,;;;;::ccccccccccc::::;;;;,,,
::::::;;;,,,,,,;;::cccccc::::::::::::ccccccllloodxk000OkkO00KK000000OOOOOOO0OOOOOOOOOOOOkkkkkkkxddddxddxxddoollllcccc:::;;,'........',,;;:::cccccccccccccccclllllllllllccc::::::::::::::;;;;,,''..........................................':dO00000Okxdollccc::;;;,,,,,,,,,;;,,,,,,,;;::ccllllccc::::;;,,,,,
cccc::;;;,,,,,,;::cccllcccc::::::;:::::cccclodxkO0OkkkkO00KKK00000000OkkkkkOOOOOOOOOOOOOOOkkkOOOkkxdooodxxxxdlllllllllccc::;,.............'',;;;;;;;;;;;:;::::::ccccccc:::;;;;;;;;;;;;,,,''..................................................:dO000000OOxdollccc::;;;;;;;;;;;,,,,,,,,,;;::cccccc:::::;;,,,,,
ccc:::;;,,,,,,;::ccclllllcc::::;;;:::::cccoxO000OkxkOO0KKK00000OOOOOOOOOOkkkOOOOOOOOOkkkOOOkkkkkOOkkxxddolodddddooooolllllllc;'...................'''''''',,,,,;;;;;;;;;,,,,,'''''''..........................................................,lxO00OOOOOOOkdolccccc::::::;;;,,,,,,,,,,,;;::ccc::::::;;,,,,,
c::::;;;,,,,;;:::cccccllccc:::;;;::::cldxk000OkkkkkO00KKKK0000OOkkOOOkkkOOkOO00OOOOkkkkkOkkkkkkkkOOkkkkkxdoolllooodddoooooooool:'................................''''...........................................................................,lxOOOOOkOOO0Okxoolcccccc:::;;;,,,,,,,,,;;;::::::::::;;;,,,'
::;;;;;;;;;;::::cccccccc::::;;;;;:coxkO000OOOkkkOO00000000OOkkkkkkkkkkkkkkkkOOOOOOOkkkkkOOkkkkkkkkOkkkkkxxxkxdolccccllooddddoodo:.................................................................................................................'cdOOOOOkkkOOOOOkxdolcccc::;;;,,,,,,,,;;;:::::::::;;;,,,''
:;;;;;;;::::::ccccccccc:::;;;::loxOO00000OkkOOOO00KKKK00OOOkkkkxxkkkkxxkkkkkkOOOOOOkkkkOOOOOkkkkkkkkkkkkkkkkkkkkxdolc::cllooooooc,...................................................................................................................:okOOOOkkkkkkOO00Okxol:;;;;,,,,,,,,,;;;;::::::;;;;,,,''
:;;;;;:::cc::cccccccc:::;:cldxkO000000OOOkkkO000000000OOOOkkkkkkkkkkkxxxxkkkkOOkOOOOOOOOOkkkkkkkkkkkkkkkkkkkkkkxxxdddoolc:;;::clc;.....................................................................................................................:oxkkkkkkkkkkkkO000Oxol:,'','',,,,,;;;::::::;;;,,,'''
:::::cccccccccc:::::::cloxO0000000000OOkkkkO00000000OOOOkkkkkxxkxkkkxddxxxkkOOOOOOOOOOOkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxddoolc::;;,,'......................................................................................................................:oxkkkOOkkkkkkxxkO000Oxoc;,'',,,,,;;;;;;;;;;,,,,,''
:::ccccccccccc:::::coxk0000000000OOOOOOOOO0000OO00OOkkxxxddddxxxxxxxxxdddxxxkkkkkkkOOOOOOkkkkkkkkkkkkkkkkxxxxxxxxxxxxddoooollc:;'.........................................................................................................................':odxxkkkxxxxxddxkkOO000Oxoc;,,,,,,,,;;;;,,,,,''''
:::ccllcccccccccoxO0000000OOOOOOOOkkkkOOOOO000OOOOOkxdlc:::cclodddxxddddddxxxkkkkxxxxkkkkkOkkkkkkkkkkkkkkxxxxxxddddddddooollcc:;;,'.........................................................................................................................,codxxxxxxxxddddxxkOO00000Oxoc;,'',,,,,,,,,'''''
::cccccccc:cldkO0K00OOOOOkkkxxxxxddddxxxkkkOOOkxxxdooc:;,''',;cllodxxxddxxkkkkkxxddooooddddxxxxxxxxddddddooooollllllcccccc:::;;;;;,'..........................................................................................................................;loddddxxddddddodxkkkkkOOO00Oxol:,'',,,,,'''''
ccccccc:cloxO000000OOOkkkxxdddooooooloodxxxddxxdooolc:;,''''''',;:cloodxkkxxxxdooollccclooooolllllllcccc::::::;:::;;;;;;;;;;;,,,,,''...........................................................................................................................':lloododdddoooodddddxxxxkkkkOOkxoc;,,,,'''''
::::::coxO0K00000OOOkkxxxxdddodoollllooodddoodddolc:;'''...'''''',;::cloddlllcc::ccccccccc::::;;;;;;;,,,,'',,,'',,,,,,;;,,,,,,;;;,,,''..........................................................................................................................';cccllloodooooooooooooooddddxkkkkxl:,,,,,''
;;:cldk0000000OOOOkkkxxdddddooodoooooooooddoooollc:,'........',,;;;,,,,;::ccccc:;;::::ccc:::;;;;,,,,'''.....''.''',,,,,,,,,,,,,,,,,,,'............................................................................................................................,:cllllllllllllllllcccllloddddxxkkxo:,,,,,
:ldkO000000OOOOOkkkxxdddddodddddoooooooooollooolllc;'........',;::;,'''.''',;;,,,,,,;;::cc::;;;;;,'''''.........'''',,,,,,,;;;;,,,,,,''............................................................................................................................':clllllllllloooollllloollooooddxxkkdc,,,
dOKKK00000OOOOkkxddddddddddddddoooooooolllcccccllc:;,'........';::;,'.......''..'',,;;::::c:;;;;:;,''''''......''''',;;,,;;;;;;;,,,,,'''............................................................................................................................':llcllllllloooollllloolllllloodxxkOOd:'



-
{{handshake_scripts | safe}} - - - + {{ ascii_art | safe }} \ No newline at end of file diff --git a/templates/assets/css/404.min.css b/templates/assets/css/404.min.css new file mode 100644 index 0000000..8c5bcde --- /dev/null +++ b/templates/assets/css/404.min.css @@ -0,0 +1 @@ +*{padding:0;margin:0;box-sizing:border-box}body{background:#282828;overflow-y:auto}p{font-family:Bevan,cursive;font-size:130px;margin:10vh 0 0;text-align:center;overflow-y:auto;letter-spacing:5px;color:#000;text-shadow:2px 2px 3px rgba(255,255,255,.1);-webkit-background-clip:text;-moz-background-clip:text;background-clip:text}p span{font-size:1.2em}code{color:#bdbdbd;text-align:left;display:block;overflow-y:auto;font-size:16px;margin:0 30px 25px}code span{color:#f0c674}code i{color:#b5bd68}code em{color:#b294bb;font-style:unset}code b{color:#81a2be;font-weight:500;overflow-y:auto}a{color:#8abeb7;font-family:monospace;font-size:20px;text-decoration:underline;overflow-y:auto;margin-top:10px;display:inline-block}@media screen and (max-width:880px){p{font-size:14vw;overflow-y:auto}}.tab-space{margin-left:2em}.message{text-align:center;margin:auto}.message span{border-radius:5px;padding:10px;background:#000} \ No newline at end of file diff --git a/templates/assets/img/profile2-fg.webp b/templates/assets/img/profile2-fg.webp new file mode 100644 index 0000000..100263a Binary files /dev/null and b/templates/assets/img/profile2-fg.webp differ diff --git a/templates/assets/img/profile2.webp b/templates/assets/img/profile2.webp new file mode 100644 index 0000000..af1b2ea Binary files /dev/null and b/templates/assets/img/profile2.webp differ diff --git a/templates/assets/js/404.min.js b/templates/assets/js/404.min.js new file mode 100644 index 0000000..e8a4b73 --- /dev/null +++ b/templates/assets/js/404.min.js @@ -0,0 +1 @@ +const trigger="s",secret="/supersecretpath",home="/";var isSecret=!1;function error_check(){return function(){isSecret?(alert("You found the secret path"),window.location=secret):(alert("You're lost! I'll send you back home"),window.location="/")}}function type(e,t){var n=document.getElementsByTagName("code")[e].innerHTML.toString(),o=0;document.getElementsByTagName("code")[e].innerHTML="",setTimeout((function(){var t=setInterval((function(){o++,document.getElementsByTagName("code")[e].innerHTML=n.slice(0,o)+"|",o==n.length&&(clearInterval(t),document.getElementsByTagName("code")[e].innerHTML=n)}),10)}),t)}setTimeout(error_check(),7e3),document.addEventListener("keydown",(function(e){"s"==e.key&&(isSecret=!0)})),type(0,0),type(1,600),type(2,1300); \ No newline at end of file diff --git a/templates/assets/js/pfp.min.js b/templates/assets/js/pfp.min.js new file mode 100644 index 0000000..ebb055e --- /dev/null +++ b/templates/assets/js/pfp.min.js @@ -0,0 +1 @@ +let clickCount=0;function changeImages(){clickCount++,5===clickCount&&(document.querySelector(".profile.background").src="assets/img/profile2.webp",document.querySelector(".profile.foreground").src="assets/img/profile2-fg.webp")}document.querySelector(".profile.background").addEventListener("click",changeImages); \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index 49920c5..0ca97b6 100644 --- a/templates/index.html +++ b/templates/index.html @@ -103,72 +103,26 @@ Check them out here!

My Websites

-
-
-
-
-

Nathan 3D Printing

-

Offering 3D Printing and CAD modelling services to the Canberra region

-
-
-
-
-
-
-

HNSAU Registry

-

An easy to use DNS provider and domain reselling platform

-
-
-
-
-
-
-

HNSAU

-

The group for Handshake enthusiasts in Australia

-
-
-
-
-
-
-

HNSHosting

-

Simple Wordpress hosting for Handshake domains with builtin SSL using DANE

-
-
-
-
-
-
-

FireWallet

-

An opensource Handshake wallet that is Fire!

-
-
-
-
-
-
-

ShakeCities

-

A single page website creator where each user's page on their free HNS domain

-
-
-
-
-
-
-

Git Server

-

Selfhosted Git server to host my repos with custom hosted CI/CD 

-
-
-
-
-
-
-

LINKR/

-

A free link shortener with a Handshake TLD and using DNS for authentication

-
-
+
+ +{% for site in sites %} +
+ +
+
+

{{ site.name }}

+

{{ site.description }}

+
+ {% endfor %}
@@ -286,6 +240,7 @@ Check them out here! + diff --git a/templates/now/24_02_18.html b/templates/now/24_02_18.html index 58bbc9c..1adf6b5 100644 --- a/templates/now/24_02_18.html +++ b/templates/now/24_02_18.html @@ -133,13 +133,13 @@ Find out what I've been up to in the last week"> - - - diff --git a/templates/now/24_02_25.html b/templates/now/24_02_25.html index 45bc885..cb356f9 100644 --- a/templates/now/24_02_25.html +++ b/templates/now/24_02_25.html @@ -100,13 +100,13 @@ Find out what I've been up to in the last week"> - - - diff --git a/templates/now/24_04_14.html b/templates/now/24_04_14.html new file mode 100644 index 0000000..c1acc4a --- /dev/null +++ b/templates/now/24_04_14.html @@ -0,0 +1,136 @@ + + + + + + + What's up at the moment | Nathan.Woodburn/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{handshake_scripts | safe}} +
+

Nathan.Woodburn/

+

WHat's Happening Now

+
{{DATE}}
+
+
+

Vietnam Hackathon

+

I've been invited to help judge a hackathon in Vietnam at the Hanoi National University. 

+
+
+
+
+

.G/ Updates

+

I've helped Andrew Lee setup the .g/ TLD. This involves a registry using Varo in addition to a custom blog. The blog includes sections that are restricted to be only accessible to people with a Handshake resolver. Another section uses the TLD restricted proxy to only allow .g/ SLD holders access to some blog articles.

Visit Alee.g/

+
+
+
+
+

Server problems

+

My main server (this is a server I own and host in a data centre) stopped responding late last week. After weeks of postage and delays, I've replaced both the raid controller and the motherboard. After tons of troubleshooting the server is now back up again.

+
+
+
+
+

New HNSDoH Nodes

+

I've just added 3 new DNS nodes to allow more reliability and faster speed for more people. These nodes were setup in partnership with EZ Domains.
These nodes are located in Canada, Netherlands & Singapore
HNSDoH

+
+
+
+
+

TLD Restricted Proxy 

+

I've just released a proxy app that allows you to set paths to be restricted to someone who holds a SLD on your TLD.
Git Repo

+
+
+
+
+

HandyCon

+

I presented a FireWallet demo at HandyCon. Listen in or watch the recording to see how it can speed up your wallet management.
Watch Recording

+
+
+
+
+

Other Updates

+

I've recorded some tutorials to my YouTube channel. Stuff like HNS Links, Site Manager and others.

+
+
+
+
+
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/templates/now/old.html b/templates/now/old.html index 11d37e4..64b7b28 100644 --- a/templates/now/old.html +++ b/templates/now/old.html @@ -76,13 +76,13 @@ Find out what I've been up to in the last week"> - - - diff --git a/templates/now/template.html b/templates/now/template.html index 3bbe392..5f767d2 100644 --- a/templates/now/template.html +++ b/templates/now/template.html @@ -77,13 +77,13 @@ Find out what I've been up to in the last week"> - - - diff --git a/templates/resume.html b/templates/resume.html index ea8b0ff..7a73ef7 100644 --- a/templates/resume.html +++ b/templates/resume.html @@ -117,7 +117,7 @@

Server Administration • Since 2023

-

I own and manage a dedicated server hosted in a local data center. Utilizing a Proxmox hypervisor, I efficiently manage virtual machines on the server. To increase security measures, I have implemented three firewalled routers to govern three distinct public IPv4 addresses. Each IP is assigned to a separate virtual network, thereby enhancing the overall security infrastructure.

+

I own and manage a dedicated server hosted in a local data center. Utilizing a Proxmox hypervisor, I efficiently manage virtual machines on the server. To increase security, I am running three separate VLANs with separate firewalls.


diff --git a/templates/sitemap.xml b/templates/sitemap.xml index d24288d..1d3785e 100644 --- a/templates/sitemap.xml +++ b/templates/sitemap.xml @@ -16,10 +16,10 @@ https://nathan.woodburn.au/now/template - https://nathan.woodburn.au/about + https://nathan.woodburn.au/404 - https://nathan.woodburn.au/ascii + https://nathan.woodburn.au/about https://nathan.woodburn.au/donate