Сircuits.СС

English forum for http://www.nedopc.org/nedopc

Moderator: Shaos

What should be a next step in development?

Creating more libraries and library components
1
25%
Long lines drawing tools (it's difficult to draw lines cell by cell)
1
25%
Logic simulator with logging and visualization
1
25%
Gerber/Excellon generator (and/or ability to order PCBs)
1
25%
Private rooms with login are extrimely needed
0
No votes
Make it faster, because it's so sloooow
0
No votes
Forget this stupid project immediately
0
No votes
 
Total votes: 4
User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Сircuits.СС

Post by Shaos »

Now I'm working on online schematics editor/simulator with potential ability to generate PCB layouts. It's very unusual mix of technologies:
  • on the client side - JavaScript and Roberta bytecode interpreter (later re-branded as Robby virtual machine);
  • on the server side - SQLite and Hopeless (in 2019 switched to MySQL+PHP).
Currently it's only sandbox kind of toy - you may draw schemes or boards by "old school" DOS pseudographic characters on one global black board:

Image

No logins, no private boards - everybody will see what you are doing!
But I monitor activities by IP-address - just in case ;)

http://Circuits.CC

Web-site tested on these browsers:

FireFox 16.0 and 17.0 (good experience - developed on it);
Chrome 23 (best experience);
Safari 5.1.7 (best experience) and v4.1.3 (a little slower);
Opera 9.64 (slow), 10.63, 11.52 and 12.1;
Konqueror v4.5.5 and v4.8.4;
Internet Explorer 8 and 9 (slow, but working);
And even web-browser in Android v2.3.6 ;)

Any suggestions are welcome!

P.S. Screenshot updated on December 23rd, 2012 with v0.2 - now it has a number of libraries and copy/paste feature!

P.P.S. Updated list of tested web-browsers as per May 2019:

FireFox v66.0.4 (64-bit), v60.5.1esr (64-bit), v52.9.0 (32-bit), v17, v16, people says v3.5 works too, but slow, (v66 in Windows10 was a little slow to load, but then ok);
Chrome v49.0, v23;
Safari v11.1.2, v5.1.7 and even v4.1.3 works (in MacOS X 10.4 on PowerPC G4);
Safari from iOS 12.2 (touchscreen on iPad);
Opera v58.0, v36.0, v12.11, v11.52, v10.63, v9.64 (slow);
Konqueror v4.14.25, v4.8.4, v4.5.5;
Android 2.3.6 (touchscreen);
Internet Explorer v9.0 and v8.0 also supported since November 23, 2012 (works, but slow);
Microsoft Edge (mouse & touchscreen on Win10).

P.P.P.S. Source code is available on GitLab:
https://gitlab.com/shaos/circuits_cc
Last edited by Shaos on 27 Jan 2013 19:46, edited 9 times in total.
User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Current screenshot:

Image
User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

More about Circuits.CC:

http://www.adafruit.com/blog/2012/11/29 ... cs-editor/

Also we got some traffic from reddit, twitter and facebook...
User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Just published full source code of Circuits.CC:

github.com/shaos/circuits_cc

Webitable+Weberta are covered by LGPLv2.1 (Weberta is under developement)
Future programs written in Roberta programming language will be covered by GPLv3
But server side sources in Hope programming language are considered Public Domain!
User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

I've moved Circuits.CC to new registrar and new hosting company
User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

New version 0.2 is available on Circuits.CC and GitHub

Now we have Copy/Paste and 200 library components:

Lib/Brd/Macros/ (3)
Lib/Brd/SIP/ (108 - up to 36 pins)
Lib/Brd/DIP/ (38 - up to DIP64)
Lib/Brd/SOIC/ (24 - up to SOIC32)
Lib/Brd/PLCC/ (2 - PLCC32 PLCC84)
Lib/Brd/Examples (1 - RS232_TTL)
Lib/Sch/Macros/ (8 - PWR GND NEG_PWR PWR5V PWR3V RES CAP CAP_EL)
Lib/Sch/Logic/ (10 - NOT OR2 AND2 NAND2 XOR OR3 AND3 OR4 AND4 MUX2)
Lib/Sch/BigLogic (1 - DTRIG_RS)
Lib/Ternary/ (5 - MUX3 TRIMUX_SCH TRIMUX TRI_1L TRI_2L)
Lib/Clipboard/ (Copy/Paste)

http://circuits.cc

Image
User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

I have created a poll on the top of this thread to see what users want more
Please choose one option that is number one priority personally for you
Based on your responses I will do further development of Circuits.CC
User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Added all existing PLCC sockets to the Lib/Brd/PLCC:

Image

See http://circuits.cc
User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Сircuits.СС

Post by Shaos »

New version 0.3 is available now:

http://Circuits.CC

It uses Rgrid.js as new AJAX+VM engine, PHP+MySQL backend and comments through IntenseDebate :idea:

All source codes: https://gitlab.com/shaos/circuits_cc

P.S. Animated history of Circuits.CC (2012-2017):


https://youtu.be/Cuoqo8O80zQ
User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Сircuits.СС

Post by Shaos »

1st board designed in http://Circuits.CC:
plcc44ad.png
plcc44ad-scan.jpg
plcc44ad-pcbs-small.jpg
plcc44ad-built.jpg
You do not have the required permissions to view the files attached to this post.
User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Сircuits.СС

Post by Shaos »

You can order three of them on OSHPark: https://oshpark.com/shared_projects/Ux20E03D
You do not have the required permissions to view the files attached to this post.
User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Сircuits.СС

Post by Shaos »

Next board will be PLCC-28 adapter:
You do not have the required permissions to view the files attached to this post.
User avatar
Shaos
Admin
Posts: 24837
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Сircuits.СС

Post by Shaos »

Claude Code wrote me a program to convert arbitrary CCC file to PNG:

Code: Select all

#!/usr/bin/env python3
"""
Convert CCC format files to PNG images.
CCC format: comma-separated decimal integers representing cell indices
- Single 0 = row separator
- Double 0 (0,0) = end of file
Each integer (0-255) maps to an embedded 8x8 cell image.

This is a fully standalone program - all 256 cell images are embedded.
"""

import sys
from pathlib import Path
from PIL import Image
from io import BytesIO
import base64


