From 176131376a6fef2a8a5ce568a06b324e7c6893b7 Mon Sep 17 00:00:00 2001 From: leijun Date: Mon, 21 Aug 2023 17:08:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=BB=BAExcel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- esbuild.config.mjs | 5 +- main.css | 2 +- main.ts | 135 ++++++++++++++++++++++++++----- package-lock.json | 141 ++++++++++++++++++--------------- package.json | 2 +- src/ExcelView.ts | 18 ++--- src/utils/FileUtils.ts | 124 +++++++++++++++++++++++++++++ src/utils/ModifierkeyHelper.ts | 53 +++++++++++++ src/utils/ObsidianUtils.ts | 126 +++++++++++++++++++++++++++++ src/utils/Settings.ts | 15 ++++ styles.css | 21 ++--- 11 files changed, 534 insertions(+), 108 deletions(-) create mode 100644 src/utils/FileUtils.ts create mode 100644 src/utils/ModifierkeyHelper.ts create mode 100644 src/utils/ObsidianUtils.ts create mode 100644 src/utils/Settings.ts diff --git a/esbuild.config.mjs b/esbuild.config.mjs index c275170..300efb3 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -2,7 +2,7 @@ import esbuild from "esbuild"; import process from "process"; import builtins from "builtin-modules"; import { lessLoader } from "esbuild-plugin-less"; -import svg from 'esbuild-plugin-svg'; +import { svgo } from "@hyrious/esbuild-plugin-svgo"; const banner = `/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD @@ -40,7 +40,8 @@ const context = await esbuild.context({ sourcemap: prod ? false : "inline", treeShaking: true, outfile: "main.js", - plugins: [lessLoader(), svg()], + plugins: [lessLoader(), svgo()], + loader: { '.svg': 'dataurl' }, }); if (prod) { diff --git a/main.css b/main.css index 4b83f05..dc644ce 100644 --- a/main.css +++ b/main.css @@ -877,7 +877,7 @@ form fieldset select { display: inline-block; } .x-spreadsheet-icon .x-spreadsheet-icon-img { - background-image: url(data:text/plain;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIiB4PSIwIiB5PSIwIiB3aWR0aD0iMjYycHgiIGhlaWdodD0iNzJweCIgdmlld0JveD0iMCAwIDI2MiA3MiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTEuNTY1NjM5MSw0LjQzNDM2MDg4IEw5LDcgTDE2LDcgTDE2LDAgTDEzLjA0MTg0MjQsMi45NTgxNTc1OCBDMTEuNTkzNjc4NywxLjczNjM1OTU5IDkuNzIyNjA3NzUsMSA3LjY3OTU1MDgzLDEgQzQuMjIxMjYyNTgsMSAxLjI1NTc1NTk5LDMuMTA5ODQ5MDggMCw2IEwyLDcgQzIuOTM2NTg3NzUsNC42MDk3NDQwNiA1LjEyOTQzNjk3LDMuMDgwMTEyMjkgNy42Nzk1NTA4MywzIEM5LjE0ODgxMjQ3LDMuMDUyODc0NyAxMC40OTk0NzgzLDMuNTc4NjIwNTMgMTEuNTY1NjM5MSw0LjQzNDM2MDg4IFoiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDE3IDUpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOCwwKSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTEuNTY1NjM5MSw0LjQzNDM2MDg4IEw5LDcgTDE2LDcgTDE2LDAgTDEzLjA0MTg0MjQsMi45NTgxNTc1OCBDMTEuNTkzNjc4NywxLjczNjM1OTU5IDkuNzIyNjA3NzUsMSA3LjY3OTU1MDgzLDEgQzQuMjIxMjYyNTgsMSAxLjI1NTc1NTk5LDMuMTA5ODQ5MDggMCw2IEwyLDcgQzIuOTM2NTg3NzUsNC42MDk3NDQwNiA1LjEyOTQzNjk3LDMuMDgwMTEyMjkgNy42Nzk1NTA4MywzIEM5LjE0ODgxMjQ3LDMuMDUyODc0NyAxMC40OTk0NzgzLDMuNTc4NjIwNTMgMTEuNTY1NjM5MSw0LjQzNDM2MDg4IFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEgNSkiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM2LDApIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMywxNCBMMywxNCBMMywxMSBMMCwxMSBMMCw2LjAwNTkxOTA1IEMwLDQuODk4MDgwNTUgMC44OTQ1MTM3NTYsNCAxLjk5NDA2MDI4LDQgTDE0LjAwNTkzOTcsNCBDMTUuMTA3MjI4OCw0IDE2LDQuODg2NTU0ODQgMTYsNi4wMDU5MTkwNSBMMTYsMTEgTDEzLDExIEwxMywxNCBaIE01LDkgTDExLDkgTDExLDEyIEw1LDEyIEw1LDkgWiBNMywwIEwxMywwIEwxMywzIEwzLDMgTDMsMCBaIE0xMiw2IEwxNCw2IEwxNCw4IEwxMiw4IEwxMiw2IFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEgMikiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU0LDApIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik05LDAgTDEsMCBDMC40NSwwIDAsMC40NSAwLDEgTDAsNCBDMCw0LjU1IDAuNDUsNSAxLDUgTDksNSBDOS41NSw1IDEwLDQuNTUgMTAsNCBMMTAsMyBMMTEsMyBMMTEsNiBMNCw2IEw0LDE0IEw2LDE0IEw2LDggTDEzLDggTDEzLDIgTDEwLDIgTDEwLDEgQzEwLDAuNDUgOS41NSwwIDksMCBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzIDIpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MiwwKSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMC4yNywxLjU1IEw1LjQzLDYuNyBMMywxMiBMNS41LDEyIEw3LjE0LDguNDIgTDExLjczLDEzIEwxMywxMS43MyBMMS41NSwwLjI3IEwwLjI3LDEuNTUgTDAuMjcsMS41NSBaIE0zLjgyLDAgTDUuODIsMiBMNy41OCwyIEw3LjAzLDMuMjEgTDguNzQsNC45MiBMMTAuMDgsMiBMMTQsMiBMMTQsMCBMMy44MiwwIEwzLjgyLDAgWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAzKSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTAsMCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTksMy41IEM5LDEuNTcgNy40MywwIDUuNSwwIEwxLjc3NjM1Njg0ZS0xNSwwIEwxLjc3NjM1Njg0ZS0xNSwxMiBMNi4yNSwxMiBDOC4wNCwxMiA5LjUsMTAuNTQgOS41LDguNzUgQzkuNSw3LjQ1IDguNzMsNi4zNCA3LjYzLDUuODIgQzguNDYsNS4yNCA5LDQuMzggOSwzLjUgWiBNNSwyIEM1LjgyOTk5OTkyLDIgNi41LDIuNjcgNi41LDMuNSBDNi41LDQuMzMgNS44Mjk5OTk5Miw1IDUsNSBMMyw1IEwzLDIgTDUsMiBaIE0zLDEwIEwzLDcgTDUuNSw3IEM2LjMyOTk5OTkyLDcgNyw3LjY3IDcsOC41IEM3LDkuMzMgNi4zMjk5OTk5MiwxMCA1LjUsMTAgTDMsMTAgWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAzKSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTA4LDApIj48cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHBvaW50cz0iNCAwIDQgMiA2LjU4IDIgMi45MiAxMCAwIDEwIDAgMTIgOCAxMiA4IDEwIDUuNDIgMTAgOS4wOCAyIDEyIDIgMTIgMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMyAzKSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTI2LDApIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBkPSJNNiwxMiBDOC43NiwxMiAxMSw5Ljc2IDExLDcgTDExLDAgTDksMCBMOSw3IEM5LDguNzUwMjk5MTYgNy40OTkxMjgwNywxMCA2LDEwIEM0LjUwMDg3MTkzLDEwIDMsOC43NTgzNzQ4NiAzLDcgTDMsMCBMMSwwIEwxLDcgQzEsOS43NiAzLjI0LDEyIDYsMTIgWiBNMCwxMyBMMCwxNSBMMTIsMTUgTDEyLDEzIEwwLDEzIFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMgMykiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE0NCwwKSI+PHBhdGggZmlsbD0iIzAxMDEwMSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMi44ODc1LDMuMDYgQzIuODg3NSwyLjYwMjUgMi45ODUsMi4xODYyNSAzLjE4Mzc1LDEuODA3NSBDMy4zODI1LDEuNDI4NzUgMy42NiwxLjEwNjI1IDQuMDIsMC44NCBDNC4zOCwwLjU3Mzc1IDQuODAzNzUsMC4zNjc1IDUuMjk4NzUsMC4yMjEyNSBDNS43OTM3NSwwLjA3NSA2LjMzMzc1LDAgNi45MjYyNSwwIEM3LjUzMzc1LDAgOC4wODUsMC4wODI1IDguNTgsMC4yNTEyNSBDOS4wNzUsMC40MiA5LjQ5ODc1LDAuNjUyNSA5Ljg1MTI1LDAuOTU2MjUgQzEwLjIwMzc1LDEuMjU2MjUgMTAuNDczNzUsMS42MTI1IDEwLjY2NSwyLjAyODc1IEMxMC44NTYyNSwyLjQ0MTI1IDEwLjk1LDIuODk1IDEwLjk1LDMuMzg2MjUgTDguNjkyNSwzLjM4NjI1IEM4LjY5MjUsMy4xNTc1IDguNjU1LDIuOTQzNzUgOC41ODM3NSwyLjc0ODc1IEM4LjUxMjUsMi41NSA4LjQsMi4zODEyNSA4LjI1LDIuMjQyNSBDOC4xLDIuMTAzNzUgNy45MTI1LDEuOTkxMjUgNy42ODc1LDEuOTE2MjUgQzcuNDYyNSwxLjgzNzUgNy4xOTYyNSwxLjggNi44ODg3NSwxLjggQzYuNTkyNSwxLjggNi4zMzc1LDEuODMzNzUgNi4xMTYyNSwxLjg5NzUgQzUuODk4NzUsMS45NjEyNSA1LjcxODc1LDIuMDUxMjUgNS41NzYyNSwyLjE2NzUgQzUuNDMzNzUsMi4yODM3NSA1LjMyNSwyLjQxODc1IDUuMjUzNzUsMi41NzI1IEM1LjE4MjUsMi43MjYyNSA1LjE0NSwyLjg5NSA1LjE0NSwzLjA2NzUgQzUuMTQ1LDMuNDI3NSA1LjMyODc1LDMuNzMxMjUgNS42OTYyNSwzLjk3NSBDNS43MTc4MDIwMywzLjk4OTA4MDY2IDUuNzM5NDIwMTIsNC4wMDMxMTcyOCA1Ljc2MTE4MzU3LDQuMDE3MzMzMTUgQzYuMDIzNDI5MjMsNC4xODg2MzE4NSA2LjUsNC41IDcsNSBMNCw1IEM0LDUgMy4yMTM3NSw0LjM3NjI1IDMuMTc2MjUsNC4zMDg3NSBDMi45ODUsMy45NTI1IDIuODg3NSwzLjUzNjI1IDIuODg3NSwzLjA2IFogTTE0LDYgTDAsNiBMMCw4IEw3LjIxODc1LDggQzcuMzUzNzUsOC4wNTI1IDcuNTE4NzUsOC4xMDUgNy42MzEyNSw4LjE1Mzc1IEM3LjkwODc1LDguMjc3NSA4LjEyNjI1LDguNDA4NzUgOC4yODM3NSw4LjUzNjI1IEM4LjQ0MTI1LDguNjY3NSA4LjU0NjI1LDguODEgOC42MDI1LDguOTYgQzguNjU4NzUsOS4xMTM3NSA4LjY4NSw5LjI4NjI1IDguNjg1LDkuNDczNzUgQzguNjg1LDkuNjUgOC42NTEyNSw5LjgxNSA4LjU4Mzc1LDkuOTY1IEM4LjUxNjI1LDEwLjExODc1IDguNDExMjUsMTAuMjUgOC4yNzI1LDEwLjM1ODc1IEM4LjEzMzc1LDEwLjQ2NzUgNy45NTM3NSwxMC41NTM3NSA3Ljc0LDEwLjYxNzUgQzcuNTIyNSwxMC42ODEyNSA3LjI3MTI1LDEwLjcxMTI1IDYuOTc4NzUsMTAuNzExMjUgQzYuNjUyNSwxMC43MTEyNSA2LjM1NjI1LDEwLjY3NzUgNi4wOSwxMC42MTM3NSBDNS44MjM3NSwxMC41NSA1LjU5ODc1LDEwLjQ0NSA1LjQxMTI1LDEwLjMwMjUgQzUuMjIzNzUsMTAuMTYgNS4wNzc1LDkuOTcyNSA0Ljk3MjUsOS43NDM3NSBDNC44Njc1LDkuNTE1IDQuNzgxMjUsOS4xNyA0Ljc4MTI1LDkgTDIuNTUsOSBDMi41NSw5LjI1MjUgMi42MSw5LjY4NzUgMi43MjYyNSwxMC4wMjUgQzIuODQyNSwxMC4zNjI1IDMuMDA3NSwxMC42NjYyNSAzLjIxMzc1LDEwLjkzMjUgQzMuNDIsMTEuMTk4NzUgMy42Njc1LDExLjQyNzUgMy45NDg3NSwxMS42MjI1IEM0LjIzLDExLjgxNzUgNC41MzM3NSwxMS45ODI1IDQuODYzNzUsMTIuMTEgQzUuMTkzNzUsMTIuMjQxMjUgNS41MzUsMTIuMzM4NzUgNS44OTg3NSwxMi4zOTg3NSBDNi4yNTg3NSwxMi40NjI1IDYuNjIyNSwxMi40OTI1IDYuOTgyNSwxMi40OTI1IEM3LjU4MjUsMTIuNDkyNSA4LjEzLDEyLjQyNSA4LjYxNzUsMTIuMjg2MjUgQzkuMTA1LDEyLjE0NzUgOS41MjUsMTEuOTQ4NzUgOS44NywxMS42OTM3NSBDMTAuMjE1LDExLjQzNSAxMC40ODEyNSwxMS4xMiAxMC42NzI1LDEwLjc0MTI1IEMxMC44NjM3NSwxMC4zNjI1IDEwLjk1Mzc1LDkuOTM1IDEwLjk1Mzc1LDkuNDU1IEMxMC45NTM3NSw5LjAwNSAxMC44NzUsOC42IDEwLjcyMTI1LDguMjQzNzUgQzEwLjY4Mzc1LDguMTU3NSAxMC42NDI1LDguMDc1IDEwLjU5Mzc1LDcuOTkyNSBMMTQsOCBMMTQsNiBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDMpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjIsMCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTcsMCBMNSwwIEwwLjUsMTIgTDIuNSwxMiBMMy42Miw5IEw4LjM3LDkgTDkuNDksMTIgTDExLjQ5LDEyIEw3LDAgTDcsMCBaIE00LjM4LDcgTDYsMi42NyBMNy42Miw3IEw0LjM4LDcgTDQuMzgsNyBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzIDEpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxODAsMCkiPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICA8cGF0aCBmaWxsPSIjMDAwMDAwIiBkPSJNMTQuNSw4Ljg3IEMxNC41LDguODcgMTMsMTAuNDkgMTMsMTEuNDkgQzEzLDEyLjMyIDEzLjY3LDEyLjk5IDE0LjUsMTIuOTkgQzE1LjMzLDEyLjk5IDE2LDEyLjMyIDE2LDExLjQ5IEMxNiwxMC41IDE0LjUsOC44NyAxNC41LDguODcgTDE0LjUsOC44NyBaIE0xMi43MSw2Ljc5IEw1LjkxLDAgTDQuODUsMS4wNiBMNi40NCwyLjY1IEwyLjI5LDYuNzkgQzEuOSw3LjE4IDEuOSw3LjgxIDIuMjksOC4yIEw2Ljc5LDEyLjcgQzYuOTksMTIuOSA3LjI0LDEzIDcuNSwxMyBDNy43NiwxMyA4LjAxLDEyLjkgOC4yMSwxMi43MSBMMTIuNzEsOC4yMSBDMTMuMSw3LjgyIDEzLjEsNy4xOCAxMi43MSw2Ljc5IEwxMi43MSw2Ljc5IFogTTQuMjEsNyBMNy41LDMuNzEgTDEwLjc5LDcgTDQuMjEsNyBMNC4yMSw3IFoiLz4KICA8L2c+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTgsMCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTMsNiBMMSw2IEwxLDIgTDgsMiBMOCw0IEwzLDQgTDMsNiBaIE0xMCw0IEwxMCwyIEwxNywyIEwxNyw2IEwxNSw2IEwxNSw0IEwxMCw0IFogTTEwLDE0IEwxNSwxNCBMMTUsMTIgTDE3LDEyIEwxNywxNiBMMTAsMTYgTDEwLDE0IFogTTEsMTIgTDMsMTIgTDMsMTQgTDgsMTQgTDgsMTYgTDEsMTYgTDEsMTIgWiBNMSw4IEw1LDggTDUsNiBMOCw5IEw1LDEyIEw1LDEwIEwxLDEwIEwxLDggWiBNMTAsOSBMMTMsNiBMMTMsOCBMMTcsOCBMMTcsMTAgTDEzLDEwIEwxMywxMiBMMTAsOSBaIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMTYsMCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTAsMTQgTDEwLDE0IEwxMCwxMiBMMCwxMiBMMCwxNCBaIE0xMCw0IEwwLDQgTDAsNiBMMTAsNiBMMTAsNCBaIE0wLDAgTDAsMiBMMTQsMiBMMTQsMCBMMCwwIFogTTAsMTAgTDE0LDEwIEwxNCw4IEwwLDggTDAsMTAgWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAyKSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjM0LDApIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yLDEyIEwyLDE0IEwxMiwxNCBMMTIsMTIgTDIsMTIgWiBNMiw0IEwyLDYgTDEyLDYgTDEyLDQgTDIsNCBaIE0wLDEwIEwxNCwxMCBMMTQsOCBMMCw4IEwwLDEwIFogTTAsMCBMMCwyIEwxNCwyIEwxNCwwIEwwLDAgWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAyKSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxOCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTQsMTQgTDE0LDE0IEwxNCwxMiBMNCwxMiBMNCwxNCBaIE0wLDEwIEwxNCwxMCBMMTQsOCBMMCw4IEwwLDEwIFogTTAsMCBMMCwyIEwxNCwyIEwxNCwwIEwwLDAgWiBNNCw2IEwxNCw2IEwxNCw0IEw0LDQgTDQsNiBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOCwxOCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTAsMCBMMCwyIEwxMiwyIEwxMiwwIEwwLDAgTDAsMCBaIE0yLjUsNyBMNSw3IEw1LDE0IEw3LDE0IEw3LDcgTDkuNSw3IEw2LDMuNSBMMi41LDcgTDIuNSw3IFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMgMikiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM2LDE4KSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOS41LDMgTDcsMyBMNywwIEw1LDAgTDUsMyBMMi41LDMgTDYsNi41IEw5LjUsMyBMOS41LDMgWiBNMCw4IEwwLDEwIEwxMiwxMCBMMTIsOCBMMCw4IEwwLDggWiBNMi41LDE1IEw1LDE1IEw1LDE4IEw3LDE4IEw3LDE1IEw5LjUsMTUgTDYsMTEuNSBMMi41LDE1IEwyLjUsMTUgWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMykiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU0LDE4KSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOS41LDcgTDcsNyBMNywwIEw1LDAgTDUsNyBMMi41LDcgTDYsMTAuNSBMOS41LDcgTDkuNSw3IFogTTAsMTIgTDAsMTQgTDEyLDE0IEwxMiwxMiBMMCwxMiBMMCwxMiBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzIDIpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MiwxOCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTE0LDAgTDAsMCBMMCwyIEwxNCwyIEwxNCwwIFogTTAsMTIgTDQsMTIgTDQsMTAgTDAsMTAgTDAsMTIgWiBNMTEuNSw1IEwwLDUgTDAsNyBMMTEuNzUsNyBDMTIuNTgsNyAxMy4yNSw3LjY3IDEzLjI1LDguNSBDMTMuMjUsOS4zMyAxMi41OCwxMCAxMS43NSwxMCBMOSwxMCBMOSw4IEw2LDExIEw5LDE0IEw5LDEyIEwxMS41LDEyIEMxMy40MywxMiAxNSwxMC40MyAxNSw4LjUgQzE1LDYuNTcgMTMuNDMsNSAxMS41LDUgWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAzKSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTAsMTgpIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wLDAgTDAsMSBMNiw3IEw2LDEyIEw4LDExIEw4LDcgTDE0LDEgTDE0LDAgTDAsMCBaIE00LDMgTDEwLDMgTDcsNiBMNCwzIFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMykiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwOCwxOCkiPjxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgcG9pbnRzPSIxMCAwIDAgMCAwIDEuOCA1LjUgNyAwIDEyLjIgMCAxNCAxMCAxNCAxMCAxMiAzLjEgMTIgOCA3IDMuMSAyIDEwIDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQgMikiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyNiwxOCkiPjxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgcG9pbnRzPSIwIDAgNCA0IDggMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSA3KSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQ0LDE4KSI+PHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBwb2ludHM9Ii0yIDIgMiA2IDYgMiIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDggMykiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2MiwxOCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTEuOSw0IEMxLjksMi44NCAyLjg0LDEuOSA0LDEuOSBMOCwxLjkgTDgsMCBMNCwwIEMxLjc5LDAgMCwxLjc5IDAsNCBDMCw2LjIxIDEuNzksOCA0LDggTDgsOCBMOCw2LjEgTDQsNi4xIEMyLjg0LDYuMSAxLjksNS4xNiAxLjksNCBMMS45LDQgWiBNMTQsMCBMMTAsMCBMMTAsMS45IEwxNCwxLjkgQzE1LjE2LDEuOSAxNi4xLDIuODQgMTYuMSw0IEMxNi4xLDUuMTYgMTUuMTYsNi4xIDE0LDYuMSBMMTAsNi4xIEwxMCw4IEwxNCw4IEMxNi4yMSw4IDE4LDYuMjEgMTgsNCBDMTgsMS43OSAxNi4yMSwwIDE0LDAgTDE0LDAgWiBNNiw1IEwxMiw1IEwxMiwzIEw2LDMgTDYsNSBMNiw1IFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgNSkiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4MCwxOCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTE1LDAgQzE1LjU1LDAgMTYsMC40NSAxNiwxIEwxNiwxNSBDMTYsMTUuNTUgMTUuNTUsMTYgMTUsMTYgTDEsMTYgQzAuNDUsMTYgMCwxNS41NSAwLDE1IEwwLDEgQzAsMC40NSAwLjQ1LDAgMSwwIEwxNSwwIFogTTIsMiBMMiwxNCBMMTQsMTQgTDE0LDIgTDIsMiBaIE02LDEyIEw0LDEyIEw0LDcgTDYsNyBMNiwxMiBMNiwxMiBaIE05LDEyIEw3LDEyIEw3LDQgTDksNCBMOSwxMiBMOSwxMiBaIE0xMiwxMiBMMTAsMTIgTDEwLDggTDEyLDggTDEyLDEyIEwxMiwxMiBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxIDEpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTgsMTgpIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgPHBhdGggc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMS41IDMuNUgxNi41VjE1LjVIMS41eiIvPgogICAgPHBhdGggZmlsbD0iIzAwMDAwMCIgZD0iTTYgOEg3VjE1SDZ6Ii8+CiAgICA8cGF0aCBmaWxsPSIjRDhEOEQ4IiBkPSJNMiA0SDE2VjdIMnoiLz4KICAgIDxwYXRoIGZpbGw9IiMwMDAwMDAiIGQ9Ik0yIDdIMTZWOEgyek0yIDExSDE2VjEySDJ6Ii8+CiAgPC9nPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjE2LDE4KSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMiwwLjUgQzEuMTcsMC41IDAuNSwxLjE3IDAuNSwyIEMwLjUsMi44MyAxLjE3LDMuNSAyLDMuNSBDMi44MywzLjUgMy41LDIuODMgMy41LDIgQzMuNSwxLjE3IDIuODMsMC41IDIsMC41IEwyLDAuNSBaIE0xMiwwLjUgQzExLjE3LDAuNSAxMC41LDEuMTcgMTAuNSwyIEMxMC41LDIuODMgMTEuMTcsMy41IDEyLDMuNSBDMTIuODMsMy41IDEzLjUsMi44MyAxMy41LDIgQzEzLjUsMS4xNyAxMi44MywwLjUgMTIsMC41IEwxMiwwLjUgWiBNNywwLjUgQzYuMTcsMC41IDUuNSwxLjE3IDUuNSwyIEM1LjUsMi44MyA2LjE3LDMuNSA3LDMuNSBDNy44MywzLjUgOC41LDIuODMgOC41LDIgQzguNSwxLjE3IDcuODMsMC41IDcsMC41IEw3LDAuNSBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDcpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzQsMTgpIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02LDQgTDYsMCBMNCwwIEw0LDQgTDAsNCBMMCw2IEw0LDYgTDQsMTAgTDYsMTAgTDYsNiBMMTAsNiBMMTAsNCBMNiw0IFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQgNCkiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMzYpIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wLDAgTDAsMTQgTDE0LDE0IEwxNCwwIEwwLDAgTDAsMCBaIE02LDEyIEwyLDEyIEwyLDggTDYsOCBMNiwxMiBMNiwxMiBaIE02LDYgTDIsNiBMMiwyIEw2LDIgTDYsNiBMNiw2IFogTTEyLDEyIEw4LDEyIEw4LDggTDEyLDggTDEyLDEyIEwxMiwxMiBaIE0xMiw2IEw4LDYgTDgsMiBMMTIsMiBMMTIsNiBMMTIsNiBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOCwzNikiPgogIDxnIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAyKSI+CiAgICA8cGF0aCBkPSJNMCwxNCBMMiwxNCBMMiwxMiBMMCwxMiBMMCwxNCBMMCwxNCBaIE0yLDMgTDAsMyBMMCw1IEwyLDUgTDIsMyBMMiwzIFogTTMsMTQgTDUsMTQgTDUsMTIgTDMsMTIgTDMsMTQgTDMsMTQgWiBNMTEsMCBMOSwwIEw5LDIgTDExLDIgTDExLDAgTDExLDAgWiBNMiwwIEwwLDAgTDAsMiBMMiwyIEwyLDAgTDIsMCBaIE01LDAgTDMsMCBMMywyIEw1LDIgTDUsMCBMNSwwIFogTTAsMTEgTDIsMTEgTDIsOSBMMCw5IEwwLDExIEwwLDExIFogTTksMTQgTDExLDE0IEwxMSwxMiBMOSwxMiBMOSwxNCBMOSwxNCBaIE0xMiwwIEwxMiwyIEwxNCwyIEwxNCwwIEwxMiwwIEwxMiwwIFogTTEyLDUgTDE0LDUgTDE0LDMgTDEyLDMgTDEyLDUgTDEyLDUgWiBNMTIsMTQgTDE0LDE0IEwxNCwxMiBMMTIsMTIgTDEyLDE0IEwxMiwxNCBaIE0xMiwxMSBMMTQsMTEgTDE0LDkgTDEyLDkgTDEyLDExIEwxMiwxMSBaIiBvcGFjaXR5PSIuNTQiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iOCAwIDYgMCA2IDYgMCA2IDAgOCA2IDggNiAxNCA4IDE0IDggOCAxNCA4IDE0IDYgOCA2Ii8+CiAgPC9nPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzYsMzYpIj4KICA8ZyBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMikiPgogICAgPHBhdGggZD0iTTYsMTQgTDgsMTQgTDgsMTIgTDYsMTIgTDYsMTQgTDYsMTQgWiBNMywyIEw1LDIgTDUsMCBMMywwIEwzLDIgTDMsMiBaIE02LDExIEw4LDExIEw4LDkgTDYsOSBMNiwxMSBMNiwxMSBaIE0zLDE0IEw1LDE0IEw1LDEyIEwzLDEyIEwzLDE0IEwzLDE0IFogTTAsNSBMMiw1IEwyLDMgTDAsMyBMMCw1IEwwLDUgWiBNMCwxNCBMMiwxNCBMMiwxMiBMMCwxMiBMMCwxNCBMMCwxNCBaIE0wLDIgTDIsMiBMMiwwIEwwLDAgTDAsMiBMMCwyIFogTTAsMTEgTDIsMTEgTDIsOSBMMCw5IEwwLDExIEwwLDExIFogTTEyLDExIEwxNCwxMSBMMTQsOSBMMTIsOSBMMTIsMTEgTDEyLDExIFogTTEyLDE0IEwxNCwxNCBMMTQsMTIgTDEyLDEyIEwxMiwxNCBMMTIsMTQgWiBNMTIsNSBMMTQsNSBMMTQsMyBMMTIsMyBMMTIsNSBMMTIsNSBaIE0xMiwwIEwxMiwyIEwxNCwyIEwxNCwwIEwxMiwwIEwxMiwwIFogTTYsMiBMOCwyIEw4LDAgTDYsMCBMNiwyIEw2LDIgWiBNOSwyIEwxMSwyIEwxMSwwIEw5LDAgTDksMiBMOSwyIFogTTYsNSBMOCw1IEw4LDMgTDYsMyBMNiw1IEw2LDUgWiBNOSwxNCBMMTEsMTQgTDExLDEyIEw5LDEyIEw5LDE0IEw5LDE0IFoiIG9wYWNpdHk9Ii41NCIvPgogICAgPHBvbHlnb24gcG9pbnRzPSIwIDggMTQgOCAxNCA2IDAgNiIvPgogIDwvZz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU0LDM2KSI+CiAgPGcgZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIj4KICAgIDxwYXRoIGQ9Ik0zLDE0IEw1LDE0IEw1LDEyIEwzLDEyIEwzLDE0IEwzLDE0IFogTTAsNSBMMiw1IEwyLDMgTDAsMyBMMCw1IEwwLDUgWiBNMCwyIEwyLDIgTDIsMCBMMCwwIEwwLDIgTDAsMiBaIE0zLDggTDUsOCBMNSw2IEwzLDYgTDMsOCBMMyw4IFogTTMsMiBMNSwyIEw1LDAgTDMsMCBMMywyIEwzLDIgWiBNMCwxNCBMMiwxNCBMMiwxMiBMMCwxMiBMMCwxNCBMMCwxNCBaIE0wLDggTDIsOCBMMiw2IEwwLDYgTDAsOCBMMCw4IFogTTAsMTEgTDIsMTEgTDIsOSBMMCw5IEwwLDExIEwwLDExIFogTTEyLDAgTDEyLDIgTDE0LDIgTDE0LDAgTDEyLDAgTDEyLDAgWiBNMTIsOCBMMTQsOCBMMTQsNiBMMTIsNiBMMTIsOCBMMTIsOCBaIE0xMiwxNCBMMTQsMTQgTDE0LDEyIEwxMiwxMiBMMTIsMTQgTDEyLDE0IFogTTEyLDUgTDE0LDUgTDE0LDMgTDEyLDMgTDEyLDUgTDEyLDUgWiBNMTIsMTEgTDE0LDExIEwxNCw5IEwxMiw5IEwxMiwxMSBMMTIsMTEgWiBNOSwxNCBMMTEsMTQgTDExLDEyIEw5LDEyIEw5LDE0IEw5LDE0IFogTTksOCBMMTEsOCBMMTEsNiBMOSw2IEw5LDggTDksOCBaIE05LDIgTDExLDIgTDExLDAgTDksMCBMOSwyIEw5LDIgWiIgb3BhY2l0eT0iLjU0Ii8+CiAgICA8cG9seWdvbiBwb2ludHM9IjYgMTQgOCAxNCA4IDAgNiAwIi8+CiAgPC9nPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzIsMzYpIj4KICA8ZyBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMikiPgogICAgPHBhdGggZD0iTTgsMyBMNiwzIEw2LDUgTDgsNSBMOCwzIEw4LDMgWiBNMTEsNiBMOSw2IEw5LDggTDExLDggTDExLDYgTDExLDYgWiBNOCw2IEw2LDYgTDYsOCBMOCw4IEw4LDYgTDgsNiBaIE04LDkgTDYsOSBMNiwxMSBMOCwxMSBMOCw5IEw4LDkgWiBNNSw2IEwzLDYgTDMsOCBMNSw4IEw1LDYgTDUsNiBaIiBvcGFjaXR5PSIuNTQiLz4KICAgIDxwYXRoIGQ9Ik0wLDAgTDE0LDAgTDE0LDE0IEwwLDE0IEwwLDAgWiBNMTIsMTIgTDEyLDIgTDIsMiBMMiwxMiBMMTIsMTIgWiIvPgogIDwvZz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkwLDM2KSI+CiAgPGcgZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIj4KICAgIDxwYXRoIGQ9Ik02LDggTDgsOCBMOCw2IEw2LDYgTDYsOCBMNiw4IFogTTYsNSBMOCw1IEw4LDMgTDYsMyBMNiw1IEw2LDUgWiBNNiwxMSBMOCwxMSBMOCw5IEw2LDkgTDYsMTEgTDYsMTEgWiBNNiwxNCBMOCwxNCBMOCwxMiBMNiwxMiBMNiwxNCBMNiwxNCBaIE0zLDE0IEw1LDE0IEw1LDEyIEwzLDEyIEwzLDE0IEwzLDE0IFogTTMsMiBMNSwyIEw1LDAgTDMsMCBMMywyIEwzLDIgWiBNMyw4IEw1LDggTDUsNiBMMyw2IEwzLDggTDMsOCBaIE0xMiwxNCBMMTQsMTQgTDE0LDEyIEwxMiwxMiBMMTIsMTQgTDEyLDE0IFogTTEyLDggTDE0LDggTDE0LDYgTDEyLDYgTDEyLDggTDEyLDggWiBNMTIsMTEgTDE0LDExIEwxNCw5IEwxMiw5IEwxMiwxMSBMMTIsMTEgWiBNMTIsNSBMMTQsNSBMMTQsMyBMMTIsMyBMMTIsNSBMMTIsNSBaIE02LDIgTDgsMiBMOCwwIEw2LDAgTDYsMiBMNiwyIFogTTEyLDAgTDEyLDIgTDE0LDIgTDE0LDAgTDEyLDAgTDEyLDAgWiBNOSwxNCBMMTEsMTQgTDExLDEyIEw5LDEyIEw5LDE0IEw5LDE0IFogTTksOCBMMTEsOCBMMTEsNiBMOSw2IEw5LDggTDksOCBaIE05LDIgTDExLDIgTDExLDAgTDksMCBMOSwyIEw5LDIgWiIgb3BhY2l0eT0iLjU0Ii8+CiAgICA8cG9seWdvbiBwb2ludHM9IjAgMTQgMiAxNCAyIDAgMCAwIi8+CiAgPC9nPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTA4LDM2KSI+CiAgPGcgZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIj4KICAgIDxwYXRoIGQ9Ik0zLDggTDUsOCBMNSw2IEwzLDYgTDMsOCBMMyw4IFogTTAsMTQgTDIsMTQgTDIsMTIgTDAsMTIgTDAsMTQgTDAsMTQgWiBNNiwxNCBMOCwxNCBMOCwxMiBMNiwxMiBMNiwxNCBMNiwxNCBaIE02LDExIEw4LDExIEw4LDkgTDYsOSBMNiwxMSBMNiwxMSBaIE0zLDE0IEw1LDE0IEw1LDEyIEwzLDEyIEwzLDE0IEwzLDE0IFogTTAsMTEgTDIsMTEgTDIsOSBMMCw5IEwwLDExIEwwLDExIFogTTYsOCBMOCw4IEw4LDYgTDYsNiBMNiw4IEw2LDggWiBNMCw1IEwyLDUgTDIsMyBMMCwzIEwwLDUgTDAsNSBaIE0wLDggTDIsOCBMMiw2IEwwLDYgTDAsOCBMMCw4IFogTTEyLDggTDE0LDggTDE0LDYgTDEyLDYgTDEyLDggTDEyLDggWiBNMTIsMTEgTDE0LDExIEwxNCw5IEwxMiw5IEwxMiwxMSBMMTIsMTEgWiBNMTIsNSBMMTQsNSBMMTQsMyBMMTIsMyBMMTIsNSBMMTIsNSBaIE02LDUgTDgsNSBMOCwzIEw2LDMgTDYsNSBMNiw1IFogTTksMTQgTDExLDE0IEwxMSwxMiBMOSwxMiBMOSwxNCBMOSwxNCBaIE05LDggTDExLDggTDExLDYgTDksNiBMOSw4IEw5LDggWiBNMTIsMTQgTDE0LDE0IEwxNCwxMiBMMTIsMTIgTDEyLDE0IEwxMiwxNCBaIiBvcGFjaXR5PSIuNTQiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMCAwIDAgMiAxNCAyIDE0IDAiLz4KICA8L2c+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjYsMzYpIj4KICA8ZyBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMikiPgogICAgPHBhdGggZD0iTTAsMiBMMiwyIEwyLDAgTDAsMCBMMCwyIEwwLDIgWiBNMywyIEw1LDIgTDUsMCBMMywwIEwzLDIgTDMsMiBaIE0zLDggTDUsOCBMNSw2IEwzLDYgTDMsOCBMMyw4IFogTTMsMTQgTDUsMTQgTDUsMTIgTDMsMTIgTDMsMTQgTDMsMTQgWiBNMCw1IEwyLDUgTDIsMyBMMCwzIEwwLDUgTDAsNSBaIE0wLDggTDIsOCBMMiw2IEwwLDYgTDAsOCBMMCw4IFogTTAsMTQgTDIsMTQgTDIsMTIgTDAsMTIgTDAsMTQgTDAsMTQgWiBNMCwxMSBMMiwxMSBMMiw5IEwwLDkgTDAsMTEgTDAsMTEgWiBNOSw4IEwxMSw4IEwxMSw2IEw5LDYgTDksOCBMOSw4IFogTTYsMTQgTDgsMTQgTDgsMTIgTDYsMTIgTDYsMTQgTDYsMTQgWiBNOSwxNCBMMTEsMTQgTDExLDEyIEw5LDEyIEw5LDE0IEw5LDE0IFogTTYsMiBMOCwyIEw4LDAgTDYsMCBMNiwyIEw2LDIgWiBNOSwyIEwxMSwyIEwxMSwwIEw5LDAgTDksMiBMOSwyIFogTTYsMTEgTDgsMTEgTDgsOSBMNiw5IEw2LDExIEw2LDExIFogTTYsNSBMOCw1IEw4LDMgTDYsMyBMNiw1IEw2LDUgWiBNNiw4IEw4LDggTDgsNiBMNiw2IEw2LDggTDYsOCBaIiBvcGFjaXR5PSIuNTQiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMTIgMCAxMiAxNCAxNCAxNCAxNCAwIi8+CiAgPC9nPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQ0LDM2KSI+CiAgPGcgZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIj4KICAgIDxwYXRoIGQ9Ik01LDAgTDMsMCBMMywyIEw1LDIgTDUsMCBMNSwwIFogTTgsNiBMNiw2IEw2LDggTDgsOCBMOCw2IEw4LDYgWiBNOCw5IEw2LDkgTDYsMTEgTDgsMTEgTDgsOSBMOCw5IFogTTExLDYgTDksNiBMOSw4IEwxMSw4IEwxMSw2IEwxMSw2IFogTTUsNiBMMyw2IEwzLDggTDUsOCBMNSw2IEw1LDYgWiBNMTEsMCBMOSwwIEw5LDIgTDExLDIgTDExLDAgTDExLDAgWiBNOCwzIEw2LDMgTDYsNSBMOCw1IEw4LDMgTDgsMyBaIE04LDAgTDYsMCBMNiwyIEw4LDIgTDgsMCBMOCwwIFogTTIsOSBMMCw5IEwwLDExIEwyLDExIEwyLDkgTDIsOSBaIE0xMiwxMSBMMTQsMTEgTDE0LDkgTDEyLDkgTDEyLDExIEwxMiwxMSBaIE0xMiw1IEwxNCw1IEwxNCwzIEwxMiwzIEwxMiw1IEwxMiw1IFogTTEyLDggTDE0LDggTDE0LDYgTDEyLDYgTDEyLDggTDEyLDggWiBNMTIsMCBMMTIsMiBMMTQsMiBMMTQsMCBMMTIsMCBMMTIsMCBaIE0yLDAgTDAsMCBMMCwyIEwyLDIgTDIsMCBMMiwwIFogTTIsMyBMMCwzIEwwLDUgTDIsNSBMMiwzIEwyLDMgWiBNMiw2IEwwLDYgTDAsOCBMMiw4IEwyLDYgTDIsNiBaIiBvcGFjaXR5PSIuNTQiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMCAxNCAxNCAxNCAxNCAxMiAwIDEyIi8+CiAgPC9nPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTYyLDM2KSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNiwxNCBMOCwxNCBMOCwxMiBMNiwxMiBMNiwxNCBMNiwxNCBaIE0zLDggTDUsOCBMNSw2IEwzLDYgTDMsOCBMMyw4IFogTTMsMiBMNSwyIEw1LDAgTDMsMCBMMywyIEwzLDIgWiBNNiwxMSBMOCwxMSBMOCw5IEw2LDkgTDYsMTEgTDYsMTEgWiBNMywxNCBMNSwxNCBMNSwxMiBMMywxMiBMMywxNCBMMywxNCBaIE0wLDUgTDIsNSBMMiwzIEwwLDMgTDAsNSBMMCw1IFogTTAsMTQgTDIsMTQgTDIsMTIgTDAsMTIgTDAsMTQgTDAsMTQgWiBNMCwyIEwyLDIgTDIsMCBMMCwwIEwwLDIgTDAsMiBaIE0wLDggTDIsOCBMMiw2IEwwLDYgTDAsOCBMMCw4IFogTTYsOCBMOCw4IEw4LDYgTDYsNiBMNiw4IEw2LDggWiBNMCwxMSBMMiwxMSBMMiw5IEwwLDkgTDAsMTEgTDAsMTEgWiBNMTIsMTEgTDE0LDExIEwxNCw5IEwxMiw5IEwxMiwxMSBMMTIsMTEgWiBNMTIsMTQgTDE0LDE0IEwxNCwxMiBMMTIsMTIgTDEyLDE0IEwxMiwxNCBaIE0xMiw4IEwxNCw4IEwxNCw2IEwxMiw2IEwxMiw4IEwxMiw4IFogTTEyLDUgTDE0LDUgTDE0LDMgTDEyLDMgTDEyLDUgTDEyLDUgWiBNMTIsMCBMMTIsMiBMMTQsMiBMMTQsMCBMMTIsMCBMMTIsMCBaIE02LDIgTDgsMiBMOCwwIEw2LDAgTDYsMiBMNiwyIFogTTksMiBMMTEsMiBMMTEsMCBMOSwwIEw5LDIgTDksMiBaIE02LDUgTDgsNSBMOCwzIEw2LDMgTDYsNSBMNiw1IFogTTksMTQgTDExLDE0IEwxMSwxMiBMOSwxMiBMOSwxNCBMOSwxNCBaIE05LDggTDExLDggTDExLDYgTDksNiBMOSw4IEw5LDggWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAyKSIgb3BhY2l0eT0iLjU0Ii8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxODAsMzYpIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02LjUsMy42MiBMMCwxMC4xMiBMMCwxMyBMMi44OCwxMyBMOS4zOCw2LjUgTDYuNSwzLjYyIFogTTExLjg1LDQuMDIgQzEyLjA1LDMuODIgMTIuMDUsMy41MSAxMS44NSwzLjMxIEw5LjY4LDEuMTQgQzkuNDgsMC45NCA5LjE3LDAuOTQgOC45NywxLjE0IEw3LjYyLDIuNSBMMTAuNSw1LjM4IEwxMS44NSw0LjAyIEwxMS44NSw0LjAyIFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTgsMzYpIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wLDAgTDE0LDAgTDE0LDIgTDAsMiBMMCwwIFogTTAsNCBMNiw0IEw2LDYgTDAsNiBMMCw0IFogTTAsOCBMMiw4IEwyLDEwIEwwLDEwIEwwLDggWiBNOCw0IEwxNCw0IEwxNCw2IEw4LDYgTDgsNCBaIE00LDggTDYsOCBMNiwxMCBMNCwxMCBMNCw4IFogTTgsOCBMMTAsOCBMMTAsMTAgTDgsMTAgTDgsOCBaIE0xMiw4IEwxNCw4IEwxNCwxMCBMMTIsMTAgTDEyLDggWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiA0KSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjE2LDM2KSI+PHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBwb2ludHM9Ii0yIDIgMiA2IDYgMiIgdHJhbnNmb3JtPSJyb3RhdGUoOTAgMyAxMCkiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzNCwzNikiPjxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgcG9pbnRzPSI3LjUzIDEuNTMgNi40NyAuNDcgNCAyLjk0IDEuNTMgLjQ3IC40NyAxLjUzIDIuOTQgNCAuNDcgNi40NyAxLjUzIDcuNTMgNCA1LjA2IDYuNDcgNy41MyA3LjUzIDYuNDcgNS4wNiA0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1IDUpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDU0KSI+PHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBwb2ludHM9IjguNDQgLjQ0IDUgMy44OCAxLjU2IC40NCAuNSAxLjUgNSA2IDkuNSAxLjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQgNikiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4LDU0KSI+PHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBwb2ludHM9IjUgMCAuNSA0LjUgMS41NiA1LjU2IDUgMi4xMiA4LjQ0IDUuNTYgOS41IDQuNSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCA2KSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzYsNTQpIj48cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHBvaW50cz0iOC40NCAuNDQgNSAzLjg4IDEuNTYgLjQ0IC41IDEuNSA1IDYgOS41IDEuNSIgdHJhbnNmb3JtPSJyb3RhdGUoOTAgNCA4KSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTQsNTQpIj48cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHBvaW50cz0iNSAwIC41IDQuNSAxLjU2IDUuNTYgNSAyLjEyIDguNDQgNS41NiA5LjUgNC41IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA0IDgpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3Miw1NCkiPjxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgcG9pbnRzPSIxMiA1IDMuMTI1IDUgNy4wNiAxLjA2IDYgMCAwIDYgNiAxMiA3LjA2IDEwLjk0IDMuMTI1IDcgMTIgNyIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTUgMykiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkwLDU0KSI+PHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBwb2ludHM9IjEyIDUgMy4xMjUgNSA3LjA2IDEuMDYgNiAwIDAgNiA2IDEyIDcuMDYgMTAuOTQgMy4xMjUgNyAxMiA3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzIDMpIi8+CjwvZz4KPC9zdmc+Cg==); + background-image: url('data:image/svg+xml,'); position: absolute; width: 262px; height: 444px; diff --git a/main.ts b/main.ts index 26e3fef..9e1894f 100644 --- a/main.ts +++ b/main.ts @@ -1,46 +1,139 @@ -import { App, Editor, MarkdownView, Modal, Notice, Plugin, PluginSettingTab, Setting, WorkspaceLeaf } from 'obsidian'; +import { TFile, Plugin, WorkspaceLeaf, normalizePath } from "obsidian"; +import { ExcelSettings, DEFAULT_SETTINGS } from "./src/utils/Settings"; +import { + emulateCTRLClickForLinks, + linkClickModifierType, + PaneTarget, +} from "./src/utils/ModifierkeyHelper"; +import { ExcelView, VIEW_TYPE_EXCEL } from "./src/ExcelView"; +import { + checkAndCreateFolder, + getNewUniqueFilepath, + getExcelFilename, +} from "./src/utils/FileUtils"; -import { ExcelView, VIEW_TYPE_EXCEL } from './src/ExcelView'; +import { getNewOrAdjacentLeaf } from "./src/utils/ObsidianUtils"; + +declare const PLUGIN_VERSION: string; export default class ExcelPlugin extends Plugin { + public settings: ExcelSettings; async onload() { - - this.registerView(VIEW_TYPE_EXCEL, (leaf: WorkspaceLeaf) => new ExcelView(leaf, this)); + this.registerView( + VIEW_TYPE_EXCEL, + (leaf: WorkspaceLeaf) => new ExcelView(leaf, this) + ); this.registerExtensions(["xlsx"], VIEW_TYPE_EXCEL); // This creates an icon in the left ribbon. - const ribbonIconEl = this.addRibbonIcon('table', 'Excel', (evt: MouseEvent) => { - // Called when the user clicks the icon. - new Notice('This is a notice!'); - }); + const ribbonIconEl = this.addRibbonIcon( + "table", + "Excel", + (e: MouseEvent) => { + // Called when the user clicks the icon. + this.createAndOpenExcel( + getExcelFilename(this.settings) + ); + } + ); // Perform additional things with the ribbon - ribbonIconEl.addClass('my-plugin-ribbon-class'); + ribbonIconEl.addClass("my-plugin-ribbon-class"); // This adds a status bar item to the bottom of the app. Does not work on mobile apps. const statusBarItemEl = this.addStatusBarItem(); - statusBarItemEl.setText('Status Bar Text'); - + statusBarItemEl.setText("Status Bar Text"); // If the plugin hooks up any global DOM events (on parts of the app that doesn't belong to this plugin) // Using this function will automatically remove the event listener when this plugin is disabled. - this.registerDomEvent(document, 'click', (evt: MouseEvent) => { - console.log('click', evt); + this.registerDomEvent(document, "click", (evt: MouseEvent) => { + console.log("click", evt); }); // When registering intervals, this function will automatically clear the interval when the plugin is disabled. - this.registerInterval(window.setInterval(() => console.log('setInterval'), 5 * 60 * 1000)); + this.registerInterval( + window.setInterval(() => console.log("setInterval"), 5 * 60 * 1000) + ); } - onunload() { + onunload() {} + async loadSettings() { + this.settings = Object.assign( + {}, + DEFAULT_SETTINGS, + await this.loadData() + ); } - // async loadSettings() { - // this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); - // } + async saveSettings() { + await this.saveData(this.settings); + } - // async saveSettings() { - // await this.saveData(this.settings); - // } + public async createExcel( + filename: string, + foldername?: string, + initData?: string + ): Promise { + // const folderpath = normalizePath( + // foldername ? foldername : "Excel" + // ); + // await checkAndCreateFolder(folderpath); //create folder if it does not exist + const fname = normalizePath(filename); + const file = await this.app.vault.create(fname, initData ?? "{}"); + + return file; + } + + public async createAndOpenExcel( + filename: string, + foldername?: string, + initData?: string + ): Promise { + const file = await this.createExcel(filename, foldername, initData); + this.openExcel(file, "new-pane", true, undefined); + return file.path; + } + + public openExcel( + excelFile: TFile, + location: PaneTarget, + active: boolean = false, + subpath?: string + ) { + if (location === "md-properties") { + location = "new-tab"; + } + var leaf: WorkspaceLeaf; + if (location === "popout-window") { + leaf = app.workspace.openPopoutLeaf(); + } + if (location === "new-tab") { + leaf = app.workspace.getLeaf("tab"); + } + if (!leaf) { + leaf = this.app.workspace.getLeaf(false); + if ( + leaf.view.getViewType() !== "empty" && + location === "new-pane" + ) { + leaf = app.workspace.getMostRecentLeaf(); + } + } + + leaf.openFile( + excelFile, + !subpath || subpath === "" + ? { active } + : { active, eState: { subpath } } + ).then(() => {}); + } + + public isExcelFile(f: TFile) { + if (!f) return false; + if (f.extension === "xlsx") { + return true; + } + return false + } } diff --git a/package-lock.json b/package-lock.json index e6c4e2c..98d3d73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -158,6 +158,15 @@ "dev": true, "optional": true }, + "@hyrious/esbuild-plugin-svgo": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@hyrious/esbuild-plugin-svgo/-/esbuild-plugin-svgo-0.2.0.tgz", + "integrity": "sha512-wg7OTGS/eOsV/+EXsFnnfyhdjGMsLtMlgbB0fdV8fM/5BZQ0VwJ561+IwzX9xEcTrFe8UBIUAH4xb4Xf+0j+dg==", + "dev": true, + "requires": { + "svgo": "^3.0.2" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -446,26 +455,26 @@ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" } }, "css-what": { @@ -475,12 +484,30 @@ "dev": true }, "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, "requires": { - "css-tree": "^1.1.2" + "css-tree": "~2.2.0" + }, + "dependencies": { + "css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "requires": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + } + }, + "mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + } } }, "debug": { @@ -502,14 +529,14 @@ } }, "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" } }, "domelementtype": { @@ -519,23 +546,23 @@ "dev": true }, "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "requires": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" } }, "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" } }, "encoding": { @@ -557,9 +584,9 @@ } }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true }, "errno": { @@ -612,15 +639,6 @@ "less": "^4.2.0" } }, - "esbuild-plugin-svg": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/esbuild-plugin-svg/-/esbuild-plugin-svg-0.1.0.tgz", - "integrity": "sha512-/9ZhvIpl+Ovl6glVK3BedvIwrOwSQnECw4Fy6ZwysWib3Ns7UkX6WNGjMOWtvQ1Cnm0uc7sptiKGm0BthKCAJA==", - "dev": true, - "requires": { - "svgo": "^2.2.2" - } - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -853,11 +871,6 @@ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "dev": true }, - "jquery": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz", - "integrity": "sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==" - }, "less": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", @@ -911,9 +924,9 @@ } }, "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true }, "merge2": { @@ -1211,12 +1224,13 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "optional": true }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true }, "string-width": { @@ -1257,18 +1271,17 @@ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" }, "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", + "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", "dev": true, "requires": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "css-select": "^5.1.0", + "css-tree": "^2.2.1", + "csso": "^5.0.5", + "picocolors": "^1.0.0" } }, "through": { diff --git a/package.json b/package.json index 0b8f5db..ae83df1 100644 --- a/package.json +++ b/package.json @@ -12,13 +12,13 @@ "author": "", "license": "MIT", "devDependencies": { + "@hyrious/esbuild-plugin-svgo": "^0.2.0", "@types/node": "^16.11.6", "@typescript-eslint/eslint-plugin": "5.29.0", "@typescript-eslint/parser": "5.29.0", "builtin-modules": "3.3.0", "esbuild": "0.17.3", "esbuild-plugin-less": "^1.2.4", - "esbuild-plugin-svg": "^0.1.0", "obsidian": "latest", "tslib": "2.4.0", "typescript": "4.7.4" diff --git a/src/ExcelView.ts b/src/ExcelView.ts index b40befa..2c20b8c 100644 --- a/src/ExcelView.ts +++ b/src/ExcelView.ts @@ -30,22 +30,22 @@ export class ExcelView extends TextFileView { }, }); - console.log(this.ownerWindow.document.documentElement.clientWidth); - const jsonData = JSON.parse(this.data || "{}") || {} + const jsonData = JSON.parse(this.data || "{}") || {}; + //@ts-ignore this.sheet = new Spreadsheet("#x-spreadsheet", { view: { height: () => this.contentEl.clientHeight, width: () => this.contentEl.clientWidth, - }, + }, }) - .loadData(jsonData) // load data - .change(data => { - // save data to db - this.data = JSON.stringify(data); - }); + .loadData(jsonData) // load data + .change((data) => { + // save data to db + this.data = JSON.stringify(data); + }); - this.sheet.validate() + this.sheet.validate(); } onload(): void { diff --git a/src/utils/FileUtils.ts b/src/utils/FileUtils.ts new file mode 100644 index 0000000..bbc8213 --- /dev/null +++ b/src/utils/FileUtils.ts @@ -0,0 +1,124 @@ + +import { normalizePath, Notice, TAbstractFile, TFile, TFolder, Vault } from "obsidian"; +import { ExcelSettings } from "./Settings"; + +/** + * Splits a full path including a folderpath and a filename into separate folderpath and filename components + * @param filepath + */ + +export function splitFolderAndFilename(filepath: string): { + folderpath: string; + filename: string; + basename: string; +} { + const lastIndex = filepath.lastIndexOf("/"); + const filename = lastIndex == -1 ? filepath : filepath.substring(lastIndex + 1); + return { + folderpath: normalizePath(filepath.substring(0, lastIndex)), + filename, + basename: filename.replace(/\.[^/.]+$/, ""), + }; +} + +/** + * Download data as file from Obsidian, to store on local device + * @param encoding + * @param data + * @param filename + */ + export const download = (encoding: string, data: any, filename: string) => { + const element = document.createElement("a"); + element.setAttribute("href", (encoding ? `${encoding},` : "") + data); + element.setAttribute("download", filename); + element.style.display = "none"; + document.body.appendChild(element); + element.click(); + document.body.removeChild(element); +} + +/** + * Generates the image filename based on the excalidraw filename + * @param excalidrawPath - Full filepath of ExclidrawFile + * @param newExtension - extension of IMG file in ".extension" format + * @returns + */ +/*export function getIMGPathFromExcalidrawFile( + excalidrawPath: string, + newExtension: string, +): string { + const isLegacyFile: boolean = excalidrawPath.endsWith(".excalidraw"); + const replaceExtension: string = isLegacyFile ? ".excalidraw" : ".md"; + return ( + excalidrawPath.substring(0, excalidrawPath.lastIndexOf(replaceExtension)) + + newExtension + ); +}*/ + +/** + * Generates the image filename based on the excalidraw filename + * @param path - path to the excalidraw file + * @param extension - extension without the preceeding "." + * @returns + */ +export function getIMGFilename(path: string, extension: string): string { + return `${path.substring(0, path.lastIndexOf("."))}.${extension}`; +} + +/** + * Create new file, if file already exists find first unique filename by adding a number to the end of the filename + * @param filename + * @param folderpath + * @returns + */ +export function getNewUniqueFilepath( + vault: Vault, + filename: string, + folderpath: string, +): string { + let fname = normalizePath(`${folderpath}/${filename}`); + let file: TAbstractFile = vault.getAbstractFileByPath(fname); + let i = 0; + const extension = filename.endsWith(".xlsx.md") + ? ".xlsx.md" + : filename.slice(filename.lastIndexOf(".")); + while (file) { + fname = normalizePath( + `${folderpath}/${filename.slice( + 0, + filename.lastIndexOf(extension), + )}_${i}${extension}`, + ); + i++; + file = vault.getAbstractFileByPath(fname); + } + return fname; +} + +export function getExcelFilename(settings: ExcelSettings): string { + return ( + "Excel " + + window.moment().format('YYYY-MM-DD HH.mm.ss') + + ".xlsx" + ); +} + + +/** + * Open or create a folderpath if it does not exist + * @param folderpath + */ +export async function checkAndCreateFolder(folderpath: string) { + const vault = app.vault; + folderpath = normalizePath(folderpath); + //https://github.com/zsviczian/obsidian-excalidraw-plugin/issues/658 + //@ts-ignore + const folder = vault.getAbstractFileByPathInsensitive(folderpath); + if (folder && folder instanceof TFolder) { + return; + } + if (folder && folder instanceof TFile) { + new Notice(`The folder cannot be created because it already exists as a file: ${folderpath}.`) + } + await vault.createFolder(folderpath); +} diff --git a/src/utils/ModifierkeyHelper.ts b/src/utils/ModifierkeyHelper.ts new file mode 100644 index 0000000..7175e0f --- /dev/null +++ b/src/utils/ModifierkeyHelper.ts @@ -0,0 +1,53 @@ + +export type PaneTarget = "active-pane"|"new-pane"|"popout-window"|"new-tab"|"md-properties"; +export type ModifierKeys = {shiftKey:boolean, ctrlKey: boolean, metaKey: boolean, altKey: boolean}; +export type KeyEvent = PointerEvent | MouseEvent | KeyboardEvent | ModifierKeys; + +export type DeviceType = { + isDesktop: boolean, + isPhone: boolean, + isTablet: boolean, + isMobile: boolean, + isLinux: boolean, + isMacOS: boolean, + isWindows: boolean, + isIOS: boolean, + isAndroid: boolean +}; + +export const DEVICE: DeviceType = { + isDesktop: !document.body.hasClass("is-tablet") && !document.body.hasClass("is-mobile"), + isPhone: document.body.hasClass("is-phone"), + isTablet: document.body.hasClass("is-tablet"), + isMobile: document.body.hasClass("is-mobile"), //running Obsidian Mobile, need to also check isTablet + isLinux: document.body.hasClass("mod-linux") && ! document.body.hasClass("is-android"), + isMacOS: document.body.hasClass("mod-macos") && ! document.body.hasClass("is-ios"), + isWindows: document.body.hasClass("mod-windows"), + isIOS: document.body.hasClass("is-ios"), + isAndroid: document.body.hasClass("is-android") +}; + +export const isCTRL = (e:KeyEvent) => DEVICE.isIOS || DEVICE.isMacOS ? e.metaKey : e.ctrlKey; +export const isALT = (e:KeyEvent) => e.altKey; +export const isMETA = (e:KeyEvent) => DEVICE.isIOS || DEVICE.isMacOS ? e.ctrlKey : e.metaKey; +export const isSHIFT = (e:KeyEvent) => e.shiftKey; +export const mdPropModifier = (ev: KeyEvent): boolean => !isSHIFT(ev) && isCTRL(ev) && !isALT(ev) && isMETA(ev); + +export const emulateCTRLClickForLinks = (e: KeyEvent) => { + return { + shiftKey: e.shiftKey, + ctrlKey: e.ctrlKey || !(DEVICE.isIOS || DEVICE.isMacOS), + metaKey: e.metaKey || (DEVICE.isIOS || DEVICE.isMacOS), + altKey: e.altKey + } +} + +export const linkClickModifierType = (ev: KeyEvent):PaneTarget => { + if(isCTRL(ev) && !isALT(ev) && isSHIFT(ev) && !isMETA(ev)) return "active-pane"; + if(isCTRL(ev) && !isALT(ev) && !isSHIFT(ev) && !isMETA(ev)) return "new-tab"; + if(isCTRL(ev) && isALT(ev) && !isSHIFT(ev) && !isMETA(ev)) return "new-pane"; + if(DEVICE.isDesktop && isCTRL(ev) && isALT(ev) && isSHIFT(ev) && !isMETA(ev) ) return "popout-window"; + if(isCTRL(ev) && isALT(ev) && isSHIFT(ev) && !isMETA(ev)) return "new-tab"; + if(mdPropModifier(ev)) return "md-properties"; + return "active-pane"; +} \ No newline at end of file diff --git a/src/utils/ObsidianUtils.ts b/src/utils/ObsidianUtils.ts new file mode 100644 index 0000000..e01da81 --- /dev/null +++ b/src/utils/ObsidianUtils.ts @@ -0,0 +1,126 @@ +import ExcelPlugin from "main"; +import { WorkspaceLeaf } from "obsidian"; + +const getLeafLoc = ( + leaf: WorkspaceLeaf +): ["main" | "popout" | "left" | "right" | "hover", any] => { + //@ts-ignore + const leafId = leaf.id; + const layout = app.workspace.getLayout(); + const getLeaves = (l: any) => + l.children + .filter((c: any) => c.type !== "leaf") + .map((c: any) => getLeaves(c)) + .flat() + .concat( + l.children + .filter((c: any) => c.type === "leaf") + .map((c: any) => c.id) + ); + + const mainLeavesIds = getLeaves(layout.main); + + return [ + layout.main && mainLeavesIds.contains(leafId) + ? "main" + : layout.floating && getLeaves(layout.floating).contains(leafId) + ? "popout" + : layout.left && getLeaves(layout.left).contains(leafId) + ? "left" + : layout.right && getLeaves(layout.right).contains(leafId) + ? "right" + : "hover", + mainLeavesIds, + ]; +}; + +/* +| Setting | Originating Leaf | +| | Main Workspace | Hover Editor | Popout Window | +| ----------------------- | -------------------------------- | -------------------------------------- | -------------------------------- | +| InMain && InAdjacent | 1.1 Reuse Leaf in Main Workspace | 1.1 Reuse Leaf in Main Workspace | 1.1 Reuse Leaf in Main Workspace | +| InMain && !InAdjacent | 1.2 New Leaf in Main Workspace | 1.2 New Leaf in Main Workspace | 1.2 New Leaf in Main Workspace | +| !InMain && InAdjacent | 1.1 Reuse Leaf in Main Workspace | 3 Reuse Leaf in Current Hover Editor | 4 Reuse Leaf in Current Popout | +| !InMain && !InAdjacent | 1.2 New Leaf in Main Workspace | 2 New Leaf in Current Hover Editor | 2 New Leaf in Current Popout | +*/ +export const getNewOrAdjacentLeaf = ( + plugin: ExcelPlugin, + leaf: WorkspaceLeaf +): WorkspaceLeaf | null => { + const [leafLoc, mainLeavesIds] = getLeafLoc(leaf); + + const getMostRecentOrAvailableLeafInMainWorkspace = ( + inDifferentTabGroup?: boolean + ): WorkspaceLeaf => { + let mainLeaf = app.workspace.getMostRecentLeaf(); + if ( + mainLeaf && + mainLeaf !== leaf && + mainLeaf.view?.containerEl.ownerDocument === document + ) { + //Found a leaf in the main workspace that is not the originating leaf + return mainLeaf; + } + //Iterate all leaves in the main workspace and find the first one that is not the originating leaf + mainLeaf = null; + mainLeavesIds.forEach((id: any) => { + const l = app.workspace.getLeafById(id); + if ( + mainLeaf || + !l.view?.navigation || + leaf === l || + //@ts-ignore + (inDifferentTabGroup && l?.parent === leaf?.parent) + ) + return; + mainLeaf = l; + }); + return mainLeaf; + }; + + //1 - In Main Workspace + if (["main", "left", "right"].contains(leafLoc) + ) { + //1.2 - Reuse leaf if it is adjacent + const ml = getMostRecentOrAvailableLeafInMainWorkspace(true); + return ml ?? app.workspace.createLeafBySplit(leaf); //app.workspace.getLeaf(true); + } + + //3 + if (leafLoc === "hover") { + const leaves = new Set(); + app.workspace.iterateAllLeaves((l) => { + //@ts-ignore + if ( + l !== leaf && + leaf.containerEl.parentElement === l.containerEl.parentElement + ) + leaves.add(l); + }); + if (leaves.size === 0) { + return plugin.app.workspace.createLeafBySplit(leaf); + } + return Array.from(leaves)[0]; + } + + //4 + if (leafLoc === "popout") { + const popoutLeaves = new Set(); + app.workspace.iterateAllLeaves((l) => { + if ( + l !== leaf && + l.view.navigation && + l.view.containerEl.ownerDocument === + leaf.view.containerEl.ownerDocument + ) { + popoutLeaves.add(l); + } + }); + if (popoutLeaves.size === 0) { + return app.workspace.createLeafBySplit(leaf); + } + return Array.from(popoutLeaves)[0]; + } + + return plugin.app.workspace.createLeafBySplit(leaf); +}; diff --git a/src/utils/Settings.ts b/src/utils/Settings.ts new file mode 100644 index 0000000..61e7f06 --- /dev/null +++ b/src/utils/Settings.ts @@ -0,0 +1,15 @@ +export interface ExcelSettings { + folder: string; + excelFilenamePrefix: String, + excelEmbedPrefixWithFilename: true, + excelFilnameEmbedPostfix: String, + excelFilenameDateTime: String, +} + +export const DEFAULT_SETTINGS: ExcelSettings = { + folder: "Excel", + excelFilenamePrefix: "Excel ", + excelEmbedPrefixWithFilename: true, + excelFilnameEmbedPostfix: " ", + excelFilenameDateTime: "YYYY-MM-DD HH.mm.ss", +}; diff --git a/styles.css b/styles.css index f6defe6..e11483f 100644 --- a/styles.css +++ b/styles.css @@ -1,16 +1,17 @@ +.sheet-box { + /* position: absolute; + left: 0; + top: 40px; */ + width: 100%; + height: 100%; + margin: -16px; + padding: 0; +} + /* node_modules/x-data-spreadsheet/src/index.less */ body { margin: 0; } -.sheet-box { - /* position: absolute; - left: 0; - top: 40px; */ - width: 100%; - height: 100%; - margin: -16px; - padding: 0; -} .x-spreadsheet { font-size: 13px; line-height: normal; @@ -877,7 +878,7 @@ form fieldset select { display: inline-block; } .x-spreadsheet-icon .x-spreadsheet-icon-img { - background-image: url(data:text/plain;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIiB4PSIwIiB5PSIwIiB3aWR0aD0iMjYycHgiIGhlaWdodD0iNzJweCIgdmlld0JveD0iMCAwIDI2MiA3MiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTEuNTY1NjM5MSw0LjQzNDM2MDg4IEw5LDcgTDE2LDcgTDE2LDAgTDEzLjA0MTg0MjQsMi45NTgxNTc1OCBDMTEuNTkzNjc4NywxLjczNjM1OTU5IDkuNzIyNjA3NzUsMSA3LjY3OTU1MDgzLDEgQzQuMjIxMjYyNTgsMSAxLjI1NTc1NTk5LDMuMTA5ODQ5MDggMCw2IEwyLDcgQzIuOTM2NTg3NzUsNC42MDk3NDQwNiA1LjEyOTQzNjk3LDMuMDgwMTEyMjkgNy42Nzk1NTA4MywzIEM5LjE0ODgxMjQ3LDMuMDUyODc0NyAxMC40OTk0NzgzLDMuNTc4NjIwNTMgMTEuNTY1NjM5MSw0LjQzNDM2MDg4IFoiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDE3IDUpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOCwwKSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTEuNTY1NjM5MSw0LjQzNDM2MDg4IEw5LDcgTDE2LDcgTDE2LDAgTDEzLjA0MTg0MjQsMi45NTgxNTc1OCBDMTEuNTkzNjc4NywxLjczNjM1OTU5IDkuNzIyNjA3NzUsMSA3LjY3OTU1MDgzLDEgQzQuMjIxMjYyNTgsMSAxLjI1NTc1NTk5LDMuMTA5ODQ5MDggMCw2IEwyLDcgQzIuOTM2NTg3NzUsNC42MDk3NDQwNiA1LjEyOTQzNjk3LDMuMDgwMTEyMjkgNy42Nzk1NTA4MywzIEM5LjE0ODgxMjQ3LDMuMDUyODc0NyAxMC40OTk0NzgzLDMuNTc4NjIwNTMgMTEuNTY1NjM5MSw0LjQzNDM2MDg4IFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEgNSkiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM2LDApIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMywxNCBMMywxNCBMMywxMSBMMCwxMSBMMCw2LjAwNTkxOTA1IEMwLDQuODk4MDgwNTUgMC44OTQ1MTM3NTYsNCAxLjk5NDA2MDI4LDQgTDE0LjAwNTkzOTcsNCBDMTUuMTA3MjI4OCw0IDE2LDQuODg2NTU0ODQgMTYsNi4wMDU5MTkwNSBMMTYsMTEgTDEzLDExIEwxMywxNCBaIE01LDkgTDExLDkgTDExLDEyIEw1LDEyIEw1LDkgWiBNMywwIEwxMywwIEwxMywzIEwzLDMgTDMsMCBaIE0xMiw2IEwxNCw2IEwxNCw4IEwxMiw4IEwxMiw2IFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEgMikiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU0LDApIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik05LDAgTDEsMCBDMC40NSwwIDAsMC40NSAwLDEgTDAsNCBDMCw0LjU1IDAuNDUsNSAxLDUgTDksNSBDOS41NSw1IDEwLDQuNTUgMTAsNCBMMTAsMyBMMTEsMyBMMTEsNiBMNCw2IEw0LDE0IEw2LDE0IEw2LDggTDEzLDggTDEzLDIgTDEwLDIgTDEwLDEgQzEwLDAuNDUgOS41NSwwIDksMCBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzIDIpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MiwwKSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMC4yNywxLjU1IEw1LjQzLDYuNyBMMywxMiBMNS41LDEyIEw3LjE0LDguNDIgTDExLjczLDEzIEwxMywxMS43MyBMMS41NSwwLjI3IEwwLjI3LDEuNTUgTDAuMjcsMS41NSBaIE0zLjgyLDAgTDUuODIsMiBMNy41OCwyIEw3LjAzLDMuMjEgTDguNzQsNC45MiBMMTAuMDgsMiBMMTQsMiBMMTQsMCBMMy44MiwwIEwzLjgyLDAgWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAzKSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTAsMCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTksMy41IEM5LDEuNTcgNy40MywwIDUuNSwwIEwxLjc3NjM1Njg0ZS0xNSwwIEwxLjc3NjM1Njg0ZS0xNSwxMiBMNi4yNSwxMiBDOC4wNCwxMiA5LjUsMTAuNTQgOS41LDguNzUgQzkuNSw3LjQ1IDguNzMsNi4zNCA3LjYzLDUuODIgQzguNDYsNS4yNCA5LDQuMzggOSwzLjUgWiBNNSwyIEM1LjgyOTk5OTkyLDIgNi41LDIuNjcgNi41LDMuNSBDNi41LDQuMzMgNS44Mjk5OTk5Miw1IDUsNSBMMyw1IEwzLDIgTDUsMiBaIE0zLDEwIEwzLDcgTDUuNSw3IEM2LjMyOTk5OTkyLDcgNyw3LjY3IDcsOC41IEM3LDkuMzMgNi4zMjk5OTk5MiwxMCA1LjUsMTAgTDMsMTAgWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAzKSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTA4LDApIj48cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHBvaW50cz0iNCAwIDQgMiA2LjU4IDIgMi45MiAxMCAwIDEwIDAgMTIgOCAxMiA4IDEwIDUuNDIgMTAgOS4wOCAyIDEyIDIgMTIgMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMyAzKSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTI2LDApIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBkPSJNNiwxMiBDOC43NiwxMiAxMSw5Ljc2IDExLDcgTDExLDAgTDksMCBMOSw3IEM5LDguNzUwMjk5MTYgNy40OTkxMjgwNywxMCA2LDEwIEM0LjUwMDg3MTkzLDEwIDMsOC43NTgzNzQ4NiAzLDcgTDMsMCBMMSwwIEwxLDcgQzEsOS43NiAzLjI0LDEyIDYsMTIgWiBNMCwxMyBMMCwxNSBMMTIsMTUgTDEyLDEzIEwwLDEzIFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMgMykiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE0NCwwKSI+PHBhdGggZmlsbD0iIzAxMDEwMSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMi44ODc1LDMuMDYgQzIuODg3NSwyLjYwMjUgMi45ODUsMi4xODYyNSAzLjE4Mzc1LDEuODA3NSBDMy4zODI1LDEuNDI4NzUgMy42NiwxLjEwNjI1IDQuMDIsMC44NCBDNC4zOCwwLjU3Mzc1IDQuODAzNzUsMC4zNjc1IDUuMjk4NzUsMC4yMjEyNSBDNS43OTM3NSwwLjA3NSA2LjMzMzc1LDAgNi45MjYyNSwwIEM3LjUzMzc1LDAgOC4wODUsMC4wODI1IDguNTgsMC4yNTEyNSBDOS4wNzUsMC40MiA5LjQ5ODc1LDAuNjUyNSA5Ljg1MTI1LDAuOTU2MjUgQzEwLjIwMzc1LDEuMjU2MjUgMTAuNDczNzUsMS42MTI1IDEwLjY2NSwyLjAyODc1IEMxMC44NTYyNSwyLjQ0MTI1IDEwLjk1LDIuODk1IDEwLjk1LDMuMzg2MjUgTDguNjkyNSwzLjM4NjI1IEM4LjY5MjUsMy4xNTc1IDguNjU1LDIuOTQzNzUgOC41ODM3NSwyLjc0ODc1IEM4LjUxMjUsMi41NSA4LjQsMi4zODEyNSA4LjI1LDIuMjQyNSBDOC4xLDIuMTAzNzUgNy45MTI1LDEuOTkxMjUgNy42ODc1LDEuOTE2MjUgQzcuNDYyNSwxLjgzNzUgNy4xOTYyNSwxLjggNi44ODg3NSwxLjggQzYuNTkyNSwxLjggNi4zMzc1LDEuODMzNzUgNi4xMTYyNSwxLjg5NzUgQzUuODk4NzUsMS45NjEyNSA1LjcxODc1LDIuMDUxMjUgNS41NzYyNSwyLjE2NzUgQzUuNDMzNzUsMi4yODM3NSA1LjMyNSwyLjQxODc1IDUuMjUzNzUsMi41NzI1IEM1LjE4MjUsMi43MjYyNSA1LjE0NSwyLjg5NSA1LjE0NSwzLjA2NzUgQzUuMTQ1LDMuNDI3NSA1LjMyODc1LDMuNzMxMjUgNS42OTYyNSwzLjk3NSBDNS43MTc4MDIwMywzLjk4OTA4MDY2IDUuNzM5NDIwMTIsNC4wMDMxMTcyOCA1Ljc2MTE4MzU3LDQuMDE3MzMzMTUgQzYuMDIzNDI5MjMsNC4xODg2MzE4NSA2LjUsNC41IDcsNSBMNCw1IEM0LDUgMy4yMTM3NSw0LjM3NjI1IDMuMTc2MjUsNC4zMDg3NSBDMi45ODUsMy45NTI1IDIuODg3NSwzLjUzNjI1IDIuODg3NSwzLjA2IFogTTE0LDYgTDAsNiBMMCw4IEw3LjIxODc1LDggQzcuMzUzNzUsOC4wNTI1IDcuNTE4NzUsOC4xMDUgNy42MzEyNSw4LjE1Mzc1IEM3LjkwODc1LDguMjc3NSA4LjEyNjI1LDguNDA4NzUgOC4yODM3NSw4LjUzNjI1IEM4LjQ0MTI1LDguNjY3NSA4LjU0NjI1LDguODEgOC42MDI1LDguOTYgQzguNjU4NzUsOS4xMTM3NSA4LjY4NSw5LjI4NjI1IDguNjg1LDkuNDczNzUgQzguNjg1LDkuNjUgOC42NTEyNSw5LjgxNSA4LjU4Mzc1LDkuOTY1IEM4LjUxNjI1LDEwLjExODc1IDguNDExMjUsMTAuMjUgOC4yNzI1LDEwLjM1ODc1IEM4LjEzMzc1LDEwLjQ2NzUgNy45NTM3NSwxMC41NTM3NSA3Ljc0LDEwLjYxNzUgQzcuNTIyNSwxMC42ODEyNSA3LjI3MTI1LDEwLjcxMTI1IDYuOTc4NzUsMTAuNzExMjUgQzYuNjUyNSwxMC43MTEyNSA2LjM1NjI1LDEwLjY3NzUgNi4wOSwxMC42MTM3NSBDNS44MjM3NSwxMC41NSA1LjU5ODc1LDEwLjQ0NSA1LjQxMTI1LDEwLjMwMjUgQzUuMjIzNzUsMTAuMTYgNS4wNzc1LDkuOTcyNSA0Ljk3MjUsOS43NDM3NSBDNC44Njc1LDkuNTE1IDQuNzgxMjUsOS4xNyA0Ljc4MTI1LDkgTDIuNTUsOSBDMi41NSw5LjI1MjUgMi42MSw5LjY4NzUgMi43MjYyNSwxMC4wMjUgQzIuODQyNSwxMC4zNjI1IDMuMDA3NSwxMC42NjYyNSAzLjIxMzc1LDEwLjkzMjUgQzMuNDIsMTEuMTk4NzUgMy42Njc1LDExLjQyNzUgMy45NDg3NSwxMS42MjI1IEM0LjIzLDExLjgxNzUgNC41MzM3NSwxMS45ODI1IDQuODYzNzUsMTIuMTEgQzUuMTkzNzUsMTIuMjQxMjUgNS41MzUsMTIuMzM4NzUgNS44OTg3NSwxMi4zOTg3NSBDNi4yNTg3NSwxMi40NjI1IDYuNjIyNSwxMi40OTI1IDYuOTgyNSwxMi40OTI1IEM3LjU4MjUsMTIuNDkyNSA4LjEzLDEyLjQyNSA4LjYxNzUsMTIuMjg2MjUgQzkuMTA1LDEyLjE0NzUgOS41MjUsMTEuOTQ4NzUgOS44NywxMS42OTM3NSBDMTAuMjE1LDExLjQzNSAxMC40ODEyNSwxMS4xMiAxMC42NzI1LDEwLjc0MTI1IEMxMC44NjM3NSwxMC4zNjI1IDEwLjk1Mzc1LDkuOTM1IDEwLjk1Mzc1LDkuNDU1IEMxMC45NTM3NSw5LjAwNSAxMC44NzUsOC42IDEwLjcyMTI1LDguMjQzNzUgQzEwLjY4Mzc1LDguMTU3NSAxMC42NDI1LDguMDc1IDEwLjU5Mzc1LDcuOTkyNSBMMTQsOCBMMTQsNiBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDMpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjIsMCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTcsMCBMNSwwIEwwLjUsMTIgTDIuNSwxMiBMMy42Miw5IEw4LjM3LDkgTDkuNDksMTIgTDExLjQ5LDEyIEw3LDAgTDcsMCBaIE00LjM4LDcgTDYsMi42NyBMNy42Miw3IEw0LjM4LDcgTDQuMzgsNyBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzIDEpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxODAsMCkiPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICA8cGF0aCBmaWxsPSIjMDAwMDAwIiBkPSJNMTQuNSw4Ljg3IEMxNC41LDguODcgMTMsMTAuNDkgMTMsMTEuNDkgQzEzLDEyLjMyIDEzLjY3LDEyLjk5IDE0LjUsMTIuOTkgQzE1LjMzLDEyLjk5IDE2LDEyLjMyIDE2LDExLjQ5IEMxNiwxMC41IDE0LjUsOC44NyAxNC41LDguODcgTDE0LjUsOC44NyBaIE0xMi43MSw2Ljc5IEw1LjkxLDAgTDQuODUsMS4wNiBMNi40NCwyLjY1IEwyLjI5LDYuNzkgQzEuOSw3LjE4IDEuOSw3LjgxIDIuMjksOC4yIEw2Ljc5LDEyLjcgQzYuOTksMTIuOSA3LjI0LDEzIDcuNSwxMyBDNy43NiwxMyA4LjAxLDEyLjkgOC4yMSwxMi43MSBMMTIuNzEsOC4yMSBDMTMuMSw3LjgyIDEzLjEsNy4xOCAxMi43MSw2Ljc5IEwxMi43MSw2Ljc5IFogTTQuMjEsNyBMNy41LDMuNzEgTDEwLjc5LDcgTDQuMjEsNyBMNC4yMSw3IFoiLz4KICA8L2c+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTgsMCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTMsNiBMMSw2IEwxLDIgTDgsMiBMOCw0IEwzLDQgTDMsNiBaIE0xMCw0IEwxMCwyIEwxNywyIEwxNyw2IEwxNSw2IEwxNSw0IEwxMCw0IFogTTEwLDE0IEwxNSwxNCBMMTUsMTIgTDE3LDEyIEwxNywxNiBMMTAsMTYgTDEwLDE0IFogTTEsMTIgTDMsMTIgTDMsMTQgTDgsMTQgTDgsMTYgTDEsMTYgTDEsMTIgWiBNMSw4IEw1LDggTDUsNiBMOCw5IEw1LDEyIEw1LDEwIEwxLDEwIEwxLDggWiBNMTAsOSBMMTMsNiBMMTMsOCBMMTcsOCBMMTcsMTAgTDEzLDEwIEwxMywxMiBMMTAsOSBaIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMTYsMCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTAsMTQgTDEwLDE0IEwxMCwxMiBMMCwxMiBMMCwxNCBaIE0xMCw0IEwwLDQgTDAsNiBMMTAsNiBMMTAsNCBaIE0wLDAgTDAsMiBMMTQsMiBMMTQsMCBMMCwwIFogTTAsMTAgTDE0LDEwIEwxNCw4IEwwLDggTDAsMTAgWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAyKSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjM0LDApIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yLDEyIEwyLDE0IEwxMiwxNCBMMTIsMTIgTDIsMTIgWiBNMiw0IEwyLDYgTDEyLDYgTDEyLDQgTDIsNCBaIE0wLDEwIEwxNCwxMCBMMTQsOCBMMCw4IEwwLDEwIFogTTAsMCBMMCwyIEwxNCwyIEwxNCwwIEwwLDAgWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAyKSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxOCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTQsMTQgTDE0LDE0IEwxNCwxMiBMNCwxMiBMNCwxNCBaIE0wLDEwIEwxNCwxMCBMMTQsOCBMMCw4IEwwLDEwIFogTTAsMCBMMCwyIEwxNCwyIEwxNCwwIEwwLDAgWiBNNCw2IEwxNCw2IEwxNCw0IEw0LDQgTDQsNiBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOCwxOCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTAsMCBMMCwyIEwxMiwyIEwxMiwwIEwwLDAgTDAsMCBaIE0yLjUsNyBMNSw3IEw1LDE0IEw3LDE0IEw3LDcgTDkuNSw3IEw2LDMuNSBMMi41LDcgTDIuNSw3IFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMgMikiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM2LDE4KSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOS41LDMgTDcsMyBMNywwIEw1LDAgTDUsMyBMMi41LDMgTDYsNi41IEw5LjUsMyBMOS41LDMgWiBNMCw4IEwwLDEwIEwxMiwxMCBMMTIsOCBMMCw4IEwwLDggWiBNMi41LDE1IEw1LDE1IEw1LDE4IEw3LDE4IEw3LDE1IEw5LjUsMTUgTDYsMTEuNSBMMi41LDE1IEwyLjUsMTUgWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMykiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU0LDE4KSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNOS41LDcgTDcsNyBMNywwIEw1LDAgTDUsNyBMMi41LDcgTDYsMTAuNSBMOS41LDcgTDkuNSw3IFogTTAsMTIgTDAsMTQgTDEyLDE0IEwxMiwxMiBMMCwxMiBMMCwxMiBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzIDIpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MiwxOCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTE0LDAgTDAsMCBMMCwyIEwxNCwyIEwxNCwwIFogTTAsMTIgTDQsMTIgTDQsMTAgTDAsMTAgTDAsMTIgWiBNMTEuNSw1IEwwLDUgTDAsNyBMMTEuNzUsNyBDMTIuNTgsNyAxMy4yNSw3LjY3IDEzLjI1LDguNSBDMTMuMjUsOS4zMyAxMi41OCwxMCAxMS43NSwxMCBMOSwxMCBMOSw4IEw2LDExIEw5LDE0IEw5LDEyIEwxMS41LDEyIEMxMy40MywxMiAxNSwxMC40MyAxNSw4LjUgQzE1LDYuNTcgMTMuNDMsNSAxMS41LDUgWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAzKSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTAsMTgpIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wLDAgTDAsMSBMNiw3IEw2LDEyIEw4LDExIEw4LDcgTDE0LDEgTDE0LDAgTDAsMCBaIE00LDMgTDEwLDMgTDcsNiBMNCwzIFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMykiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwOCwxOCkiPjxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgcG9pbnRzPSIxMCAwIDAgMCAwIDEuOCA1LjUgNyAwIDEyLjIgMCAxNCAxMCAxNCAxMCAxMiAzLjEgMTIgOCA3IDMuMSAyIDEwIDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQgMikiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyNiwxOCkiPjxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgcG9pbnRzPSIwIDAgNCA0IDggMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSA3KSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQ0LDE4KSI+PHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBwb2ludHM9Ii0yIDIgMiA2IDYgMiIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDggMykiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2MiwxOCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTEuOSw0IEMxLjksMi44NCAyLjg0LDEuOSA0LDEuOSBMOCwxLjkgTDgsMCBMNCwwIEMxLjc5LDAgMCwxLjc5IDAsNCBDMCw2LjIxIDEuNzksOCA0LDggTDgsOCBMOCw2LjEgTDQsNi4xIEMyLjg0LDYuMSAxLjksNS4xNiAxLjksNCBMMS45LDQgWiBNMTQsMCBMMTAsMCBMMTAsMS45IEwxNCwxLjkgQzE1LjE2LDEuOSAxNi4xLDIuODQgMTYuMSw0IEMxNi4xLDUuMTYgMTUuMTYsNi4xIDE0LDYuMSBMMTAsNi4xIEwxMCw4IEwxNCw4IEMxNi4yMSw4IDE4LDYuMjEgMTgsNCBDMTgsMS43OSAxNi4yMSwwIDE0LDAgTDE0LDAgWiBNNiw1IEwxMiw1IEwxMiwzIEw2LDMgTDYsNSBMNiw1IFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgNSkiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4MCwxOCkiPjxwYXRoIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTE1LDAgQzE1LjU1LDAgMTYsMC40NSAxNiwxIEwxNiwxNSBDMTYsMTUuNTUgMTUuNTUsMTYgMTUsMTYgTDEsMTYgQzAuNDUsMTYgMCwxNS41NSAwLDE1IEwwLDEgQzAsMC40NSAwLjQ1LDAgMSwwIEwxNSwwIFogTTIsMiBMMiwxNCBMMTQsMTQgTDE0LDIgTDIsMiBaIE02LDEyIEw0LDEyIEw0LDcgTDYsNyBMNiwxMiBMNiwxMiBaIE05LDEyIEw3LDEyIEw3LDQgTDksNCBMOSwxMiBMOSwxMiBaIE0xMiwxMiBMMTAsMTIgTDEwLDggTDEyLDggTDEyLDEyIEwxMiwxMiBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxIDEpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTgsMTgpIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgPHBhdGggc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMS41IDMuNUgxNi41VjE1LjVIMS41eiIvPgogICAgPHBhdGggZmlsbD0iIzAwMDAwMCIgZD0iTTYgOEg3VjE1SDZ6Ii8+CiAgICA8cGF0aCBmaWxsPSIjRDhEOEQ4IiBkPSJNMiA0SDE2VjdIMnoiLz4KICAgIDxwYXRoIGZpbGw9IiMwMDAwMDAiIGQ9Ik0yIDdIMTZWOEgyek0yIDExSDE2VjEySDJ6Ii8+CiAgPC9nPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjE2LDE4KSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMiwwLjUgQzEuMTcsMC41IDAuNSwxLjE3IDAuNSwyIEMwLjUsMi44MyAxLjE3LDMuNSAyLDMuNSBDMi44MywzLjUgMy41LDIuODMgMy41LDIgQzMuNSwxLjE3IDIuODMsMC41IDIsMC41IEwyLDAuNSBaIE0xMiwwLjUgQzExLjE3LDAuNSAxMC41LDEuMTcgMTAuNSwyIEMxMC41LDIuODMgMTEuMTcsMy41IDEyLDMuNSBDMTIuODMsMy41IDEzLjUsMi44MyAxMy41LDIgQzEzLjUsMS4xNyAxMi44MywwLjUgMTIsMC41IEwxMiwwLjUgWiBNNywwLjUgQzYuMTcsMC41IDUuNSwxLjE3IDUuNSwyIEM1LjUsMi44MyA2LjE3LDMuNSA3LDMuNSBDNy44MywzLjUgOC41LDIuODMgOC41LDIgQzguNSwxLjE3IDcuODMsMC41IDcsMC41IEw3LDAuNSBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDcpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzQsMTgpIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02LDQgTDYsMCBMNCwwIEw0LDQgTDAsNCBMMCw2IEw0LDYgTDQsMTAgTDYsMTAgTDYsNiBMMTAsNiBMMTAsNCBMNiw0IFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQgNCkiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMzYpIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wLDAgTDAsMTQgTDE0LDE0IEwxNCwwIEwwLDAgTDAsMCBaIE02LDEyIEwyLDEyIEwyLDggTDYsOCBMNiwxMiBMNiwxMiBaIE02LDYgTDIsNiBMMiwyIEw2LDIgTDYsNiBMNiw2IFogTTEyLDEyIEw4LDEyIEw4LDggTDEyLDggTDEyLDEyIEwxMiwxMiBaIE0xMiw2IEw4LDYgTDgsMiBMMTIsMiBMMTIsNiBMMTIsNiBaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOCwzNikiPgogIDxnIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAyKSI+CiAgICA8cGF0aCBkPSJNMCwxNCBMMiwxNCBMMiwxMiBMMCwxMiBMMCwxNCBMMCwxNCBaIE0yLDMgTDAsMyBMMCw1IEwyLDUgTDIsMyBMMiwzIFogTTMsMTQgTDUsMTQgTDUsMTIgTDMsMTIgTDMsMTQgTDMsMTQgWiBNMTEsMCBMOSwwIEw5LDIgTDExLDIgTDExLDAgTDExLDAgWiBNMiwwIEwwLDAgTDAsMiBMMiwyIEwyLDAgTDIsMCBaIE01LDAgTDMsMCBMMywyIEw1LDIgTDUsMCBMNSwwIFogTTAsMTEgTDIsMTEgTDIsOSBMMCw5IEwwLDExIEwwLDExIFogTTksMTQgTDExLDE0IEwxMSwxMiBMOSwxMiBMOSwxNCBMOSwxNCBaIE0xMiwwIEwxMiwyIEwxNCwyIEwxNCwwIEwxMiwwIEwxMiwwIFogTTEyLDUgTDE0LDUgTDE0LDMgTDEyLDMgTDEyLDUgTDEyLDUgWiBNMTIsMTQgTDE0LDE0IEwxNCwxMiBMMTIsMTIgTDEyLDE0IEwxMiwxNCBaIE0xMiwxMSBMMTQsMTEgTDE0LDkgTDEyLDkgTDEyLDExIEwxMiwxMSBaIiBvcGFjaXR5PSIuNTQiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iOCAwIDYgMCA2IDYgMCA2IDAgOCA2IDggNiAxNCA4IDE0IDggOCAxNCA4IDE0IDYgOCA2Ii8+CiAgPC9nPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzYsMzYpIj4KICA8ZyBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMikiPgogICAgPHBhdGggZD0iTTYsMTQgTDgsMTQgTDgsMTIgTDYsMTIgTDYsMTQgTDYsMTQgWiBNMywyIEw1LDIgTDUsMCBMMywwIEwzLDIgTDMsMiBaIE02LDExIEw4LDExIEw4LDkgTDYsOSBMNiwxMSBMNiwxMSBaIE0zLDE0IEw1LDE0IEw1LDEyIEwzLDEyIEwzLDE0IEwzLDE0IFogTTAsNSBMMiw1IEwyLDMgTDAsMyBMMCw1IEwwLDUgWiBNMCwxNCBMMiwxNCBMMiwxMiBMMCwxMiBMMCwxNCBMMCwxNCBaIE0wLDIgTDIsMiBMMiwwIEwwLDAgTDAsMiBMMCwyIFogTTAsMTEgTDIsMTEgTDIsOSBMMCw5IEwwLDExIEwwLDExIFogTTEyLDExIEwxNCwxMSBMMTQsOSBMMTIsOSBMMTIsMTEgTDEyLDExIFogTTEyLDE0IEwxNCwxNCBMMTQsMTIgTDEyLDEyIEwxMiwxNCBMMTIsMTQgWiBNMTIsNSBMMTQsNSBMMTQsMyBMMTIsMyBMMTIsNSBMMTIsNSBaIE0xMiwwIEwxMiwyIEwxNCwyIEwxNCwwIEwxMiwwIEwxMiwwIFogTTYsMiBMOCwyIEw4LDAgTDYsMCBMNiwyIEw2LDIgWiBNOSwyIEwxMSwyIEwxMSwwIEw5LDAgTDksMiBMOSwyIFogTTYsNSBMOCw1IEw4LDMgTDYsMyBMNiw1IEw2LDUgWiBNOSwxNCBMMTEsMTQgTDExLDEyIEw5LDEyIEw5LDE0IEw5LDE0IFoiIG9wYWNpdHk9Ii41NCIvPgogICAgPHBvbHlnb24gcG9pbnRzPSIwIDggMTQgOCAxNCA2IDAgNiIvPgogIDwvZz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU0LDM2KSI+CiAgPGcgZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIj4KICAgIDxwYXRoIGQ9Ik0zLDE0IEw1LDE0IEw1LDEyIEwzLDEyIEwzLDE0IEwzLDE0IFogTTAsNSBMMiw1IEwyLDMgTDAsMyBMMCw1IEwwLDUgWiBNMCwyIEwyLDIgTDIsMCBMMCwwIEwwLDIgTDAsMiBaIE0zLDggTDUsOCBMNSw2IEwzLDYgTDMsOCBMMyw4IFogTTMsMiBMNSwyIEw1LDAgTDMsMCBMMywyIEwzLDIgWiBNMCwxNCBMMiwxNCBMMiwxMiBMMCwxMiBMMCwxNCBMMCwxNCBaIE0wLDggTDIsOCBMMiw2IEwwLDYgTDAsOCBMMCw4IFogTTAsMTEgTDIsMTEgTDIsOSBMMCw5IEwwLDExIEwwLDExIFogTTEyLDAgTDEyLDIgTDE0LDIgTDE0LDAgTDEyLDAgTDEyLDAgWiBNMTIsOCBMMTQsOCBMMTQsNiBMMTIsNiBMMTIsOCBMMTIsOCBaIE0xMiwxNCBMMTQsMTQgTDE0LDEyIEwxMiwxMiBMMTIsMTQgTDEyLDE0IFogTTEyLDUgTDE0LDUgTDE0LDMgTDEyLDMgTDEyLDUgTDEyLDUgWiBNMTIsMTEgTDE0LDExIEwxNCw5IEwxMiw5IEwxMiwxMSBMMTIsMTEgWiBNOSwxNCBMMTEsMTQgTDExLDEyIEw5LDEyIEw5LDE0IEw5LDE0IFogTTksOCBMMTEsOCBMMTEsNiBMOSw2IEw5LDggTDksOCBaIE05LDIgTDExLDIgTDExLDAgTDksMCBMOSwyIEw5LDIgWiIgb3BhY2l0eT0iLjU0Ii8+CiAgICA8cG9seWdvbiBwb2ludHM9IjYgMTQgOCAxNCA4IDAgNiAwIi8+CiAgPC9nPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzIsMzYpIj4KICA8ZyBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMikiPgogICAgPHBhdGggZD0iTTgsMyBMNiwzIEw2LDUgTDgsNSBMOCwzIEw4LDMgWiBNMTEsNiBMOSw2IEw5LDggTDExLDggTDExLDYgTDExLDYgWiBNOCw2IEw2LDYgTDYsOCBMOCw4IEw4LDYgTDgsNiBaIE04LDkgTDYsOSBMNiwxMSBMOCwxMSBMOCw5IEw4LDkgWiBNNSw2IEwzLDYgTDMsOCBMNSw4IEw1LDYgTDUsNiBaIiBvcGFjaXR5PSIuNTQiLz4KICAgIDxwYXRoIGQ9Ik0wLDAgTDE0LDAgTDE0LDE0IEwwLDE0IEwwLDAgWiBNMTIsMTIgTDEyLDIgTDIsMiBMMiwxMiBMMTIsMTIgWiIvPgogIDwvZz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkwLDM2KSI+CiAgPGcgZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIj4KICAgIDxwYXRoIGQ9Ik02LDggTDgsOCBMOCw2IEw2LDYgTDYsOCBMNiw4IFogTTYsNSBMOCw1IEw4LDMgTDYsMyBMNiw1IEw2LDUgWiBNNiwxMSBMOCwxMSBMOCw5IEw2LDkgTDYsMTEgTDYsMTEgWiBNNiwxNCBMOCwxNCBMOCwxMiBMNiwxMiBMNiwxNCBMNiwxNCBaIE0zLDE0IEw1LDE0IEw1LDEyIEwzLDEyIEwzLDE0IEwzLDE0IFogTTMsMiBMNSwyIEw1LDAgTDMsMCBMMywyIEwzLDIgWiBNMyw4IEw1LDggTDUsNiBMMyw2IEwzLDggTDMsOCBaIE0xMiwxNCBMMTQsMTQgTDE0LDEyIEwxMiwxMiBMMTIsMTQgTDEyLDE0IFogTTEyLDggTDE0LDggTDE0LDYgTDEyLDYgTDEyLDggTDEyLDggWiBNMTIsMTEgTDE0LDExIEwxNCw5IEwxMiw5IEwxMiwxMSBMMTIsMTEgWiBNMTIsNSBMMTQsNSBMMTQsMyBMMTIsMyBMMTIsNSBMMTIsNSBaIE02LDIgTDgsMiBMOCwwIEw2LDAgTDYsMiBMNiwyIFogTTEyLDAgTDEyLDIgTDE0LDIgTDE0LDAgTDEyLDAgTDEyLDAgWiBNOSwxNCBMMTEsMTQgTDExLDEyIEw5LDEyIEw5LDE0IEw5LDE0IFogTTksOCBMMTEsOCBMMTEsNiBMOSw2IEw5LDggTDksOCBaIE05LDIgTDExLDIgTDExLDAgTDksMCBMOSwyIEw5LDIgWiIgb3BhY2l0eT0iLjU0Ii8+CiAgICA8cG9seWdvbiBwb2ludHM9IjAgMTQgMiAxNCAyIDAgMCAwIi8+CiAgPC9nPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTA4LDM2KSI+CiAgPGcgZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIj4KICAgIDxwYXRoIGQ9Ik0zLDggTDUsOCBMNSw2IEwzLDYgTDMsOCBMMyw4IFogTTAsMTQgTDIsMTQgTDIsMTIgTDAsMTIgTDAsMTQgTDAsMTQgWiBNNiwxNCBMOCwxNCBMOCwxMiBMNiwxMiBMNiwxNCBMNiwxNCBaIE02LDExIEw4LDExIEw4LDkgTDYsOSBMNiwxMSBMNiwxMSBaIE0zLDE0IEw1LDE0IEw1LDEyIEwzLDEyIEwzLDE0IEwzLDE0IFogTTAsMTEgTDIsMTEgTDIsOSBMMCw5IEwwLDExIEwwLDExIFogTTYsOCBMOCw4IEw4LDYgTDYsNiBMNiw4IEw2LDggWiBNMCw1IEwyLDUgTDIsMyBMMCwzIEwwLDUgTDAsNSBaIE0wLDggTDIsOCBMMiw2IEwwLDYgTDAsOCBMMCw4IFogTTEyLDggTDE0LDggTDE0LDYgTDEyLDYgTDEyLDggTDEyLDggWiBNMTIsMTEgTDE0LDExIEwxNCw5IEwxMiw5IEwxMiwxMSBMMTIsMTEgWiBNMTIsNSBMMTQsNSBMMTQsMyBMMTIsMyBMMTIsNSBMMTIsNSBaIE02LDUgTDgsNSBMOCwzIEw2LDMgTDYsNSBMNiw1IFogTTksMTQgTDExLDE0IEwxMSwxMiBMOSwxMiBMOSwxNCBMOSwxNCBaIE05LDggTDExLDggTDExLDYgTDksNiBMOSw4IEw5LDggWiBNMTIsMTQgTDE0LDE0IEwxNCwxMiBMMTIsMTIgTDEyLDE0IEwxMiwxNCBaIiBvcGFjaXR5PSIuNTQiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMCAwIDAgMiAxNCAyIDE0IDAiLz4KICA8L2c+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjYsMzYpIj4KICA8ZyBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMikiPgogICAgPHBhdGggZD0iTTAsMiBMMiwyIEwyLDAgTDAsMCBMMCwyIEwwLDIgWiBNMywyIEw1LDIgTDUsMCBMMywwIEwzLDIgTDMsMiBaIE0zLDggTDUsOCBMNSw2IEwzLDYgTDMsOCBMMyw4IFogTTMsMTQgTDUsMTQgTDUsMTIgTDMsMTIgTDMsMTQgTDMsMTQgWiBNMCw1IEwyLDUgTDIsMyBMMCwzIEwwLDUgTDAsNSBaIE0wLDggTDIsOCBMMiw2IEwwLDYgTDAsOCBMMCw4IFogTTAsMTQgTDIsMTQgTDIsMTIgTDAsMTIgTDAsMTQgTDAsMTQgWiBNMCwxMSBMMiwxMSBMMiw5IEwwLDkgTDAsMTEgTDAsMTEgWiBNOSw4IEwxMSw4IEwxMSw2IEw5LDYgTDksOCBMOSw4IFogTTYsMTQgTDgsMTQgTDgsMTIgTDYsMTIgTDYsMTQgTDYsMTQgWiBNOSwxNCBMMTEsMTQgTDExLDEyIEw5LDEyIEw5LDE0IEw5LDE0IFogTTYsMiBMOCwyIEw4LDAgTDYsMCBMNiwyIEw2LDIgWiBNOSwyIEwxMSwyIEwxMSwwIEw5LDAgTDksMiBMOSwyIFogTTYsMTEgTDgsMTEgTDgsOSBMNiw5IEw2LDExIEw2LDExIFogTTYsNSBMOCw1IEw4LDMgTDYsMyBMNiw1IEw2LDUgWiBNNiw4IEw4LDggTDgsNiBMNiw2IEw2LDggTDYsOCBaIiBvcGFjaXR5PSIuNTQiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMTIgMCAxMiAxNCAxNCAxNCAxNCAwIi8+CiAgPC9nPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQ0LDM2KSI+CiAgPGcgZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIj4KICAgIDxwYXRoIGQ9Ik01LDAgTDMsMCBMMywyIEw1LDIgTDUsMCBMNSwwIFogTTgsNiBMNiw2IEw2LDggTDgsOCBMOCw2IEw4LDYgWiBNOCw5IEw2LDkgTDYsMTEgTDgsMTEgTDgsOSBMOCw5IFogTTExLDYgTDksNiBMOSw4IEwxMSw4IEwxMSw2IEwxMSw2IFogTTUsNiBMMyw2IEwzLDggTDUsOCBMNSw2IEw1LDYgWiBNMTEsMCBMOSwwIEw5LDIgTDExLDIgTDExLDAgTDExLDAgWiBNOCwzIEw2LDMgTDYsNSBMOCw1IEw4LDMgTDgsMyBaIE04LDAgTDYsMCBMNiwyIEw4LDIgTDgsMCBMOCwwIFogTTIsOSBMMCw5IEwwLDExIEwyLDExIEwyLDkgTDIsOSBaIE0xMiwxMSBMMTQsMTEgTDE0LDkgTDEyLDkgTDEyLDExIEwxMiwxMSBaIE0xMiw1IEwxNCw1IEwxNCwzIEwxMiwzIEwxMiw1IEwxMiw1IFogTTEyLDggTDE0LDggTDE0LDYgTDEyLDYgTDEyLDggTDEyLDggWiBNMTIsMCBMMTIsMiBMMTQsMiBMMTQsMCBMMTIsMCBMMTIsMCBaIE0yLDAgTDAsMCBMMCwyIEwyLDIgTDIsMCBMMiwwIFogTTIsMyBMMCwzIEwwLDUgTDIsNSBMMiwzIEwyLDMgWiBNMiw2IEwwLDYgTDAsOCBMMiw4IEwyLDYgTDIsNiBaIiBvcGFjaXR5PSIuNTQiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMCAxNCAxNCAxNCAxNCAxMiAwIDEyIi8+CiAgPC9nPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTYyLDM2KSI+PHBhdGggZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNiwxNCBMOCwxNCBMOCwxMiBMNiwxMiBMNiwxNCBMNiwxNCBaIE0zLDggTDUsOCBMNSw2IEwzLDYgTDMsOCBMMyw4IFogTTMsMiBMNSwyIEw1LDAgTDMsMCBMMywyIEwzLDIgWiBNNiwxMSBMOCwxMSBMOCw5IEw2LDkgTDYsMTEgTDYsMTEgWiBNMywxNCBMNSwxNCBMNSwxMiBMMywxMiBMMywxNCBMMywxNCBaIE0wLDUgTDIsNSBMMiwzIEwwLDMgTDAsNSBMMCw1IFogTTAsMTQgTDIsMTQgTDIsMTIgTDAsMTIgTDAsMTQgTDAsMTQgWiBNMCwyIEwyLDIgTDIsMCBMMCwwIEwwLDIgTDAsMiBaIE0wLDggTDIsOCBMMiw2IEwwLDYgTDAsOCBMMCw4IFogTTYsOCBMOCw4IEw4LDYgTDYsNiBMNiw4IEw2LDggWiBNMCwxMSBMMiwxMSBMMiw5IEwwLDkgTDAsMTEgTDAsMTEgWiBNMTIsMTEgTDE0LDExIEwxNCw5IEwxMiw5IEwxMiwxMSBMMTIsMTEgWiBNMTIsMTQgTDE0LDE0IEwxNCwxMiBMMTIsMTIgTDEyLDE0IEwxMiwxNCBaIE0xMiw4IEwxNCw4IEwxNCw2IEwxMiw2IEwxMiw4IEwxMiw4IFogTTEyLDUgTDE0LDUgTDE0LDMgTDEyLDMgTDEyLDUgTDEyLDUgWiBNMTIsMCBMMTIsMiBMMTQsMiBMMTQsMCBMMTIsMCBMMTIsMCBaIE02LDIgTDgsMiBMOCwwIEw2LDAgTDYsMiBMNiwyIFogTTksMiBMMTEsMiBMMTEsMCBMOSwwIEw5LDIgTDksMiBaIE02LDUgTDgsNSBMOCwzIEw2LDMgTDYsNSBMNiw1IFogTTksMTQgTDExLDE0IEwxMSwxMiBMOSwxMiBMOSwxNCBMOSwxNCBaIE05LDggTDExLDggTDExLDYgTDksNiBMOSw4IEw5LDggWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiAyKSIgb3BhY2l0eT0iLjU0Ii8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxODAsMzYpIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02LjUsMy42MiBMMCwxMC4xMiBMMCwxMyBMMi44OCwxMyBMOS4zOCw2LjUgTDYuNSwzLjYyIFogTTExLjg1LDQuMDIgQzEyLjA1LDMuODIgMTIuMDUsMy41MSAxMS44NSwzLjMxIEw5LjY4LDEuMTQgQzkuNDgsMC45NCA5LjE3LDAuOTQgOC45NywxLjE0IEw3LjYyLDIuNSBMMTAuNSw1LjM4IEwxMS44NSw0LjAyIEwxMS44NSw0LjAyIFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTgsMzYpIj48cGF0aCBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wLDAgTDE0LDAgTDE0LDIgTDAsMiBMMCwwIFogTTAsNCBMNiw0IEw2LDYgTDAsNiBMMCw0IFogTTAsOCBMMiw4IEwyLDEwIEwwLDEwIEwwLDggWiBNOCw0IEwxNCw0IEwxNCw2IEw4LDYgTDgsNCBaIE00LDggTDYsOCBMNiwxMCBMNCwxMCBMNCw4IFogTTgsOCBMMTAsOCBMMTAsMTAgTDgsMTAgTDgsOCBaIE0xMiw4IEwxNCw4IEwxNCwxMCBMMTIsMTAgTDEyLDggWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiA0KSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjE2LDM2KSI+PHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBwb2ludHM9Ii0yIDIgMiA2IDYgMiIgdHJhbnNmb3JtPSJyb3RhdGUoOTAgMyAxMCkiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzNCwzNikiPjxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgcG9pbnRzPSI3LjUzIDEuNTMgNi40NyAuNDcgNCAyLjk0IDEuNTMgLjQ3IC40NyAxLjUzIDIuOTQgNCAuNDcgNi40NyAxLjUzIDcuNTMgNCA1LjA2IDYuNDcgNy41MyA3LjUzIDYuNDcgNS4wNiA0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1IDUpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDU0KSI+PHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBwb2ludHM9IjguNDQgLjQ0IDUgMy44OCAxLjU2IC40NCAuNSAxLjUgNSA2IDkuNSAxLjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQgNikiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4LDU0KSI+PHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBwb2ludHM9IjUgMCAuNSA0LjUgMS41NiA1LjU2IDUgMi4xMiA4LjQ0IDUuNTYgOS41IDQuNSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCA2KSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzYsNTQpIj48cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHBvaW50cz0iOC40NCAuNDQgNSAzLjg4IDEuNTYgLjQ0IC41IDEuNSA1IDYgOS41IDEuNSIgdHJhbnNmb3JtPSJyb3RhdGUoOTAgNCA4KSIvPgo8L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTQsNTQpIj48cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHBvaW50cz0iNSAwIC41IDQuNSAxLjU2IDUuNTYgNSAyLjEyIDguNDQgNS41NiA5LjUgNC41IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA0IDgpIi8+CjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3Miw1NCkiPjxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgcG9pbnRzPSIxMiA1IDMuMTI1IDUgNy4wNiAxLjA2IDYgMCAwIDYgNiAxMiA3LjA2IDEwLjk0IDMuMTI1IDcgMTIgNyIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTUgMykiLz4KPC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkwLDU0KSI+PHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBwb2ludHM9IjEyIDUgMy4xMjUgNSA3LjA2IDEuMDYgNiAwIDAgNiA2IDEyIDcuMDYgMTAuOTQgMy4xMjUgNyAxMiA3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzIDMpIi8+CjwvZz4KPC9zdmc+Cg==); + background-image: url('data:image/svg+xml,'); position: absolute; width: 262px; height: 444px;