Update, and force DBS.js decoder encoding to prevent breakage on Windows

This commit is contained in:
DUOLabs333
2023-07-18 07:15:40 -04:00
parent 06869e03dd
commit ae008cfbc2
8 changed files with 19677 additions and 19217 deletions

View File

@@ -71,7 +71,7 @@ def dl_file(path):
for url in urls:
dl_file(url)
db_data = open(root + "code/dbs/DBS.js").read()
db_data = open(root + "code/dbs/DBS.js",encoding="utf-8").read()
db_vars = re.findall(r"var (\w+)\s*=\s*(\{[\w\W]+?\n\s*\})\s*(?=;|/\*|var)", db_data)
db = {}
@@ -119,7 +119,8 @@ def decompress_font_list(flist):
yield Font(ff, fsf, psn, int(flg), int(cat), url)
prev_ff, prev_fsf, prev_flg, prev_cat = ff, fsf, flg, cat
for font in decompress_font_list(db["FNTS"]["list"]):
print(font.url)
if '--fonts' in sys.argv:
for font in decompress_font_list(db["FNTS"]["list"]):
path = "rsrc/fonts/" + font.url

View File

@@ -44,6 +44,9 @@ var PIMG = {
"tools/pen" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAHlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3KG9qAAAACnRSTlMA/oA48NEJpmIZ13nuwgAABEpJREFUeJytmk1v00AQhqMG8nE0TRSOqVSQuNVS4U56oBxNpaq9WaIV1xqkCm5pQUjcWgkkfm6z68Qfs7OzM7P7niJXfngysx7bGwYDZd5mWbbUnoxksuFlL9LxRpUBJlS8trx0iqOiBiZTHG95yRSrHTCR4qThJVI8boFJFJuWpFLcy7K0inkPmECxytIqDvu8eMUxAEYr5hAYq1hAYKTixOFFKj53gXGKdwgwRrF33aVQREoYp3iFAiMUsRLGKI7e40C14p6Hp1b86wNqFSsvUKc49fKUis7oilXMCaBK0V9CnSKc/tGKVAlVimQJNYpFAChVDJRQrohN/yhFz+jSK4ZKKFXEpz+IBHidGsgooQjonf5aoHf6a4GeG6gemHN4kmXD6sl5YuDsKPFX3hfwWE2RCIbGtcmJhMeYhqIKDhjD5lLGC3ZlUQqBgfE1935htFjLzR8OSOCt1wRtp7mmyPFw5v9q+IILKF4QtcKvMVrxtCSABX4Opbh4IHi+BUwo+hts4r3EvIrzNcXzDwGf4uw1ySPmnkfxB80jLllckViANtRQwRSpBWgTetAHiqsyBCQHs6NILsA65L0IKtILsE5FAYHibB3mBQZ9TzG0AG1CTzBG8df2c2gB2oRulkZxWtmPoQVYJ/h8YBSnrzYfTlm8QE+y3ePQ//ufJYtHvRB3FPlhPFXK3kWehYEyxZwBFClWDKDksZfRExkw+ZN++H1TCMxTA6vEQF5PBEBeTwRApyerd58PY4A5ONPcgrbDTweE596Yg+59lc2DPVng/wwfCJ/KP9aHnV1NNhD2ZFkfdnrPBubgxO1d3LmzsoGwWGV9eKQFTuEuRSzQeVOK/crOdbKsj6ubksMTb+rj6mVTgfMWnuNcoLNztBVUX3qwJ1tB/XCAPTGvq19jxlcOBEvvAzwTCL7arXtIBgQ9MYJfcB4TCHpy2/zvCC2w3xNKkAnMe+ecE4JMYO/0OSXIA/Z7QgrygL2e0II8YK8n574fVQXAHAhSu+AsYLdil7QgC9jtyfwhsE3PAXZ7EhJkATs9MYL/KB4LmPcEp6QgC9i+pQcFZ98YvE5PQoLz3xzBtichwQ+8neB21gcEL0oWb/DIE2SVz6bpyRklyCufza4nZq/cK7jib6Q3PTkhBL+XbF7TE0Jw9oaPa3uyERzigou1hLfriRE8RnmfwptwvRStIPrjHXu1bDOkBeei8pmMScGF8GeXwa4nHsELYflMDghBaflsCq/g/I+GN/QKMmcVzNgnyJ1VMLYn+44gf1bB2E1NR1Awq2AKTFBZPhPbkzUQ1JbPxPTkZV9QXz6Tx1owT1I+k7tasOUJRj2awgq2+9eSUY9laAWbu4ps1GMZ9wQXceUzueoKrhSzCuauIxi1WnYpGkH5qMcybAQVox7LeCeoGfVYrta1YJLymdxbQd2oR3NkBCNmFZJJ1KxCcpisfHWG8RdbN0/hzp+bdxqC2QAAAABJRU5ErkJggg==",
"tools/fpen" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAHlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3KG9qAAAACnRSTlMA/nQ+msYI5fUa2U6/fQAABStJREFUeJytmktz3EQQgF3WZqk9KuyWdPR6SQi3yDYmudlmDeaGnI1NbluYFOYWOaZSHEOSSrgluAD/XPQcaWa6e3oefdrSSp8+dY96Zsfe2HCMr+M43nK9GIjN1yXwbjje+DCOgyo+r3nhFMd5AwymeKflBVM87ICBFDcFL5Diox4YRFGUJJTi4InDKN5KwACKh3FYxUjm+SveUYDeipkK9FXMVaCnoppCb0Uthb6KcwDoozguAKCP4ibE81H8FQR6KEIp9FGEU+ihOEJ4zoq3GNBV8RAFuilOXqNAN0U0ha6KGQF0UsRT6KYItC4/Rah1eSmSKXRRzA1AW0VDCu0VDSm0VzSl0FrRlEJbRbj7K2EDRLq/OxDp/s5AtPu7AlkptAGyUphaADMOcBoaeBYYmHwMDHxjwdu4NPPShzZAasZzEWR0w8RKkNFsntnxjFWZri2BhncPf2AwWVsbpnbzHWoClvOuSfEJ/mjwgDMoviRyBV9GK/65JoA5fA2lOKXeYWwAE4ozckSjrxiqaHhD0M6MKab3SR5RSkTxB5pHvLKwIjEA66CaCqRIDcA6TAt9RZEcgHWQs6WmSA7AJjIKqCrSA7CJnAIqismWmTchebJiinesPkxTUeX0oP1sGoB1mFYwleLkpP5oGoBNZAZgrTi5V364YvHMU1uzir7ZXqxZPENNOkV+MJYHdr9FPjMD7RQzBtBKMWcAbdbRjJrYAYOv9Dk1sQJmoYHkrocDkFcTCyCvJhZArSZv9y9OfICZcmU1BU30vPKB6rUH1UG9X7B56mbeFL4NH6jW5K/msLaryQaq+zIHzWHtmdnATLmwncW11Q4bqCZr3RweuwK1DVZfoPae+D6ytld20Bx3LkqGAJ2HjVqTKXKcCxyrNcGemAtUa9IKujcHtSbV4m+5f/G9xuMCM/mq2RpdmDCByqOd6YfsgEpNKsFfYB4TqNTkTPx3hCtQrgklyARmmmDuB5SerxJ8jvF4QLkmpCAPKNWEFuQBpZrQgjxgxhfkAYc1eUYLsoDDXe/ZR1qQBRzWxCTIAg5qUgn+Q/FYwEwSnJCCLGBfk8QkmH7L4A1q8odBcGbYR2qin8tNgm95O8F9TQyCp2sYcLO9XC4X/Z7LJ55gAqdvvHfefN//rBQ1qQQLNH37IG9PPFEqFDtGtRP4H8a7BtMnzbMH7UFRk5eE4BMwfXtSH32h1IQQTMBNmsmX8lk/KjUpBSNYEN7kik6Qs+a94Dcg7wrchIvy/ox3q6PFrkhKQQsiL9vPgpeuHst3ag8jgslXME/c+1TNR7smegMLIi+b4L3T7/eJEjyF9zDFraHv57gg1qu6esDfF6jgDE6f4CVgL4uEoLrKxnpVx0N646gTfKTwsF4Vtb0E29K9hQXRVt/x0C3dOSiItno6f1UUkCDa6v8u2gdAt4gjSBBLX9+u8L8KjnRBpNWXJ4luSmwRVzWRBdH07eTdKdQWcVmTzyVBuNWXp9wTp1ytCWBe76r2gnCrL6e2wpzh+r717CcE4VZfPu1PfUrotcioFsy69IEz5XiIw97vLi4rwW55eA31qosvBjg0wyLmleAcfZbJzvFwwKMDqo9cCOqt/mLnuIiHoTV7PSIhKL9s492d5Xksx/VjBDKMUSfYzpS/3ezubi+Pz/X/ulsZitHGZSv44VUVhYbpcncEL5T02GbsvKarBTxTQfHQ9Kf3xIZWByGYrI765QU7HgAbKXH8/uly4QArI7o/+JmXvvr96WpZLnv+dUFV8T+SbuMvj3r57gAAAABJRU5ErkJggg==",
"tools/cpen" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAGFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWNxwqAAAACHRSTlMA/xJJfu/Lo3CjPdwAAAUNSURBVHic5ZrNU9QwFMA7W3TPHejudXcQvFIGhuuCqFf5UK4sKlypgv77btJsm+R9pu3Nd1CmNL/+8l6apilZ1jMOi6JY9W2MxM6GV+yNCKwNcETFQ8sbT3GyboCjKb51vNEU6y1wJMWdljeS4kEHHEdxXYyr6PV4HMVlABxBsS7GVcxD3nDFtxFwsGIVA4cqrmPgQMU4hYMVQQqHKoIUDlW8QoBDFHcw3hDFAxQ4QPEcB/ZWnKApHKCIp3CAIpHC/opECnsrTkheT8UpA+yluGSAvRRrDthDEZm6hiliU9cgxYoHpivC2X+YopDCdEUhhemKUgqTFaUUpirKKdxECvDN2EB66uoHJGf/vkBy9u8LVKUwBVhpeCnDRgW8HxlYLkYG7ibwVEU5SgFyTzwXNyk8xa1cJgkqJpuHNJ5YleRnlHDv0R1Gk7XKpOnmgjRBy7knKX6nu4avAQVFhkckn1e85ZJPDA9Ocb5geNSiklGcsSOavMVIReEOIScBSrFcsTzmhiAUf/E85pbFFbkBY0Ja6MeK4pTF3Q6IIjsAbbATM1BkB2ATFQeMFfkB2AQ/jYaKmimaq0msWNIzVhfSCsYonrqfpQFoQ3pYGsVJbX+UBmATlQC0ipNPhfqZKT7amkfR/uUHHU+oyVZRH4pVZdrTUrOASVKsFMAkxVoBTFrpa3j/4Uo/BViPDNTVJAGoq0kCENTk9ij/qAKaNWUJD1dRS/MIcpOfADTrlxk8HLdd4XlAgGZTbA6OxjWZ45fBgOYceI/HLtfNYbCihTyrAt/L4n2ZFX4dBGiXgF/A4Spq6J664K0AAu2+4jOaCD8W7rgMrL3re4m46gu0fYCjBuRK3WWbfFhk6mOTXJTKHL3GD/vhsiwPmyvv8l7UUbs5cRwAbRfgdgOoyTPRYwBc4imMGzpBxeRQ4ymMa2IEX4735emrGQUrAKygIPFStW3hH0Mmw6hrz/AQB4QzQ1STGS2IAuGNHNXknhZEgQuhJrMF81qKAWEKq6DNAyOoBAbNjSC9Da4ChjV58P58oycwmKOM4CHJC4D+/3RNeEEd0P/aJAjqgP5LqyCoA17pBVVAvyaSoAro1UQUVAG9moiCKmBXE1Gw/O0D44vAmkiCs+NMAexqUgqCd96CgwF2NbnmBf23+GA5SdWEFwx3LYLzqJqwguEuTXgeURMjSH6Gv10EbcKOEDW5Zj49RZsgUUfCX26fHowg2PRpzoMrfxvbmtCC83h5mjfnwaenDVcTs5WFC0bpa5sQgtua3FCCv0ELlyRCMOcFkT0zVxFKcNoK5oggSF/WbqetCOCyFTyFvB8L2MAtW8j9lnNGEKavG4KUYFMTVHCGbjmetinCIycF79At0fdFmyI8ppQglr5NAt1l6U9atia7QLDE0rc5yyWQ2XC2NQGCePpaHrdHt8YE8fRleV0IFXE1iQW/4x1qeTP89zamULAkNpTb/rKbkstGsPLSRwyId+012R3n80aw48G5qomz9gz+k8I6EiSunr+KPXAnhoLE/v7krEux8A1qGghic9UGd+I/kYRPAAdmFtoKounb/+wNAPkTwLkZAk4QudkmJ3+KIoWXrVvBOH2T/ZPPP4sikZcbQXs3l4+Pj09/N/Fi/nn8+TVmEX2IYrqn3tgkJ4wgDlbKP6QpzH6nzMsu1YIz3ReUI6Vg+bJQ8TKdYPmS8DcRH18l3LcPartN5Bc16/Z0eSxDuvgH9FbXXacSLEkAAAAASUVORK5CYII=",
"tools/aapoint" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAG1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUUeIgAAAACXRSTlMA/xebdOzJWDtNG/K/AAAEkUlEQVR4nK2avW/bMBDFBcVxshqOndVB0XS1AhToqBZFdzsB2jFxW6Rj2KmjM+T/rqkPizry7h5JvymwpZ+f7pEnUkpROJodVIB6OxxbawdFACf22KsTAit7rGoRB942PNUiDCyfWqBmEQZOO55mEQZWPVCxiAIvjjzFIgq8GYCyRRB4jES1CALPZjPQIgi8GQGv84FPI+DsJRd4MeZJFjHglACFKmJAQ4F80BjwiQJ5ixCQllCyCAHPfSBrEQJ+DgA5iwiw3ASAnEUEeBbicRYR4E0QyFhEgFUYOFgMf98qwCu5Y+tEYLiErsVIIFNCx2IksGIPvkoCXgpH1ylAr3X5FuOARjq8TgD6rcuR37rDEEeB1uXKu7uoQKmEs8CMVoFGBnozWgVuFCC1qAEnCs+zqAHfq0BiUQOGur9oUQGGu79kUQGyrctVDJBvXYnA6sRAqXUlAaESxgBDaxBPiwjgKwKMGTYGAT6eGLhYRQCRYbgdn5INJAYVoNKuAwYVoHJDOWhJDGpTb6MBd/QMBWgUnr/qVIDKHcC74KOCXaAutHZTs06CXeCK+6LXHX9p4XuRYvGPUKvwvUi2+F3gcSuimv2t2Wy+EnhcZ7YWmaD5gAvputZcFZfCpr4Q1gdz5tcWMk9YH9Rhi19knrBKDQctDMBG2kKfWvyh8MTpELD4oPHku6VnURyArYwEpBYBnrxzIBaXe52nrGCuXYuLWuepK5gXpyragGmkraOtxbK9aO8WEpQRcZ3F8tvhj2eIp2Qy63d0H77+w3jsM4WxRVzAqlJ9AzCSvreJtGgAoPTU1ZOaiVUEL2GlLythpS8L2izFAIH9ZhwQyiQCCMyTOCCWSQTQu5/c7y8/5gANOdPeMrrmlwakmazDdYB5NJN5+7FnEQZSL90+xutAMJCeuQ7/Dg405MR9+7HXMWAgzaT/PBXozZNcoFerfft58iV78yQ3FMMAk4cNzaQb18kD28uEu2IUSE/sDKY3B5rJwWD5M6d9Gd/grQ+LAJJM1uRFcjSQZCIYBIFkoykYBIHjTCSDINDABkHg6HTRIPjfGqNTHiWDGHCUid3y8wYx4CiTnWgQA7pPWBWDsf9PohqEgG4mmkEI6Gay015MIEAnk2WhbVcQoBkOP0ySS9EgBBwysJPkTcItkG2yk8mjUsHlX8TgkImNWKrgwwrhOZkoEYO77iET2eDiE8gbMhENYuWzOmZiH+azEYPlszpmshXGIFo+qz4TW0Hmxc5Ce0o4Ug/Zsa8Q5vsYXt+7rEGTWz6rPpMdt6WPKZ/VRK5gXPmszgeDG5+nPFQO6VUyGFm+RhVfQXyyOWozsZPEixifbK7aTLaBMRg5+nqd9wbpM5FfqyRem8TWWyEmla9RFTQ4jx8tncqgwdTLLVqQF3Hy5RZtJsRg/GRzZbwKppevUUUNZpTPqmwNVvmjpdOkMXjcOSb0FqLpyOD9Kpd3mCeOwed8XlE5EeeWz6ocDC6zRl+vybGCJyif1bQ3GHtn4/S2agzmTTZXd43BxNYc0t4azJxsRO9OMloGlb9PVr5Wk/1Jcf8BS8qkyiNVRD0AAAAASUVORK5CYII=",
"tools/dapoint" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAG1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUUeIgAAAACXRSTlMA/xbrcpjFOVVUpdl8AAAEUElEQVR4nM2ZO2/bMBSFDcWxsxKKhIwOCnS3kSAd1aLobKVD1tht0Y4xsnRUuvRv15Qsi4/L+yA59EyBY30+vIe8pKTZLFKvSqkm9mJA8yNPXWcEthqY0eKi52W0uBuA2SyeDOaz2I7ATBavzrxMFg8TMI/Fncpr8VKpvBZvLWAGizsLqLpU3pXNUzepwIUDTK7imwtMreLOBSZadEuYbPHCB6ZZ/AgAUywWawCYYvES4qVYvAWBCRZbGDhZhP8/COAVoe82kUC4hKZFITBQQsOiENgGv3wdBVwi325igF7r8i3KgF7r8i3KgH7r8i1KBLQuU50YiJUwyiJaQhWxotcEUGpxTvDEFt+RQKFFqPunWIS7f4LFYOsyJQGGW1cksM0MxFpXFJBVQgkQOoN4KgXAAwcomTZUZ+j1nBlYrjIPeSPgcea1yCDVrrUeJDxqQzmqFhmk+7Xay3hkzOI9itgBwgMGu0Azo9pNE3QCdoHr0D9GPYaHBu9FhMWfSK3gvQi3+AEr/hq+pgn+llIVxgt1Zn1RIOj6BQMGx7UNVbHsMF64M1eBXyN4yPmggS02OA85pcJBIxOwF3XQdy2SLQtbDoDFO4qH75aexWpFAtEm5Vpk8PA7B8ciPqEHESeYG9Ni2dA88gTTGVWhJkwv6gSjLS6HQfO2EPJ8oC0WX45//GLxiEzU+DDu9+e/PB7jVNnwSCcxTpWy3ZJzquwkQM6ZTfRIk8xES8D7/0/6rJslCZBxvykDsjIRAHmZCIC8TARAb53cvyy/pgDddaIPpYVfVz7QvXYL14HNc5+H1vDP8IGul9ONlneiZQPdTLbw7/CBbianXdebnWygW6zx81hg0Eks0KtV6pC9dZIairefnIDR08bNpAp8zgV67w1CI+YC3QtPBuObA7ROfqS0LycTbTDw3IIJdIa29T+SAZ1MEINMoJMJYpAJtDPRBt8HeEygnckWnC8ioHV5jRnkAe1MnjGDPKB1848b5AGtTHCDPOCBb5AHbPkGWUAzE8ogC2hm8ky9mOAAjUy0wVeMxwIa6+RocIkaZAGnDCrKYMm5TTYyoQzWHcfglAlVwbsVh2dksscjZt51T5noQ3D4bVv5xORNmWywCtZ/uLxzJvphfrCCzPJpnTPBDHLLpzVmoit4CJTvk4B3huyDrxAqxkMpQ+1kEH5GICif1pjJPnT7KCmf1hyvIGvxWrqYDK59Hm/xWnrDDArL16sNV5C/2AwNmehF4kUcMdzZmMkGmIPC2TfqYjToPhP5voriDUk8eK8iosrXS2dSvrgG48qnVYAGY4c7G0BeBaOHOxsy2dgGZb3K1ZtnsOpSeDoT22BC+bSKIeI2fbacNO8jPt+lxM+WUQvL4H3cYjN1MA1KWzOk1jCYWj6tQkc8GKyTZt+ouZ6DbabyaS1GgznKp/U6VDBtsZl66g1y3lYx1RtMXGyOFllmy6TiW7byDZrnK5/WPyRQnVWjdOvqAAAAAElFTkSuQmCC",
"tools/capoint" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAG1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUUeIgAAAACXRSTlMA/xSdy3bsNlj7g2f6AAAE4klEQVR4nK2aPW/bMBCGBcVOsgp2jIwOEHS2MjRr7KIfY1y0P6AOgnSMl6Cj06V/uyapj9Px7nhH+Z0KBXr86I6kKKlFdcyqsOfteN4j9QcHnNl5U3feFQfMUKz9eZRilaV4608jFascxXIdTqMUqxzFScOjFKscxboFEopVhuJlxyMUqwzFfQ+MFasMxXUlKFZ2xbMKBiu6Y2ub4s0AeE0Ab22K6wGwOsTA0qR4OeRhRXeoMClOEBBV0QNNiu8YOGy0B5oU1xg4VAxAgyIuIVYMQIPieQwcKDZAveKWAELFBqhWLH8RQKjYArWKU4oHFVugVvGGBALFDqhUrGlgr9gBdYolzQOKPVCleMYBO8UeqFJkSggUAVCjyJQQKAKgQvGC5XWKEJhWjJauWBEC04rR0hUrDoBJxXjpArmOgSlFYumCOcTAhKJUwraKQ2BCUSxhFaqIgLIiuXQhRQQUFemlCylioKT4IQm8ioGS4jYJPCpGQF6RXv2xYgQMihSQXbpgCKBXpC6ZX7pkoFMkm1LnAo+KlKC0dMnA4pYUVJWQBpbkUyG1B4myIIF09hogNWy4pFYGn4cTAxfLE1/yjpjLbBTjevFqASaWa5eXwgJM3FCOmS9NwOR6Xd0VNmCqzeFObwAm7gD+gsmQq4CbjbUIJOerD7kKXHF/aHPHXxp9L0oofhVqtSXPkBV/S8VndkSP7G8ldqncyuwUmUbPXyUge10rrorzg8Tj9wcz5tcWMk/YHzCN5gdgCL9LpRstDECf1EYfK4oDpmCqJCg+p3jy3TJSnC2TQHGRwooKnvzkgBTlAR2S2MFcQ8VFasAURXoHcwBVSQ0Yn9Q+2ilehIveaHjp/YFTLH8c//FNxUv0pGqf6P78/KfjKXaVBx2piWJXSX4BYKPZVZoUNXs2/NZVTLInLgaecqevj3Knr4/qYckC3J4aqOqJAajriQGo64kBGM2Tp9eLj2OAeJ64W0ZZjwDinqzoOqh5uCfNJi1SVAOxyy4cju4KaiDuyYr+HT0Q96S560ajUw3EPWmP5wJZk1xgVKuxlxzNk7FNie4nDTB72OCetA8fdSYwKhV3xVogPrERzF8ciHlSfhqzfKGeOMHbGGYAop6s4kM2IPqW4wS5Fys6IHrQXIH/fJAHHPZEqGDeuzJJUAms1YI64LAnD5KgDjjoyVwU1AEHPZEFdcA9FFyKgjpgrRdUAWFPEhXUAWFPjoIX4rtCDRD0xI3BN4mnAoJ5skoJqoC1XnCheUwGPXlICM7/agT7nswTgs9LDQ/0ZCN/e1I+dfc9cZOEF1zcK3l9TzZSBXXlc+l6spAEleVz6XqyEwS15XNpe+IquGfK993A6yAb9hPCTPFSCqTuBel3BIbyubQ92XCPj5byuUzlCtrK53LeCxItnh2svKZujKCxfD41X0H9ZAMJPXGTJGpx4h06k9CTHTEGjaOvzaQV3CLe52UWL3TiJdohZpXPx/XEfTMcCmaMliYlKZh7uUUAOcFBi7MvtwjzZDcUtE82mPeoxfnl86mx4IjyuZSoxfmjpcnUt7h7csybbDATL1g3vKe8yQazh2PQujRTqUEFx5bPpewrOB81+tpMuwqeoHwuk1bwFOVzeQuC4yYbzL0XzFyaqXjBkZMN5ewko6VP+eVk5QuZnq58Lv8BNma0BINK0SMAAAAASUVORK5CYII=",
"tools/gradient" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgCAMAAAC8EZcfAAAAkFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDIYgjAAAAMHRSTlMA+25aOHYrI/Pj08iwlWFKB+3p3tnOv7q2q5+bj4uGgXxoVFBBMR4WEg3DpqNGPRsUDc03AAAA7klEQVR42u3Q11HDUAAAQTDBZHCOytmx/+54ogBm/K29Cm72TpIkSZKkIXf/10toMplMp9PX0Gw2m8/nb6HFYvEeOhyWy+VqtVqv1x+hzWZzPJ5O2+12t9t9hvb7fRRFcRwnSZKm6VPfqC/Lsq/QQ1+e50VRfIfO57IsL5fHvqqqnvvGobqur9emadq27bruJzTkwdFtg2OCBAkSJEiQIEGCBAkSJEiQIEGCBAkSJEiQIEGCBAkSJEiQIEGCBAkSJEiQIEGCBAkSJEiQIEGCBAkSJEiQIEGCBAkSJEiQIEGCBAkS/E9QkiRJkqRB9wta1piumzN/FwAAAABJRU5ErkJggg==",
"tools/hand" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAHlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3KG9qAAAACnRSTlMA/w/xgcApBeBI4LcAVQAAAyNJREFUeJzt2s+P0kAUB/CGIITjpMMGb03cgx5rUK8lstG9UQN6hQhmj3tw945u1CN78cd/K+30xwyF+fW+MRo7p5ahn7z2zaNlOkFg0/oX8d3O6puWbcMYG0Y4r7Pdg+wNDuxmHhviwEc5yBIYOBHgU7F3+4EMpgLk+c55zMZLIrgV4Cjb7mc6vyZ5feGxMNsRCXpLAjsyuBLBLmFgkaB3MFBJEAIsEsQ8nN7FfNcEmT84KX8QZLDjD3arHwQQeF9dewzYF1d/BwNFRbAZDHwgjjuDgat6AGPAosSGMDBtIjQwBoPHkH8TvP0VQcFNzIZLIJiX0xgIisFq9RhlBRb1/hUGSuWJAVOxafUUZQWqGW/BFmzBFmzBFmzBFmzBFvzLwOxxf0AFM6Rbbs+q/+UE8HkQvC+3eTG1QQJHu145mcTCZBCTQTaqPGXbHzzR/kPwGg3u6rlZDDiTBjwE5NVcEQgMX22qbQgoNxuwb2bcwMDM/FlwvZhGSDAbUc+WQDAfUXwJA3tx/vkYBpY3igQFFjNEyhQRCayKMgGBadnDQWB960kwYFx1cQwo9SUQULrzcgiYHgmRBE6kTo4AV3JvAgC7ci8HgMpFLEKkgTfNEGlgbyv3J3SwfkitQiSCSlryEImgMhTzEKlgI0QqmL96l0OkgsHVQYhksLjzVSGSwfovjQiRDqpp4XRQHTlO7QR4Yz7SDexszYc6gWpBI8CB+VA30DstJ8Gu+Vg3UC1oABg8RoNqQQPAg4IGgH5p0YB+I0cH+hT0SAf6FLT+7a1HQevfL3sU9EMt6JGWF3rQfeTM9KB7QSd60Lmgw8gAuha0eRHBvRt4ZgQd02LISdbcRo7Fyg6nEK2WTbiEaL6EjiEmNmDw0tobRVZgPb1saoZfhqpdmSmXM96XS2rnDa1XxH60Az/ZepZ5cVkPa3XSX+w9q5N2XLD70wg6LinumCrQeZn7QH+TDhNHb38ZY+AJ522t8cZeq7w3Jz0e+XinRf917euj1/HOM76snacNLrz054JsYfaBN/9B8vbtyWspuvl3KpeT08VnFn5bTC8j/Rd/A77Qy3Uri4NyAAAAAElFTkSuQmCC",
"tools/rview" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAIVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABt0UjBAAAAC3RSTlMA/w/ygdhmnbcvRtZOXcAAAASDSURBVHic7Zq9bxMxGMajcE2abNZdacsUhNKqnbgiFbpdBsTaoCI+phQWxNRKgBBTKrWCsRGgli2txMJfSe78cf48+7U9MOSZLvb5l+de+707+9xqGVSYKnyVxQaiIjYwtkUU2yKKbRHFtohiW0Q6i+33+ct5AFCxOFwUrg/8gbLF9rgsfB4AlCwmVeEGHLb77OIR0lh8gAsnQNzWBWISLR7jwj38a+e3E673FPESLJ7x/7Kdo8eXdl7/TOCJFnNctlYeVx1k7/HOGDUASVlaHneRS4/3ZZ5wyW0eeB+bbbbYPpV5gkEBSDqo2eIvmSf2iQAksV5v4nVyyknPb1WDIpAGpwk4orzzSz71el++zVUgsgMTcsqTt7RBRv9nYyAD2w5AEuajqnF9++qy2AOBPXzCG/KTGbxhsQcCh1X9Pv1JDeJbFprDgadlNQ4WBmKDHdxuCgb2q+oT9puOwRXcbhMMXKm7FQPJ8Qy3y8DAY3phFIgN0sG5BgaWsU8H9W9q9kyFOAGrEN7lCohBeg8EA1fLykO1XAdxAlaxn0cEjkjgfYE7fwdiw7EUQiDwOkcbwhOrSuQ9b2AidylOsBNv4CmSu2DV0CduQHIn5Z8vd5A4rGHAGT7kr7l8KGpfgpyAJJv4UXJj6GQ3oBBPrHIYbsYElt30MCawjMI0JnCMDLMIX2CO9MMwCDiIA2TvH1jyTAIOTJAgOZAelyxYVKY6HkDBomzQq1M4i+p00QfIWVQM+g0bZlEzn/UCMouqQc+BPTIa9AQmRoO+qTcyGfQFJiaDIXds/ZKFLzAxLar4Alsjw5qKNzDRG/QHmrQELoFL4H8DLF+r+qHAEtKhx1MybQgCHrD1yOpt/CYYmM57Y3qMJv08GIjSmodSxgsAGrQEyvr5/fNALLEB58pknFf5BrF+CQIe0vVdLbBaDRLXkm3Au2ydUAPs5VX5PgSIJlfsUAHSBC0gQE4KcEYqslhA9rJdRAKy7wBZJOCYVRVxgDmryuIAuboiCrB2WFsMAvIfZ4oYQH6mm8UAzvjaIgJQmDpnEYBCEInFMOBQtRgGbOeKxTBg64diMRDYEU4owoHqoksosCucUYQDyQee2mIoUBw5C4vBQPLkYxaDgfWrJLYYDhSX67JwIFmH95EBOLS3hAHFkRMBKCZ0DGDf3hQGlBd6w4Fde1sYUHwUxAB6jhwzUEzoCEApoSMAE3trGNAvoZuAq/bminSfQpl8Erp575FHQjfvE/NI6HuNwHrC5Szdx1pO8ISeNgPhCT2xAKEJrf1Yywua0I2bgyoBE1r7bVVQxw7hNbUCgY+CuR0Iuuc4bfqDWLSHEGhRtwdBlXv+WUchVr2sZ5PlzsCk7n4LumL3G637xk7Hmw5g6+k7F17qsPmSilt6NevAnddqbdt5awCDC/2xAoGbd9WdmJLqDXKOUveKCkonQN4ip/Mm4Gswr7lj9u3NNbo28nz3Z5uILvuJ9brSxvHI01+pLfXJn371x7WUndULe/Mg3kK7nzh357ehuApZ7k5PX7z6+GGgP+Ef11LuXs329fkAAAAASUVORK5CYII=",
@@ -77,6 +80,7 @@ var PIMG = {
"tools/slice" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAFVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAASAQCkAAAAB3RSTlMA/4Ic5F+tW+as8wAAAuFJREFUeJztmE1u20AMhQ0Z9n7SNGvpBjHgA6Qo0HWNAFnL6P3vUEeypRmJ5JjvcSnu/eEb65Hzs9vhdeiJH0t1fnuPBV7T71Bek1L6Gwk83YBvgbz9rxsw/YsDHr956TXuu1wGYPoZxRtXfKs+CHi881JUGLsHMCiM+zRXSBjPGTAkjNcMGBHGQ86LCOO5AAaE8VoC6TA2Cx4dxtMSSIZxaruoMB7XPC6MFwHIhFFaMRVGacWJCWMnA+Ew7hUeHMazBkTDuGy7rKAwHnQeFkZ9xQkLo7FiKIyrQVOWP4ynYKDcdnO5v7PSdo/yJ/Fi8vzfpLLi3i1or/jFzVMHzVj+zlMHzVDAQDTbDhnZZtsBw8saNNCkMVfcAkBrxcgWZQ4aZFifDB6ynVhtB+3yVtv1AM8aNEAT2yuGtk9jxdipRh802LnLGDTYCURvO/DsqrddiwHVvxA9Z6qNDB//FUX8giIrMvdGUbHHeaIi1MSWIvc6sFYk7slNKyhSX+RFUCTutM3YYaUicwHtxg9aKraU4FqRebnoHpnLFYnINPMSY568urktJkUmMhMkV+x5wUKRaeLsQ8yKTBNnUZkUmcgUYb4rUs9xRbvdFZnILAbCoEi9Ii1G1qDYxglSE0ESZHcRaWPiFIV9iVIUN3dGUdzbCUXlgIQrKucjWFE7wb0GC8Lbp3rERGeXegj+ESyYPoIFwf3JuG1j+4nx5APNf0MQi6EhCMXQeq+AYmg9miExNB9UPoIFkRjaT8tADO1nx+i3byCGtqA/huGP87agP4YVQX8MK4LuGNYE3TGsCXpjWBX0xrAq6IxhVdAbw6qgM4Z1QWcM64K+GD4h6IvhE4KuGD4h+OczVNCHqwo6cTVBN84W9ONMQQRnCEI4XRDEaYIoThHEcaIggZMEKdxakMOtBFncQpDGlYIBuFwwApcJxuAmwSDcQzAMNwrG4QbBSNxNMBS3233F4rbaaquttrrXf2MxALTWF1Y1AAAAAElFTkSuQmCC",
"tools/sselect" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAFVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAASAQCkAAAAB3RSTlMA/xyD5GCvZiOPYAAAA7tJREFUeJztmU124jAQhP0gsNeQZE3eywHwDcIsZg2zmDXk/ocYYrD1V9WtlrSklzIuPnWVZCOGob42h4abUX2+7/sKXt3vrnpr59ypp+DHTfC9p+DxJui+++ltf/Tc676b4HkSdG/oWk2eVse7oLuAizV52j70HLq5Jk/jLIhudq/mPK2cr/xm0lqpXgLBPIy3Qasv10AwDyNprVCbUC8PI2mtUJ+RYNax6VtMvlxjwTSMPPKk1ole2rH7oMGXj1Qw6RiPPKljJhiHEX6LUNtcLw7j7H6pL2cgGIWRuU9qBWYch3EZLPMFzTjG8Y3YU5WgRiwYhNGPlfiyInoBTtCIAl9emKDHwY1glS67oGaccEz1ZcPUnA8jbgSpT6b2U9+5oOqLMOMljPGY7Eu20cT1lgsqvuQbjSoo+wKXna8TEpR8IcturocBZBjVWdSbN4hsnPqCN5qlLgMW5L7IM94NTJD6MoqCJy5IfKEbTTIvcBH7wjcaF23Z6Cr0RVx2AYPM70vaaKLHHvwA8EXcaA6aIPBFmnE0I/yRzBdxo0FvDkllvkgbDXq3kWcxiBtN8sq5jF9yI3xJyy65cR6Wfwqeud4u+ShuRFLSRpN2m42XzjhbBGw8qpHq5b9IcWeTGXPAvFOPLxIB+UYDrGRfFBZfdmDR3y/ID3jaQtT56UKapaToQkYc04WLLMgQYaMmS/aKIEbEt+mWUEQ8L90Shkgar1vCEAlGgSUYkS3WEksOAJHe5dwvjW7cAURqpG7J+r7CYkS+H+uWjHfbYkT+pqtasp7vDxGF7VO1ZJwzFyIKbdIsWfspekRpaWmWjH5ZLIgtJ5GLSIh4qdfz0wwQS5aqChgitpw3B1FZEM3HgxhwQWw6G46W2wOx5cg+2RAmxKbz9TEWnBBb/vbINtXW/1DGVLAlgAiwFTEDbESED/cWRADYhEhekOoRIWADInuDk1917YDV/2zRV8zavYsB6q8ZRkD31Rmw8vkk/Nque55wQLfvDFgXQwGwKobSeUVVDAXAqhiKBypfnQFrYigfLVfEUASsiKEMWBFDGdAew6LD+X6A9hgqgPYYKoDmGGqA5hhqgNYYqoDWGKqAxhiqgNYYqoDGGOqAxhjqgLYYFgDaYlgAaIphAeCfv10BbXIqoFFOAzTLyYB2ORGwRk4ArJLjgJVyDLBWjgDWy0HABjkE2CSXA7bJZYCtcglgs1wM2EEuBOwhFwD2kVsAO8nNgN3k7oD95CbAnnI3wK5yw/Cvr9yznvWsZz3rUf8Bse81q69DDhYAAAAASUVORK5CYII=",
"tools/artb" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgAgMAAAD2oY++AAAADFBMVEUAAAAAAAAAAAAAAAA16TeWAAAABHRSTlMA/3+ASBS0bgAAAMpJREFUeJzt1DEOAjEQQ9FIW+c4OUpQyhyFS3IfGpA29jg7ogJht3nFV4op5bXeS26GhoaGfwL7dvcsnFk4svCWhafICzizcGThKXLz4WvkBZxZOLKQImP44MgYNo6MYeXIGB4cGcPCkQJypIAcKSBHCsiRClKkghSpIEUqSJESYqSEGCkhRkqIkRpCpIYQqSFEagiRG9jgTkpY4U5KeMCdlHCN3MG23kkN63onNVwi1ZF6z/BzWKJXQ0NDQ0NDQ8Ofh/sZ5qDnfcGeasqB5oE5SvEAAAAASUVORK5CYII=",
"tools/mremove" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAD1BMVEUAAAAAAAAAAAAAAAAAAABPDueNAAAABXRSTlMA/2Cs2akEUvUAAAR6SURBVHiczZpreqsgEIYVXcChyQI06QJC0wVom/2v6VS5ONxBvj5P51dr9HVuDDDYdb8sbPrrwOEBBvYLGDj/QwPfwEBxAQP5FctjnGOBA+cTFNhzvkCBM+fYvBGcY/OGc2xUhg04AYH9Blzsa7fb8/P14vz1+n7ebpVAsQGJE9l9v0Ll8jGV89j+iB4r7L66NCnXYuYoH5AlMYaTyDKgsm+z+ZbA7cgSbw767ol9pnGbfOftFvreSx63Sc7uIY+oI0a89jLZ95ORL/u3rxRvDsCuT8/3tyd9caK+v/u4SySSN0HumYp5qSiSLLiGbwvol57xmUgRj1+pZGJoRpLnR3YP4fJIpol2rJODIl0GjGGWd6I1JQ88Us25K1oI8jXlPeLGQJB/XJPWztJxca8zX8m6kue9nLneK1GPEL3J1y01xTytivuAsHk1C+MhFBdHwbrVw3tAB0dBV/+MCE9FqaA4p6B+nKq4o97YSQVVNhIVB4UR5xTUkT5UnBXGmujrVTwUMXbKnK7nSRXNg6PBi3MWaxUf9J9NQbmcO7XbY1SV4++GBeeuVXdQHoZ9cudDKDOhiPOL9tXYuRLrG7YVRi9GA9GfjElH/D8e3mzbmm2cRSp1+K1l87jZvPlLcOq31HoqI1ozO5fF+Z3ZIKPCqAubWgRMRmWwK1lLE0Psto52Oegb+jbzHubeiklTI0iiZm4tJFpaVdLY2S5YLcBhB4rTBcsTtscXDlx/A4jhqfLMsUCOB8JNBgJ/KW3gQGfotchgxvKCAcri4JSvFpEop8C2iDTWmQJaRE4BDDZU1CTlTKMNoqZRZ6JvED3R95GosNruo16KjGEnbo2IaFMmKNp3LOhEuX+ryadjOb0GntRb/AoVj4UwXRLTt/G6aB16Db7NpmFQvoJ3lv62zSM3MpUCybaCbHyk0P5DacpbG5/RUZF2EkudaG3NOts4q0FSmDj25tHZnCoFP+4VQGd7yywVV/2fKK5sNqCzt7UyxEsnR3lZ3rgtAqsLMRt3REa5L34TgzRKmFFQ3lcCFK6C2s4v/Zc0tLSYhxpBqiHyUBYvNcBgq0qXg8nKySIgiwwpmX0Xr3eQBYrIAAgN4BKg0KZ5QkqMvlQAjLVMybuIf/PAWFN3F2O0qTBZYKTtrGVwNcyJtilaNPULyzq6prOcqEjGjQU9Z3OCkDLoyJ3cHJ8+/gio2HpAo8VquDcdIYWAbYdcUrgvp4/hDPAtegLkSkEu7MDSM8iSRcDmn2vmXElJwWFrp9JmuxNyHNxZKwrEgbWzAogfqZfiVN/5KFmth/66gi30UtNnCSqzkR/xSBOBn1aNcBVlZIGftKjZND/si2WtGVklYib8ivRNi8nlur1jXMgqB5Q+5HAYZLZA60hPmyc0ETRoCHGBEycQ0UQGNq5N9qCAZsGGq45qwgd+7zegi6P0I/Q7UThQoIGhPlaLMHRQZnDakH4BRmZkdejMSIHx9C4fBxTokQct2V3046FWIPCLb4Z2ofsVDQiI4+ErAwMP5HOfe/8HecHaQmWzeJMAAAAASUVORK5CYII=",
"adj/brit" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAElBMVEUAAAAAAAAAAAAAAAAAAAAAAADgKxmiAAAABnRSTlMA/6l+4k2u63+LAAADXklEQVR4nO2aT3ObMBDFbQP3yrXvkEzupk7vkKZ3k5bv/1VqIYEResCTs55JZ7Q3Y/Hjsbv6t2KziRbtv7Gs2F9EgYVS3yV5mbqapMSdBuaCwK0GfovACIzACPzCwKwNA7Yrw25Wq1/g8uwA+6oOy8QG3zg3BegHHReB9bXFHlyfmaSul9VhidcpgRLhNNp5YnHyMkAkEVpBAtn5zQhcnl7rEIlG4KIPuyizEq3A5SjbRhOJf57e68P7808kcO3hoNWH8YN+u5fVZ69LTAZchzwFChza9Td+qIn1IhNO4CCxMr9epzzV9/WUDl8xih3g9cSGTjAjseu5fxFPqd/6v5IVaCVqhQnmGQc3rEArsdr03eZqb+f2MgbqzpHSAo3E09Br1L6LuCPxaOSzo0jSubB/YZsn3kuXt9xatey88RLXBeqYncNW8TuXNwHesYIvxu/rA+lBuLekd/4MkPeftbJLj5GXpsDAjZWZC6rRlSkwcGOVen7ygGErk9pzkwdcnksmlviB9IBBYdlOPYiAy7OTa2CJ4QMD3jkDAnxgQJxT0BwA+TiXXkggkM/tGjweABXL65ImJ4Bs4qTo6QhYkcAG+QcB2Uws0cMRkB0Ua+QeBCRTGy/5EZBM7QRmBATmFHAHvQOBFQXcwvhBINf5GtgSArm8aaBzIJDrzaVCnQoCuUQseOBsIg4r6RcL9BNsFujca213a3IyHYUEqum91prbxWMo0L135DVrewP0vTIHdO8Fjc0vHuj+ehRQ/JWb20WZoIinjZ/YAT0FJbZrEl3PsVLRow03OGg3VxyQG740UHSATWFLCOSmAPFJKoHhg8CcAopP9PxShF0glsg7iMculholvJwTX3CKL4nFF+3stoLf1YtvfMitWcB2VHrzaGaeagUYsr2lNuB5AFC8RCBfxCDKLIGVoLJ7q4VCUGitarVUlQcC7SLodtsnBQ71yIH4KYGJLkiWru99gWc6LETJNA8qmU6Kum8XDxhW1PXKzofntnWAgWXn9cK45jR0rMVL99KHC+LHH9IHNOJHSNKHXDPHcD/0MdzTPcdwDevqDXlQKH2UKX7Y+qDjYCDw3gNr8SN1+UN/8c8SxD+cmLGv9K1IBEZgBEZggIl/WCv+6a/4x8nyn09Hi/ZQ+weBSfaGAgwyGAAAAABJRU5ErkJggg==",
"adj/levl" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAElBMVEUAAAAAAAAAAAAAAAAAAAAAAADgKxmiAAAABnRSTlMA//3vv9yeSLVyAAAAwklEQVR4nO3WQQrDIBSEYaV076M36Al6hNz/VIG0tJJE8mqGovUf3kJn8aEbMZg4ARCwEgyiAAICAgICAgI2DpolwP8GoyXANkGzSQ0+1KD31oDdgVczLRjHBp0mICAgIGAF6DG7BhcN8Pgr+z14cEhAwE7BlbnZtgjmTQm8vDQZGE+D0W5q0Pxg/iqKwLQC381JcK9RgsviA+amByw0lWB5fgFmWnPg0xwN3AwgICAgICAgICAgICDgPqgM4BDgXZwZNUK4Urmj+rUAAAAASUVORK5CYII=",
"adj/curv" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgBAMAAAB54XoeAAAAElBMVEUAAAAAAAAAAAAAAAAAAAAAAADgKxmiAAAABnRSTlMA/4AfV7kZplLQAAAD7klEQVR4nO2aS3LiMBCGFST2Ewb22MAeM8le9nCAOKm5/1UGt1qy/JBxt3qJFqmkUH35+4nVsnoXXuoFfAGZQPV8lWX6M9PKAm/CCoe8fOCnsA83PepwFgBGvH9W5QN1iO/3n7MSABbe2pNSVwFg7XnW/Z0L9A7cXZWVAGrPe9TKWQJYB32qKW0+EA0+PHimlFCIGfPgeYF5QCy5o+oFZgExIj8qEpgFrHyAVYhxFhAFojKbD3Qp83u0iQ80LmPGm/jAKkRYmasAUEcRaU4CwG0fkZCDWUAokr0TWNp8YEogG1j0KTMQyAXqXqAeCOQCq96D6hYL5ALbqOj0YBMPuOlzcLx4QCjjr6k8LtCFBH5trqNNLOA25IwpT6NNLGAdQjLMQS5Qh741LBI2ECz+NS+QBQSLr/MCOUAdktBMBXKAvcXqPt3EAPYxnlsMYLrseMCNt3heJB1YocVmGmEesMWsnslBFtBgHc/lIAv41m0+JgXSgYXbnBJIBmr8MkkJJAM32KsTMaYDK98YEgLJQJ80yUUE6tD8hYDQaY7GigHBhapJRYQO7Fy4T+YgHQh195XMQToQXHhfEkgEds36sCiQCAQXLoWECLyAC5eShggsfN1JAZ/WHRX4tO6IwAu2LjEguHD8PJgDBBdaQSB2fzGgXuNCCnC7IgtJwGpFFkbA8unqdu1W7SIAvwWBl/X/dh2wS+sDAfjU2+2KQqZEeV0WEoCQhVYQWBDqcw3QrGmuFGADaS0IhGHmtyCwglwVBIILBYHGdQYpoLluXWeQAjan2hWyEPDxPNi5cC8GbMo7FLIU8CEQzmNWCvh4HoReuHhRSAB288F36IVSCm8Wz2NSQO3PY2JR9ucxEWA3H/SHeBFgNx905zEZIMwHa/xcAtidScKsSwAIp7ow+REAwqEJksaKAN2xE5NGAqg7gT5pREz+UGjxUQjYrTZ8KgMEi/ciwL/w8811GgGgKeGJv3WdRgDoDu6RxZlAHH1UvcWZQJwsRBbnAVHg4CYmC3hzAmOLMxWCQHcT4893eT4EyjaKsUilFKGOZYCQhP2TOh/oRz116FyZQBxGmUFIMoB+PlgNQpIBxCJxOXPMB3qB9TAkfCAKdB6Mz59sYEIg3+RI4ODEnZfYxShncoGfU4E8IN4X44slwzkSC4j3xc7gn+FeDhDvi53B4wM8Bxh91U1nIAygKxJ8G24yEGAAQaDGt+FsPtAJRN7PZC8dCM+D+LLZzEiFYfJH//afFQEG/80YzItyi7zZYTAVeO/fPj3Mzm6JQHNpA8/O7qUBm4BLTtNpwGgleFxgetrPAy7cHrCAu4XZPNuH2esFfAEZ6z/ZlF7oxg0uNwAAAABJRU5ErkJggg==",
@@ -7973,7 +7977,7 @@ var LNG = {
},
{
"name": "繁体中文",
"code": "zh-HK",
"code": "zh-CHT",
"table": 23
},
{

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,328 +1,328 @@
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/dropbox@10.9.0/dist/Dropbox-sdk.min.js"></script>
</head>
<body onload="go()">
<script type="text/javascript" >
var sentFalse = false;
var authDone = false;
var lastMsg, authUrl;
var DROPBOX_APP_KEY = "ylv5pcromn2df1o"; //'7rlydkifdtp5gnb';
var redirectUri = "https://www.photopea.com/code/storages/dropboxStorage.html";
var dbx = new Dropbox.Dropbox({ clientId: DROPBOX_APP_KEY });
function go() {
if (window.name == "authwin")
{
authDone = false;
window.setTimeout(function()
{
var searchParams = new URLSearchParams(window.location.search.substr(1));
var dropboxCode = searchParams.get('code');
window.opener.saveCode(dropboxCode);
send("ready",true);
window.setTimeout(function()
{
window.close();
}, 400);
}, 100);
}
else
{
dbx.auth.accessToken = localStorage.getItem('dropboxAccessToken');
window.addEventListener("message", onMessage,false);
doAction(checkUser);
}
}
function handleError(e)
{
console.log(e);
if(e.error && e.error == "multiple_colons") { send(1,"Rename path contains more than one colon."); }
else
{
send("ready",false);
sentFalse = true;
}
}
function saveCode(code)
{
dbx.auth.getAccessTokenFromCode(redirectUri, code)
.then(function({ result })
{
dbx.auth.accessToken = result.access_token;
localStorage.setItem('dropboxAccessToken', result.access_token);
authDone = true;
if(retryAction) { doAction(retryAction.action, retryAction.prms, 1); retryAction = null; }
else send("ready",true);
})
.catch(function(error) { handleError(error); });
}
function signOut()
{
var w = window.open("https://www.dropbox.com/logout", 'logoutwin', 'width=700,height=800');
if(!w) { handleError("Popup window blocked.") }
else
{
dbx.authTokenRevoke()
.then(function({ result })
{
send(0,"");
})
.catch(function(error) { handleError(error); });
window.setTimeout(function()
{
w.close();
}, 5000);
}
}
//check valid accessToken and proceed, or try to reauthenticate
function doAction(action, prms)
{
if(action == signOut) { signOut(); }
else if(sentFalse) { authenticate(action,prms); }
else if(dbx.auth.accessToken)
{
dbx.checkUser({"query": ""})
.then(function(e) {
action(prms);
})
.catch(function(e)
{
handleError(e);
});
}
else { handleError("No Access Token present."); }
}
function handleListResult(response, prms, out)
{
var entries = response.result.entries;
if (!out) { out = []; };
for (var i = 0; i<entries.length; ++i)
{
if (entries[i][".tag"] == "file")
{
out.push([entries[i].name,entries[i].size, Date.parse(entries[i].server_modified)/1000]);
}
else out.push([entries[i].name,-1, 0]);
}
if(response.result.has_more)
{
prms.cursor = response.result.cursor;
listDir(prms, out);
}
else
{
getThumbnailPage(prms, 0, out);
}
}
function listDir(prms, out)
//recursively listdir until no more .has_more, passing out array with every call
{
if(prms.path == "/") { prms.path = ""; }
if(prms.cursor)
{
dbx.filesListFolderContinue({cursor: prms.cursor})
.then(function(response) { handleListResult(response,prms,out); })
.catch(function(error) { handleError(error); });
}
else
{
dbx.filesListFolder({path: prms.path})
.then(function(response) { handleListResult(response,prms,out); })
.catch(function(error) { handleError(error); });
}
}
function getThumbnailPage(prms, i, out)
{
var ii = i;
var thumbnailExtenstions = ["jpg", "jpeg", "png", "tiff", "tif", "gif", "webp", "ppm", "bmp",
"JPG", "JPEG", "PNG", "TIFF", "TIF", "GIF", "WEBP", "PPM", "BMP"];
var query = [];
while(query.length < 25 && ii < out.length)
{
if(thumbnailExtenstions.includes(out[ii][0].split('.').pop()))
{
query.push({"path" : prms.path + "/" + out[ii][0], "format" : "png"});
}
++ii;
}
dbx.filesGetThumbnailBatch({entries:query})
.then(function(response) {
ii = i;
var j = 0;
while(j < 25 && ii < out.length)
{
//could just check names from metadata, probably faster than .includes
if(thumbnailExtenstions.includes(out[ii][0].split('.').pop()))
{
out[ii].push(response.result.entries[j].thumbnail)
++j
}
++ii;
}
if(ii < out.length) { getThumbnailPage(prms, ii, out); }
else { convertThumbnail(prms, 0, out) }
})
.catch(function(e) { console.log(e); })
}
function convertThumbnail(prms, i, out)
{
if(i == out.length) { send(0,out); }
else if(out[i].length == 4)
{
fetch("data:image/png;base64,"+out[i][3])
.then(function(result) {
result.blob()
.then(function(blob) {
out[i][3] = URL.createObjectURL(blob);
convertThumbnail(prms, i+1, out);
})
.catch(function(e) { handleError(e); });
})
.catch(function(e) { handleError(e); });
}
else { convertThumbnail(prms, i+1, out); }
}
function downloadFile(prms)
{
dbx.filesDownload({"path" : prms.path})
.then(function(response) {
response.result.fileBlob.arrayBuffer()
.then(function(buffer) { window.parent.postMessage(buffer,"*"); })
.catch(function(e) { handleError(e); });
})
.catch(function(response) {
handleError(response);
});
}
function downloadThumbnail(prms)
{
dbx.filesGetThumbnail({"path" : prms.path, "format" : "png"})
.then(function(response) {
var blobURL = URL.createObjectURL(response.result.fileBlob);
console.log(blobURL);
var xhr = new XMLHttpRequest();
xhr.open('GET', blobURL, true);
xhr.responseType = "arraybuffer";
xhr.onload = function(e) {window.parent.postMessage(e.target.response,"*"); };
xhr.onerror = function(e) { console.error(e); };
xhr.send();
})
.catch(function(response) {
handleError(response);
});
}
function uploadFile(prms)
{
var file = new Blob([prms.buffer]);
dbx.filesUpload({"path": prms.path, "contents": file, "mode" : "overwrite"})
.then(function(response) { send(0,""); })
.catch(function(error) { send(1,error); });
}
function deleteFile(prms)
{
dbx.filesDelete({ "path" : prms.path })
.then(function(response) { send(0,""); })
.catch(function(error) { send(1,error); });
}
function makeFolder(prms)
{
dbx.filesCreateFolderV2({ "path" : prms.path.slice(0, -1) })
.then(function(response) { send(0,""); })
.catch(function(error) { send(1,error); });
}
function renameFile(prms)
{
dbx.filesMoveV2({ "from_path": prms.from_path, "to_path": prms.to_path })
.then(function(response) {send(0,""); })
.catch(function(error) { send(1,error); });
}
function authenticate(action, prms)
{
sentFalse = false;
if(action) { retryAction = { "action": action, "prms": prms }; }
dbx.auth.getAuthenticationUrl(
redirectUri,
'',
'code',
'',
[
'account_info.read',
'files.content.write',
'files.content.read',
],
'user',
true,)
.then(function(url)
{
var w = window.open(url, 'authwin', 'width=700,height=800');
if(!w) { handleError("Popup window blocked.") }
else
{
var popupTick = setInterval(function()
{
if (w.closed)
{
clearInterval(popupTick);
if (!authDone) { handleError("Authorization failed (window closed without authorization completing.") }
}
}, 500);
}
});
}
function checkUser(prms)
{
send("ready",true);
}
function onMessage(e) {
if((typeof e.data) == "string") {
var msg = JSON.parse(e.data);
console.log(msg);
if(msg.code=="show") { doAction(listDir, { "path" : msg.prm }); }
else if(msg.code=="load") { doAction(downloadFile, { "path" : msg.prm }); }
//else if(msg.code=="load") { doAction(downloadThumbnail, { "path" : msg.prm }); }
else if(msg.code=="delete") { doAction(deleteFile, { "path" : msg.prm }); }
else if(msg.code=="save" && msg.prm.endsWith("/")) { doAction(makeFolder, { "path" : msg.prm }); }
else if(msg.code=="forget") { doAction(signOut); }
else if(msg.code=="rename")
{
var prmSplit = msg.prm.split(":");
if (prmSplit.length > 2) { handleError({"error" : "multiple_colons"}); return; }
else { doAction(renameFile, { "from_path" : prmSplit[0], "to_path" : prmSplit[0].substring(0,prmSplit[0].lastIndexOf("/")+1)+prmSplit[1] }); }
}
lastMsg=msg;
}
else {
if(lastMsg.code=="save") doAction(uploadFile, { "path": lastMsg.prm, "buffer" : e.data });
}
}
function send(code,prm) {
window.parent.postMessage(JSON.stringify({"code":code, "prm":prm}),"*");
}
</script>
</body>
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/dropbox@10.9.0/dist/Dropbox-sdk.min.js"></script>
</head>
<body onload="go()">
<script type="text/javascript" >
var sentFalse = false;
var authDone = false;
var lastMsg, authUrl;
var DROPBOX_APP_KEY = "ylv5pcromn2df1o"; //'7rlydkifdtp5gnb';
var redirectUri = window.location.href;
var dbx = new Dropbox.Dropbox({ clientId: DROPBOX_APP_KEY });
function go() {
if (window.name == "authwin")
{
authDone = false;
window.setTimeout(function()
{
var searchParams = new URLSearchParams(window.location.search.substr(1));
var dropboxCode = searchParams.get('code');
window.opener.saveCode(dropboxCode);
send("ready",true);
window.setTimeout(function()
{
window.close();
}, 400);
}, 100);
}
else
{
dbx.auth.accessToken = localStorage.getItem('dropboxAccessToken');
window.addEventListener("message", onMessage,false);
doAction(checkUser);
}
}
function handleError(e)
{
console.log(e);
if(e.error && e.error == "multiple_colons") { send(1,"Rename path contains more than one colon."); }
else
{
send("ready",false);
sentFalse = true;
}
}
function saveCode(code)
{
dbx.auth.getAccessTokenFromCode(redirectUri, code)
.then(function({ result })
{
dbx.auth.accessToken = result.access_token;
localStorage.setItem('dropboxAccessToken', result.access_token);
authDone = true;
if(retryAction) { doAction(retryAction.action, retryAction.prms, 1); retryAction = null; }
else send("ready",true);
})
.catch(function(error) { handleError(error); });
}
function signOut()
{
var w = window.open("https://www.dropbox.com/logout", 'logoutwin', 'width=700,height=800');
if(!w) { handleError("Popup window blocked.") }
else
{
dbx.authTokenRevoke()
.then(function({ result })
{
send(0,"");
})
.catch(function(error) { handleError(error); });
window.setTimeout(function()
{
w.close();
}, 5000);
}
}
//check valid accessToken and proceed, or try to reauthenticate
function doAction(action, prms)
{
if(action == signOut) { signOut(); }
else if(sentFalse) { authenticate(action,prms); }
else if(dbx.auth.accessToken)
{
dbx.checkUser({"query": ""})
.then(function(e) {
action(prms);
})
.catch(function(e)
{
handleError(e);
});
}
else { handleError("No Access Token present."); }
}
function handleListResult(response, prms, out)
{
var entries = response.result.entries;
if (!out) { out = []; };
for (var i = 0; i<entries.length; ++i)
{
if (entries[i][".tag"] == "file")
{
out.push([entries[i].name,entries[i].size, Date.parse(entries[i].server_modified)/1000]);
}
else out.push([entries[i].name,-1, 0]);
}
if(response.result.has_more)
{
prms.cursor = response.result.cursor;
listDir(prms, out);
}
else
{
getThumbnailPage(prms, 0, out);
}
}
function listDir(prms, out)
//recursively listdir until no more .has_more, passing out array with every call
{
if(prms.path == "/") { prms.path = ""; }
if(prms.cursor)
{
dbx.filesListFolderContinue({cursor: prms.cursor})
.then(function(response) { handleListResult(response,prms,out); })
.catch(function(error) { handleError(error); });
}
else
{
dbx.filesListFolder({path: prms.path})
.then(function(response) { handleListResult(response,prms,out); })
.catch(function(error) { handleError(error); });
}
}
function getThumbnailPage(prms, i, out)
{
var ii = i;
var thumbnailExtenstions = ["jpg", "jpeg", "png", "tiff", "tif", "gif", "webp", "ppm", "bmp",
"JPG", "JPEG", "PNG", "TIFF", "TIF", "GIF", "WEBP", "PPM", "BMP"];
var query = [];
while(query.length < 25 && ii < out.length)
{
if(thumbnailExtenstions.includes(out[ii][0].split('.').pop()))
{
query.push({"path" : prms.path + "/" + out[ii][0], "format" : "png"});
}
++ii;
}
dbx.filesGetThumbnailBatch({entries:query})
.then(function(response) {
ii = i;
var j = 0;
while(j < 25 && ii < out.length)
{
//could just check names from metadata, probably faster than .includes
if(thumbnailExtenstions.includes(out[ii][0].split('.').pop()))
{
out[ii].push(response.result.entries[j].thumbnail)
++j
}
++ii;
}
if(ii < out.length) { getThumbnailPage(prms, ii, out); }
else { convertThumbnail(prms, 0, out) }
})
.catch(function(e) { console.log(e); })
}
function convertThumbnail(prms, i, out)
{
if(i == out.length) { send(0,out); }
else if(out[i].length == 4)
{
fetch("data:image/png;base64,"+out[i][3])
.then(function(result) {
result.blob()
.then(function(blob) {
out[i][3] = URL.createObjectURL(blob);
convertThumbnail(prms, i+1, out);
})
.catch(function(e) { handleError(e); });
})
.catch(function(e) { handleError(e); });
}
else { convertThumbnail(prms, i+1, out); }
}
function downloadFile(prms)
{
dbx.filesDownload({"path" : prms.path})
.then(function(response) {
response.result.fileBlob.arrayBuffer()
.then(function(buffer) { window.parent.postMessage(buffer,"*"); })
.catch(function(e) { handleError(e); });
})
.catch(function(response) {
handleError(response);
});
}
function downloadThumbnail(prms)
{
dbx.filesGetThumbnail({"path" : prms.path, "format" : "png"})
.then(function(response) {
var blobURL = URL.createObjectURL(response.result.fileBlob);
console.log(blobURL);
var xhr = new XMLHttpRequest();
xhr.open('GET', blobURL, true);
xhr.responseType = "arraybuffer";
xhr.onload = function(e) {window.parent.postMessage(e.target.response,"*"); };
xhr.onerror = function(e) { console.error(e); };
xhr.send();
})
.catch(function(response) {
handleError(response);
});
}
function uploadFile(prms)
{
var file = new Blob([prms.buffer]);
dbx.filesUpload({"path": prms.path, "contents": file, "mode" : "overwrite"})
.then(function(response) { send(0,""); })
.catch(function(error) { send(1,error); });
}
function deleteFile(prms)
{
dbx.filesDelete({ "path" : prms.path })
.then(function(response) { send(0,""); })
.catch(function(error) { send(1,error); });
}
function makeFolder(prms)
{
dbx.filesCreateFolderV2({ "path" : prms.path.slice(0, -1) })
.then(function(response) { send(0,""); })
.catch(function(error) { send(1,error); });
}
function renameFile(prms)
{
dbx.filesMoveV2({ "from_path": prms.from_path, "to_path": prms.to_path })
.then(function(response) {send(0,""); })
.catch(function(error) { send(1,error); });
}
function authenticate(action, prms)
{
sentFalse = false;
if(action) { retryAction = { "action": action, "prms": prms }; }
dbx.auth.getAuthenticationUrl(
redirectUri,
'',
'code',
'',
[
'account_info.read',
'files.content.write',
'files.content.read',
],
'user',
true,)
.then(function(url)
{
var w = window.open(url, 'authwin', 'width=700,height=800');
if(!w) { handleError("Popup window blocked.") }
else
{
var popupTick = setInterval(function()
{
if (w.closed)
{
clearInterval(popupTick);
if (!authDone) { handleError("Authorization failed (window closed without authorization completing.") }
}
}, 500);
}
});
}
function checkUser(prms)
{
send("ready",true);
}
function onMessage(e) {
if((typeof e.data) == "string") {
var msg = JSON.parse(e.data);
console.log(msg);
if(msg.code=="show") { doAction(listDir, { "path" : msg.prm }); }
else if(msg.code=="load") { doAction(downloadFile, { "path" : msg.prm }); }
//else if(msg.code=="load") { doAction(downloadThumbnail, { "path" : msg.prm }); }
else if(msg.code=="delete") { doAction(deleteFile, { "path" : msg.prm }); }
else if(msg.code=="save" && msg.prm.endsWith("/")) { doAction(makeFolder, { "path" : msg.prm }); }
else if(msg.code=="forget") { doAction(signOut); }
else if(msg.code=="rename")
{
var prmSplit = msg.prm.split(":");
if (prmSplit.length > 2) { handleError({"error" : "multiple_colons"}); return; }
else { doAction(renameFile, { "from_path" : prmSplit[0], "to_path" : prmSplit[0].substring(0,prmSplit[0].lastIndexOf("/")+1)+prmSplit[1] }); }
}
lastMsg=msg;
}
else {
if(lastMsg.code=="save") doAction(uploadFile, { "path": lastMsg.prm, "buffer" : e.data });
}
}
function send(code,prm) {
window.parent.postMessage(JSON.stringify({"code":code, "prm":prm}),"*");
}
</script>
</body>
</html>

View File

@@ -1,80 +1,80 @@

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0" />
<meta name="thumbnail" content="https://www.photopea.com/promo/screens/scr5.png" />
<meta name="theme-color" content="#474747">
<title>Photopea | Online Photo Editor</title>
<link rel="apple-touch-icon" href="promo/icon512.png">
<link rel="icon" sizes="512x512" href="promo/icon512.png">
<link rel="image_src" type="image/png" href="promo/icon512.png" />
<link rel="manifest" href="manifest.json">
<link rel="chrome-webstore-item" href="//chrome.google.com/webstore/detail/fmophgdjdipcbfjiopifpngdjmemonko">
<meta name="description" content="Photopea Online Photo Editor lets you edit photos, apply effects, filters, add text, crop or resize pictures. Do Online Photo Editing in your browser for free!" />
<link rel="stylesheet" href="style/all.css" />
<style>
#cap {
font-size: 1.3em;
padding:2% 2% 1em 2%; background-color: #0f171d; /*background-image: linear-gradient(rgb(20, 20, 22), rgb(40,40,45));*/
color:#e6e6e6; text-align:center;
/*position:absolute; z-index:10; margin:1em; border-radius: 1em;*/
}
#cap a { color:inherit; font-weight:bold; }
#cap p { margin-bottom:1.5em; line-height:1.5em; }
h1 { font-size: 2.3em; margin:0.5em 0; letter-spacing: 0em; line-height:1.2em; }
strong { display:inline-block; font-size: 1.1em; background:rgba(0,0,0,0.1); padding:0.1em 0.5em;
margin: 0.2em 0.5em 0.2em 0; border-radius:0.3em; font-weight:normal; line-height:1.7}
</style>
<script>
function showCap() {_showCap(true);} function hideCap() {_showCap(false);}
function _showCap(vis){
document.getElementById("cap").setAttribute("style", vis?"":"display:none;");
localStorage.setItem("capShown", ""+vis);
}
</script>
</head>
<body class="theme0">
<!---->
<div id="cap">
<span style="position:absolute;right:0;top:0;font-size:7em;margin:0 0.2em;cursor:pointer;" onclick="hideCap()"></span>
<img style="width:8em; height:8em; margin-top:1em;" src="promo/icon512.png" alt="Photopea logo" />
<h1>Photopea: advanced photo editor</h1>
<p style="font-size:1.3em">Free online photo editor supporting <b>PSD</b>, <b>XCF</b>, <b>Sketch</b>, <b>XD</b> and <b>CDR</b> formats.
(<b>Adobe Photoshop</b>, <b>GIMP</b>, <b>Sketch App</b>, <b>Adobe XD</b> and <b>CorelDRAW</b>).</p>
<p>Create a new image or open existing files from your computer. Save your work as PSD
(File - Save as PSD) or as JPG / PNG / SVG (File - Export). Suggest new features at our
<a href="//github.com/photopea/photopea/issues" target="_blank">GitHub</a> or <a href="//www.facebook.com/photopea/" target="_blank">Facebook</a>.
Our goal is to create <a href="https://blog.photopea.com/introduction.html" target="_blank">the most advanced and affordable photo editor</a>.</p>
<span><!--<a href="mailto:support@photopea.com">-->support@photopea.com<!--</a>-->
| Reddit: <a target="_blank" href="//www.reddit.com/r/photopea/">/r/Photopea</a>
| <a target="_blank" href="/privacy.html">Privacy Policy</a></span>
</div>
<!---->
<script>if(localStorage.getItem("capShown")=="false" || window.self != window.top) hideCap();</script>
<script src="code/ext/ext.js"></script>
<script src="code/dbs/DBS.js"></script>
<script src="code/pp/pp.js"></script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https:#/gtag/js?id=G-49YR1RB5KP"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag("js", new Date()); gtag('config', 'G-49YR1RB5KP'); //gtag("config", "UA-4249565-37");
</script>
</body>
</html>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0" />
<meta name="thumbnail" content="https://www.photopea.com/promo/screens/scr5.png" />
<meta name="theme-color" content="#474747">
<title>Photopea | Online Photo Editor</title>
<link rel="apple-touch-icon" href="promo/icon512.png">
<link rel="icon" sizes="512x512" href="promo/icon512.png">
<link rel="image_src" type="image/png" href="promo/icon512.png" />
<link rel="manifest" href="manifest.json">
<link rel="chrome-webstore-item" href="//chrome.google.com/webstore/detail/fmophgdjdipcbfjiopifpngdjmemonko">
<meta name="description" content="Photopea Online Photo Editor lets you edit photos, apply effects, filters, add text, crop or resize pictures. Do Online Photo Editing in your browser for free!" />
<link rel="stylesheet" href="style/all.css" />
<style>
#cap {
font-size: 1.3em;
padding:2% 2% 1em 2%; background-color: #0f171d; /*background-image: linear-gradient(rgb(20, 20, 22), rgb(40,40,45));*/
color:#e6e6e6; text-align:center;
/*position:absolute; z-index:10; margin:1em; border-radius: 1em;*/
}
#cap a { color:inherit; font-weight:bold; }
#cap p { margin-bottom:1.5em; line-height:1.5em; }
h1 { font-size: 2.3em; margin:0.5em 0; letter-spacing: 0em; line-height:1.2em; }
strong { display:inline-block; font-size: 1.1em; background:rgba(0,0,0,0.1); padding:0.1em 0.5em;
margin: 0.2em 0.5em 0.2em 0; border-radius:0.3em; font-weight:normal; line-height:1.7}
</style>
<script>
function showCap() {_showCap(true);} function hideCap() {_showCap(false);}
function _showCap(vis){
document.getElementById("cap").setAttribute("style", vis?"":"display:none;");
localStorage.setItem("capShown", ""+vis);
}
</script>
</head>
<body class="theme0">
<!---->
<div id="cap">
<span style="position:absolute;right:0;top:0;font-size:7em;margin:0 0.2em;cursor:pointer;" onclick="hideCap()"></span>
<img style="width:8em; height:8em; margin-top:1em;" src="promo/icon512.png" alt="Photopea logo" />
<h1>Photopea: advanced photo editor</h1>
<p style="font-size:1.3em">Free online photo editor supporting <b>PSD</b>, <b>XCF</b>, <b>Sketch</b>, <b>XD</b> and <b>CDR</b> formats.
(<b>Adobe Photoshop</b>, <b>GIMP</b>, <b>Sketch App</b>, <b>Adobe XD</b> and <b>CorelDRAW</b>).</p>
<p>Create a new image or open existing files from your computer. Save your work as PSD
(File - Save as PSD) or as JPG / PNG / SVG (File - Export). Suggest new features at our
<a href="//github.com/photopea/photopea/issues" target="_blank">GitHub</a> or <a href="//www.facebook.com/photopea/" target="_blank">Facebook</a>.
Our goal is to create <a href="https://blog.photopea.com/introduction.html" target="_blank">the most advanced and affordable photo editor</a>.</p>
<span><!--<a href="mailto:support@photopea.com">-->support@photopea.com<!--</a>-->
| Reddit: <a target="_blank" href="//www.reddit.com/r/photopea/">/r/Photopea</a>
| <a target="_blank" href="/privacy.html">Privacy Policy</a></span>
</div>
<!---->
<script>if(localStorage.getItem("capShown")=="false" || window.self != window.top) hideCap();</script>
<script src="code/ext/ext.js"></script>
<script src="code/dbs/DBS.js"></script>
<script src="code/pp/pp.js"></script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-49YR1RB5KP"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag("js", new Date()); gtag('config', 'G-49YR1RB5KP'); //gtag("config", "UA-4249565-37");
</script>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@@ -1165,6 +1165,16 @@ input[type="checkbox"]:checked + label:before { content: "\2713"; }
display:inline-block;
min-width:4em;
}
.label6 .flabel
{
display:inline-block;
min-width:6em;
}
.label8 .flabel
{
display:inline-block;
min-width:8em;
}
.label12 .flabel
{
display:inline-block;