# Embedded cell image data (256 cells: 0000-00ff)
# Each cell is an 8x8 RGB image stored as base64-encoded PNG
CELLS_DATA = {
    "0000": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAADklEQVR4nGNgGA5gFQMAAhwAq7bCL0kAAAAASUVORK5CYII=",
    "0001": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANklEQVR4nJWOwQkAMAwCLyUzOqRT9hMaKOmjggiHiAFm0hopkJVWMxlIIzju4feUqqPrRHy/2lUbB7+vlEi9AAAAAElFTkSuQmCC",
    "0002": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAN0lEQVR4nJXOMQoAIRQD0ad4xn/InNJiF7Sw0DSBDIRpxCn9uGL8nVpbZQP4UETdXFkSJWjPVhPzPAcT2o4K9gAAAABJRU5ErkJggg==",
    "0003": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANUlEQVR4nGNkYFjFgA0wYRVlYGBggdKrwhBiYasYGBgYVkHMgpu3CiqC0yhGqGIMoxhJdhUAI7cKCExJT0YAAAAASUVORK5CYII=",
    "0004": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHElEQVR4nGNkYFjFgA0wYRXFJ8GI3SB8OqhnOQALSQIMzPWFfwAAAABJRU5ErkJggg==",
    "0005": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgQIBVDAyr4BwmBhyAEaEaDsKQ9cMlYAwyjCIZAAD8qwYD+atCzgAAAABJRU5ErkJggg==",
    "0006": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgQIBVDAyr4BwmBhyAEaEaDsIYGBgYWND4DKugakg3inQAAHrrBQmQN/UIAAAAAElFTkSuQmCC",
    "0007": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgQIBVDAyr4BwmBhyAEaEaDsIYGBgYWFbB2WFQFavINIp0AAD05wYJgHys9AAAAABJRU5ErkJggg==",
    "0008": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgoCZYhVWUCZccEy59TAwMYVjlIDqwyAEA9AwEB4SXVzAAAAAASUVORK5CYII=",
    "0009": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgIBUwQulVSGJhMJFVyBIwBhPpRiGBVcjyOI0CADRHBgOb6qJOAAAAAElFTkSuQmCC",
    "000a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgIBUwQulVSGJhDAwMDCxofIZVUDVMJBuFDFYhy+M0CgCyeAUJCh422wAAAABJRU5ErkJggg==",
    "000b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgIBUwQulVSGJhDAwMDCyr4OwwqAqICBPJRiGDVcjyOI0CACyDBgkt3LOpAAAAAElFTkSuQmCC",
    "000c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNkQIBVMEYYAwMDE5JEGLIKRgZ0ANXHhCERhiGCTR9VAAAIrgOxLGnjxgAAAABJRU5ErkJggg==",
    "000d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgQIBVDAyr4BwmBhyAEaEaDsKQ9cMlYAwyjCLZVQAtZgdZ/M8WRQAAAABJRU5ErkJggg==",
    "000e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALElEQVR4nGNgQIBVDAyr4BwmBhyAEaEaDsIYGBgYWND4DKugakg3ChkQ5yoAq5cGXxF/JgUAAAAASUVORK5CYII=",
    "000f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALUlEQVR4nGNgQIBVDAyr4BwmBhyAEaEaDsIYGBgYWFbB2WFQFavINAoZEOcqACWiB19+A5HaAAAAAElFTkSuQmCC",
    "0010": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFElEQVR4nGNkYFjFgA0wYRUdtBIAidoAuiOe/Y8AAAAASUVORK5CYII=",
    "0011": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNgoBpgXIVDgol6duAEAFRlAK7l9p89AAAAAElFTkSuQmCC",
    "0012": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGElEQVR4nGNgQIBVDAyr4BwmBhxgcEoAAP3yAWOXdalEAAAAAElFTkSuQmCC",
    "0013": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgQIBVDAyr4BwmBhwApwTjKhwSOHUgAwotBwCg9ANeAuSmfgAAAABJRU5ErkJggg==",
    "0014": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNkwASrGBgYGBgxhSCACasoqgQD9STCUCQYGTDBKgYGBgYAVXsDDOR/KSEAAAAASUVORK5CYII=",
    "0015": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMklEQVR4nGNkwASrGBgYGBgxhSCACasoAwMDC5wbhmoeEwMOgGQHqlFIOlDNQnUVklYA+aQEt8/FXBcAAAAASUVORK5CYII=",
    "0016": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgWMXAsIoBEzBBaQxpJhTeKlwSOHWQLhGGYLJgCkEAAFN2BA97mnk5AAAAAElFTkSuQmCC",
    "0017": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMElEQVR4nGNgWMXAsIoBEzBBaQxpJhQekhwLmglwKSYGHABdRxh2HWEIJgumEAQAALE6BRN+4TYbAAAAAElFTkSuQmCC",
    "0018": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNkWMWAFTBhF0aRCGNgCMOUCGNAYxA0Cu4EGIORZFcBAKU7BA9i1avSAAAAAElFTkSuQmCC",
    "0019": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAOElEQVR4nG2NQRIAIAgCVx/pI3tlB4dMixMugxipRSkAfFKdVjRa1Ru9jIJHCs5DGfuMA5GNmBTYUXUHuND4vEEAAAAASUVORK5CYII=",
    "001a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAF0lEQVR4nGNgIBUwrsIhwYRLB+kSpAMAZqgAsuFozHoAAAAASUVORK5CYII=",
    "001b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAEklEQVR4nGNcxYAdMOEQH6QSAIsuALqj0AtvAAAAAElFTkSuQmCC",
    "001c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNkYGBgYGBYxQAFYTAGE1ZRBgYGJqyiUB2Yoiim0w4AAGaCBAivWjq8AAAAAElFTkSuQmCC",
    "001d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgoDFYxcDAhFWUAVNiFYzBhFU0DFkCWZSBgQEA0g4EB8nSW1EAAAAASUVORK5CYII=",
    "001e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMElEQVR4nGNgQAarEEwmBhwASWIViiaCOpBMh7Dx64AoD0MiV8F1hCEpDmNgYGAAAPgPBg3j2J99AAAAAElFTkSuQmCC",
    "001f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAL0lEQVR4nGNgYGBgWMUABUgMJnQhGJsRiwQDA0MYXAcGYIIrQVaOJEEAINmEUwcAKHkFtLWh86UAAAAASUVORK5CYII=",
    "0020": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAADElEQVR4nGNgGB4AAADIAAGtQHYiAAAAAElFTkSuQmCC",
    "0021": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgIAxWMTCsQvCYcCnDKYFhGomAGB0AK9MCrZcYYVAAAAAASUVORK5CYII=",
    "0022": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNgIAxWIZEMDExE6KA/AADXyAFXvuGGhAAAAABJRU5ErkJggg==",
    "0023": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgIABWoTMYUUThIAy3DiZcZpNuFE4AAGyBBgEnR48qAAAAAElFTkSuQmCC",
    "0024": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgIAqsQjAZMYVQFa7CqgO7ckw7VjEwrMKlIwy3qwCPSAeoSWQNLQAAAABJRU5ErkJggg==",
    "0025": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgIAusYmBYhc5mQlfBwMAQhkcfFlEUo7CbgAMAAB3FCKlF7dYXAAAAAElFTkSuQmCC",
    "0026": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAEYofQqJLEwZAWr0BmMWOSw6EDXtwpVxSqsloehqsMEACilCP5b5d5NAAAAAElFTkSuQmCC",
    "0027": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNgIAxWMTCswiNHtCgtAQB+rQKpi/NyRQAAAABJRU5ErkJggg==",
    "0028": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAG0lEQVR4nGNgIAxWMTCsIkKUCZd+0iUIWo4BAMdpBAOB1jRPAAAAAElFTkSuQmCC",
    "0029": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHElEQVR4nGNgIAxWMTCsIkKOCZca0iWItBwJAAC/cQQDfv1AGQAAAABJRU5ErkJggg==",
    "002a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgIAqsQjCZMIUgbEYsysOQdRAwHZnEZTlOAAAjSQWsJocJJgAAAABJRU5ErkJggg==",
    "002b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoAysQjCZcKlhxFTLwMDAEEaGUTgBANxSAlqXGaJ3AAAAAElFTkSuQmCC",
    "002c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFElEQVR4nGNgGBxgFQPDKjxyBEUBdP4CqTYf1A8AAAAASUVORK5CYII=",
    "002d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNgoD1ghNKrUIXDqGkHAFgiAQJ6TOavAAAAAElFTkSuQmCC",
    "002e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNgGBxgFQPDKgSPiWT9AFQuAVcRsILUAAAAAElFTkSuQmCC",
    "002f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFElEQVR4nGNgoBisYmBYRT9RHAAARfQGpZhRSEgAAAAASUVORK5CYII=",
    "0030": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgwAEYofQqVOEwiMQqKAdZERMuo0iXwGk5TgAAsOIDtBVqP98AAAAASUVORK5CYII=",
    "0031": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgIBasYmBYxcDAwMCELgoDTCiiYVglkEQxjCJGAicAAL3NA1/A9dnwAAAAAElFTkSuQmCC",
    "0032": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgwAEYGRgYGFbhkkADqxgYGBiYSDaKBcEMI04HTgAAPogDCfqj3kQAAAAASUVORK5CYII=",
    "0033": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgwAEYGRgYGFbhkkADqxgYGBiY8BqFqpaBgYEhDLdROC3HCQBgkQOweI6mWAAAAABJRU5ErkJggg==",
    "0034": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALklEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSgVMCySgsEmgAvx04AQB3RQMIw03l3wAAAABJRU5ErkJggg==",
    "0035": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgwAEYGRgYGFZhkWBBMMNQJJhINooRi9gqvDpwAgAmzQMJfBItFgAAAABJRU5ErkJggg==",
    "0036": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgwAEYGRgYGFZhkWBBMMNQJJioYtQqvDpwAgA9LgNiS1LK9AAAAABJRU5ErkJggg==",
    "0037": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgwAEYGRgYGFbhkkADqxgYGBiYcBlFRQmcAADMAQFfQWJlmQAAAABJRU5ErkJggg==",
    "0038": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTNQzCqcOnAAAk4IEDC+/uIUAAAAASUVORK5CYII=",
    "0039": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTCQbxYhFbBVeHTgBAH0hA7MBtp1PAAAAAElFTkSuQmCC",
    "003a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNgoACsYmBYheAxDaRRAAvVAq0gph3mAAAAAElFTkSuQmCC",
    "003b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgoACsYmBYheAxUc8oDDmCogAspQP/IDhreAAAAABJRU5ErkJggg==",
    "003c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNgoBisYmBYRZYQ9aQZGAA9/AalCeceQwAAAABJRU5ErkJggg==",
    "003d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgoBpgZGBgYFiFIRxGTR04AQCzeAIDcMfVZAAAAABJRU5ErkJggg==",
    "003e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNgIAusYmBYRVVp4oRwAwBN7Aal4KFrdAAAAABJRU5ErkJggg==",
    "003f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgwAEYEcxVMEYYAwMDAxOKaBiCzYKsCjdYhWQgcYAY5QA3bwUGqm8oqwAAAABJRU5ErkJggg==",
    "0040": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgwAEYofQqVOEwrKKrGBgYGFjQ+HDAhMsObEbhsxwPAADzHARb3n7+6AAAAABJRU5ErkJggg==",
    "0041": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgwAEYEcxVKBJMKKJhDAxhaBLYjVqFRYIFwYQZAlGH0yicAACkTgO3h6L7oQAAAABJRU5ErkJggg==",
    "0042": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMUlEQVR4nHXMsQ0AIAwDwSNixgzJlHSRgsh3tt5mYMHpXUK0nMoLA78rsJ/r8sbFyAX0GAS2dsSyCAAAAABJRU5ErkJggg==",
    "0043": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqmHDZgU3HKryW4wQAY5ADZYubxrEAAAAASUVORK5CYII=",
    "0044": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMUlEQVR4nGNgwAEYGRgYGFahioUxMDAwMKHwwxjg6pgYGLAoZ1iFKQEDOCWwWY4fAADizgQLpn/f2AAAAABJRU5ErkJggg==",
    "0045": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqmBD8VShm4jQKp+U4AQDtRgUPPtGXAQAAAABJRU5ErkJggg==",
    "0046": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALElEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqmBD8VShmYjOKAU0HkQAAqxADvM7p0b8AAAAASUVORK5CYII=",
    "0047": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqMCRgxjJhVY7PcpwAAInWA7stJK0cAAAAAElFTkSuQmCC",
    "0048": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAL0lEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSgVMCyShUwIJgEmkHTgAAjaYDYcfvoIMAAAAASUVORK5CYII=",
    "0049": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgwAEYofQqJLEwNDWrUKSZcBlFvgTc9FU4FMIBAI+mA7KDFM9jAAAAAElFTkSuQmCC",
    "004a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgwAEYEcxVSMJhaMpWIaSZcBnFhKYQVQKf5XAd6NZiAAD50gSxGQfOQQAAAABJRU5ErkJggg==",
    "004b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMklEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMKGrhCliwiqKahQqYEEwCdhBEAAAfa0FYdfcFLAAAAAASUVORK5CYII=",
    "004c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgwAdWMTCsQhdjwqWYdAkW7FYyMDDCWcQCACdVArR5YoTvAAAAAElFTkSuQmCC",
    "004d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANUlEQVR4nI3MwQ0AIAxC0adDdshO6ckoBxM5NIRf4KEBDWpnDfP89HUDXGmCisFs1LEJfrQAYQMEtkUlUD4AAAAASUVORK5CYII=",
    "004e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAM0lEQVR4nHXLwQ0AIAxC0adDdshO6ck0JMoJ+MBHCxrU7Rr2bDoeO1I/QQXLR41NkOytAy8DBLZtJcfZAAAAAElFTkSuQmCC",
    "004f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTLiMIl0Cp+U4AQAaNAJhftx21AAAAABJRU5ErkJggg==",
    "0050": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTFQxigGvUTgBAFFMArliVZ6rAAAAAElFTkSuQmCC",
    "0051": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTLiMIl5iFdRYnJbjBABSMANh24EvVwAAAABJRU5ErkJggg==",
    "0052": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAL0lEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTCQbhaQjDMm0MEyjwhDWYAcAk7AEY42IgKMAAAAASUVORK5CYII=",
    "0053": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqcBrFiEVsFV4dOAEAoWEEC1DuJ4kAAAAASUVORK5CYII=",
    "0054": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAEYGRgYGFZhkWCC0mFIYmFwiTB05QxhcB04jSJeAicAABxGAg71T1jGAAAAAElFTkSuQmCC",
    "0055": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALklEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSQUUJRmQLESAMQyEcAAA5HAK1ZRHYogAAAABJRU5ErkJggg==",
    "0056": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANElEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSQYzEKiQSagcSHwrC4DrCUETxAQDcawS1Y8ZBeAAAAABJRU5ErkJggg==",
    "0057": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAL0lEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSQaTEKqx2YNEBtxaTgQkAn+0ECwkJjQwAAAAASUVORK5CYII=",
    "0058": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANklEQVR4nHWLsQ0AMAjDDEdyZK7sUAFFKpkgdmCJAQiAyE6voPzzsMHoqX/mKjDd23iLMdmWA9rxCQX0ScpeAAAAAElFTkSuQmCC",
    "0059": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANUlEQVR4nH3NwQ0AIAhD0adDMiRTelGDB/yHJrQppWFAgjhewuwaJcii+1W5N3Eb8bi/jZYFJ2EEtSYKU1UAAAAASUVORK5CYII=",
    "005a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALUlEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVwHQwoQhBFjJhCGHZgMQqb5TgBAEaNBgj3sSeBAAAAAElFTkSuQmCC",
    "005b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgwAEYofQqJLEwBgYGBhYUZWEIJhMuoyiVWIXqCqwAAAUUArg92EUVAAAAAElFTkSuQmCC",
    "005c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAF0lEQVR4nGNgIAusYmBYNVjkGBgYGBgARfQGpbrvdQMAAAAASUVORK5CYII=",
    "005d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgwAEYofQqJLEwTGWrECqYcBlFugQLFsvxAwB2JAMKCttkpAAAAABJRU5ErkJggg==",
    "005e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAG0lEQVR4nGNgIAqsQjCZ0EVXoUlA+GHo+mgLANs9A63DEDwPAAAAAElFTkSuQmCC",
    "005f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFElEQVR4nGNgGFKAkYGBgWEVFgkADikArA8arLkAAAAASUVORK5CYII=",
    "0060": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFElEQVR4nGNgIAqsIkKUiQgdNAMAEr8CAXmZhxUAAAAASUVORK5CYII=",
    "0061": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgoBpghNKrUIXDMEVXQblMuIxiQTcqDMNYNAAAWOIEsA4sqJoAAAAASUVORK5CYII=",
    "0062": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgwAdWYRFjwqUYpwQjFqPCsNqxCsplwWM/dgAAZG0EXIv77lwAAAAASUVORK5CYII=",
    "0063": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoBpghNKrUIXDMEVXIXPRlBNhFDYAAHBCBKuofj3zAAAAAElFTkSuQmCC",
    "0064": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgIAGsYmBgYGDCJYtTggVZO3ZDEexVhHVgAwA+xQQJ9fSHFQAAAABJRU5ErkJggg==",
    "0065": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgoBpghNKrkMTCGBgYGJjQRVG4aBL4jcIJADvwBAMFIT0AAAAAAElFTkSuQmCC",
    "0066": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgIAxWMTCswiXBgFUOVYgRi2gYXjuYiHAVKgAAhM4FqgVQ4H0AAAAASUVORK5CYII=",
    "0067": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgoBpghNKrUIXDMEVXQbn4dSADfDrCGBgYGACRxgZW+HQraAAAAABJRU5ErkJggg==",
    "0068": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgwAdWYRFjwqUYpwQjFqPCsNqxCsrFaRROAABIJQOwlWPnVgAAAABJRU5ErkJggg==",
    "0069": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGklEQVR4nGNgIAxWEaEGnw4mXHKoEjh1EAMA9EICBTvi2r4AAAAASUVORK5CYII=",
    "006a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgIAxWEaEGnw4mXHKoEug68Fm7Cl0aACbJBAOTwdPSAAAAAElFTkSuQmCC",
    "006b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgIABWoQswEVKxCl2UCY8cKn8VlI1hB0EAAEueBgFh9bCAAAAAAElFTkSuQmCC",
    "006c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgIABWMTCswiOHBJhwKUOVWIVLghijcAIAdMsCsX11qJgAAAAASUVORK5CYII=",
    "006d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgoBpgZGBgYFiFKhbGwMDAwITMgZKrkCUwAE4JnAAA5ukCXptzYBMAAAAASUVORK5CYII=",
    "006e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgoBpghNKrkMTCkBWsQmKsYmBgYGDCZRROCZwAABycAwSFYOvmAAAAAElFTkSuQmCC",
    "006f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoBpghNKrkMTC4Cxk0VVQLhN5RmEDAERgBAOKBdIoAAAAAElFTkSuQmCC",
    "0070": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgoBpgZGBgYFiFKhYGZyFLrIJyWbDIoajCAEy4LAcAa1wEWqENDmYAAAAASUVORK5CYII=",
    "0071": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgoBpghNKrUIXDMEVXQbks2HVgB6sYGBgYmHDJAgBeZgRakfv28AAAAABJRU5ErkJggg==",
    "0072": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGklEQVR4nGNgoAVYhUSiSyCJMuHSj1MCJwAACXMCrR3uwjQAAAAASUVORK5CYII=",
    "0073": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgoBpgRDBXIQmHMbCgqwzDZcQqqFYWBJ9IAAD0ZQNeK7KLgQAAAABJRU5ErkJggg==",
    "0074": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgIAxWofCYUERXMWAD2HVgyKFK4NRBDAAArhkDWyGvYiYAAAAASUVORK5CYII=",
    "0075": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgoDpYhcRYxcDAwMCESyVOCUYspjEwMIThthQAAIMDBMebjPoAAAAASUVORK5CYII=",
    "0076": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgoDpYhcRYxcDAwMAE5YchyTEgSyDrC0OTCCPOUgB/1QRbXaL5mwAAAABJRU5ErkJggg==",
    "0077": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgoC5YhUquYmBgYGDCpRinBCOKaRAQhtdeAFE1A65eo8AQAAAAAElFTkSuQmCC",
    "0078": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgoDpYxcCwCsbAKYcuikVuFSobiz4kAAAZdgdPVvlB7gAAAABJRU5ErkJggg==",
    "0079": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgoC5YhcpexcDAwMCESzEjFk0MDAxhWI1dhUtHGAMDAwMAU+kFVyGNswsAAAAASUVORK5CYII=",
    "007a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgoBpgZGBgYFiFJBCGqWYVphCy6CooG8MonAbCAABPFASr2DKEDQAAAABJRU5ErkJggg==",
    "007b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgIAqsYmBYRawoA7ooE1ZRYnQQ0IdkPwBkWAapb6/92QAAAABJRU5ErkJggg==",
    "007c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGElEQVR4nGNgIAqsQjCZcKnBKUEkoMgOAJbwAV1aUNgAAAAAAElFTkSuQmCC",
    "007d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgIABWMTCsIlMOBpjwyBHUgVMtqgQAbFAGqZni+7wAAAAASUVORK5CYII=",
    "007e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAE0lEQVR4nGNgIAxWIZGERAcKAACPRwKpcWPjtAAAAABJRU5ErkJggg==",
    "007f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgIAqswiOKLrcKnc2E3YRVEAlsgBG3nTgAAEWGBVb0MbvqAAAAAElFTkSuQmCC",
    "0080": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgwAEYEcxVKBJMKKJhDAxhaBLYjVqFRYIFwYQZAlGH0yicAACkTgO3h6L7oQAAAABJRU5ErkJggg==",
    "0081": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgwAEYGRgYGFZhCIcxsCBzkAETyUYhScCNWoVHBx4AALe3BLWodVEnAAAAAElFTkSuQmCC",
    "0082": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMUlEQVR4nHXMsQ0AIAwDwSNixgzJlHSRgsh3tt5mYMHpXUK0nMoLA78rsJ/r8sbFyAX0GAS2dsSyCAAAAABJRU5ErkJggg==",
    "0083": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqmHDZQboETgAAIMQCEOieKPcAAAAASUVORK5CYII=",
    "0084": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAEYEcxVSMJhDEwoomEIKSYGHIB0CUZ0a2GABdklyA4BAFd8A7muOgsBAAAAAElFTkSuQmCC",
    "0085": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqmBD8VShm4jQKp+U4AQDtRgUPPtGXAQAAAABJRU5ErkJggg==",
    "0086": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANklEQVR4nHXNwQkAIAwEwdEiU2Sq9KEiEXKvcFn2aDIgQdwuYRYs31kfv6qyWzv/jThcq2qzAD9JBV/lNRI3AAAAAElFTkSuQmCC",
    "0087": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALElEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVwHWgAiwTczDBkO7AYhc1ynAAAGk0Fskoy4+UAAAAASUVORK5CYII=",
    "0088": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANElEQVR4nH3MwQ0AIAgEwZEiLZIq/WgMRt0PZA+OBw0S9OUS4rzMOeNqa1AL60ffa1ztjwEvAwS2aQyhYAAAAABJRU5ErkJggg==",
    "0089": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALUlEQVR4nGNgwAdWMTCsgjFgXCYUFWEwOQY0iVUIJhO6aBhWHWEIJhNWUXwAAGO7BrNLJ73vAAAAAElFTkSuQmCC",
    "008a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMklEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMKGrhCliwiqKahQqYEEwCdhBEAAAfa0FYdfcFLAAAAAASUVORK5CYII=",
    "008b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgwAEYEcxVKBJMKKJhDAxhaBIYgEyJVbhksQEASOICtjiFuxQAAAAASUVORK5CYII=",
    "008c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANUlEQVR4nI3MwQ0AIAxC0adDdshO6ckoBxM5NIRf4KEBDWpnDfP89HUDXGmCisFs1LEJfrQAYQMEtkUlUD4AAAAASUVORK5CYII=",
    "008d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAL0lEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSgVMCyShUwIJgEmkHTgAAjaYDYcfvoIMAAAAASUVORK5CYII=",
    "008e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTLiMIl0Cp+U4AQAaNAJhftx21AAAAABJRU5ErkJggg==",
    "008f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTLiMoqIETgAA/HUBuPGlE1cAAAAASUVORK5CYII=",
    "0090": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTFQxigGvUTgBAFFMArliVZ6rAAAAAElFTkSuQmCC",
    "0091": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqmHDZgU3HKryW4wQAY5ADZYubxrEAAAAASUVORK5CYII=",
    "0092": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAEYGRgYGFZhkWCC0mFIYmFwiTB05QxhcB04jSJeAicAABxGAg71T1jGAAAAAElFTkSuQmCC",
    "0093": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALklEQVR4nH3MwQ0AIAzDwIMhGbJT8kKqEMHPWA6BAQXW2QpmKqJoVw9xUd8isgGU9QOxNNF/+AAAAABJRU5ErkJggg==",
    "0094": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgwAEYofQqVOEwBiaEaBgSuQoigQ3glMBvB9xoTDYmAAANTgS3Yb+P2gAAAABJRU5ErkJggg==",
    "0095": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANklEQVR4nHWLsQ0AMAjDDEdyZK7sUAFFKpkgdmCJAQiAyE6voPzzsMHoqX/mKjDd23iLMdmWA9rxCQX0ScpeAAAAAElFTkSuQmCC",
    "0096": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgwAdWMTCsQmcz4VJMRQlGqIXEglUMANNnBAa/DKIqAAAAAElFTkSuQmCC",
    "0097": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALklEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSgVMCySgsEmgAvx04AQB3RQMIw03l3wAAAABJRU5ErkJggg==",
    "0098": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALUlEQVR4nI3NMQoAIADDwNNH+si+0slBsGDGhlAKAwLW2QKzFbdIE7V4n3+yAXu+AwlhXJvgAAAAAElFTkSuQmCC",
    "0099": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALUlEQVR4nI3NMQoAIADDwNNH+si+0slBsGDGhlAKAwLW2QKzFbdIE7V4n38RG30SA7MKOdbJAAAAAElFTkSuQmCC",
    "009a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALElEQVR4nGNgwAEYGRgYGFbBeGEICSY0PqoETqOQTYOZyYTGhxq7CpcOPAAAmeQEYKnd/CEAAAAASUVORK5CYII=",
    "009b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAL0lEQVR4nI3MwQkAIAwEwdEiU2Sq9BVQIZB93rJHw4IEUVvC7oqJyPr8Rbh5iwkHt/QECojLwHkAAAAASUVORK5CYII=",
    "009c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgIABWMTCsQhFgwqUSpwQjwihkEIamI4yBIQyqDocOPAAAnVMEXY55g28AAAAASUVORK5CYII=",
    "009d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgwAEYofQqVOEwiMQqKAdZESMDJsAigWQgQaPQLMcDAI4LBllDo++UAAAAAElFTkSuQmCC",
    "009e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAdWMTCsQmczoasIgzJQJZAAksQqXBJhuCQgcquwKEIBAAuDBrMHDWNVAAAAAElFTkSuQmCC",
    "009f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgwAEYofQqrBIQ0TAGZEVMeI3CMAcVrEJirGJgwWIHfgAANCcGButx4YQAAAAASUVORK5CYII=",
    "00a0": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgoBpghNKrUIXDMEVXQblMuIxiQTcqDMNYNAAAWOIEsA4sqJoAAAAASUVORK5CYII=",
    "00a1": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgwAEYofQqVOEwZA6aHAOaHEwav1HIojBNLERYgAoAftMGrTqH5LoAAAAASUVORK5CYII=",
    "00a2": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgwAdWMTCsQhdjIqQDAzBikQjDqgNmHwse07ADACIYBa46Ux/DAAAAAElFTkSuQmCC",
    "00a3": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgoBpghNKrkMTCMJWtQlWBVQibUdhNgwEAXqwEq9d/4vcAAAAASUVORK5CYII=",
    "00a4": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgoBpghNKrUIXDMEVXQbn4dSADfDrCGBgYGACRxgZW+HQraAAAAABJRU5ErkJggg==",
    "00a5": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgoBpghNKrkMTCGBgYGJjQRVG4aBL4jcIJADvwBAMFIT0AAAAAAElFTkSuQmCC",
    "00a6": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgoC5YxcCwCsaAcZkYGBgYwrAoZkRoQgVMCNEwJBIPAAD1VgWudjmESwAAAABJRU5ErkJggg==",
    "00a7": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgoBpghNKrUIXDMFXCVDBhEV2FKYFkAgt2OxgYAA4wBAivCIt5AAAAAElFTkSuQmCC",
    "00a8": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgoDpYhcRYxcDAwMCESyVOCUYspjEwMIThthQAAIMDBMebjPoAAAAASUVORK5CYII=",
    "00a9": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgIAxWMTCsIkIZknJUfUy4VOKUYMRiGgMDQxhuSwHYVQRYxJ0bkgAAAABJRU5ErkJggg==",
    "00aa": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgoDpYhcFA4SOJMmJXGMbAhMxhCCPCUgBkTARYvGROcAAAAABJRU5ErkJggg==",
    "00ab": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgoBpgRDBXIQmHYYqugrKZcBmFUwInAAAZnAMErFlhNwAAAABJRU5ErkJggg==",
    "00ac": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAG0lEQVR4nGNgoDpYBSNXYRVFkmPCZQROCZwAAMdfBKu0WEsRAAAAAElFTkSuQmCC",
    "00ad": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgoDpYhcRYxcDAwMCESyULFk0MaDrCGBjCiLAUACIFA13YqLTEAAAAAElFTkSuQmCC",
    "00ae": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoBpghNKrkMTC4Cxk0VVQLhN5RmEDAERgBAOKBdIoAAAAAElFTkSuQmCC",
    "00af": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgoBpghNKrUIXDGJiQOQxhCB4TAw6AUwInAACtxwG00e2tVQAAAABJRU5ErkJggg==",
    "00b0": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNgWMXAwMCAhcQNBqMOALxECqGn/2nKAAAAAElFTkSuQmCC",
    "00b1": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgYGBgWMWAjcQuyoBDdIB1AABOQBVBmKyDtQAAAABJRU5ErkJggg==",
    "00b2": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGElEQVR4nGNgYGBgWMWASTJCWdjBoNMBAKJTDU1MO/3yAAAAAElFTkSuQmCC",
    "00b3": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNgQAarEEwmBhxgcEoAAIHEALlbT/HwAAAAAElFTkSuQmCC",
    "00b4": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHElEQVR4nGNgQAarEEwmBhyAdAkWZHNxA4osBwDrjAINN6w+UwAAAABJRU5ErkJggg==",
    "00b5": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgQAarEEwmBhwApwQLsnbcAEkR6TpwWg4AVWMDYeKqzYAAAAAASUVORK5CYII=",
    "00b6": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNggINVSCQDAxMDDkC6BAvcUNyAUssBj6EDYbG06d8AAAAASUVORK5CYII=",
    "00b7": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoD1gZFiFIRaGxl+FRDIwMOEyCqcEAK66AlpkoTMiAAAAAElFTkSuQmCC",
    "00b8": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgoBpgZFiFKhCGVRmSIhZ0HdgBkiImXGoA+hcDBpzYv1oAAAAASUVORK5CYII=",
    "00b9": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNggINVSCQDAxMDDoBTggWulxCAqUPVEYZHLUFXAQD7TwULuTu2pwAAAABJRU5ErkJggg==",
    "00ba": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNggINVSCQDAxMDDjA4JQD9SAFjueA6xgAAAABJRU5ErkJggg==",
    "00bb": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgoBpgZFiFIRaGVSVMHQuKDnxqYeqYcFkOACOMBAY0p2jpAAAAAElFTkSuQmCC",
    "00bc": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNggINVSCQDAxMDDoBTggWulxCAqSNeB0EAALbPA1/gGMFAAAAAAElFTkSuQmCC",
    "00bd": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNggINVSCQDAxMDDkC6BCPcUAQIw6WYTAAAV7sCXERIEygAAAAASUVORK5CYII=",
    "00be": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgQAarEEwmBhwApwQLsnbcAEkRkTqIAQA9SQK1kdeBnwAAAABJRU5ErkJggg==",
    "00bf": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHElEQVR4nGNgoD1gZFiFKhCGVRmSIiZcRuGUAACHOgGwvCjgrQAAAABJRU5ErkJggg==",
    "00c0": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGklEQVR4nGNgQAarEEwmBhyAdAlGXHZQEQAAuVABXFVLgHYAAAAASUVORK5CYII=",
    "00c1": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgQAarEEwmBhyAdAlGZHNpBADBSAFcPqjnEgAAAABJRU5ErkJggg==",
    "00c2": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgoD1gZFhFjDIkRUy41OCUAABrWAFaFohb2gAAAABJRU5ErkJggg==",
    "00c3": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgQAarEEwmBhyAdAlGXHYw4JIg3Q4A4mgCCtpotOsAAAAASUVORK5CYII=",
    "00c4": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAEUlEQVR4nGNgoD1gZFhFczsAQkAArKURdJ8AAAAASUVORK5CYII=",
    "00c5": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHElEQVR4nGNgQAarEEwmBhyAdAlGZHNxA4osBwDqYAIKuAbSIAAAAABJRU5ErkJggg==",
    "00c6": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgQAarEEwmBhwApwQjLqMYcEmQrgOn5QBDGwNbD7hQtQAAAABJRU5ErkJggg==",
    "00c7": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNggINVSCQDAxMDDkC6BAsWsVW4JMLIswMARk8CZ994XnoAAAAASUVORK5CYII=",
    "00c8": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNggINVSCQDAxMDDoBTggWL2Cq8fEbcCkkFAKf8A1zOsaFWAAAAAElFTkSuQmCC",
    "00c9": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgoBpgRDBX4VKDKsGCSxpDgoGBIYyBgYGBCZfBALrRAmBtEhGKAAAAAElFTkSuQmCC",
    "00ca": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNggINVSCQDAxMDDoBTggWuF91MXICRgDwJAADEigNcV5nKIAAAAABJRU5ErkJggg==",
    "00cb": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoBpgZFhFkY4wBmwGrEIiGRiYcBkFAO68A61bWRgiAAAAAElFTkSuQmCC",
    "00cc": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNggINVSCQDAxMDDoBTggWL2Cq8fAwdq3BJMDAwhOG1HACv7wO7VaNYkAAAAABJRU5ErkJggg==",
    "00cd": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAE0lEQVR4nGNgoBpgZFhFcx04AQCDuAFXNbwBBgAAAABJRU5ErkJggg==",
    "00ce": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNggINVSCQDAxMDDoBTggWuF91MXIARRT4Mq3IiXQUAL50FsowbNIEAAAAASUVORK5CYII=",
    "00cf": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgQAarEEwmBhwApwQjsnaiAOk6cAIAAdUCBZzeVw4AAAAASUVORK5CYII=",
    "00d0": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAG0lEQVR4nGNggINVSCQDAxMDDkC6BCPcUNoBADzbAgZALE0iAAAAAElFTkSuQmCC",
    "00d1": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAF0lEQVR4nGNgoBpgZFhFGx1IiphwqQEAm9ICA6tZpbsAAAAASUVORK5CYII=",
    "00d2": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAG0lEQVR4nGNgoD1gZFhFUM0qJJKBgQmXMpwSAJPaAgR7GMx3AAAAAElFTkSuQmCC",
    "00d3": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAG0lEQVR4nGNggINVSCQDAxMDDkC6BCO6HTQAADbhAgYDT+z9AAAAAElFTkSuQmCC",
    "00d4": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgQAarEEwmBhwApwQjLqMYcEkQqYMYAAArAQKvArv60QAAAABJRU5ErkJggg==",
    "00d5": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGklEQVR4nGNgoBpgROGtwqUMSYJ0HUy41AAAxP4CrYVyat8AAAAASUVORK5CYII=",
    "00d6": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGklEQVR4nGNgoD1gRDBX4VKzCkWaCZcynBIAjeACBJzCo5cAAAAASUVORK5CYII=",
    "00d7": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNggINVSCQDAxMDDkC6BCPcUNyAUssBjnUDXivTk20AAAAASUVORK5CYII=",
    "00d8": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgQAarEEwmBhwApwQjsnbcAEkR6TpwWg4AUwsDW4+6rBIAAAAASUVORK5CYII=",
    "00d9": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgQAarEEwmBhyAdAkWZHNpBADCdAFfIXGD+gAAAABJRU5ErkJggg==",
    "00da": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgoD1gROGtwqUMSYIJlxqcEgBjYAFafTiWOgAAAABJRU5ErkJggg==",
    "00db": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAE0lEQVR4nGNkWMWAFTBhFx6sEgCKhAC6r/jUNgAAAABJRU5ErkJggg==",
    "00dc": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNgoD1gZFiFXYIJlw7SJQBDbACyAe6yiAAAAABJRU5ErkJggg==",
    "00dd": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNkWMWAAGEIJhMDDjA4JQDJAAEQBuzXjgAAAABJRU5ErkJggg==",
    "00de": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNkQAarEEwmBhxgcEoAAIKMALql0gTaAAAAAElFTkSuQmCC",
    "00df": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNkWMWAFTBhFyZHgh4AAIiQALJRSBqJAAAAAElFTkSuQmCC",
    "00e0": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgoBpgZGBgYFiFKhYGZyFLrIJyWbDIoajCAEy4LAcAa1wEWqENDmYAAAAASUVORK5CYII=",
    "00e1": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoBpghNKrUIXDMEVXIXPRlBNhFDYAAHBCBKuofj3zAAAAAElFTkSuQmCC",
    "00e2": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgoBpgZGBgYFiFKhbGwMDAwITMgZKrkCUwAE4JnAAA5ukCXptzYBMAAAAASUVORK5CYII=",
    "00e3": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgoC5YhcpexcDAwMCESzEjFk0MDAxhWI1dhUtHGAMDAwMAU+kFVyGNswsAAAAASUVORK5CYII=",
    "00e4": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALklEQVR4nGNgoACsQuExYgoxMDAwhDEwwVkIkoGBgQEusQqLadjtYMKqhoGBAQB72ARcr4uT6wAAAABJRU5ErkJggg==",
    "00e5": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgoDpYxcCwCsbAKYcuikVuFSobiz4kAAAZdgdPVvlB7gAAAABJRU5ErkJggg==",
    "00e6": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgoDpYhcRYxcDAwMCESyVOCUYspuG3EgD4tgNYRt2aFgAAAABJRU5ErkJggg==",
    "00e7": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgoDpYhcRYxcDAwMCESyUjFk0MDAxhWM1chSmKBABC3ARW8vc3NwAAAABJRU5ErkJggg==",
    "00e8": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgoC5YhUquYmBgYGDCpZigBLJp+AEAXzsEAymO+tUAAAAASUVORK5CYII=",
    "00e9": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgoC5YhUquYmBgYGDCpRinBCPCECJtBQBKcwQClRUNMgAAAABJRU5ErkJggg==",
    "00ea": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgoC5YxcCwCl2MESEHB2FomlB1s2CRww8AiMsFAiXplasAAAAASUVORK5CYII=",
    "00eb": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgoC5YhYXLhOCgSsMkwtC1IukgEgAAax0EWfsbDfAAAAAASUVORK5CYII=",
    "00ec": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgoDpYhS7AiEUiDKuOVVA2Cx7TsAMAORsEWEKKfC4AAAAASUVORK5CYII=",
    "00ed": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgoBpghNKrkMTCkCXQpMMYmND4eI1CVYEOAC5iBAZ0Za1XAAAAAElFTkSuQmCC",
    "00ee": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgoC5YhcSAsZlQpMMQ6pjQNTGg6QjDLo0FAADDVwVZBu8OfQAAAABJRU5ErkJggg==",
    "00ef": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHElEQVR4nGNgoBpgRDBXIQmHYYqugrJJ14ETAACanwX/VagwFwAAAABJRU5ErkJggg==",
    "00f0": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALElEQVR4nGNggINVSCQDAyMyBxmwIJhhKFpZMNVCVDCh2IFkJk6jcFqOEwAA5F0GY+tho2MAAAAASUVORK5CYII=",
    "00f1": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgIAxWIZF4ACOKcggIY2BgYGDCon0VFhYRRuEEABHTBVcj20O6AAAAAElFTkSuQmCC",
    "00f2": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgoBpgRDBXwRhhEIlVmKrx6kAFSLqZcFkOAAclA1ofSWL2AAAAAElFTkSuQmCC",
    "00f3": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgQAarEEwmBhyAGIlVKKYxYrWAgYGBBYspYZhCxLgKAHqJA7YUycDiAAAAAElFTkSuQmCC",
    "00f4": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgQAarEEwmBhyAGIlVKKYxIpuLDBix2ByGy3j8AACSCAOxvQP/ewAAAABJRU5ErkJggg==",
    "00f5": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgQAarEEwmBhyAGIlVKKaxIJuLDBix2ByGqYwYVwEAq04EYGbLjGoAAAAASUVORK5CYII=",
    "00f6": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgQAarEEwmBhyAGIlVKKYxIpuLDBix2ByGqYwYVwEAqiIEXdiX04cAAAAASUVORK5CYII=",
    "00f7": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgQAarEEwmBhwASWIVuiYM/iq4DnRVyCIYOhixqArDdAqSPgC2fges6zB15QAAAABJRU5ErkJggg==",
    "00f8": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgQAarGBhWQZksDGggDCGHqgMGmDBlYUZh0UieUTglAFu0BGFT1cf6AAAAAElFTkSuQmCC",
    "00f9": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNkgIBVDCggjIEJzkIWhamFK0fThy6NBSBJM2KXJgcAAHWQBwHX6gLAAAAAAElFTkSuQmCC",
    "00fa": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAEklEQVR4nGNgGJxgFQPDKlKkAVMgAqkgiF9iAAAAAElFTkSuQmCC",
    "00fb": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgQAarEEwmBhyAdAkWZHNxAyRFLPilkYRgogAMVwQLc597zwAAAABJRU5ErkJggg==",
    "00fc": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGElEQVR4nGNgIBUwYhFbhVUIXZQ4IfIAAMBXBKgbakdJAAAAAElFTkSuQmCC",
    "00fd": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNggIBVDAyrGFABFqHBCwDhnwKp0eW+qQAAAABJRU5ErkJggg==",
    "00fe": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFElEQVR4nGNgoD1gZGBgYFhFWzsAQEIArKZ9/uQAAAAASUVORK5CYII=",
    "00ff": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgYGBgWMWAjYSw0ABWQYgEE25JqulgxKUDAPNUB/4MMEtcAAAAAElFTkSuQmCC",
}


def read_ccc_file(input_path):
    """Read CCC file and return list of rows (each row is a list of integers)."""
    with open(input_path, 'r') as f:
        content = f.read().strip()

    # Parse comma-separated integers
    numbers = [int(x.strip()) for x in content.split(',')]

    # Split by rows (single 0 = row separator, double 0 = end of file)
    rows = []
    current_row = []

    i = 0
    while i < len(numbers):
        if numbers[i] == 0:
            # Check if this is end of file (double 0)
            if i + 1 < len(numbers) and numbers[i + 1] == 0:
                # End of file - save current row if not empty
                if current_row:
                    rows.append(current_row)
                break
            else:
                # Single 0 - row separator
                if current_row:
                    rows.append(current_row)
                    current_row = []
        else:
            current_row.append(numbers[i])
        i += 1

    return rows


def get_cell_image(cell_index):
    """Get embedded cell image as PIL Image object."""
    hex_key = f"{cell_index:04x}"

    if hex_key not in CELLS_DATA:
        # Create a placeholder (dark gray square)
        return Image.new('RGB', (8, 8), color=(64, 64, 64))

    # Decode base64 PNG data
    b64_data = CELLS_DATA[hex_key]
    png_bytes = base64.b64decode(b64_data)
    cell_image = Image.open(BytesIO(png_bytes)).convert('RGB')

    return cell_image


def create_image_from_rows(rows, cell_size=8):
    """Create composite image from rows of cell indices.

    All cell images are embedded as 8x8 RGB images in CELLS_DATA.
    """
    if not rows:
        raise ValueError("No rows found in CCC file")

    # Calculate dimensions
    max_width = max(len(row) for row in rows) if rows else 0
    height = len(rows)

    if max_width == 0:
        raise ValueError("Invalid row width")

    # Create new image with black background
    image_width = max_width * cell_size
    image_height = height * cell_size
    composite = Image.new('RGB', (image_width, image_height), color='black')

    # Paste cells into composite image
    for row_idx, row in enumerate(rows):
        for col_idx, cell_index in enumerate(row):
            cell_image = get_cell_image(cell_index)

            # Calculate position
            x = col_idx * cell_size
            y = row_idx * cell_size

            # Paste cell
            composite.paste(cell_image, (x, y))

    return composite


def main():
    if len(sys.argv) != 3:
        print("Usage: ccc_to_png.py <input.ccc> <output.png>")
        sys.exit(1)

    input_file = Path(sys.argv[1])
    output_file = Path(sys.argv[2])

    if not input_file.exists():
        print(f"Error: Input file not found: {input_file}")
        sys.exit(1)

    try:
        # Read CCC file
        rows = read_ccc_file(input_file)
        print(f"Read {len(rows)} rows from {input_file}")

        # Create composite image (uses embedded cell data)
        image = create_image_from_rows(rows)
        print(f"Created image: {image.width}x{image.height} pixels")

        # Save image
        image.save(output_file)
        print(f"Saved to {output_file}")

    except Exception as e:
        print(f"Error: {e}", file=sys.stderr)
        sys.exit(1)


if __name__ == '__main__':
    main()
https://gitlab.com/shaos/circuits_cc/-/commit/35601d856b7921281a4d6ca1c3a0c75ee4f3ddb8
You do not have the required permissions to view the files attached to this post.