[
  {
    "path": "README.md",
    "content": "<img width=\"960\" alt=\"Screenshot 2023-04-22 101234\" src=\"https://github.com/lidojs/canva-clone/assets/19285404/06249d78-3e6c-45a0-b14a-bd73c186fd84\" />\n\n# LidoJS - Powerful Design Tool for Creatives\n\nLidoJS is a simple and user-friendly graphic design tool, that helps you create great designs quickly. Whether you need presentations, marketing materials, or social media graphics, LidoJS has what you need to bring your ideas to life.\nThe tool is developed from scratch with ReactJS, so it's easy to upgrade by yourself.\nThis code will show you how to integrate LidoJS into an application to make an online design editor application.\n\nExplore the platform at [https://lidojs.com](https://lidojs.com) or meet us at [https://discord.gg/mBj7fqKpEM](https://discord.gg/mBj7fqKpEM).\n\n## **Overview**\n\nLidoJS makes designing simple and fun, offering a variety of tools to help designers, marketers, and content creators reach their goals. From creating slides to making graphics, LidoJS makes the whole process easier.\n\n## **Demo**\n\n[https://demo.lidojs.com](https://demo.lidojs.com).\n\nAfter creating designs, you can download them in various formats, including PDF, PNG, and JPG. Download feature does not include in the packages, but you can see the output file below\n\n[Open PDF file](https://s3.us-east-2.amazonaws.com/lidojs.com/output-from-templates.pdf)\n\n## **Key Features**\n- **Drag-and-Drop Interface:** Simplify the design process with an intuitive editor.\n- **Customizable Templates:** Access a vast collection of pre-designed templates for presentations, posters, and social media.\n- **Advanced Editing Tools:** Fine-tune your designs with precise editing options, including layering, masking, painting, shapes, frames, and color adjustments.\n- **Export Options:** Download designs in various formats suitable for both print (PDF, PNG, JPG) and digital platforms (SVG, WebP).\nTechnical Highlights\n\n## **Technical Highlights**\n- **Proven Technology:** LidoJS uses the same advanced technical solutions as Canva, ensuring a reliable and high-performance design experience.\n- **Built from Scratch:** Core features are developed entirely with React.js, without relying on third-party frameworks.\n- **Unlimited Customization:** Enjoy total creative freedom with the ability to customize any element to fit your specific needs.\n\n## **Usage Purpose**\nLidoJS works for many design tasks, such as:\n\n- **Presentations:** Craft professional slide decks with ease using customizable templates.\n- **Marketing Campaigns:** Create eye-catching promotional materials for ads and social media.\n- **Branding:** Develop cohesive brand assets such as logos and banners.\n- **Content Creation:** Design visually compelling graphics for blogs, websites, and newsletters.\n\n## **Trusted by Leading Brands**\nLidoJS is a preferred design tool for top brands and organizations, including:\n\n- **Sendsteps:** Engaging presentation solutions.\n- **Menuzen:** Dynamic digital menu creation.\n- **Designstripe:** Simplified design experiences.\n- **Momentumstack:** Innovative technology and business services.\n\nStart designing with LidoJS and experience the future of creative possibilities. Visit [https://lidojs.com](https://lidojs.com) to learn more and get started today.\n\n\n## Disclaimer\n\nThis source code is developed entirely by our team from scratch. We have not used any third-party resources that require licensing. \nOur product is designed to assist users in developing design applications efficiently. However, we do not guarantee any specific outcomes or take responsibility for how this software is used.  \nUse this code at your own risk. We are not liable for any damages or issues arising from its use.\n\n\n"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\" />\n  <title>LidoJS Design Editor</title>\n  <meta\n    content=\"Canva clone, design editor tool, graphic editor tool, image editor tool.\"\n    name=\"description\"\n  />\n  <meta\n    content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover, interactive-widget=resizes-content\"\n    name=\"viewport\">\n  <meta content=\"website\" property=\"og:type\" />\n  <meta content=\"LidoJS Design Editor\" property=\"og:title\" />\n  <meta\n    content=\"Canva clone, design editor tool, graphic editor tool, image editor tool.\"\n    property=\"og:description\"\n  />\n  <link href=\"https://fonts.googleapis.com\" rel=\"preconnect\">\n  <link crossorigin href=\"https://fonts.gstatic.com\" rel=\"preconnect\">\n  <link\n    crossorigin\n    href=\"https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,300;0,400;0,600;0,700;1,400;1,600;1,700&display=swap\"\n    rel=\"stylesheet\">\n</head>\n<body>\n<style>\n  html, body {\n    margin: 0;\n    font-family: 'Nunito', sans-serif;\n    color: #5E6278;\n    font-size: 14px;\n  }\n\n  html,\n  body {\n    overflow-wrap: break-word;\n    -webkit-hyphens: none;\n    hyphens: none;\n    word-break: break-word;\n    margin: 0;\n    display: flex;\n    flex-direction: column;\n    height: unset;\n    overscroll-behavior: none;\n  }\n\n  blockquote,\n  dl,\n  dd,\n  h1,\n  h2,\n  h3,\n  h4,\n  h5,\n  h6,\n  hr,\n  figure,\n  p,\n  pre {\n    margin: 0;\n  }\n\n  button {\n    background-color: transparent;\n    background-image: none;\n  }\n\n  fieldset {\n    margin: 0;\n    padding: 0;\n  }\n\n  ol,\n  ul {\n    list-style: none;\n    margin: 0;\n    padding: 0;\n  }\n\n  body {\n    font-family: inherit;\n    line-height: inherit;\n  }\n\n  *,\n  ::before,\n  ::after {\n    box-sizing: border-box; /* 1 */\n    border-width: 0; /* 2 */\n    border-style: solid; /* 2 */\n    border-color: currentColor; /* 2 */\n    outline: none;\n  }\n\n  hr {\n    border-top-width: 1px;\n  }\n\n  img {\n    border-style: solid;\n  }\n\n  textarea {\n    resize: vertical;\n  }\n\n  input::placeholder,\n  textarea::placeholder {\n    opacity: 1;\n    color: #a1a1aa;\n  }\n\n  button,\n  [role='button'] {\n    cursor: pointer;\n  }\n\n  table {\n    border-collapse: collapse;\n  }\n\n  a {\n    color: inherit;\n    text-decoration: inherit;\n  }\n\n  button,\n  input,\n  optgroup,\n  select,\n  textarea {\n    padding: 0;\n    line-height: inherit;\n    color: inherit;\n  }\n\n  pre,\n  code,\n  kbd,\n  samp {\n    font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;\n  }\n\n  img,\n  svg,\n  video,\n  canvas,\n  audio,\n  iframe,\n  embed,\n  object {\n    display: block;\n    vertical-align: middle;\n  }\n\n  img,\n  video {\n    max-width: 100%;\n    height: auto;\n  }\n</style>\n<noscript>You need to enable JavaScript to run this app.</noscript>\n<div id=\"root\"></div>\n<script src=\"./index.tsx\" type=\"module\"></script>\n</body>\n<% if(process.env.NODE_ENV !== 'development'){ %>\n<script>\n  window[\"_fs_host\"] = \"fullstory.com\";\n  window[\"_fs_script\"] = \"edge.fullstory.com/s/fs.js\";\n  window[\"_fs_org\"] = \"o-1PBR16-na1\";\n  window[\"_fs_namespace\"] = \"FS\";\n  (function(m, n, e, t, l, o, g, y) {\n    if (e in m) {\n      if (m.console && m.console.log) {\n        m.console.log(\"FullStory namespace conflict. Please set window[\\\"_fs_namespace\\\"].\");\n      }\n      return;\n    }\n    g = m[e] = function(a, b, s) {\n      g.q ? g.q.push([a, b, s]) : g._api(a, b, s);\n    };\n    g.q = [];\n    o = n.createElement(t);\n    o.async = 1;\n    o.crossOrigin = \"anonymous\";\n    o.src = \"https://\" + _fs_script;\n    y = n.getElementsByTagName(t)[0];\n    y.parentNode.insertBefore(o, y);\n    g.identify = function(i, v, s) {\n      g(l, { uid: i }, s);\n      if (v) g(l, v, s);\n    };\n    g.setUserVars = function(v, s) {\n      g(l, v, s);\n    };\n    g.event = function(i, v, s) {\n      g(\"event\", { n: i, p: v }, s);\n    };\n    g.anonymize = function() {\n      g.identify(!!0);\n    };\n    g.shutdown = function() {\n      g(\"rec\", !1);\n    };\n    g.restart = function() {\n      g(\"rec\", !0);\n    };\n    g.log = function(a, b) {\n      g(\"log\", [a, b]);\n    };\n    g.consent = function(a) {\n      g(\"consent\", !arguments.length || a);\n    };\n    g.identifyAccount = function(i, v) {\n      o = \"account\";\n      v = v || {};\n      v.acctId = i;\n      g(o, v);\n    };\n    g.clearUserCookie = function() {\n    };\n    g.setVars = function(n, p) {\n      g(\"setVars\", [n, p]);\n    };\n    g._w = {};\n    y = \"XMLHttpRequest\";\n    g._w[y] = m[y];\n    y = \"fetch\";\n    g._w[y] = m[y];\n    if (m[y]) m[y] = function() {\n      return g._w[y].apply(this, arguments);\n    };\n    g._v = \"1.3.0\";\n  })(window, document, window[\"_fs_namespace\"], \"script\", \"user\");\n</script>\n<% } %>\n</html>\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"@lidojs/react\",\n  \"version\": \"2.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"serve\": \"vite preview\"\n  },\n  \"dependencies\": {\n    \"@duyank/icons\": \"^0.1.2\",\n    \"@emotion/react\": \"11.14.0\",\n    \"@emotion/styled\": \"11.14.0\",\n    \"@lidojs/color-picker\": \"^2.0.0\",\n    \"@lidojs/design-core\": \"^2.0.0\",\n    \"@lidojs/design-editor\": \"^2.0.0\",\n    \"@lidojs/design-layers\": \"^2.0.0\",\n    \"@lidojs/design-screen\": \"^2.0.0\",\n    \"@lidojs/design-utils\": \"^2.0.0\",\n    \"@lidojs/draw\": \"^2.0.0\",\n    \"@lidojs/text-editor\": \"^2.0.0\",\n    \"@mui/material\": \"^6.4.5\",\n    \"axios\": \"^1.7.9\",\n    \"lodash\": \"^4.17.21\",\n    \"react\": \"^18.3.1\",\n    \"react-device-detect\": \"^2.2.3\",\n    \"react-dom\": \"catalog:\",\n    \"react-responsive-masonry\": \"^2.7.1\",\n    \"react-use\": \"^17.6.0\",\n    \"uuid\": \"^11.0.5\"\n  },\n  \"devDependencies\": {\n    \"@types/react\": \"^18.3.1\",\n    \"@types/react-dom\": \"^18.3.5\",\n    \"prop-types\": \"^15.8.1\",\n    \"vite-bundle-analyzer\": \"^0.17.0\",\n    \"vite-plugin-environment\": \"^1.1.3\"\n  }\n}\n"
  },
  {
    "path": "src/assets/.gitkeep",
    "content": ""
  },
  {
    "path": "src/constant/data.ts",
    "content": "export const data = [\n  {\n    layers: {\n      ROOT: {\n        type: { resolvedName: 'RootLayer' },\n        props: {\n          boxSize: { width: 1640, height: 924 },\n          position: { x: 0, y: 0 },\n          rotate: 0,\n          color: 'rgb(255, 255, 255)',\n          image: null,\n        },\n        locked: false,\n        child: [\n          'd80fa039-b645-4678-89f2-fc0336958989',\n          '851673f7-8917-4b3e-95d0-3a81b6f638bb',\n          'af7b69ea-3060-46ff-914e-9833d66ddc1d',\n          '09a24f96-90bd-4e0d-b610-47d23de11c2b',\n          '2096d6ab-d78e-4acf-b509-170a3e6b97f5',\n        ],\n        parent: null,\n      },\n      'd80fa039-b645-4678-89f2-fc0336958989': {\n        type: { resolvedName: 'ShapeLayer' },\n        props: {\n          shape: 'rectangle',\n          position: { x: -41, y: 652 },\n          boxSize: { width: 1766, height: 296, x: -41, y: 652 },\n          rotate: 0,\n          color: 'rgb(253, 235, 207)',\n        },\n        locked: false,\n        child: [],\n        parent: 'ROOT',\n      },\n      '851673f7-8917-4b3e-95d0-3a81b6f638bb': {\n        type: { resolvedName: 'TextLayer' },\n        props: {\n          doc: {\n            type: 'doc',\n            content: [\n              {\n                type: 'paragraph',\n                attrs: {\n                  textAlign: 'center',\n                  color: 'rgb(0, 0, 0)',\n                  fontFamily: 'Agdasima',\n                  fontSize: '42px',\n                  lineHeight: 1.03,\n                  letterSpacing: 0,\n                  textTransform: '',\n                  marginLeft: null,\n                  indent: 0,\n                  listType: '',\n                },\n                content: [\n                  {\n                    type: 'text',\n                    marks: [\n                      { type: 'color', attrs: { color: 'rgb(0, 0, 0)' } },\n                    ],\n                    text: 'LIDOJS',\n                  },\n                ],\n              },\n              {\n                type: 'paragraph',\n                attrs: {\n                  textAlign: 'center',\n                  color: 'rgb(0, 0, 0)',\n                  fontFamily: 'Agdasima',\n                  fontSize: '42px',\n                  lineHeight: 1.03,\n                  letterSpacing: 0,\n                  textTransform: '',\n                  marginLeft: null,\n                  indent: 0,\n                  listType: '',\n                },\n                content: [\n                  {\n                    type: 'text',\n                    marks: [\n                      { type: 'color', attrs: { color: 'rgb(0, 0, 0)' } },\n                    ],\n                    text: 'DESIGN EDITOR',\n                  },\n                ],\n              },\n            ],\n          },\n          position: { x: 528.5031977930256, y: 276.6364429758855 },\n          boxSize: {\n            width: 536.3009995574356,\n            height: 144.98254063816975,\n            x: 523.1390728476821,\n            y: 259.9867549668875,\n          },\n          scale: 1.6664659843467788,\n          rotate: 0,\n          fonts: [\n            {\n              name: 'Agdasima',\n              fonts: [\n                {\n                  urls: [\n                    'https://fonts.gstatic.com/s/agdasima/v4/PN_zRfyxp2f1fUCgAMg6rzjb_-Da.ttf',\n                  ],\n                },\n              ],\n            },\n          ],\n          colors: ['rgb(0, 0, 0)'],\n          fontSizes: [42],\n        },\n        locked: false,\n        child: [],\n        parent: 'ROOT',\n      },\n      'af7b69ea-3060-46ff-914e-9833d66ddc1d': {\n        type: { resolvedName: 'TextLayer' },\n        props: {\n          doc: {\n            type: 'doc',\n            content: [\n              {\n                type: 'paragraph',\n                attrs: {\n                  textAlign: 'center',\n                  color: 'rgb(0, 0, 0)',\n                  fontFamily: 'Oswald',\n                  fontSize: '18px',\n                  lineHeight: '1.4',\n                  letterSpacing: 0,\n                  textTransform: 'uppercase',\n                  marginLeft: null,\n                  indent: 0,\n                  listType: '',\n                },\n                content: [\n                  {\n                    type: 'text',\n                    marks: [\n                      { type: 'bold' },\n                      { type: 'color', attrs: { color: 'rgb(0, 0, 0)' } },\n                    ],\n                    text: 'DEVELOPED WITH REACTJS',\n                  },\n                ],\n              },\n            ],\n          },\n          position: { x: 665.6953642384103, y: 440.2251655629139 },\n          boxSize: {\n            width: 261.91666666666606,\n            height: 25,\n            x: 660.2715231788078,\n            y: 440.2251655629139,\n          },\n          scale: 1,\n          rotate: 0,\n          fonts: [\n            {\n              name: 'Oswald',\n              fonts: [\n                {\n                  style: 'Bold',\n                  urls: [\n                    'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Oswald/Oswald-Bold.woff2',\n                  ],\n                },\n                {\n                  urls: [\n                    'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Oswald/Oswald-Regular.woff2',\n                  ],\n                },\n              ],\n            },\n          ],\n          colors: ['rgb(0, 0, 0)'],\n          fontSizes: [18],\n          effect: null,\n        },\n        locked: false,\n        child: [],\n        parent: 'ROOT',\n      },\n      '09a24f96-90bd-4e0d-b610-47d23de11c2b': {\n        type: { resolvedName: 'TextLayer' },\n        props: {\n          doc: {\n            type: 'doc',\n            content: [\n              {\n                type: 'paragraph',\n                attrs: {\n                  textAlign: 'center',\n                  color: 'rgb(0, 0, 0)',\n                  fontFamily: 'Oswald',\n                  fontSize: '18px',\n                  lineHeight: '1.4',\n                  letterSpacing: 0,\n                  textTransform: 'uppercase',\n                  marginLeft: null,\n                  indent: 0,\n                  listType: '',\n                },\n                content: [\n                  {\n                    type: 'text',\n                    marks: [\n                      { type: 'bold' },\n                      { type: 'color', attrs: { color: 'rgb(0, 0, 0)' } },\n                    ],\n                    text: 'DISCORD: https://discord.gg/mBj7fqKpEM',\n                  },\n                ],\n              },\n            ],\n          },\n          position: { x: 587.4569536423838, y: 839.8609271523178 },\n          boxSize: {\n            width: 379.3868653421627,\n            height: 25,\n            x: 587.4569536423838,\n            y: 839.8609271523178,\n          },\n          scale: 1,\n          rotate: 0,\n          fonts: [\n            {\n              name: 'Oswald',\n              fonts: [\n                {\n                  style: 'Bold',\n                  urls: [\n                    'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Oswald/Oswald-Bold.woff2',\n                  ],\n                },\n                {\n                  urls: [\n                    'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Oswald/Oswald-Regular.woff2',\n                  ],\n                },\n              ],\n            },\n          ],\n          colors: ['rgb(0, 0, 0)'],\n          fontSizes: [18],\n          effect: null,\n        },\n        locked: false,\n        child: [],\n        parent: 'ROOT',\n      },\n      '2096d6ab-d78e-4acf-b509-170a3e6b97f5': {\n        type: { resolvedName: 'TextLayer' },\n        props: {\n          doc: {\n            type: 'doc',\n            content: [\n              {\n                type: 'paragraph',\n                attrs: {\n                  textAlign: 'center',\n                  color: 'rgb(0, 0, 0)',\n                  fontFamily: 'Oswald',\n                  fontSize: '18px',\n                  lineHeight: '1.4',\n                  letterSpacing: 0,\n                  textTransform: 'uppercase',\n                  marginLeft: null,\n                  indent: 0,\n                  listType: '',\n                },\n                content: [\n                  {\n                    type: 'text',\n                    marks: [\n                      { type: 'bold' },\n                      { type: 'color', attrs: { color: 'rgb(0, 0, 0)' } },\n                    ],\n                    text: 'CONTACT: DUYANH980@GMAIL.COM',\n                  },\n                ],\n              },\n            ],\n          },\n          position: { x: 634.1125827814567, y: 810.4900662251654 },\n          boxSize: {\n            width: 293.4994481236197,\n            height: 25,\n            x: 634.1125827814567,\n            y: 810.4900662251654,\n          },\n          scale: 1,\n          rotate: 0,\n          fonts: [\n            {\n              name: 'Oswald',\n              fonts: [\n                {\n                  style: 'Bold',\n                  urls: [\n                    'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Oswald/Oswald-Bold.woff2',\n                  ],\n                },\n                {\n                  urls: [\n                    'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Oswald/Oswald-Regular.woff2',\n                  ],\n                },\n              ],\n            },\n          ],\n          colors: ['rgb(0, 0, 0)'],\n          fontSizes: [18],\n          effect: null,\n        },\n        locked: false,\n        child: [],\n        parent: 'ROOT',\n      },\n    },\n  },\n];\n"
  },
  {
    "path": "src/constant/text-effects.ts",
    "content": "export const addAHeading = {\n  rootId: 'f2d33316-8857-4496-a0c7-3dcc9c4ff981',\n  layers: {\n    'f2d33316-8857-4496-a0c7-3dcc9c4ff981': {\n      type: { resolvedName: 'TextLayer' },\n      props: {\n        doc: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Roboto',\n                fontSize: '68px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: '',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  marks: [\n                    {\n                      type: 'bold',\n                    },\n                    {\n                      type: 'color',\n                      attrs: {\n                        color: 'rgb(0, 0, 0)',\n                      },\n                    },\n                  ],\n                  text: 'Add a heading',\n                },\n              ],\n            },\n          ],\n        },\n        position: { x: 525.12102340009, y: 261.582179409994 },\n        boxSize: {\n          width: 536.3009995574356,\n          height: 95,\n          x: 523.1390728476821,\n          y: 259.9867549668875,\n        },\n        scale: 1,\n        rotate: 0,\n        fonts: [\n          {\n            name: 'Roboto',\n            fonts: [\n              {\n                style: 'Bold',\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                ],\n              },\n              {\n                style: 'Bold_Italic',\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                ],\n              },\n              {\n                style: 'Bold',\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                ],\n              },\n              {\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                ],\n              },\n              {\n                style: 'Italic',\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                ],\n              },\n              {\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                ],\n              },\n            ],\n          },\n        ],\n        colors: ['rgb(0, 0, 0)'],\n        fontSizes: [68],\n      },\n      locked: false,\n      child: [],\n      parent: 'ROOT',\n    },\n  },\n};\n\nexport const addASubheading = {\n  rootId: '9cc89a8c-49d5-4f90-9964-f65bbe90db92',\n  layers: {\n    '9cc89a8c-49d5-4f90-9964-f65bbe90db92': {\n      type: { resolvedName: 'TextLayer' },\n      props: {\n        doc: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Roboto',\n                fontSize: '38px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: '',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  marks: [\n                    {\n                      type: 'bold',\n                    },\n                    {\n                      type: 'color',\n                      attrs: {\n                        color: 'rgb(0, 0, 0)',\n                      },\n                    },\n                  ],\n                  text: 'Add a subheading',\n                },\n              ],\n            },\n          ],\n        },\n        position: { x: 519.12102340009, y: 365.582179409994 },\n        boxSize: {\n          width: 536.3009995574356,\n          height: 53,\n          x: 523.1390728476821,\n          y: 259.9867549668875,\n        },\n        scale: 1,\n        rotate: 0,\n        fonts: [\n          {\n            name: 'Roboto',\n            fonts: [\n              {\n                style: 'Bold',\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                ],\n              },\n              {\n                style: 'Bold_Italic',\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                ],\n              },\n              {\n                style: 'Bold',\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                ],\n              },\n              {\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                ],\n              },\n              {\n                style: 'Italic',\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                ],\n              },\n              {\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                ],\n              },\n            ],\n          },\n        ],\n        colors: ['rgb(0, 0, 0)'],\n        fontSizes: [38],\n      },\n      locked: false,\n      child: [],\n      parent: 'ROOT',\n    },\n  },\n};\n\nexport const addABodyText = {\n  rootId: '3cace409-216f-4e0e-9449-9248901c8c94',\n  layers: {\n    '3cace409-216f-4e0e-9449-9248901c8c94': {\n      type: { resolvedName: 'TextLayer' },\n      props: {\n        doc: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Roboto',\n                fontSize: '26px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: '',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  marks: [\n                    {\n                      type: 'color',\n                      attrs: {\n                        color: 'rgb(0, 0, 0)',\n                      },\n                    },\n                  ],\n                  text: 'Add a little bit of body text',\n                },\n              ],\n            },\n          ],\n        },\n        position: { x: 508.99988653474736, y: 434.903672486454 },\n        boxSize: {\n          width: 536.3009995574356,\n          height: 36,\n          x: 523.1390728476821,\n          y: 259.9867549668875,\n        },\n        scale: 1,\n        rotate: 0,\n        fonts: [\n          {\n            name: 'Roboto',\n            fonts: [\n              {\n                style: 'Bold',\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                ],\n              },\n              {\n                style: 'Bold_Italic',\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                ],\n              },\n              {\n                style: 'Bold',\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                ],\n              },\n              {\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                ],\n              },\n              {\n                style: 'Italic',\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                ],\n              },\n              {\n                urls: [\n                  'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                ],\n              },\n            ],\n          },\n        ],\n        colors: ['rgb(0, 0, 0)'],\n        fontSizes: [26],\n      },\n      locked: false,\n      child: [],\n      parent: 'ROOT',\n    },\n  },\n};\n"
  },
  {
    "path": "src/features/design/components/LidoJSEditor.tsx",
    "content": "'use client';\n\nimport type { FontData } from '@lidojs/design-core';\nimport { Editor, type GetFontQuery, PageControl } from '@lidojs/design-editor';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { EditorContent } from './editor-content';\nimport { EditorHeader } from './editor-header';\nimport { LayerSettings } from './layer-settings';\nimport { PreviewModal } from './preview';\nimport { Sidebar } from './sidebar';\n\nexport const LidoJSEditor = ({\n  googleFontList,\n}: { googleFontList: FontData[] }) => {\n  const leftSidebarRef = useRef<HTMLDivElement>(null);\n  const [openPreview, setOpenPreview] = useState(false);\n\n  const getFonts = useCallback(\n    async (query: GetFontQuery) => {\n      return googleFontList\n        .filter((i) => !query.q || i.name.toLowerCase().includes(query.q))\n        .slice(\n          Number.parseInt(query?.offset ?? '', 10),\n          Number.parseInt(query?.offset ?? '', 10) +\n            Number.parseInt(query?.limit || '', 10),\n        );\n    },\n    [googleFontList],\n  );\n  const [viewPortHeight, setViewPortHeight] = useState<number>();\n  useEffect(() => {\n    if (!window) return;\n    const windowHeight = () => {\n      setViewPortHeight(window.innerHeight);\n    };\n    window.addEventListener('resize', windowHeight);\n    windowHeight();\n    return () => {\n      window.removeEventListener('resize', windowHeight);\n    };\n  }, []);\n  const config = useMemo(\n    () => ({\n      assetPath: './assets',\n      frame: {\n        defaultImage: {\n          url: './assets/images/frame-placeholder.png',\n          width: 1200,\n          height: 800,\n        },\n      },\n    }),\n    [],\n  );\n\n  const uploadImage = async (file: File) => {\n    // TODO: to integrate with image manipulation then need update this\n    return new Promise<{ url: string; thumb: string }>((resolve, reject) => {\n      const reader = new FileReader();\n      reader.readAsDataURL(file);\n      reader.onload = () => {\n        resolve({\n          url: reader.result as string,\n          thumb: reader.result as string,\n        });\n      };\n      reader.onerror = reject;\n    });\n  };\n\n  return (\n    <Editor config={config} getFonts={getFonts} uploadImage={uploadImage}>\n      <div\n        css={{\n          display: 'flex',\n          flexDirection: 'column',\n          width: '100vw',\n          height: '100vh',\n          maxHeight: viewPortHeight ? `${viewPortHeight}px` : 'auto',\n        }}\n      >\n        <EditorHeader openPreview={() => setOpenPreview(true)} />\n        {openPreview && <PreviewModal onClose={() => setOpenPreview(false)} />}\n        <div\n          css={{\n            display: 'flex',\n            flexDirection: 'row',\n            flex: 'auto',\n            overflow: 'auto',\n            background: '#EBECF0',\n            '@media (max-width: 900px)': {\n              flexDirection: 'column-reverse',\n            },\n          }}\n        >\n          <div\n            ref={leftSidebarRef}\n            css={{\n              display: 'flex',\n              background: 'white',\n            }}\n          >\n            <Sidebar />\n          </div>\n          <div\n            css={{\n              flexGrow: 1,\n              position: 'relative',\n              display: 'flex',\n              flexDirection: 'column',\n              overflow: 'auto',\n            }}\n          >\n            <LayerSettings />\n            <div\n              css={{\n                flexGrow: 1,\n                overflow: 'auto',\n                display: 'flex',\n                flexDirection: 'column',\n              }}\n            >\n              <EditorContent />\n            </div>\n            <div\n              css={{\n                height: 40,\n                background: '#fff',\n                borderTop: '1px solid rgba(57,76,96,.15)',\n                display: 'grid',\n                alignItems: 'center',\n                flexShrink: 0,\n                '@media (max-width: 900px)': {\n                  display: 'none',\n                },\n              }}\n            >\n              <PageControl />\n            </div>\n          </div>\n        </div>\n      </div>\n    </Editor>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/editor-content/EditorContent.tsx",
    "content": "import { DesignFrame } from '@lidojs/design-editor';\nimport { data } from '../../../../constant/data';\n\nexport const EditorContent = () => {\n  return <DesignFrame data={data} />;\n};\n"
  },
  {
    "path": "src/features/design/components/editor-content/index.ts",
    "content": "export * from './EditorContent';\n"
  },
  {
    "path": "src/features/design/components/editor-header/EditorHeader.tsx",
    "content": "import ArrowClockwiseIcon from '@duyank/icons/regular/ArrowClockwise';\nimport ArrowCounterClockwiseIcon from '@duyank/icons/regular/ArrowCounterClockwise';\nimport GithubLogoIcon from '@duyank/icons/regular/GithubLogo';\nimport PlayCircleIcon from '@duyank/icons/regular/PlayCircle';\nimport { useEditor } from '@lidojs/design-editor';\nimport {\n  type ChangeEvent,\n  type ForwardRefRenderFunction,\n  forwardRef,\n  useRef,\n} from 'react';\nimport { downloadObjectAsJson } from '../../../../utils/download';\n\ninterface HeaderLayoutProps {\n  openPreview: () => void;\n}\n\nconst EditorHeaderForwardRef: ForwardRefRenderFunction<\n  HTMLDivElement,\n  HeaderLayoutProps\n> = ({ openPreview }, ref) => {\n  const uploadRef = useRef<HTMLInputElement>(null);\n  const { actions, query } = useEditor();\n  const handleExport = () => {\n    downloadObjectAsJson('file', query.serialize());\n  };\n\n  const handleImport = (e: ChangeEvent<HTMLInputElement>) => {\n    const file = e.target.files?.[0];\n    if (file) {\n      const reader = new FileReader();\n      reader.onload = () => {\n        const fileContent = JSON.parse(reader.result as string);\n        actions.setData(fileContent);\n      };\n      reader.readAsText(file);\n      e.target.value = '';\n    }\n  };\n  return (\n    <div\n      ref={ref}\n      css={{\n        background: '#1E1E2D',\n        padding: '12px 32px',\n        display: 'flex',\n        justifyContent: 'space-between',\n        alignItems: 'center',\n        '@media (max-width: 900px)': {\n          padding: 12,\n        },\n      }}\n    >\n      <div\n        css={{\n          color: '#3d8eff',\n          fontSize: 36,\n        }}\n      >\n        <div\n          css={{ color: 'white', height: 42, paddingTop: 6, paddingBottom: 6 }}\n        >\n          <a href=\"https://lidojs.com\" rel=\"noreferrer\" target=\"_blank\">\n            <img\n              alt=\"LidoJs\"\n              css={{ maxHeight: '100%' }}\n              src=\"./assets/logo.png\"\n            />\n          </a>\n        </div>\n      </div>\n      <div css={{ display: 'flex', alignItems: 'center', gap: 32 }}>\n        <div css={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n          <div\n            css={{\n              display: 'flex',\n              alignItems: 'center',\n              justifyContent: 'center',\n              color: '#fff',\n              background: '#3a3a4c',\n              width: 36,\n              height: 36,\n              borderRadius: '50%',\n              cursor: query.history.canUndo() ? 'pointer' : undefined,\n              opacity: query.history.canUndo() ? 1 : 0.5,\n              ':hover': {\n                background: query.history.canUndo()\n                  ? 'rgba(58,58,76,0.5)'\n                  : undefined,\n              },\n            }}\n            onClick={actions.history.undo}\n          >\n            <ArrowCounterClockwiseIcon />\n          </div>\n          <div\n            css={{\n              display: 'flex',\n              alignItems: 'center',\n              justifyContent: 'center',\n              color: '#fff',\n              background: '#3a3a4c',\n              width: 36,\n              height: 36,\n              borderRadius: '50%',\n              cursor: query.history.canRedo() ? 'pointer' : undefined,\n              opacity: query.history.canRedo() ? 1 : 0.5,\n              ':hover': {\n                background: query.history.canRedo()\n                  ? 'rgba(58,58,76,0.5)'\n                  : undefined,\n              },\n            }}\n            onClick={actions.history.redo}\n          >\n            <ArrowClockwiseIcon />\n          </div>\n        </div>\n        <a\n          href=\"https://github.com/lidojs/canva-clone\"\n          rel=\"noreferrer\"\n          target=\"_blank\"\n        >\n          <span\n            css={{\n              display: 'flex',\n              alignItems: 'center',\n              justifyContent: 'center',\n              color: '#fff',\n              background: '#3a3a4c',\n              width: 36,\n              height: 36,\n              borderRadius: '50%',\n              cursor: 'pointer',\n              ':hover': {\n                background: 'rgba(58,58,76,0.5)',\n              },\n            }}\n          >\n            <GithubLogoIcon />\n          </span>\n        </a>\n        <div\n          css={{\n            cursor: 'pointer',\n            color: '#fff',\n            fontWeight: 700,\n            ':hover': {\n              textDecoration: 'underline',\n            },\n            '@media (max-width: 900px)': {\n              display: 'none',\n            },\n          }}\n          onClick={() => uploadRef.current?.click()}\n        >\n          <input\n            ref={uploadRef}\n            accept=\"application/json\"\n            css={{ display: 'none' }}\n            type=\"file\"\n            onChange={handleImport}\n          />\n          Import\n        </div>\n        <div\n          css={{\n            cursor: 'pointer',\n            color: '#fff',\n            fontWeight: 700,\n            ':hover': {\n              textDecoration: 'underline',\n            },\n            '@media (max-width: 900px)': {\n              display: 'none',\n            },\n          }}\n          onClick={() => handleExport()}\n        >\n          Export\n        </div>\n        <div\n          css={{\n            display: 'flex',\n            alignItems: 'center',\n            color: '#fff',\n            lineHeight: 1,\n            background: '#3a3a4c',\n            padding: '8px 14px',\n            borderRadius: 8,\n            cursor: 'pointer',\n            ':hover': {\n              background: 'rgba(58,58,76,0.5)',\n            },\n            '@media (max-width: 900px)': {\n              display: 'none',\n            },\n          }}\n          onClick={openPreview}\n        >\n          <div css={{ marginRight: 4, fontSize: 20 }}>\n            <PlayCircleIcon />\n          </div>\n          Preview\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport const EditorHeader = forwardRef(EditorHeaderForwardRef);\n"
  },
  {
    "path": "src/features/design/components/editor-header/index.ts",
    "content": "export * from './EditorHeader';\n"
  },
  {
    "path": "src/features/design/components/index.ts",
    "content": "export * from './LidoJSEditor';\n"
  },
  {
    "path": "src/features/design/components/layer-settings/LayerSettings.tsx",
    "content": "import {\n  LayerSettings as EditorLayerSettings,\n  useSelectedLayers,\n} from '@lidojs/design-editor';\n\nexport const LayerSettings = () => {\n  const { selectedLayerIds } = useSelectedLayers();\n  return (\n    <div\n      css={{\n        background: 'white',\n        borderBottom: '1px solid rgba(57,76,96,.15)',\n        height: 50,\n        overflowX: 'auto',\n        flexShrink: 0,\n        '@media (max-width: 900px)': {\n          position: 'fixed',\n          bottom: 0,\n          left: 0,\n          right: 0,\n          background: '#fff',\n          display: selectedLayerIds.length > 0 ? 'flex' : 'none',\n          justifyContent: 'center',\n          zIndex: 20,\n          height: 72,\n        },\n      }}\n    >\n      <EditorLayerSettings />\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/layer-settings/index.ts",
    "content": "export * from './LayerSettings';\n"
  },
  {
    "path": "src/features/design/components/preview/PreviewModal.tsx",
    "content": "import XIcon from '@duyank/icons/regular/X';\nimport { Preview } from '@lidojs/design-editor';\nimport type { FC } from 'react';\n\ninterface PreviewModalProps {\n  onClose: () => void;\n}\n\nexport const PreviewModal: FC<PreviewModalProps> = ({ onClose }) => {\n  return (\n    <div\n      css={{\n        position: 'fixed',\n        inset: 0,\n        zIndex: 1040,\n        background: 'rgba(13,18,22,.95)',\n      }}\n    >\n      <Preview />\n      <div\n        css={{\n          background: 'rgba(255,255,255,0.3)',\n          width: 60,\n          height: 60,\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          position: 'fixed',\n          right: 24,\n          top: 24,\n          borderRadius: '50%',\n          fontSize: 36,\n          color: '#fff',\n          cursor: 'pointer',\n        }}\n        onClick={onClose}\n      >\n        <XIcon />\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/preview/index.ts",
    "content": "export * from './PreviewModal';\n"
  },
  {
    "path": "src/features/design/components/sidebar/DrawContent.tsx",
    "content": "import XBoldIcon from '@duyank/icons/bold/XBold';\nimport { useEditor } from '@lidojs/design-editor';\nimport { useDraw } from '@lidojs/draw';\nimport { type FC, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Highlighter } from '../../../../shared/icons/pencil/Highlighter';\nimport { Marker } from '../../../../shared/icons/pencil/Marker';\nimport { Pencil } from '../../../../shared/icons/pencil/Pencil';\n\nexport const DrawContent: FC<{ onClose: () => void }> = ({ onClose }) => {\n  const svgRef = useRef<SVGSVGElement>(null);\n  const boxRef = useRef<HTMLDivElement>(null);\n  const penColorRef = useRef('#0571d3');\n  const penWidthRef = useRef(5);\n  const scaleRef = useRef(1);\n  const transparencyRef = useRef(1);\n  const [size, setSize] = useState({ width: 0, height: 0 });\n  const { actions, scale, activePage, sidebar } = useEditor((state) => ({\n    scale: state.scale,\n    activePage: state.activePage,\n    sidebar: state.sidebar,\n  }));\n  useEffect(() => {\n    scaleRef.current = scale;\n  }, [scale]);\n  useDraw({\n    options: {\n      width: penWidthRef.current * scaleRef.current,\n      minWidth: 33 * scaleRef.current,\n      minHeight: 33 * scaleRef.current,\n    },\n    canStartDraw: (e) => {\n      const page = document.getElementById(`lidojs-page-${activePage}`);\n      if (!page) {\n        throw new Error(\"Can't find page\");\n      }\n      const rect = page.getBoundingClientRect();\n      if (\n        e.x >= rect.x &&\n        e.x <= rect.x + rect.width &&\n        e.y >= rect.y &&\n        e.y <= rect.y + rect.height &&\n        !sidebar &&\n        boxRef.current\n      ) {\n        boxRef.current.style.pointerEvents = 'auto';\n        boxRef.current.style.opacity = transparencyRef.current.toString();\n        return true;\n      }\n      return false;\n    },\n    onChange: (path) => {\n      if (!svgRef.current) return;\n      const svgPath = document.createElementNS(\n        'http://www.w3.org/2000/svg',\n        'path',\n      );\n      svgPath.setAttributeNS(null, 'd', path);\n      svgPath.setAttributeNS(null, 'fill', 'none');\n      svgPath.setAttributeNS(null, 'stroke', penColorRef.current);\n      svgPath.setAttributeNS(null, 'stroke-linecap', 'round');\n      svgPath.setAttributeNS(\n        null,\n        'stroke-width',\n        (penWidthRef.current * scaleRef.current).toString(),\n      );\n      svgRef.current.appendChild(svgPath);\n    },\n    onEnd: (path, boxSize, position) => {\n      const page = document.getElementById(`lidojs-page-${activePage}`);\n      if (page) {\n        const rect = page.getBoundingClientRect();\n        const p = {\n          x: (position.x - rect.x) / scaleRef.current,\n          y: (position.y - rect.y) / scaleRef.current,\n        };\n        actions.addDrawLayer(\n          { path, color: penColorRef.current, width: penWidthRef.current },\n          {\n            width: boxSize.width / scaleRef.current,\n            height: boxSize.height / scaleRef.current,\n          },\n          p,\n          1 / scaleRef.current,\n          transparencyRef.current,\n        );\n      }\n\n      if (boxRef.current) {\n        boxRef.current.style.pointerEvents = 'none';\n      }\n      if (svgRef.current) {\n        svgRef.current.innerHTML = '';\n      }\n    },\n  });\n\n  useEffect(() => {\n    if (!window) return;\n    const { innerWidth: width, innerHeight: height } = window;\n    setSize({ width, height });\n  }, []);\n\n  return (\n    <>\n      <div\n        css={{\n          position: 'absolute',\n          left: 72,\n          top: 500,\n          zIndex: 10,\n          overflow: 'hidden',\n          width: 120,\n          height: 250,\n          paddingTop: 60,\n          paddingBottom: 60,\n        }}\n      >\n        <div\n          css={{\n            background: '#FFFFFF',\n            boxShadow:\n              '0px 0px 0px 1px rgba(64,87,109,.04),0px 6px 20px -4px rgba(64,87,109,.3)',\n            width: 30,\n            height: 30,\n            borderRadius: 9999,\n            zIndex: 10,\n            top: 0,\n            left: 30,\n            position: 'absolute',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            cursor: 'pointer',\n          }}\n          onClick={() => onClose()}\n        >\n          <XBoldIcon />\n        </div>\n        <div\n          css={{\n            background: '#ffffff',\n            borderRadius: 20,\n            inset: 0,\n            top: 40,\n            right: 40,\n            bottom: 10,\n            position: 'absolute',\n            boxShadow:\n              '0px 0px 0px 1px rgba(64,87,109,.04),0px 6px 20px -4px rgba(64,87,109,.3)',\n          }}\n        />\n        <div\n          css={{\n            display: 'flex',\n            flexDirection: 'column',\n            gap: 8,\n            position: 'relative',\n          }}\n        >\n          <div\n            css={{\n              color: 'rgb(5, 113, 211)',\n              marginLeft: '-30px',\n              cursor: 'pointer',\n              ':hover': {\n                marginLeft: 0,\n              },\n            }}\n            onClick={() => {\n              penColorRef.current = '#0571d3';\n              penWidthRef.current = 5;\n              transparencyRef.current = 1;\n            }}\n          >\n            <Pencil width=\"100px\" />\n          </div>\n          <div\n            css={{\n              color: 'rgb(231, 25, 31)',\n              marginLeft: '-30px',\n              cursor: 'pointer',\n              ':hover': {\n                marginLeft: 0,\n              },\n            }}\n            onClick={() => {\n              penColorRef.current = '#e7171f';\n              penWidthRef.current = 10;\n              transparencyRef.current = 1;\n            }}\n          >\n            <Marker width=\"100px\" />\n          </div>\n          <div\n            css={{\n              color: 'rgb(255, 242, 52)',\n              marginLeft: '-30px',\n              cursor: 'pointer',\n              ':hover': {\n                marginLeft: 0,\n              },\n            }}\n            onClick={() => {\n              penColorRef.current = '#fff234';\n              penWidthRef.current = 20;\n              transparencyRef.current = 0.8;\n            }}\n          >\n            <Highlighter width=\"100px\" />\n          </div>\n        </div>\n      </div>\n      {createPortal(\n        <div\n          ref={boxRef}\n          css={{ position: 'absolute', inset: 0 }}\n          style={{ pointerEvents: 'none' }}\n        >\n          <svg\n            ref={svgRef}\n            height={size.height}\n            viewBox={`0 0 ${size.width} ${size.height}`}\n            width={size.width}\n            xmlns=\"http://www.w3.org/2000/svg\"\n          />\n        </div>,\n        document.body,\n      )}\n    </>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/sidebar/FrameContent.tsx",
    "content": "import XIcon from '@duyank/icons/regular/X';\nimport type { LayerId, LayerType, SerializedLayers } from '@lidojs/design-core';\nimport { useEditor } from '@lidojs/design-editor';\nimport axios from 'axios';\nimport { type FC, useState } from 'react';\nimport { isMobile } from 'react-device-detect';\nimport { useAsync } from 'react-use';\n\ninterface Frame {\n  id: string;\n  img: string;\n  clipPath: string;\n  width: number;\n  height: number;\n}\n\nexport const FrameContent: FC<{ onClose: () => void }> = ({ onClose }) => {\n  const [frames, setFrames] = useState<Frame[]>([]);\n  const [isLoading, setIsLoading] = useState(true);\n  const { actions, query } = useEditor();\n  useAsync(async () => {\n    const response = await axios.get<Frame[]>('/frames');\n    setFrames(response.data);\n    setIsLoading(false);\n  }, []);\n  const addFrame = async (data: Frame) => {\n    actions.addFrameLayer(data, data.clipPath);\n    if (isMobile) {\n      onClose();\n    }\n  };\n\n  const handleDrag = (event: React.DragEvent, frame: Frame) => {\n    const { clientX, clientY } = event;\n    const pageSize = query.getPageSize(query.activePage());\n    const ratio = pageSize.width / pageSize.height;\n    const frameRatio = frame.width / frame.height;\n    const scale =\n      ratio > frameRatio\n        ? (pageSize.height * 0.5) / frame.height\n        : (pageSize.width * 0.5) / frame.width;\n    const data: {\n      layer: LayerType;\n      data: { rootId: LayerId; layers: SerializedLayers };\n    } = {\n      layer: 'Frame',\n      data: {\n        rootId: frame.id,\n        layers: {\n          [frame.id]: {\n            type: {\n              resolvedName: 'FrameLayer',\n            },\n            props: {\n              clipPath: frame.clipPath,\n              position: {\n                x: 0,\n                y: 0,\n              },\n              boxSize: {\n                width: frame.width * scale,\n                height: frame.height * scale,\n              },\n              rotate: 0,\n              scale,\n            },\n            locked: false,\n            parent: 'ROOT',\n            child: [],\n          },\n        },\n      },\n    };\n    actions.startDragNDrop(data, { x: clientX, y: clientY });\n    event.dataTransfer.clearData('text/plain');\n    event.dataTransfer.setData('text/plain', JSON.stringify(data));\n    event.dataTransfer.setDragImage(new Image(), 0, 0);\n  };\n\n  return (\n    <div\n      css={{\n        width: '100%',\n        height: '100%',\n        flexDirection: 'column',\n        overflowY: 'auto',\n        display: 'flex',\n      }}\n    >\n      <div\n        css={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          flexShrink: 0,\n          height: 48,\n          borderBottom: '1px solid rgba(57,76,96,.15)',\n          padding: '0 20px',\n        }}\n      >\n        <p\n          css={{\n            lineHeight: '48px',\n            fontWeight: 600,\n            color: '#181C32',\n            flexGrow: 1,\n          }}\n        >\n          Frames\n        </p>\n        <div\n          css={{\n            fontSize: 20,\n            flexShrink: 0,\n            width: 32,\n            height: 32,\n            cursor: 'pointer',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n          }}\n          onClick={onClose}\n        >\n          <XIcon />\n        </div>\n      </div>\n      <div\n        css={{ flexDirection: 'column', overflowY: 'auto', display: 'flex' }}\n      >\n        <div\n          css={{\n            flexGrow: 1,\n            overflowY: 'auto',\n            display: 'grid',\n            gridTemplateColumns: 'repeat(3,minmax(0,1fr))',\n            gridGap: 8,\n            padding: '16px',\n          }}\n        >\n          {isLoading && <div>Loading...</div>}\n          {frames.map((item, index) => (\n            <div\n              key={index}\n              css={{\n                cursor: 'pointer',\n                position: 'relative',\n                '-webkit-user-drag': 'element',\n              }}\n              onClick={() => addFrame(item)}\n              onDragStart={(e) => handleDrag(e, item)}\n            >\n              <div css={{ paddingBottom: '100%' }} />\n              <div\n                css={{\n                  position: 'absolute',\n                  top: 0,\n                  left: 0,\n                  height: '100%',\n                  width: '100%',\n                  display: 'flex',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                }}\n              >\n                <img\n                  alt={item.img}\n                  css={{\n                    maxHeight: '100%',\n                    maxWidth: '100%',\n                  }}\n                  src={item.img}\n                />\n              </div>\n            </div>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/sidebar/GraphicContent.tsx",
    "content": "import MagnifyingGlassIcon from '@duyank/icons/regular/MagnifyingGlass';\nimport XIcon from '@duyank/icons/regular/X';\nimport { useEventCallback } from '@lidojs/design-core';\nimport { useEditor } from '@lidojs/design-editor';\nimport axios from 'axios';\nimport { type FC, type FormEvent, useEffect, useRef, useState } from 'react';\nimport { isMobile } from 'react-device-detect';\nimport { useAsync } from 'react-use';\nimport Masonry from '../../../../shared/components/masonry/Masonry';\n\nexport const GraphicContent: FC<{ onClose: () => void }> = ({ onClose }) => {\n  const qRef = useRef<HTMLInputElement>(null);\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const dataRef = useRef(false);\n  const [images, setImages] = useState<\n    {\n      id: string;\n      thumb: string;\n      downloadUrl: string;\n    }[]\n  >([]);\n  const [isLoading, setIsLoading] = useState(true);\n  const [keyword, setKeyword] = useState('');\n  const { actions } = useEditor();\n\n  const loadGraphicList = useEventCallback(async (offset: number) => {\n    dataRef.current = true;\n    setIsLoading(true);\n    const params = {\n      limit: '100',\n      offset: `${offset}`,\n      q: keyword,\n    };\n    const response = await axios.get<\n      {\n        id: string;\n        thumb: string;\n        downloadUrl: string;\n      }[]\n    >(`/graphics?${new URLSearchParams(params).toString()}`);\n    if (offset) {\n      setImages((prevState) => {\n        prevState.push(...response.data);\n        return prevState;\n      });\n    } else {\n      setImages(response.data);\n    }\n    setIsLoading(false);\n    if (response.data.length > 0) {\n      dataRef.current = false;\n    }\n  });\n  useAsync(async () => {\n    await loadGraphicList(0);\n  }, [loadGraphicList]);\n\n  const handleLoadMore = useEventCallback(async (e: Event) => {\n    const node = e.target as HTMLDivElement;\n    if (\n      node.scrollHeight - node.scrollTop - 80 <= node.clientHeight &&\n      !dataRef.current\n    ) {\n      await loadGraphicList(images.length);\n    }\n  });\n\n  useEffect(() => {\n    const ele = scrollRef.current;\n    ele?.addEventListener('scroll', handleLoadMore);\n    return () => {\n      ele?.removeEventListener('scroll', handleLoadMore);\n    };\n  }, [handleLoadMore]);\n  const handleSearch = async (e: FormEvent<HTMLFormElement>) => {\n    e.preventDefault();\n    if (scrollRef.current) {\n      scrollRef.current.scrollTop = 0;\n    }\n    setKeyword(qRef.current?.value || '');\n    setTimeout(async () => {\n      await loadGraphicList(0);\n    });\n  };\n  const addGraphic = async (item: {\n    id: string;\n    thumb: string;\n    downloadUrl: string;\n  }) => {\n    const res = await axios.get(\n      `/graphics/download?url=${window.encodeURIComponent(item.downloadUrl)}`,\n    );\n    const file = res.data.file;\n    const parser = new DOMParser();\n    const ele = parser.parseFromString(file, 'text/xml')\n      .documentElement as unknown as SVGElement;\n    const viewBox = ele.getAttribute('viewBox')?.split(' ') || [];\n    const width =\n      viewBox.length === 4 ? +viewBox[2] : +(ele.getAttribute('width') || 100);\n    const height =\n      viewBox.length === 4 ? +viewBox[3] : +(ele.getAttribute('height') || 100);\n\n    const svgBlob = new Blob([ele.outerHTML], {\n      type: 'image/svg+xml;charset=utf-8',\n    });\n    const svgUrl = URL.createObjectURL(svgBlob);\n    actions.addSvgLayer(svgUrl, { width, height }, ele);\n    if (isMobile) {\n      onClose();\n    }\n  };\n\n  return (\n    <div\n      css={{\n        width: '100%',\n        height: '100%',\n        flexDirection: 'column',\n        overflowY: 'auto',\n        display: 'flex',\n      }}\n    >\n      <div\n        css={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          flexShrink: 0,\n          height: 48,\n          borderBottom: '1px solid rgba(57,76,96,.15)',\n          padding: '0 20px',\n        }}\n      >\n        <p\n          css={{\n            lineHeight: '48px',\n            fontWeight: 600,\n            color: '#181C32',\n            flexGrow: 1,\n          }}\n        >\n          Graphic\n        </p>\n        <div\n          css={{\n            fontSize: 20,\n            flexShrink: 0,\n            width: 32,\n            height: 32,\n            cursor: 'pointer',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n          }}\n          onClick={onClose}\n        >\n          <XIcon />\n        </div>\n      </div>\n      <div\n        css={{\n          flexDirection: 'column',\n          overflowY: 'auto',\n          display: 'flex',\n          flexGrow: 1,\n        }}\n      >\n        <div\n          css={{\n            borderRadius: 4,\n            boxShadow: '0 0 0 1px rgba(43,59,74,.3)',\n            margin: 16,\n          }}\n        >\n          <div\n            css={{\n              height: 40,\n              borderRadius: 4,\n              padding: '0 12px',\n              display: 'flex',\n              alignItems: 'center',\n            }}\n          >\n            <div css={{ fontSize: 24, marginRight: 8, flexShrink: 0 }}>\n              <MagnifyingGlassIcon />\n            </div>\n            <form onSubmit={handleSearch}>\n              <input\n                ref={qRef}\n                css={{ width: '100%', height: '100%' }}\n                type=\"text\"\n              />\n            </form>\n          </div>\n        </div>\n        <div\n          ref={scrollRef}\n          css={{\n            flexGrow: 1,\n            overflowY: 'auto',\n            padding: '16px',\n            gridGap: 8,\n          }}\n        >\n          <Masonry columnsCount={4} gutter=\"20px\">\n            {images.map((item) => (\n              <div\n                key={item.id}\n                css={{ cursor: 'pointer' }}\n                onClick={() => addGraphic(item)}\n              >\n                <img\n                  key={item.id}\n                  alt={item.thumb}\n                  loading=\"lazy\"\n                  src={item.thumb}\n                />\n              </div>\n            ))}\n          </Masonry>\n          {isLoading && <div>Loading...</div>}\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/sidebar/IframeContent.tsx",
    "content": "import XIcon from '@duyank/icons/regular/X';\nimport type {\n  LayerId,\n  LayerType,\n  SerializedLayerTree,\n  SerializedLayers,\n} from '@lidojs/design-core';\nimport { useEditor } from '@lidojs/design-editor';\nimport type { FC } from 'react';\nimport { isMobile } from 'react-device-detect';\nimport { iframeList } from '../../config/iframe';\n\nexport const IframeContent: FC<{ onClose: () => void }> = ({ onClose }) => {\n  const { actions } = useEditor();\n  const addIframe = async (elements: SerializedLayerTree) => {\n    actions.addLayerTree(elements);\n    if (isMobile) {\n      onClose();\n    }\n  };\n  const handleDrag = (\n    event: React.DragEvent,\n    elements: SerializedLayerTree,\n  ) => {\n    const data: {\n      layer: LayerType;\n      data: { rootId: LayerId; layers: SerializedLayers };\n    } = {\n      layer: 'Image',\n      data: elements,\n    };\n    const { clientX, clientY } = event;\n    actions.startDragNDrop(data, { x: clientX, y: clientY });\n    event.dataTransfer.clearData('text/plain');\n    event.dataTransfer.setData('text/plain', JSON.stringify(data));\n    event.dataTransfer.setDragImage(new Image(), 0, 0);\n  };\n\n  return (\n    <div\n      css={{\n        width: '100%',\n        height: '100%',\n        flexDirection: 'column',\n        overflowY: 'auto',\n        display: 'flex',\n      }}\n    >\n      <div\n        css={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          flexShrink: 0,\n          height: 48,\n          borderBottom: '1px solid rgba(57,76,96,.15)',\n          padding: '0 20px',\n        }}\n      >\n        <p\n          css={{\n            lineHeight: '48px',\n            fontWeight: 600,\n            color: '#181C32',\n            flexGrow: 1,\n          }}\n        >\n          Widgets\n        </p>\n        <div\n          css={{\n            fontSize: 20,\n            flexShrink: 0,\n            width: 32,\n            height: 32,\n            cursor: 'pointer',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n          }}\n          onClick={onClose}\n        >\n          <XIcon />\n        </div>\n      </div>\n      <div\n        css={{ flexDirection: 'column', overflowY: 'auto', display: 'flex' }}\n      >\n        <div\n          css={{\n            flexGrow: 1,\n            overflowY: 'auto',\n            display: 'grid',\n            gridTemplateColumns: 'repeat(3,minmax(0,1fr))',\n            gridGap: 8,\n            padding: '16px',\n          }}\n        >\n          {iframeList.map((item, index) => (\n            <div\n              key={index}\n              css={{\n                cursor: 'pointer',\n                position: 'relative',\n                '-webkit-user-drag': 'element',\n              }}\n              onClick={() => addIframe(item.elements[0])}\n              onDragStart={(e) => handleDrag(e, item.elements[0])}\n            >\n              <div css={{ paddingBottom: '100%' }} />\n              <div\n                css={{\n                  position: 'absolute',\n                  top: 0,\n                  left: 0,\n                  height: '100%',\n                  width: '100%',\n                  display: 'flex',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                }}\n              >\n                <img\n                  alt={item.img}\n                  css={{\n                    maxHeight: '100%',\n                    maxWidth: '100%',\n                  }}\n                  src={item.img}\n                />\n              </div>\n            </div>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/sidebar/ImageContent.tsx",
    "content": "import MagnifyingGlassIcon from '@duyank/icons/regular/MagnifyingGlass';\nimport XIcon from '@duyank/icons/regular/X';\nimport {\n  type LayerId,\n  type LayerType,\n  type SerializedLayers,\n  useEventCallback,\n} from '@lidojs/design-core';\nimport { useEditor } from '@lidojs/design-editor';\nimport axios from 'axios';\nimport type React from 'react';\nimport { type FC, type FormEvent, useEffect, useRef, useState } from 'react';\nimport { isMobile } from 'react-device-detect';\nimport Masonry from 'react-responsive-masonry';\nimport { useAsync } from 'react-use';\nimport { Photo } from './Photo';\n\nexport const ImageContent: FC<{ onClose: () => void }> = ({ onClose }) => {\n  const qRef = useRef<HTMLInputElement>(null);\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const dataRef = useRef(false);\n  const [images, setImages] = useState<\n    {\n      id: string;\n      image: string;\n      thumb: string;\n      width: number;\n      height: number;\n      username: string;\n      name: string;\n    }[]\n  >([]);\n  const [isLoading, setIsLoading] = useState(true);\n  const [keyword, setKeyword] = useState('');\n  const { actions, query } = useEditor((state) => ({\n    dragNDrop: state.dragNDrop,\n  }));\n\n  const loadImageList = useEventCallback(async (offset = 0) => {\n    dataRef.current = true;\n    setIsLoading(true);\n    const params = {\n      limit: '40',\n      page: `${(images.length % 40) + 1}`,\n      q: keyword,\n    };\n    const response = await axios.get<\n      {\n        id: string;\n        image: string;\n        thumb: string;\n        width: number;\n        height: number;\n        username: string;\n        name: string;\n      }[]\n    >(`/images?${new URLSearchParams(params).toString()}`);\n    if (offset) {\n      setImages((prevState) => {\n        prevState.push(...response.data);\n        return prevState;\n      });\n    } else {\n      setImages(response.data);\n    }\n    setIsLoading(false);\n    if (response.data.length > 0) {\n      dataRef.current = false;\n    }\n  });\n  useAsync(async () => {\n    await loadImageList(0);\n  }, [loadImageList]);\n\n  useEffect(() => {\n    const handleLoadMore = async (e: Event) => {\n      const node = e.target as HTMLDivElement;\n      if (\n        node.scrollHeight - node.scrollTop - 80 <= node.clientHeight &&\n        !dataRef.current\n      ) {\n        await loadImageList(images.length);\n      }\n    };\n    const ele = scrollRef.current;\n    ele?.addEventListener('scroll', handleLoadMore);\n    return () => {\n      ele?.removeEventListener('scroll', handleLoadMore);\n    };\n  }, [loadImageList, images]);\n  const handleSearch = async (e: FormEvent<HTMLFormElement>) => {\n    e.preventDefault();\n    if (scrollRef.current) {\n      scrollRef.current.scrollTop = 0;\n    }\n    setKeyword(qRef.current?.value || '');\n    setTimeout(async () => {\n      await loadImageList(0);\n    });\n  };\n  const addImage = async (item: {\n    id: string;\n    image: string;\n    thumb: string;\n    width: number;\n    height: number;\n    username: string;\n    name: string;\n  }) => {\n    actions.addImageLayer(\n      { thumb: item.thumb, url: item.image },\n      { width: item.width, height: item.height },\n    );\n    axios.put(`/images?id=${item.id}`);\n    if (isMobile) {\n      onClose();\n    }\n  };\n\n  const handleDrag = (\n    event: React.DragEvent,\n    item: {\n      id: string;\n      image: string;\n      thumb: string;\n      width: number;\n      height: number;\n      username: string;\n      name: string;\n    },\n  ) => {\n    const { clientX, clientY } = event;\n    const pageSize = query.getPageSize(query.activePage());\n    const ratio = pageSize.width / pageSize.height;\n    const imgRatio = item.width / item.height;\n    const w =\n      ratio < imgRatio\n        ? pageSize.width * 0.8\n        : pageSize.height * imgRatio * 0.8;\n    const h = w / imgRatio;\n    const data: {\n      layer: LayerType;\n      data: { rootId: LayerId; layers: SerializedLayers };\n    } = {\n      layer: 'Image',\n      data: {\n        rootId: item.id,\n        layers: {\n          [item.id]: {\n            type: {\n              resolvedName: 'ImageLayer',\n            },\n            props: {\n              image: {\n                url: item.image,\n                thumb: item.thumb,\n                boxSize: {\n                  width: w,\n                  height: h,\n                },\n                position: {\n                  x: 0,\n                  y: 0,\n                },\n                rotate: 0,\n              },\n              position: {\n                x: 0,\n                y: 0,\n              },\n              boxSize: {\n                width: w,\n                height: h,\n              },\n              rotate: 0,\n            },\n            locked: false,\n            parent: 'ROOT',\n            child: [],\n          },\n        },\n      },\n    };\n    actions.startDragNDrop(data, { x: clientX, y: clientY });\n    event.dataTransfer.clearData('text/plain');\n    event.dataTransfer.setData('text/plain', JSON.stringify(data));\n    event.dataTransfer.setDragImage(new Image(), 0, 0);\n  };\n\n  return (\n    <div\n      css={{\n        width: '100%',\n        height: '100%',\n        flexDirection: 'column',\n        overflowY: 'auto',\n        display: 'flex',\n      }}\n    >\n      <div\n        css={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          flexShrink: 0,\n          height: 48,\n          borderBottom: '1px solid rgba(57,76,96,.15)',\n          padding: '0 20px',\n        }}\n      >\n        <p\n          css={{\n            lineHeight: '48px',\n            fontWeight: 600,\n            color: '#181C32',\n            flexGrow: 1,\n          }}\n        >\n          Images\n        </p>\n        <div\n          css={{\n            fontSize: 20,\n            flexShrink: 0,\n            width: 32,\n            height: 32,\n            cursor: 'pointer',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n          }}\n          onClick={onClose}\n        >\n          <XIcon />\n        </div>\n      </div>\n      <div\n        css={{\n          flexDirection: 'column',\n          overflowY: 'auto',\n          display: 'flex',\n          flexGrow: 1,\n        }}\n      >\n        <div\n          css={{\n            borderRadius: 4,\n            boxShadow: '0 0 0 1px rgba(43,59,74,.3)',\n            margin: 16,\n          }}\n        >\n          <div\n            css={{\n              height: 40,\n              borderRadius: 4,\n              padding: '0 12px',\n              display: 'flex',\n              alignItems: 'center',\n            }}\n          >\n            <div css={{ fontSize: 24, marginRight: 8, flexShrink: 0 }}>\n              <MagnifyingGlassIcon />\n            </div>\n            <form onSubmit={handleSearch}>\n              <input\n                ref={qRef}\n                css={{ width: '100%', height: '100%' }}\n                type=\"text\"\n              />\n            </form>\n          </div>\n        </div>\n        <div\n          ref={scrollRef}\n          css={{\n            flexGrow: 1,\n            overflowY: 'auto',\n            padding: '16px',\n            gridGap: 8,\n          }}\n        >\n          <Masonry columnsCount={2} gutter=\"8px\">\n            {images.map((item) => (\n              <Photo\n                key={item.id}\n                image={item.thumb}\n                name={item.name}\n                username={item.username}\n                onClick={() => {\n                  addImage(item);\n                }}\n                onDragStart={(e) => handleDrag(e, item)}\n              />\n            ))}\n          </Masonry>\n          {isLoading && <div>Loading...</div>}\n        </div>\n      </div>\n\n      <div css={{ flexShrink: 0, paddingLeft: 16, textAlign: 'center' }}>\n        Photos by\n        <a href=\"https://unsplash.com/\" rel=\"noreferrer\" target=\"_blank\">\n          Unsplash\n        </a>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/sidebar/Photo.tsx",
    "content": "import { type FC, type HTMLProps, memo, useState } from 'react';\n\ntype Props = {\n  image: string;\n  name: string;\n  username: string;\n} & HTMLProps<HTMLDivElement>;\n\nexport const Photo: FC<Props> = memo(({ image, name, username, ...props }) => {\n  const [isShow, setIsShow] = useState(false);\n  return (\n    <div\n      css={{\n        cursor: 'pointer',\n        position: 'relative',\n        '-webkit-user-drag': 'element',\n      }}\n      {...props}\n      onMouseOut={() => setIsShow(false)}\n      onMouseOver={() => setIsShow(true)}\n    >\n      <img alt={image} loading=\"lazy\" src={image} />\n      <p\n        css={{\n          display: isShow ? 'block' : 'none',\n          position: 'absolute',\n          bottom: 0,\n          fontSize: 10,\n          left: 0,\n          right: 0,\n          color: '#fff',\n          textAlign: 'center',\n          paddingTop: 12,\n          paddingBottom: 2,\n          paddingLeft: 4,\n          paddingRight: 4,\n          background:\n            'linear-gradient(0deg, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, 0.2) 80%, rgba(0, 0, 0, 0) 100%)',\n        }}\n      >\n        Photo by\n        <a\n          css={{ color: '#3d8eff' }}\n          href={`https://unsplash.com/@${username}?utm_source=lidojs&utm_medium=referral`}\n          rel=\"noreferrer\"\n          target=\"_blank\"\n        >\n          {name}\n        </a>\n        on\n        <a\n          href={`https://unsplash.com/@${username}?utm_source=lidojs&utm_medium=referral`}\n          rel=\"noreferrer\"\n          target=\"_blank\"\n        >\n          unsplash\n        </a>\n      </p>\n    </div>\n  );\n});\n"
  },
  {
    "path": "src/features/design/components/sidebar/QrCodeContent.tsx",
    "content": "import XIcon from '@duyank/icons/regular/X';\nimport type {\n  LayerId,\n  LayerType,\n  SerializedLayerTree,\n  SerializedLayers,\n} from '@lidojs/design-core';\nimport { useEditor } from '@lidojs/design-editor';\nimport type { FC } from 'react';\nimport { isMobile } from 'react-device-detect';\nimport { qrCodeList } from '../../config/qrCode';\n\nexport const QrCodeContent: FC<{ onClose: () => void }> = ({ onClose }) => {\n  const { actions } = useEditor();\n  const addQrCode = async (elements: SerializedLayerTree) => {\n    actions.addLayerTree(elements);\n    if (isMobile) {\n      onClose();\n    }\n  };\n  const handleDrag = (\n    event: React.DragEvent,\n    elements: SerializedLayerTree,\n  ) => {\n    const data: {\n      layer: LayerType;\n      data: { rootId: LayerId; layers: SerializedLayers };\n    } = {\n      layer: 'Image',\n      data: elements,\n    };\n    const { clientX, clientY } = event;\n    actions.startDragNDrop(data, { x: clientX, y: clientY });\n    event.dataTransfer.clearData('text/plain');\n    event.dataTransfer.setData('text/plain', JSON.stringify(data));\n    event.dataTransfer.setDragImage(new Image(), 0, 0);\n  };\n\n  return (\n    <div\n      css={{\n        width: '100%',\n        height: '100%',\n        flexDirection: 'column',\n        overflowY: 'auto',\n        display: 'flex',\n      }}\n    >\n      <div\n        css={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          flexShrink: 0,\n          height: 48,\n          borderBottom: '1px solid rgba(57,76,96,.15)',\n          padding: '0 20px',\n        }}\n      >\n        <p\n          css={{\n            lineHeight: '48px',\n            fontWeight: 600,\n            color: '#181C32',\n            flexGrow: 1,\n          }}\n        >\n          QR Code\n        </p>\n        <div\n          css={{\n            fontSize: 20,\n            flexShrink: 0,\n            width: 32,\n            height: 32,\n            cursor: 'pointer',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n          }}\n          onClick={onClose}\n        >\n          <XIcon />\n        </div>\n      </div>\n      <div\n        css={{ flexDirection: 'column', overflowY: 'auto', display: 'flex' }}\n      >\n        <div\n          css={{\n            flexGrow: 1,\n            overflowY: 'auto',\n            display: 'grid',\n            gridTemplateColumns: 'repeat(3,minmax(0,1fr))',\n            gridGap: 8,\n            padding: '16px',\n          }}\n        >\n          {qrCodeList.map((item, index) => (\n            <div\n              key={index}\n              css={{\n                cursor: 'pointer',\n                position: 'relative',\n                '-webkit-user-drag': 'element',\n              }}\n              onClick={() => addQrCode(item.elements[0])}\n              onDragStart={(e) => handleDrag(e, item.elements[0])}\n            >\n              <div css={{ paddingBottom: '100%' }} />\n              <div\n                css={{\n                  position: 'absolute',\n                  top: 0,\n                  left: 0,\n                  height: '100%',\n                  width: '100%',\n                  display: 'flex',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                }}\n              >\n                <img\n                  alt={item.img}\n                  css={{\n                    maxHeight: '100%',\n                    maxWidth: '100%',\n                  }}\n                  src={item.img}\n                />\n              </div>\n            </div>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/sidebar/ShapeContent.tsx",
    "content": "import XIcon from '@duyank/icons/regular/X';\nimport type { LayerId, LayerType, SerializedLayers } from '@lidojs/design-core';\nimport { useEditor } from '@lidojs/design-editor';\nimport type { FC } from 'react';\nimport { isMobile } from 'react-device-detect';\nimport { v4 } from 'uuid';\nimport { type Line, lines } from '../../config/line';\nimport { type Shape, shapes } from '../../config/shape';\n\nexport const ShapeContent: FC<{ onClose: () => void }> = ({ onClose }) => {\n  const { actions, query } = useEditor();\n  const addLine = (props: Line['props']) => {\n    actions.addLineLayer({ props });\n  };\n  const addShape = (shape: Shape) => {\n    actions.addShapeLayer({\n      type: {\n        resolvedName: 'ShapeLayer',\n      },\n      props: {\n        shape: shape.type,\n        position: {\n          x: 0,\n          y: 400,\n        },\n        boxSize: {\n          width: shape.width,\n          height: shape.height,\n        },\n        rotate: 0,\n        color: '#5E6278',\n      },\n    });\n    if (isMobile) {\n      onClose();\n    }\n  };\n\n  const handleDrag = (event: React.DragEvent, shape: Shape) => {\n    const { clientX, clientY } = event;\n    const id = v4();\n    const data: {\n      layer: LayerType;\n      data: { rootId: LayerId; layers: SerializedLayers };\n    } = {\n      layer: 'Shape',\n      data: {\n        rootId: id,\n        layers: {\n          [id]: {\n            type: {\n              resolvedName: 'ShapeLayer',\n            },\n            locked: false,\n            parent: 'ROOT',\n            child: [],\n            props: {\n              shape: shape.type,\n              position: {\n                x: 0,\n                y: 400,\n              },\n              boxSize: {\n                width: shape.width,\n                height: shape.height,\n              },\n              rotate: 0,\n              color: '#5E6278',\n            },\n          },\n        },\n      },\n    };\n    actions.startDragNDrop(data, { x: clientX, y: clientY });\n    event.dataTransfer.clearData('text/plain');\n    event.dataTransfer.setData('text/plain', JSON.stringify(data));\n    event.dataTransfer.setDragImage(new Image(), 0, 0);\n  };\n  const handleDragLine = (event: React.DragEvent, line: Line) => {\n    const { clientX, clientY } = event;\n    const width = query.getPageSize(query.activePage()).width / 2;\n    const data: {\n      layer: LayerType;\n      data: { rootId: LayerId; layers: SerializedLayers };\n    } = {\n      layer: 'Line',\n      data: {\n        rootId: line.id,\n        layers: {\n          [line.id]: {\n            props: {\n              ...line.props,\n              boxSize: {\n                width,\n                height: 4,\n              },\n              position: {\n                x: 0,\n                y: 0,\n              },\n              style: 'solid',\n              color: 'rgb(0, 0, 0)',\n              scale: 1,\n              rotate: 0,\n            },\n            type: {\n              resolvedName: 'LineLayer',\n            },\n            locked: false,\n            parent: 'ROOT',\n            child: [],\n          },\n        },\n      },\n    };\n    actions.startDragNDrop(data, { x: clientX, y: clientY });\n    event.dataTransfer.clearData('text/plain');\n    event.dataTransfer.setData('text/plain', JSON.stringify(data));\n    event.dataTransfer.setDragImage(new Image(), 0, 0);\n  };\n\n  return (\n    <div\n      css={{\n        width: '100%',\n        height: '100%',\n        flexDirection: 'column',\n        overflowY: 'auto',\n        display: 'flex',\n      }}\n    >\n      <div\n        css={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          flexShrink: 0,\n          height: 48,\n          borderBottom: '1px solid rgba(57,76,96,.15)',\n          padding: '0 20px',\n        }}\n      >\n        <p\n          css={{\n            lineHeight: '48px',\n            fontWeight: 600,\n            color: '#181C32',\n            flexGrow: 1,\n          }}\n        >\n          Shapes\n        </p>\n        <div\n          css={{\n            fontSize: 20,\n            flexShrink: 0,\n            width: 32,\n            height: 32,\n            cursor: 'pointer',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n          }}\n          onClick={onClose}\n        >\n          <XIcon />\n        </div>\n      </div>\n      <div css={{ padding: '16px' }}>\n        <div css={{ padding: '8px 0', fontWeight: 700 }}>\n          Arrow\n          <div\n            css={{\n              display: 'inline-block',\n              marginLeft: 6,\n              background: '#fdebcf',\n              borderRadius: 9999,\n              fontSize: 9,\n              padding: '2px 4px',\n            }}\n          >\n            Business\n          </div>\n        </div>\n        <div\n          css={{\n            flexGrow: 1,\n            overflowY: 'auto',\n            display: 'grid',\n            gridTemplateColumns: 'repeat(4,minmax(0,1fr))',\n            gridGap: 8,\n          }}\n        >\n          {lines.map((l, idx) => (\n            <div\n              key={idx}\n              draggable\n              css={{\n                width: '100%',\n                paddingBottom: '100%',\n                position: 'relative',\n                cursor: 'pointer',\n                '-webkit-user-drag': 'element',\n              }}\n              onClick={() => addLine(l.props)}\n              onDragStart={(e) => handleDragLine(e, l)}\n            >\n              <div\n                css={{\n                  position: 'absolute',\n                  inset: 0,\n                  display: 'flex',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                }}\n              >\n                {l.icon}\n              </div>\n            </div>\n          ))}\n        </div>\n        <div css={{ padding: '8px 0', fontWeight: 700 }}>Shape</div>\n        <div\n          css={{\n            flexGrow: 1,\n            overflowY: 'auto',\n            display: 'grid',\n            gridTemplateColumns: 'repeat(4,minmax(0,1fr))',\n            gridGap: 8,\n          }}\n        >\n          {shapes.map((shape) => (\n            <div\n              key={shape.type}\n              css={{\n                width: '100%',\n                paddingBottom: '100%',\n                position: 'relative',\n                cursor: 'pointer',\n                '-webkit-user-drag': 'element',\n              }}\n              draggable={true}\n              onClick={() => addShape(shape)}\n              onDragStart={(e) => handleDrag(e, shape)}\n            >\n              {shape.icon}\n            </div>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/sidebar/Sidebar.tsx",
    "content": "import BrowserIcon from '@duyank/icons/regular/Browser';\nimport FrameCornersIcon from '@duyank/icons/regular/FrameCorners';\nimport ImageIcon from '@duyank/icons/regular/Image';\nimport LayoutIcon from '@duyank/icons/regular/Layout';\nimport PencilIcon from '@duyank/icons/regular/Pencil';\nimport PiggyBankIcon from '@duyank/icons/regular/PiggyBank';\nimport QrCodeIcon from '@duyank/icons/regular/QrCode';\nimport SquareIcon from '@duyank/icons/regular/Square';\nimport TableIcon from '@duyank/icons/regular/Table';\nimport TextTIcon from '@duyank/icons/regular/TextT';\nimport UploadIcon from '@duyank/icons/regular/Upload';\nimport VideoIcon from '@duyank/icons/regular/Video';\nimport { useEditor } from '@lidojs/design-editor';\nimport { useCallback, useState } from 'react';\nimport { SidebarTab } from '../tabs';\nimport { DrawContent } from './DrawContent';\nimport { FrameContent } from './FrameContent';\nimport { GraphicContent } from './GraphicContent';\nimport { IframeContent } from './IframeContent';\nimport { ImageContent } from './ImageContent';\nimport { QrCodeContent } from './QrCodeContent';\nimport { ShapeContent } from './ShapeContent';\nimport { TableContent } from './TableContent';\nimport { TemplateContent } from './TemplateContent';\nimport { TextContent } from './TextContent';\nimport { UploadContent } from './UploadContent';\nimport { VideoContent } from './VideoContent';\n\nconst tabs = [\n  {\n    name: 'Template',\n    icon: <LayoutIcon />,\n  },\n  {\n    name: 'Text',\n    icon: <TextTIcon />,\n  },\n  {\n    name: 'Shape',\n    icon: <SquareIcon />,\n  },\n  {\n    name: 'Table',\n    icon: <TableIcon />,\n    isBusiness: true,\n  },\n  {\n    name: 'Frame',\n    icon: <FrameCornersIcon />,\n  },\n  {\n    name: 'Image',\n    icon: <ImageIcon />,\n  },\n  {\n    name: 'Graphic',\n    icon: <PiggyBankIcon />,\n  },\n  {\n    name: 'QrCode',\n    icon: <QrCodeIcon />,\n    isBusiness: true,\n  },\n  {\n    name: 'Widgets',\n    icon: <BrowserIcon />,\n  },\n  {\n    name: 'Draw',\n    icon: <PencilIcon />,\n    isBusiness: true,\n  },\n  {\n    name: 'Video',\n    icon: <VideoIcon />,\n  },\n  {\n    name: 'Upload',\n    icon: <UploadIcon />,\n  },\n];\nexport const Sidebar = () => {\n  const { actions } = useEditor();\n  const [tab, setTab] = useState<string | null>('Template');\n\n  const handleCloseTab = useCallback(() => {\n    setTab(null);\n    actions.setSidebar();\n  }, [actions]);\n  return (\n    <div\n      css={{\n        display: 'flex',\n        zIndex: 2,\n        position: 'relative',\n        backgroundColor: '#ffffff',\n        borderRight: '1px solid rgba(217, 219, 228, 0.6)',\n      }}\n    >\n      <div\n        css={{\n          display: 'flex',\n        }}\n      >\n        <SidebarTab\n          active={tab}\n          tabs={tabs}\n          onChange={(_, tab) => {\n            actions.setSidebar();\n            setTab(tab);\n          }}\n        />\n        {tab && (\n          <div\n            css={{\n              width: tab === 'Draw' ? 0 : 360,\n              '@media (max-width: 900px)': {\n                width: '100%',\n                position: 'fixed',\n                bottom: 0,\n                left: 0,\n                top: 0,\n                background: '#fff',\n              },\n            }}\n          >\n            {tab === 'Template' && (\n              <TemplateContent\n                onClose={() => {\n                  setTab(null);\n                  actions.setSidebar();\n                }}\n              />\n            )}\n            {tab === 'Text' && <TextContent onClose={handleCloseTab} />}\n            {tab === 'Frame' && <FrameContent onClose={handleCloseTab} />}\n            {tab === 'Image' && <ImageContent onClose={handleCloseTab} />}\n            {tab === 'Graphic' && <GraphicContent onClose={handleCloseTab} />}\n            {tab === 'QrCode' && <QrCodeContent onClose={handleCloseTab} />}\n            {tab === 'Widgets' && <IframeContent onClose={handleCloseTab} />}\n            {tab === 'Shape' && <ShapeContent onClose={handleCloseTab} />}\n            {tab === 'Table' && <TableContent onClose={handleCloseTab} />}\n            {tab === 'Video' && <VideoContent onClose={handleCloseTab} />}\n            {tab === 'Draw' && <DrawContent onClose={handleCloseTab} />}\n            <UploadContent\n              visibility={tab === 'Upload'}\n              onClose={handleCloseTab}\n            />\n          </div>\n        )}\n      </div>\n      <div\n        css={{\n          width: 360,\n          position: 'absolute',\n          overflow: 'hidden',\n          top: 0,\n          left: 73,\n          height: '100%',\n          pointerEvents: 'none',\n        }}\n        id=\"settings\"\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/sidebar/TableContent.tsx",
    "content": "import XIcon from '@duyank/icons/regular/X';\nimport type { LayerId, LayerType, SerializedLayers } from '@lidojs/design-core';\nimport { useEditor } from '@lidojs/design-editor';\nimport type { FC } from 'react';\nimport { isMobile } from 'react-device-detect';\nimport { v4 } from 'uuid';\n\nconst tableLayer = {\n  type: {\n    resolvedName: 'TableLayer',\n  },\n  props: {\n    position: {\n      x: 458.2781364561637,\n      y: 229.60681114551085,\n    },\n    boxSize: {\n      width: 838.5314463859182,\n      height: 282,\n      x: 344.41332869685516,\n      y: 226.56694426649582,\n    },\n    rotate: 0,\n    scale: 1,\n    format: {\n      cellSpacing: 0,\n      cellPadding: 10,\n      rowHeight: [100, 120, 180, 202.38026124818578],\n      colWidth: [400, 400, 300, 252.3802612481859],\n      rows: [\n        {\n          index: 1,\n          height: 70,\n        },\n        {\n          index: 2,\n          height: 70,\n        },\n        {\n          index: 3,\n          height: 70,\n        },\n        {\n          index: 4,\n          height: 70,\n        },\n      ],\n      columns: [\n        {\n          index: 1,\n          width: 226.64958360025628,\n        },\n        {\n          index: 2,\n          width: 209.83984625240237,\n        },\n        {\n          index: 3,\n          width: 200.19218449711718,\n        },\n        {\n          index: 4,\n          width: 199.8498320361424,\n        },\n      ],\n    },\n    cells: [\n      {\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(84, 84, 84)',\n                fontFamily: 'Acme',\n                fontSize: '18px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  marks: [\n                    {\n                      type: 'bold',\n                    },\n                    {\n                      type: 'color',\n                      attrs: {\n                        color: 'rgb(84, 84, 84)',\n                      },\n                    },\n                  ],\n                  text: 'Header 1',\n                },\n              ],\n            },\n          ],\n        },\n        row: 1,\n        col: 1,\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(84, 84, 84)',\n                fontFamily: 'Acme',\n                fontSize: '18px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  marks: [\n                    {\n                      type: 'bold',\n                    },\n                    {\n                      type: 'color',\n                      attrs: {\n                        color: 'rgb(84, 84, 84)',\n                      },\n                    },\n                  ],\n                  text: 'Header 1',\n                },\n              ],\n            },\n          ],\n        },\n        row: 1,\n        col: 2,\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(84, 84, 84)',\n                fontFamily: 'Acme',\n                fontSize: '18px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  marks: [\n                    {\n                      type: 'bold',\n                    },\n                    {\n                      type: 'color',\n                      attrs: {\n                        color: 'rgb(84, 84, 84)',\n                      },\n                    },\n                  ],\n                  text: 'Header 3',\n                },\n              ],\n            },\n          ],\n        },\n        row: 1,\n        col: 3,\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(84, 84, 84)',\n                fontFamily: 'Acme',\n                fontSize: '18px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  marks: [\n                    {\n                      type: 'bold',\n                    },\n                    {\n                      type: 'color',\n                      attrs: {\n                        color: 'rgb(84, 84, 84)',\n                      },\n                    },\n                  ],\n                  text: 'Header 4',\n                },\n              ],\n            },\n          ],\n        },\n        row: 1,\n        col: 4,\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Akatab',\n                fontSize: '10px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  marks: [\n                    {\n                      type: 'color',\n                      attrs: {\n                        color: 'rgb(0, 0, 0)',\n                      },\n                    },\n                  ],\n                  text: 'Content For Column 1',\n                },\n              ],\n            },\n          ],\n        },\n        row: 2,\n        col: 1,\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(228, 5, 5)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Akatab',\n                fontSize: '10px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  text: 'Content For Column 2',\n                },\n              ],\n            },\n          ],\n        },\n        row: 2,\n        col: 2,\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(96, 25, 211)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Akatab',\n                fontSize: '10px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  marks: [\n                    {\n                      type: 'color',\n                      attrs: {\n                        color: 'rgb(0, 0, 0)',\n                      },\n                    },\n                  ],\n                  text: 'Content For Column 3',\n                },\n              ],\n            },\n          ],\n        },\n        row: 2,\n        col: 3,\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        row: 2,\n        col: 4,\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Akatab',\n                fontSize: '10px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  text: 'Content For Column 4',\n                },\n              ],\n            },\n          ],\n        },\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        row: 3,\n        col: 3,\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Akatab',\n                fontSize: '10px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  text: 'Content For Column 3',\n                },\n              ],\n            },\n          ],\n        },\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        row: 3,\n        col: 4,\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Akatab',\n                fontSize: '10px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  text: 'Content For Column 4',\n                },\n              ],\n            },\n          ],\n        },\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Akatab',\n                fontSize: '10px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  text: 'Content For Column 1',\n                },\n              ],\n            },\n          ],\n        },\n        row: 3,\n        col: 1,\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Akatab',\n                fontSize: '10px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  text: 'Content For Column 2',\n                },\n              ],\n            },\n          ],\n        },\n        row: 3,\n        col: 2,\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Akatab',\n                fontSize: '10px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  text: 'Content For Column 1',\n                },\n              ],\n            },\n          ],\n        },\n        col: 1,\n        row: 4,\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 2,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        row: 4,\n        col: 2,\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Akatab',\n                fontSize: '10px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  text: 'Content For Column 2',\n                },\n              ],\n            },\n          ],\n        },\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 2,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        row: 4,\n        col: 3,\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Akatab',\n                fontSize: '10px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  text: 'Content For Column 3',\n                },\n              ],\n            },\n          ],\n        },\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 2,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n      {\n        value: {\n          type: 'doc',\n          content: [\n            {\n              type: 'paragraph',\n              attrs: {\n                textAlign: 'center',\n                color: 'rgb(0, 0, 0)',\n                fontFamily: 'Akatab',\n                fontSize: '10px',\n                lineHeight: '1.4',\n                letterSpacing: 0,\n                textTransform: 'uppercase',\n                marginLeft: null,\n                indent: 0,\n                listType: '',\n              },\n              content: [\n                {\n                  type: 'text',\n                  text: 'Content For Column 4',\n                },\n              ],\n            },\n          ],\n        },\n        col: 4,\n        row: 4,\n        background: 'rgb(255,255,255)',\n        border: {\n          top: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          left: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          right: {\n            width: 1,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n          bottom: {\n            width: 2,\n            color: 'rgb(0, 0, 0)',\n            style: 'solid',\n          },\n        },\n      },\n    ],\n    fonts: [\n      {\n        name: 'Acme',\n        fonts: [\n          {\n            urls: [\n              'https://fonts.gstatic.com/s/acme/v25/RrQfboBx-C5_bx3Lb23lzLk.ttf',\n            ],\n          },\n        ],\n      },\n      {\n        name: 'Akatab',\n        fonts: [\n          {\n            style: 'Bold',\n            urls: [\n              'https://fonts.gstatic.com/s/akatab/v7/VuJzdNrK3Z7gqJE3gKLdPKNiaRpFvg.ttf',\n            ],\n          },\n          {\n            urls: [\n              'https://fonts.gstatic.com/s/akatab/v7/VuJwdNrK3Z7gqJEPWIz5NIh-YA.ttf',\n            ],\n          },\n        ],\n      },\n    ],\n  },\n};\n\nexport const TableContent: FC<{ onClose: () => void }> = ({ onClose }) => {\n  const { actions } = useEditor();\n\n  const addTable = () => {\n    actions.addLayer(tableLayer);\n    if (isMobile) {\n      onClose();\n    }\n  };\n  const handleDrag = (event: React.DragEvent) => {\n    const { clientX, clientY } = event;\n    const id = v4();\n    const data: {\n      layer: LayerType;\n      data: { rootId: LayerId; layers: SerializedLayers };\n    } = {\n      layer: 'Table',\n      data: {\n        rootId: id,\n        layers: {\n          [id]: {\n            ...tableLayer,\n            locked: false,\n            parent: 'ROOT',\n            child: [],\n          },\n        },\n      },\n    };\n    actions.startDragNDrop(data, { x: clientX, y: clientY });\n    event.dataTransfer.clearData('text/plain');\n    event.dataTransfer.setData('text/plain', JSON.stringify(data));\n    event.dataTransfer.setDragImage(new Image(), 0, 0);\n  };\n\n  return (\n    <div\n      css={{\n        width: '100%',\n        height: '100%',\n        flexDirection: 'column',\n        overflowY: 'auto',\n        display: 'flex',\n      }}\n    >\n      <div\n        css={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          flexShrink: 0,\n          height: 48,\n          borderBottom: '1px solid rgba(57,76,96,.15)',\n          padding: '0 20px',\n        }}\n      >\n        <p\n          css={{\n            lineHeight: '48px',\n            fontWeight: 600,\n            color: '#181C32',\n            flexGrow: 1,\n          }}\n        >\n          Table\n        </p>\n        <div\n          css={{\n            fontSize: 20,\n            flexShrink: 0,\n            width: 32,\n            height: 32,\n            cursor: 'pointer',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n          }}\n          onClick={onClose}\n        >\n          <XIcon />\n        </div>\n      </div>\n      <div css={{ padding: '16px' }}>\n        <div\n          css={{ cursor: 'pointer', '-webkit-user-drag': 'element' }}\n          onClick={addTable}\n          onDragStart={(e) => handleDrag(e)}\n        >\n          <div>\n            <img src=\"/assets/images/table/table-1.png\" alt=\"Table\" />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/sidebar/TemplateContent.tsx",
    "content": "import XIcon from '@duyank/icons/regular/X';\nimport type { SerializedPage } from '@lidojs/design-core';\nimport { useEditor } from '@lidojs/design-editor';\nimport axios from 'axios';\nimport { type FC, useState } from 'react';\nimport { isMobile } from 'react-device-detect';\nimport { useAsync } from 'react-use';\n\ninterface Template {\n  img: string;\n  elements: SerializedPage;\n}\n\nexport const TemplateContent: FC<{ onClose: () => void }> = ({ onClose }) => {\n  const [templates, setTemplates] = useState<Template[]>([]);\n  const [isLoading, setIsLoading] = useState(true);\n  const { actions, activePage } = useEditor((state) => ({\n    activePage: state.activePage,\n  }));\n  useAsync(async () => {\n    const response = await axios.get<Template[]>('/templates');\n    setTemplates(response.data);\n    setIsLoading(false);\n  }, []);\n  const addPage = async (data: SerializedPage) => {\n    actions.setPage(activePage, data);\n    if (isMobile) {\n      onClose();\n    }\n  };\n  return (\n    <div\n      css={{\n        width: '100%',\n        height: '100%',\n        flexDirection: 'column',\n        overflowY: 'auto',\n        display: 'flex',\n      }}\n    >\n      <div\n        css={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          flexShrink: 0,\n          height: 48,\n          borderBottom: '1px solid rgba(57,76,96,.15)',\n          padding: '0 20px',\n        }}\n      >\n        <p\n          css={{\n            lineHeight: '48px',\n            fontWeight: 600,\n            color: '#181C32',\n            flexGrow: 1,\n          }}\n        >\n          Templates\n        </p>\n        <div\n          css={{\n            fontSize: 20,\n            flexShrink: 0,\n            width: 32,\n            height: 32,\n            cursor: 'pointer',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n          }}\n          onClick={onClose}\n        >\n          <XIcon />\n        </div>\n      </div>\n      <div\n        css={{ flexDirection: 'column', overflowY: 'auto', display: 'flex' }}\n      >\n        <div\n          css={{\n            flexGrow: 1,\n            overflowY: 'auto',\n            display: 'grid',\n            gridTemplateColumns: 'repeat(2,minmax(0,1fr))',\n            gridGap: 8,\n            padding: '16px',\n          }}\n        >\n          {isLoading && <div>Loading...</div>}\n          {templates.map((item, index) => (\n            <div\n              key={index}\n              css={{ cursor: 'pointer' }}\n              onClick={() => addPage(item.elements)}\n            >\n              <img alt={item.img} loading=\"lazy\" src={item.img} />\n            </div>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/sidebar/TextContent.tsx",
    "content": "import XIcon from '@duyank/icons/regular/X';\nimport type { LayerId, SerializedLayers } from '@lidojs/design-core';\nimport { useEditor } from '@lidojs/design-editor';\nimport axios from 'axios';\nimport { type FC, useState } from 'react';\nimport { isMobile } from 'react-device-detect';\nimport { useAsync } from 'react-use';\nimport {\n  addABodyText,\n  addAHeading,\n  addASubheading,\n} from '../../../../constant/text-effects';\nimport { getThumbnail } from '../../../../utils/thumbnail';\n\ninterface Text {\n  img: string;\n  elements: {\n    rootId: LayerId;\n    layers: SerializedLayers;\n  };\n}\n\nexport const TextContent: FC<{ onClose: () => void }> = ({ onClose }) => {\n  const { actions } = useEditor();\n  const [texts, setTexts] = useState<Text[]>([]);\n  const [isLoading, setIsLoading] = useState(true);\n\n  useAsync(async () => {\n    const response = await axios.get<Text[]>('/texts');\n    setTexts(response.data);\n    setIsLoading(false);\n  }, []);\n\n  const handleAddText = (data: {\n    rootId: LayerId;\n    layers: SerializedLayers;\n  }) => {\n    actions.addTextLayer(data);\n    if (isMobile) {\n      onClose();\n    }\n  };\n\n  const handleDrag = (\n    event: React.DragEvent,\n    data: { rootId: LayerId; layers: SerializedLayers },\n  ) => {\n    const { clientX, clientY } = event;\n    actions.startDragNDrop({ layer: 'Text', data }, { x: clientX, y: clientY });\n    event.dataTransfer.clearData('text/plain');\n    event.dataTransfer.setData(\n      'text/plain',\n      JSON.stringify({ layer: 'Text', data }),\n    );\n    event.dataTransfer.setDragImage(new Image(), 0, 0);\n  };\n\n  return (\n    <div\n      css={{\n        width: '100%',\n        height: '100%',\n        flexDirection: 'column',\n        overflowY: 'auto',\n        display: 'flex',\n      }}\n    >\n      <div\n        css={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          flexShrink: 0,\n          height: 48,\n          borderBottom: '1px solid rgba(57,76,96,.15)',\n          padding: '0 20px',\n        }}\n      >\n        <p\n          css={{\n            lineHeight: '48px',\n            fontWeight: 600,\n            color: '#181C32',\n            flexGrow: 1,\n          }}\n        >\n          Text\n        </p>\n        <div\n          css={{\n            fontSize: 20,\n            flexShrink: 0,\n            width: 32,\n            height: 32,\n            cursor: 'pointer',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n          }}\n          onClick={onClose}\n        >\n          <XIcon />\n        </div>\n      </div>\n      <div\n        css={{ flexDirection: 'column', overflowY: 'auto', display: 'flex' }}\n      >\n        <div\n          css={{\n            padding: 16,\n            display: 'flex',\n            gap: 8,\n            flexDirection: 'column',\n          }}\n        >\n          <div\n            css={{\n              fontSize: 28,\n              lineHeight: 1,\n              padding: '16px 16px',\n              fontWeight: 700,\n              background: '#EBECF0',\n              borderRadius: 4,\n              cursor: 'pointer',\n              '-webkit-user-drag': 'element',\n            }}\n            draggable={true}\n            onClick={() => handleAddText(addAHeading)}\n            onDragStart={(e) => handleDrag(e, addAHeading)}\n          >\n            Add a heading\n          </div>\n          <div\n            css={{\n              fontSize: 18,\n              lineHeight: 1,\n              padding: '16px',\n              fontWeight: 700,\n              background: '#EBECF0',\n              borderRadius: 4,\n              cursor: 'pointer',\n              '-webkit-user-drag': 'element',\n            }}\n            onClick={() => handleAddText(addASubheading)}\n            onDragStart={(e) => handleDrag(e, addASubheading)}\n          >\n            Add a subheading\n          </div>\n          <div\n            css={{\n              fontSize: 12,\n              lineHeight: 1,\n              padding: '16px',\n              fontWeight: 700,\n              background: '#EBECF0',\n              borderRadius: 4,\n              cursor: 'pointer',\n              '-webkit-user-drag': 'element',\n            }}\n            onClick={() => handleAddText(addABodyText)}\n            onDragStart={(e) => handleDrag(e, addABodyText)}\n          >\n            Add a little bit of body text\n          </div>\n        </div>\n        <div\n          css={{\n            flexGrow: 1,\n            overflowY: 'auto',\n            display: 'grid',\n            gridTemplateColumns: 'repeat(3,minmax(0,1fr))',\n            gridGap: 8,\n            padding: '16px',\n          }}\n        >\n          {isLoading && <div>Loading...</div>}\n          {texts.map(({ img, elements }, idx) => (\n            <div\n              key={idx}\n              css={{\n                cursor: 'pointer',\n                position: 'relative',\n                paddingBottom: '100%',\n                width: '100%',\n                '-webkit-user-drag': 'element',\n              }}\n              onClick={() => handleAddText(elements)}\n              onDragStart={(e) => handleDrag(e, elements)}\n            >\n              <img\n                alt={getThumbnail(img)}\n                css={{\n                  position: 'absolute',\n                  top: 0,\n                  left: 0,\n                  height: '100%',\n                  width: '100%',\n                  objectFit: 'cover',\n                }}\n                src={getThumbnail(img)}\n              />\n            </div>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/sidebar/UploadContent.tsx",
    "content": "import XIcon from '@duyank/icons/regular/X';\nimport { useEditor } from '@lidojs/design-editor';\nimport { fetchSvgContent } from '@lidojs/design-utils';\nimport { type ChangeEvent, type FC, useRef, useState } from 'react';\nimport { isMobile } from 'react-device-detect';\n\ninterface UploadContentProps {\n  visibility: boolean;\n  onClose: () => void;\n}\n\nexport const UploadContent: FC<UploadContentProps> = ({\n  visibility,\n  onClose,\n}) => {\n  const inputFileRef = useRef<HTMLInputElement>(null);\n  const { actions } = useEditor();\n\n  const [images, setImages] = useState<\n    { url: string; type: 'svg' | 'image' }[]\n  >([]);\n  const addImage = async (url: string) => {\n    if (!window) return;\n    const img = new Image();\n    img.onerror = (err) => window.alert(err);\n    img.src = url;\n    img.crossOrigin = 'anonymous';\n    img.onload = () => {\n      actions.addImageLayer(\n        { url, thumb: url },\n        { width: img.naturalWidth, height: img.naturalHeight },\n      );\n      if (isMobile) {\n        onClose();\n      }\n    };\n  };\n  const addSvg = async (url: string) => {\n    const ele = await fetchSvgContent(url);\n    const viewBox = ele.getAttribute('viewBox')?.split(' ') || [];\n    const width =\n      viewBox.length === 4 ? +viewBox[2] : +(ele.getAttribute('width') || 100);\n    const height =\n      viewBox.length === 4 ? +viewBox[3] : +(ele.getAttribute('height') || 100);\n    actions.addSvgLayer(url, { width, height }, ele);\n    if (isMobile) {\n      onClose();\n    }\n  };\n\n  const handleUpload = (e: ChangeEvent<HTMLInputElement>) => {\n    const file = e.target.files?.[0];\n    if (file) {\n      const reader = new FileReader();\n      reader.onloadend = () => {\n        setImages((prevState) => {\n          return prevState.concat([\n            {\n              url: reader.result as string,\n              type: file.type === 'image/svg+xml' ? 'svg' : 'image',\n            },\n          ]);\n        });\n      };\n      reader.readAsDataURL(file);\n    }\n  };\n  return (\n    <div\n      css={{\n        width: '100%',\n        height: '100%',\n        flexDirection: 'column',\n        overflowY: 'auto',\n        display: visibility ? 'flex' : 'none',\n      }}\n    >\n      <div\n        css={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          flexShrink: 0,\n          height: 48,\n          borderBottom: '1px solid rgba(57,76,96,.15)',\n          padding: '0 20px',\n        }}\n      >\n        <p\n          css={{\n            lineHeight: '48px',\n            fontWeight: 600,\n            color: '#181C32',\n            flexGrow: 1,\n          }}\n        >\n          Upload Images\n        </p>\n        <div\n          css={{\n            fontSize: 20,\n            flexShrink: 0,\n            width: 32,\n            height: 32,\n            cursor: 'pointer',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n          }}\n          onClick={onClose}\n        >\n          <XIcon />\n        </div>\n      </div>\n      <div\n        css={{\n          margin: 16,\n          background: '#3a3a4c',\n          borderRadius: 8,\n          color: '#fff',\n          padding: '8px 16px',\n          cursor: 'pointer',\n          textAlign: 'center',\n        }}\n        onClick={() => inputFileRef.current?.click()}\n      >\n        Upload\n      </div>\n      <input\n        ref={inputFileRef}\n        accept=\"image/*\"\n        css={{ display: 'none' }}\n        type=\"file\"\n        onChange={handleUpload}\n      />\n      <div css={{ padding: '16px' }}>\n        <div\n          css={{\n            flexGrow: 1,\n            overflowY: 'auto',\n            display: 'grid',\n            gridTemplateColumns: 'repeat(2,minmax(0,1fr))',\n            gridGap: 8,\n          }}\n        >\n          {images.map((item, idx) => (\n            <div\n              key={idx}\n              css={{ cursor: 'pointer', position: 'relative' }}\n              onClick={() =>\n                item.type === 'image' ? addImage(item.url) : addSvg(item.url)\n              }\n            >\n              <div css={{ paddingBottom: '100%', height: 0 }} />\n              <div\n                css={{\n                  position: 'absolute',\n                  inset: 0,\n                  display: 'flex',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                }}\n              >\n                <img\n                  alt={item.url}\n                  css={{ maxHeight: '100%' }}\n                  loading=\"lazy\"\n                  src={item.url}\n                />\n              </div>\n            </div>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/sidebar/VideoContent.tsx",
    "content": "import XIcon from '@duyank/icons/regular/X';\nimport type { LayerId, LayerType, SerializedLayers } from '@lidojs/design-core';\nimport { useEditor } from '@lidojs/design-editor';\nimport { type FC, useState } from 'react';\nimport { isMobile } from 'react-device-detect';\nimport { useAsync } from 'react-use';\nimport { v4 } from 'uuid';\n\nexport const VideoContent: FC<{ onClose: () => void }> = ({ onClose }) => {\n  const [videos] = useState<\n    { img: string; url: string; width: number; height: number }[]\n  >([\n    {\n      img: 'https://template.canva.com/EAFaarkqz_0/2/0/400w-IVVQCZOr1K4.jpg',\n      url: 'https://template.canva.com/EAFaarkqz_0/2/0/400w-xadNArxL6gA.mp4',\n      width: 400,\n      height: 334,\n    },\n  ]);\n  const [isLoading] = useState(false);\n  const { actions, query } = useEditor();\n  useAsync(async () => {\n    //const response = await axios.get<{ img: string; url: string; width: number; height: number }[]>('/videos');\n    //setVideos(response.data);\n    //setIsLoading(false);\n  }, []);\n\n  const addVideo = ({\n    url,\n    width,\n    height,\n  }: {\n    url: string;\n    width: number;\n    height: number;\n  }) => {\n    actions.addVideoLayer({ url }, { width, height });\n    if (isMobile) {\n      onClose();\n    }\n  };\n\n  const handleDrag = (\n    event: React.DragEvent,\n    { url, width, height }: (typeof videos)[number],\n  ) => {\n    const { clientX, clientY } = event;\n    const pageSize = query.getPageSize(query.activePage());\n    const ratio = pageSize.width / pageSize.height;\n    const imgRatio = width / height;\n    const w =\n      ratio < imgRatio\n        ? pageSize.width * 0.4\n        : pageSize.height * imgRatio * 0.4;\n    const h = w / imgRatio;\n    const id: LayerId = v4();\n    const data: {\n      layer: LayerType;\n      data: { rootId: LayerId; layers: SerializedLayers };\n    } = {\n      layer: 'Video',\n      data: {\n        rootId: id,\n        layers: {\n          [id]: {\n            type: {\n              resolvedName: 'VideoLayer',\n            },\n            props: {\n              video: {\n                url: url,\n                boxSize: {\n                  width: w,\n                  height: h,\n                },\n                position: {\n                  x: 0,\n                  y: 0,\n                },\n                rotate: 0,\n              },\n              position: {\n                x: 0,\n                y: 0,\n              },\n              boxSize: {\n                width: w,\n                height: h,\n              },\n              rotate: 0,\n            },\n            locked: false,\n            parent: 'ROOT',\n            child: [],\n          },\n        },\n      },\n    };\n    actions.startDragNDrop(data, { x: clientX, y: clientY });\n    event.dataTransfer.clearData('text/plain');\n    event.dataTransfer.setData('text/plain', JSON.stringify(data));\n    event.dataTransfer.setDragImage(new Image(), 0, 0);\n  };\n\n  return (\n    <div\n      css={{\n        width: '100%',\n        height: '100%',\n        flexDirection: 'column',\n        overflowY: 'auto',\n        display: 'flex',\n      }}\n    >\n      <div\n        css={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          flexShrink: 0,\n          height: 48,\n          borderBottom: '1px solid rgba(57,76,96,.15)',\n          padding: '0 20px',\n        }}\n      >\n        <p\n          css={{\n            lineHeight: '48px',\n            fontWeight: 600,\n            color: '#181C32',\n            flexGrow: 1,\n          }}\n        >\n          Images\n        </p>\n        <div\n          css={{\n            fontSize: 20,\n            flexShrink: 0,\n            width: 32,\n            height: 32,\n            cursor: 'pointer',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n          }}\n          onClick={onClose}\n        >\n          <XIcon />\n        </div>\n      </div>\n      <div\n        css={{ flexDirection: 'column', overflowY: 'auto', display: 'flex' }}\n      >\n        <div\n          css={{\n            flexGrow: 1,\n            overflowY: 'auto',\n            display: 'grid',\n            gridTemplateColumns: 'repeat(3,minmax(0,1fr))',\n            padding: '16px',\n            gridGap: 8,\n          }}\n        >\n          {isLoading && <div>Loading...</div>}\n          {videos.map((item, idx) => (\n            <div\n              key={idx}\n              css={{\n                cursor: 'pointer',\n                position: 'relative',\n                paddingBottom: '100%',\n                width: '100%',\n                '-webkit-user-drag': 'element',\n              }}\n              onClick={() => addVideo(item)}\n              draggable={true}\n              onDragStart={(e) => handleDrag(e, item)}\n            >\n              <img\n                alt={item.img}\n                css={{\n                  position: 'absolute',\n                  top: 0,\n                  left: 0,\n                  height: '100%',\n                  width: '100%',\n                  objectFit: 'cover',\n                }}\n                loading=\"lazy\"\n                src={item.img}\n              />\n            </div>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/sidebar/index.ts",
    "content": "export * from './Sidebar';\n"
  },
  {
    "path": "src/features/design/components/tabs/TabList.tsx",
    "content": "import type { FC, ReactNode } from 'react';\n\ninterface SidebarTabProps {\n  tabs: {\n    name: string;\n    icon: ReactNode;\n    isBusiness?: boolean;\n  }[];\n  active: string | null;\n  onChange: (e: React.MouseEvent, tab: string) => void;\n}\n\nexport const SidebarTab: FC<SidebarTabProps> = ({ tabs, active, onChange }) => {\n  const activeIdx = tabs.findIndex((tab) => tab.name === active);\n  return (\n    <div\n      css={{\n        color: '#5E6278',\n        borderRight: '1px solid rgba(217, 219, 228, 0.6)',\n        overflowY: 'auto',\n        '@media (max-width: 900px)': {\n          position: 'fixed',\n          bottom: 0,\n          left: 0,\n          right: 0,\n          background: '#fff',\n          display: 'flex',\n          justifyContent: 'center',\n        },\n      }}\n    >\n      <div\n        css={{\n          position: 'relative',\n          '@media (max-width: 900px)': {\n            display: 'flex',\n            overflowX: 'scroll',\n          },\n        }}\n      >\n        {activeIdx >= 0 && (\n          <div\n            css={{\n              background: '#fff',\n              width: 72,\n              height: 72,\n              position: 'absolute',\n              left: 0,\n              top: 0,\n              transform: `translateY(${activeIdx * 100}%)`,\n              '@media (max-width: 900px)': {\n                display: 'none',\n              },\n            }}\n          >\n            <div\n              css={{\n                position: 'absolute',\n                height: 8,\n                width: 8,\n                right: 0,\n                top: -8,\n                background:\n                  'radial-gradient(circle closest-side,transparent 0,transparent 50%,#fff 0) 200% 200% /400% 400%',\n              }}\n            />\n            <div\n              css={{\n                position: 'absolute',\n                height: 8,\n                width: 8,\n                right: 0,\n                bottom: -8,\n                transform: 'scaleY(-1)',\n                background:\n                  'radial-gradient(circle closest-side,transparent 0,transparent 50%,#fff 0) 200% 200% /400% 400%',\n              }}\n            />\n          </div>\n        )}\n        {tabs.map((tab, idx) => (\n          <div\n            key={idx}\n            css={{\n              color: idx === activeIdx ? '#009ef7' : undefined,\n              borderBottomRightRadius: idx === activeIdx - 1 ? 8 : 0,\n              borderTopRightRadius: idx === activeIdx + 1 ? 8 : 0,\n              position: 'relative',\n              display: 'flex',\n              flexDirection: 'column',\n              justifyContent: 'center',\n              alignItems: 'center',\n              padding: '0 2px',\n              height: 72,\n              width: 72,\n              minWidth: 72,\n              minHeight: 72,\n              cursor: 'pointer',\n              ':hover': {\n                color: '#009ef7',\n              },\n            }}\n            onClick={(e) => onChange(e, tab.name)}\n          >\n            <div css={{ fontSize: 24 }}>{tab.icon}</div>\n            <span css={{ fontSize: 10, lineHeight: 1.6, fontWeight: 600 }}>\n              {tab.name}\n            </span>\n            {tab.isBusiness && (\n              <div\n                css={{\n                  position: 'absolute',\n                  background: '#fdebcf',\n                  borderRadius: 9999,\n                  fontSize: 9,\n                  padding: '2px 4px',\n                  top: 0,\n                }}\n              >\n                Business\n              </div>\n            )}\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/features/design/components/tabs/index.ts",
    "content": "export * from './TabList';\n"
  },
  {
    "path": "src/features/design/config/iframe.tsx",
    "content": "import type { LayerId, SerializedLayers } from '@lidojs/design-core';\n\nexport type IframeItem = {\n  elements: [\n    {\n      rootId: LayerId;\n      layers: SerializedLayers;\n    },\n  ];\n  img: string;\n};\n\nexport const iframeList: IframeItem[] = [\n  {\n    elements: [\n      {\n        rootId: '3f39efa2-4017-4c77-b3a9-c98456c629f0',\n        layers: {\n          '3f39efa2-4017-4c77-b3a9-c98456c629f0': {\n            type: { resolvedName: 'IframeLayer' },\n            props: {\n              url: 'https://api.wo-cloud.com/content/widget/?geoObjectKey=6112695&language=en&region=US&timeFormat=HH:mm&windUnit=mph&systemOfMeasurement=imperial&temperatureUnit=fahrenheit',\n              position: { x: 45.586770981507925, y: 121.96449211646916 },\n              boxSize: {\n                width: 350.8264580369844,\n                height: 350.8264580369844,\n              },\n              rotate: 0,\n              scale: 1,\n            },\n            locked: false,\n            child: [],\n            parent: 'ROOT',\n          },\n        },\n      },\n    ],\n    img: '/assets/images/weather/1.png',\n  },\n];\n"
  },
  {
    "path": "src/features/design/config/line.tsx",
    "content": "import type { LayerId } from '@lidojs/design-core';\nimport type { DeepPartial, LineLayerProps } from '@lidojs/design-editor';\nimport type { ReactElement } from 'react';\nimport { v4 } from 'uuid';\n\nexport type Line = {\n  id: LayerId;\n  props: DeepPartial<LineLayerProps>;\n  icon: ReactElement;\n};\n\nexport const lines: Line[] = [\n  {\n    id: v4(),\n    props: {\n      style: 'solid',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Solid\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"\"\n          strokeLinecap=\"butt\"\n          x1=\"0.5\"\n          x2=\"32.5\"\n        />\n      </svg>\n    ),\n  },\n  {\n    id: v4(),\n    props: {\n      style: 'shortDashes',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Short Dashes\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"3,1\"\n          strokeLinecap=\"butt\"\n          x1=\"0.5\"\n          x2=\"32.5\"\n        />\n      </svg>\n    ),\n  },\n  {\n    id: v4(),\n    props: {\n      style: 'dots',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Dots\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"1,1\"\n          strokeLinecap=\"butt\"\n          x1=\"0.5\"\n          x2=\"32.5\"\n        />\n      </svg>\n    ),\n  },\n  {\n    id: v4(),\n    props: {\n      style: 'solid',\n      arrowStart: 'bar',\n      arrowEnd: 'bar',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Solid with Bar Arrows\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"\"\n          strokeLinecap=\"butt\"\n          x1=\"1\"\n          x2=\"32\"\n        />\n        <rect height=\"4\" rx=\"0.5\" stroke=\"none\" width=\"1\" x=\"0\" y=\"-2\" />\n        <g transform=\"translate(33)\">\n          <rect height=\"4\" rx=\"0.5\" stroke=\"none\" width=\"1\" x=\"-1\" y=\"-2\" />\n        </g>\n      </svg>\n    ),\n  },\n\n  {\n    id: v4(),\n    props: {\n      style: 'dots',\n      arrowStart: 'none',\n      arrowEnd: 'arrow',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Dots with Arrow End\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"1,1\"\n          strokeLinecap=\"butt\"\n          x1=\"0.5\"\n          x2=\"32.25\"\n        />\n        <g transform=\"translate(33)\">\n          <path\n            d=\"M -2.5,-1.5,-0.5,0,-2.5,1.5 \"\n            fill=\"none\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n          />\n        </g>\n      </svg>\n    ),\n  },\n  {\n    id: v4(),\n    props: {\n      style: 'solid',\n      arrowStart: 'arrow',\n      arrowEnd: 'arrow',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Solid with Arrow Start and End\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"\"\n          strokeLinecap=\"butt\"\n          x1=\"0.75\"\n          x2=\"32.25\"\n        />\n        <path\n          d=\"M 2.5,-1.5,0.5,0,2.5,1.5 \"\n          fill=\"none\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n        />\n        <g transform=\"translate(33)\">\n          <path\n            d=\"M -2.5,-1.5,-0.5,0,-2.5,1.5 \"\n            fill=\"none\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n          />\n        </g>\n      </svg>\n    ),\n  },\n\n  {\n    id: v4(),\n    props: {\n      style: 'solid',\n      arrowStart: 'outlineDiamond',\n      arrowEnd: 'outlineDiamond',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Dots\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"\"\n          strokeLinecap=\"butt\"\n          x1=\"3.5\"\n          x2=\"29.5\"\n        />\n        <path\n          d=\"M 0.5,0 l 1.5,-1.5 1.5,1.5 -1.5,1.5 Z\"\n          fill=\"none\"\n          strokeLinejoin=\"round\"\n        />\n        <g transform=\"translate(33)\">\n          <path\n            d=\"M -0.5,0 l -1.5,-1.5 -1.5,1.5 1.5,1.5 Z\"\n            fill=\"none\"\n            strokeLinejoin=\"round\"\n          />\n        </g>\n      </svg>\n    ),\n  },\n  {\n    id: v4(),\n    props: {\n      style: 'solid',\n      arrowStart: 'diamond',\n      arrowEnd: 'diamond',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Solid with Diamond Arrows\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"\"\n          strokeLinecap=\"butt\"\n          x1=\"3.5\"\n          x2=\"29.5\"\n        />\n        <path\n          d=\"M 0.5,0 l 1.5,-1.5 1.5,1.5 -1.5,1.5 Z\"\n          fill=\"inherit\"\n          strokeLinejoin=\"round\"\n        />\n        <g transform=\"translate(33)\">\n          <path\n            d=\"M -0.5,0 l -1.5,-1.5 -1.5,1.5 1.5,1.5 Z\"\n            fill=\"inherit\"\n            strokeLinejoin=\"round\"\n          />\n        </g>\n      </svg>\n    ),\n  },\n  {\n    id: v4(),\n    props: {\n      style: 'solid',\n      arrowStart: 'none',\n      arrowEnd: 'arrow',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Solid with Arrow End\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"\"\n          strokeLinecap=\"butt\"\n          x1=\"0.5\"\n          x2=\"32.25\"\n        />\n        <g transform=\"translate(33)\">\n          <path\n            d=\"M -2.5,-1.5,-0.5,0,-2.5,1.5 \"\n            fill=\"none\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n          />\n        </g>\n      </svg>\n    ),\n  },\n  {\n    id: v4(),\n    props: {\n      style: 'solid',\n      arrowStart: 'none',\n      arrowEnd: 'triangle',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Solid with Triangle End\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"\"\n          strokeLinecap=\"butt\"\n          x1=\"0.5\"\n          x2=\"30\"\n        />\n        <g transform=\"translate(33)\">\n          <path\n            d=\"M -2.5,-1.5,-0.5,0,-2.5,1.5 Z\"\n            fill=\"inherit\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n          />\n        </g>\n      </svg>\n    ),\n  },\n  {\n    id: v4(),\n    props: {\n      style: 'solid',\n      arrowStart: 'circle',\n      arrowEnd: 'circle',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Solid with Circle Arrows\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"\"\n          strokeLinecap=\"butt\"\n          x1=\"4\"\n          x2=\"29\"\n        />\n        <circle cx=\"2\" fill=\"inherit\" r=\"1.5\" />\n        <g transform=\"translate(33)\">\n          <circle cx=\"-2\" fill=\"inherit\" r=\"1.5\" />\n        </g>\n      </svg>\n    ),\n  },\n  {\n    id: v4(),\n    props: {\n      style: 'solid',\n      arrowStart: 'square',\n      arrowEnd: 'square',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Solid with Square Arrows\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"\"\n          strokeLinecap=\"butt\"\n          x1=\"4\"\n          x2=\"29\"\n        />\n        <rect\n          fill=\"inherit\"\n          height=\"3\"\n          strokeLinejoin=\"round\"\n          width=\"3\"\n          x=\"0.5\"\n          y=\"-1.5\"\n        />\n        <g transform=\"translate(33)\">\n          <rect\n            fill=\"inherit\"\n            height=\"3\"\n            strokeLinejoin=\"round\"\n            width=\"3\"\n            x=\"-3.5\"\n            y=\"-1.5\"\n          />\n        </g>\n      </svg>\n    ),\n  },\n  {\n    id: v4(),\n    props: {\n      style: 'solid',\n      arrowStart: 'outlineSquare',\n      arrowEnd: 'outlineSquare',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Solid with Outline Square Arrows\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"\"\n          strokeLinecap=\"butt\"\n          x1=\"4\"\n          x2=\"29\"\n        />\n        <rect\n          fill=\"none\"\n          height=\"3\"\n          strokeLinejoin=\"round\"\n          width=\"3\"\n          x=\"0.5\"\n          y=\"-1.5\"\n        />\n        <g transform=\"translate(33)\">\n          <rect\n            fill=\"none\"\n            height=\"3\"\n            strokeLinejoin=\"round\"\n            width=\"3\"\n            x=\"-3.5\"\n            y=\"-1.5\"\n          />\n        </g>\n      </svg>\n    ),\n  },\n  {\n    id: v4(),\n    props: {\n      style: 'dots',\n      arrowStart: 'triangle',\n      arrowEnd: 'triangle',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Dots with Triangle Arrows\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"1,1\"\n          strokeLinecap=\"butt\"\n          x1=\"3\"\n          x2=\"30\"\n        />\n        <path\n          d=\"M 2.5,-1.5,0.5,0,2.5,1.5 Z\"\n          fill=\"inherit\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n        />\n        <g transform=\"translate(33)\">\n          <path\n            d=\"M -2.5,-1.5,-0.5,0,-2.5,1.5 Z\"\n            fill=\"inherit\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n          />\n        </g>\n      </svg>\n    ),\n  },\n  {\n    id: v4(),\n    props: {\n      style: 'solid',\n      arrowStart: 'outlineCircle',\n      arrowEnd: 'outlineCircle',\n      boxSize: {\n        height: 4,\n      },\n      color: 'rgb(94, 98, 120)',\n    },\n    icon: (\n      <svg\n        role=\"img\"\n        aria-label=\"Solid with Outline Circle Arrows\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        style={{ overflow: 'visible' }}\n        viewBox=\"0 -0.5 33 1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <line\n          fill=\"none\"\n          strokeDasharray=\"\"\n          strokeLinecap=\"butt\"\n          x1=\"4\"\n          x2=\"29\"\n        />\n        <circle cx=\"2\" fill=\"none\" r=\"1.5\" />\n        <g transform=\"translate(33)\">\n          <circle cx=\"-2\" fill=\"none\" r=\"1.5\" />\n        </g>\n      </svg>\n    ),\n  },\n];\n"
  },
  {
    "path": "src/features/design/config/qrCode.tsx",
    "content": "import type { LayerId, SerializedLayers } from '@lidojs/design-core';\n\nexport type QrCodeItem = {\n  elements: [\n    {\n      rootId: LayerId;\n      layers: SerializedLayers;\n    },\n  ];\n  img: string;\n};\n\nexport const qrCodeList: QrCodeItem[] = [\n  {\n    elements: [\n      {\n        rootId: '3f39efa2-4017-4c77-b3a9-c98456c629f0',\n        layers: {\n          '3f39efa2-4017-4c77-b3a9-c98456c629f0': {\n            type: { resolvedName: 'QrCodeLayer' },\n            props: {\n              text: 'https://lidojs.com',\n              position: { x: 45.586770981507925, y: 121.96449211646916 },\n              boxSize: {\n                width: 350.8264580369844,\n                height: 350.8264580369844,\n              },\n              rotate: 0,\n              bgColor: 'rgb(255, 255, 255)',\n              textColor: 'rgb(30, 30, 45)',\n              logo: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAAAACXBIWXMAAC4jAAAuIwF4pT92AABbQ0lEQVR4nO3defzVc/7//8f73UJ7qBSpLNWEZBlqjKWyFJEYYxnrxzKYGR/MMGMZzAyGMZbMxzbMIDvjVyGERGRG2cmSCElpIS1apN6/P2bM12c+ltQ553nOeV6vl4t/Phc9X3cfb03nds55vWrq6urqAgAAAKhqtakHAAAAAMUnAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIQP3UA4CV8/7778cf//jH1DOK5sgjj4zu3bunngEAAFVDAIAKNWvWrLjssstSzyia3r17CwAAAFBAvgIAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyED91AMAAAAKZenSpTF58uR48803Y+rUqTF9+vSYPn16zJo1K+bOnfvvv5YuXRrLli2L+fPn//vXNm7cOBo2bBgREY0aNYpmzZr9+68111wzWrduHW3atIl27dpFmzZtolOnTtGxY8do0KBBqn9c+FYEAAAAoCJ98MEHMX78+HjhhRfi2WefjQkTJsS7774by5YtW6nz5s6d+61/TW1tbay33nqxwQYbRLdu3WKzzTaLzTbbLDbddNNo1qzZSu2AYhEAqshVV10VS5YsST2j4DbeeOPYddddU88AIuLee++Nt956K/WMotlwww1jzz33TD0DKIHBgwennlA0xx13XKy22mqpZxTFhx9+GCNHjoxHH300xowZE2+++WbqSbF8+fJ499134913341HH3303//3mpqa6NatW3z/+9//918bbbRRwqUQUVNXV1eXegSF0bJly5WqluXusMMOixtuuCH1jLLzwgsvxBZbbJF6RtEMGzYsBg0alHoG/2HQoEFx9913p55RNHvttVcMHz489QygBGpqalJPKJo5c+ZEy5YtU88omClTpsTtt98e9957b/z973+P5cuXp5600tZff/3Yfffdo3///rHTTjtFo0aNUk8iMz4BAAAAlJWFCxfGbbfdFjfddFM8/vjjUS3vWb799ttxxRVXxBVXXBFNmjSJPffcM370ox/FrrvuWrWf2qC8eAoAAABQFiZPnhw///nPY911142jjjoqxowZUzUv/v/TJ598ErfffnsMHDgw2rVrFyeddFK88cYbqWdR5QQAAAAgqYkTJ8bhhx8eXbp0iUsvvTQ+/vjj1JNKas6cOTF48ODo2rVr7LLLLjFy5MjUk6hSAgAAAJDE+++/H4cffnh069YthgwZstJ3768mo0aNit122y169uwZw4cPr9pPQJCGAAAAAJTU4sWL45xzzokuXbrEkCFDvMj9EuPHj4+99947tttuuxg/fnzqOVQJAQAAACiZJ598MjbffPM466yzYuHChannlL2///3v0bNnzzj44INj1qxZqedQ4QQAAACg6JYsWRK/+MUvYvvtt4+JEyemnlNxbrnllujWrVvccsstqadQwQQAAACgqN58883Ydttt45JLLvFx/1Xw4YcfxsEHHxw/+MEPYs6cOannUIEEAAAAoGjuu+++2HLLLeO5555LPaVqDB06NL773e/Gs88+m3oKFUYAAAAAiuLiiy+OgQMHxvz581NPqTqTJ0+O73//+3HrrbemnkIFEQAAAICCqqurixNOOCFOPvnkWL58eeo5VWvJkiVx0EEHxQUXXJB6ChVCAAAAAApm2bJlceSRR8af/vSn1FOycdppp8Xxxx/v/gp8IwEAAAAoiLq6ujj88MPj+uuvTz0lO5dffnmceuqpqWdQ5gQAAACgIH72s5/FzTffnHpGti688MI444wzUs+gjAkAAADAKvvd734XV155ZeoZ2fv9738f11xzTeoZlCkBAAAAWCV33HFHnH322aln8C8//elP45FHHkk9gzIkAAAAACvtmWeeif/6r/9KPYMv+Oyzz+KHP/xhvPfee6mnUGYEAAAAYKXMnTs39t9//1i0aFHqKfyHOXPmxIEHHhifffZZ6imUEQEAAABYKUcddVRMnjw59Qy+wpNPPhm/+93vUs+gjAgAAADAt3bDDTfEXXfdlXoG3+D3v/99PPfcc6lnUCYEAAAA4Fv54IMP4sQTT0w9gxWwbNmyOPLII30VgIgQAAAAgG/puOOOi7lz56aewQp64YUX4pJLLkk9gzIgAAAAACts5MiRMXz48NQz+JbOPffcmDFjRuoZJCYAAAAAK+Szzz6Lk046KfUMVsL8+fPj17/+deoZJFY/9QBg5ay55ppx2GGHpZ5RNB06dEg9AQD4D1deeWW8/vrrqWewkv7617/GSSedFBtvvHHqKSQiAECF6tChQ9xwww2pZwAAmVi0aFGcf/75qWewCurq6uJ3v/td3H777amnkIivAAAAAN/oz3/+c3zwwQepZ7CK7rzzznj11VdTzyARAQAAAPhaixcvjvPOOy/1DAqgrq7Ov8uMCQAAAMDXuvnmm2P27NmpZ1Agd955Z7z//vupZ5CAAAAAAHylurq6GDx4cOoZFNBnn30WV1xxReoZJCAAAAAAX2n06NHxyiuvpJ5Bgf35z3+OxYsXp55BiQkAAADAV/rLX/6SegJF8NFHH8Xw4cNTz6DEBAAAAOBLzZkzJ4YNG5Z6BkVy3XXXpZ5AiQkAAADAl7r11ltjyZIlqWdQJKNGjYopU6aknkEJCQAAAMCXuvPOO1NPoIjq6ur8O86MAAAAAPwfM2fOjLFjx6aeQZHdddddqSdQQvVTDwDIxfLly+Pdd9+Nt99+O955552YMWNGfPTRR/HRRx/FsmXL4uOPP46IiNVWWy0aNWoU9erVi2bNmkWrVq2idevW0aZNm1h33XWjS5cu0bJly6T/LPC5uXPnxrRp0+L999+PGTNmxIcffhhz5879919Lly6Nurq6mDt37r9/TZMmTaJBgwYREdGyZcto0aLFv/9q165dtGvXLtZZZ51o06ZN1NTUpPpHg+wNHTo0li9fnnoGRTZu3LiYMmVKdOjQIfUUSkAAACiSmTNnxuOPPx6PPfZYPPvss/Hyyy/HJ598UpCz11577fjOd74TW265ZWy33Xax3XbbRZs2bQpyNnyZyZMnx/PPPx8vvfRSvPnmmzFx4sSYNGlSzJs3r2jXbNCgQWywwQbRtWvX2GijjWLjjTeOLbbYIjbddNNo2LBh0a4L/NOIESNST6BEhg4dGieeeGLqGZSAAAAVatGiRTFx4sTUM4pm/fXXjxYtWqSe8a299957ceutt8bw4cNj3LhxUVdXV5TrzJgxI2bMmBFjxoyJSy+9NCIiNt5449hnn31in332iS222KIo1yUPixcvjqeeeirGjBkTY8eOjaeffvp/vYNfKkuXLo2JEyf+n9/r6tevH927d49tt902dtxxx9h+++2jbdu2Jd8H1WzJkiXx6KOPpp5BiTzwwAMCQCYEAKhQEydOrOoXecOGDYtBgwalnrFC6urq4oEHHoj/+Z//iQcffLBoL/q/yauvvhqvvvpqnHvuudG5c+f46U9/GkcccUQ0a9YsyR4qy9tvvx333ntvjBgxIh5//PGyvuv3Z599Fs8//3w8//zzccUVV0RExCabbBIDBgyIPfbYI7bddtuoV69e4pVQ2caOHRsLFy5MPYMSGTNmTCxatCgaNWqUegpF5iaAAKtg+PDhsfnmm8eAAQNi5MiRyV78/6dJkybFiSeeGOuuu2788pe//Pf9BeCL3nvvvbjwwgtj8803jw022CBOOOGEePjhh8v6xf9XeeWVV+LCCy+MHXbYIdq0aRPHHntsjB07tmz+m4RKM2rUqNQTKKElS5bEY489lnoGJSAAAKyECRMmxI477hh77713vPTSS6nnfKX58+fHH//4x9hwww3jsssui88++yz1JBL77LPP4q677oq+fftGx44d41e/+lW8+OKLqWcV1EcffRR//vOfY/vtt49OnTrFueeeGx988EHqWVBRnnzyydQTKLFHHnkk9QRKQAAA+BaWLVsW55xzTmy11Vbx+OOPp56zwj766KM48cQTo1evXvHqq6+mnkMCc+bMiXPOOSc6duwYP/zhD+PRRx/N4t3xKVOmxJlnnhkdOnSIAw44IJ555pnUk6DsffrppzF+/PjUMyixSvpzDStPAABYQR988EHsvPPOcdZZZ8Wnn36aes5KefbZZ2PrrbeOm2++OfUUSmTGjBlx6qmnxnrrrRdnnXVWTJs2LfWkJJYuXRp33HFHbL311tG/f/8YM2ZM6klQtp555pmK/CoQq+a5556LBQsWpJ5BkQkAACvg5Zdfjq233roqvh+3cOHCOOSQQ+LMM8/M4h3gXC1YsCDOPvvs2GCDDeIPf/hDwR5BWQ0efPDB6N27d/Tr16+sv8IDqTz33HOpJ5DAsmXL4qmnnko9gyITAAC+wdixY2O77baLqVOnpp5SUOeee24cdthhsWzZstRTKKC6urr461//Gp07d47f/e537uL9NR566KHYfPPN44gjjoiZM2emngNl4/nnn089gUTGjRuXegJF5jGAAF9j3LhxMWDAgJg3b17qKUVx0003xbJly+LGG2/02LQq8Nprr8WPf/zjGDt2bOopFaOuri6uv/76GD58eFx44YVx5JFHRk1NTepZkFQuAaBt27ax4447Rvfu3aNTp07RpEmTiPjnPRDee++9ePHFF2P06NHx/vvvJ15aOs8++2zqCRSZAADwFSZOnBj9+vWr2hf/n7v11lujtrY2brzxRi98KtSyZcvi/PPPj3POOadi70+R2pw5c+Loo4+Om266KYYMGRKdOnVKPQmSWLZsWbzyyiupZxTV7rvvHieffHLsuOOOUVv79R+IrqurizFjxsR5552XxaMR3Si1+vkKAMCXmDNnTgwcODDmzp2bekpJ3HzzzXHGGWeknsFKeOedd6J3795x5plnevFfAI8//nj06NEjbr311tRTIIl33nmnan8vadGiRQwdOjTuu+++6NOnzze++I+IqKmpid69e8fDDz8ct912WzRt2rQES9N57733YtasWalnUEQCAMCXOPzww+ONN95IPaOkzj///LjuuutSz+BbuOeee6JHjx4+8l9g8+bNi4MOOij+67/+KxYvXpx6DpTUxIkTU08oipYtW8YTTzwRe++990qfccABB8SYMWOiefPmBVxWfl5++eXUEygiAQDgP1x99dVxzz33pJ6RxHHHHef7fxWgrq4ufvOb38Ree+1V9V9RSemGG26I7bffPt57773UU6BkqjV+33rrrdG9e/dVPmfLLbeMu+66qwCLyle1fwUkdwIAwBe89957ccopp6Sekcynn34a++23XzZffahECxcujB/84Afx29/+NvWULDzzzDPx3e9+152xycZbb72VekLBHXHEEbHbbrsV7LxddtkljjzyyIKdV25ef/311BMoIgEA4AtOOOGEWLBgQeoZSU2ePDlOOOGE1DP4EnPmzIldd901hg0blnpKVmbOnBl9+vSJ+++/P/UUKLpqe+RtgwYN4uyzzy74uWeeeeYK3UOgEr322mupJ1BE1flTC7ASRo8e7YXVvwwZMiQefPDB1DP4gqlTp8Z2220XTz75ZOopWVq0aFEMHDgwbrnlltRToKimTJmSekJBDRo0KDp06FDwczt27Bh9+/Yt+LnloFrvA8E/CQAA8c/vVP/yl79MPaOsHH300fHJJ5+knkH888V/796949VXX009JWvLli2LQw89VASgqlXbJwD233//op3dr1+/op2d0rRp02LJkiWpZ1AkAgBARNx9991ufvcf3nvvvfjDH/6Qekb2pk2bFr17967K7+VWouXLl4sAVK1ly5bFzJkzU88oqB133LFoZ2+11VZFOzu1d999N/UEikQAALJXV1fnhmpf4aKLLqq6d4Mqydy5c2O33Xbz4r/MfB4BRowYkXoKFNSHH36YekJBrbPOOtGqVauind++ffuinZ3a22+/nXoCRSIAANm7//7744UXXkg9oywtWrQozjzzzNQzsvTpp5/GPvvsEy+99FLqKXyJ5cuXx3777Rf/+Mc/Uk+Bgqm2AFCM7/5/0ZprrlnU81MSAKqXAABkb/DgwaknlLWbbrop3nzzzdQzsnPEEUfE6NGjU8/ga3x+Y8DJkyenngIFMXv27NQTCmqNNdYo6vn16tUr6vkpTZ8+PfUEikQAALI2YcKEGDVqVOoZZW3ZsmVx0UUXpZ6RlYsvvth3zCvE7NmzY9CgQW6YSVX46KOPUk8oqIYNG6aeULE++OCD1BMoEgEAyNq1116bekJFuO6662LatGmpZ2ThkUce8USKCvPyyy/HEUccEXV1damnwCqptpA1b9681BMqlk8AVC8BAMjW4sWL46abbko9oyIsXbo0rrnmmtQzqt706dPjwAMPjOXLl6eewrd05513xhVXXJF6BqyShQsXpp5QUNX2lYZSmjFjRuoJFIkAAGRrxIgRMWfOnNQzKsY111wTS5cuTT2jatXV1cXhhx8es2bNSj2FlXTyySfHhAkTUs+AlbZgwYLUEwrqnXfe8cmclVRtj4Pk/xEAgGzdeuutqSdUlOnTp8djjz2WekbVGjx4cDz00EOpZ7AKlixZEgceeGAsWbIk9RRYKfPnz089oaDmz5/vMaorqdruB8H/IwAAWVqwYEHcd999qWdUnGr7eGi5ePPNN+OMM85IPYMCmDBhQpx77rmpZ8BKWbZsWeoJBff888+nnlCR5s2b5+toVUoAALL0wAMPxKeffpp6BkRdXV0cc8wxsWjRotRTKJALLrjAVwGgTPz9739PPaFi+ZpkdRIAgCzdfffdqSdAREQMGTIkRo8enXoGBfTZZ5/FUUcd5bvHUAb87/3K+/jjj1NPoAgEACA7y5cvjwcffDD1DIgFCxbEaaedlnoGRTBu3Li45ZZbUs+A7L399ts+kbOSqu2eEPyTAABk5/nnn/doIMrC+eefHx988EHqGRTJqaee6r4ZUAb+9re/pZ5Qkfz+VZ0EACA7Dz/8cOoJEFOmTIlLLrkk9QyK6P3334+LLroo9QxYYbW11fnS4Nprr43PPvss9YyK415J1ak6/ysH+Bpjx45NPQHi97//fSxevDj1DIrskksu8T1aKkbz5s1TTyiK6dOnx/Dhw1PPqDhz585NPYEiEACArCxfvtwdgUluypQpcd1116WeQQnMnTs3Bg8enHoGrJBq/QRARMSf/vSn1BMqjk8AVKfq/a8c4EtMmjTJY21I7g9/+EMsXbo09QxKZPDgwbFgwYLUM+AbtWrVKvWEonniiSfiscceSz2jonzyySepJ1AEAgCQlRdeeCH1BDI3Z86cGDJkSOoZlNDcuXPj+uuvTz0DvtFaa62VekJRnXbaaR7PSfYEACArL774YuoJZO4vf/mLd1UydNlll8Xy5ctTz4CvVe0B4KmnnhLjyJ4AAGTFJwBIafny5XH55ZennkECb731Vtx///2pZ8DXatu2beoJRffLX/7S41fJWv3UAwBKSQAgpYceeiimTJmSegaJ/OUvf4k99tgj9Qz4Sm3bto369etX9SPzPvzwwzj66KPj3nvvXeWz6tWrFz169CjAqvLUsmXL1BMoAgEAyMbs2bNj+vTpqWeQsRtuuCH1BBK67777YubMmdGmTZvUU+BL1a9fPzp06BCTJ09OPaWoRowYEZdddlmccMIJq3ROs2bNvLFAxfEVACAbb775ZuoJZGzOnDkxbNiw1DNI6LPPPotbbrkl9Qz4WhtssEHqCSVxyimnxLhx41LPgJLzCQAgG++8807qCck0adIkdtppp9hiiy2ic+fO0bx582jcuHHMmTMnpk2bFk8//XQ89NBDMXPmzNRTq9bw4cOze6Zy+/bto3///rHZZpvFeuutFy1atIgFCxbErFmz4pVXXolHHnkkuxtz3nHHHXHSSSelngFfaaONNopRo0alnlF0S5cujUGDBsXTTz8d7du3Tz0HSkYAALKRYwDo1KlTnH322bH//vtHo0aNvvbvXbp0aQwbNixOPfXUePvtt0u0MB9Dhw5NPaFkttpqqzjnnHOif//+UVNT87V/78svvxznnXde3HHHHSVal9a4ceNiypQp0aFDh9RT4EttuummqSeUzAcffBADBw6MsWPHRuPGjVPPgZLwFQAgG7kFgJNOOikmTpwYhx9++De++I+IaNCgQey3337xyiuvxOGHH178gRmZO3duPPTQQ6lnFF1NTU2ce+65MX78+Nhtt92+8cV/RET37t3j9ttvj/vuuy+bG04NHz489QT4SptvvnnqCSX1/PPPx7777htLly5NPQVKQgAAspFTADjvvPPikksuiYYNG37rX9uoUaO47rrr4tBDDy3Csjw9/PDDWXz8/4Ybbogzzjgjamu//R8vdt9993j88cdjzTXXLMKy8nL33XenngBfqUePHisU76rJAw88EEcffXTU1dWlngJFJwAA2cglAOy7775x+umnr9IZNTU18ec//zm6d+9eoFV5e/DBB1NPKLozzzxzlaNR9+7d429/+9tKBYRK8uSTT8bChQtTz4Av1bRp0+jcuXPqGSU3ZMiQ+MlPfiICUPWq+39hAb7go48+Sj2h6Bo3bhyDBw8uyFmrr756XHbZZQU5K3fV/vH/LbfcMs4+++yCnNW3b99VfjRXuVuyZEk8/vjjqWfAV9p+++1TT0ji6quvjlNPPTX1DCgqAQDIRg4B4Mgjj4x11123YOf16dMn+vTpU7DzcjRp0qSYMmVK6hlFdfHFF0e9evUKdt5ZZ50Va621VsHOK0c53GWdytW7d+/UE5K58MIL45RTTvFJAKqWAABkYd68ebFs2bLUM4ruiCOOKPiZbgi4ap588snUE4qqZ8+eBX+x0LJlyzjmmGMKema5GTt2bOoJ8JVy/QTA5y666CJfB6BqCQBAFmbNmpV6QtF16NChKHdv3nvvvaN+fU+NXVn/+Mc/Uk8oqmOPPbYo5/74xz8uyrnl4rnnnovFixenngFfqmPHjtGpU6fUM5K6+uqr45hjjsnizQPyIgAAWcjh4/99+/YtyrnNmjWLnj17FuXsHFRzAGjQoEHsvffeRTm7Y8eOVf1zt3Tp0njuuedSz4CvNHDgwNQTkrv22mvj0EMPFQGoKgIAkIUcAsBOO+1UtLN33nnnop1dzRYuXBivvPJK6hlFs80220SLFi2Kdn7//v2LdnY5ePrpp1NPgK8kAPzTrbfeGvvuu28Wj3IlDwIAkIVFixalnlB0xQwAxfp0QbV79dVXY/ny5alnFM2OO+5Y0een9tJLL6WeAF9phx12KGrgqyTDhw+Pfffd1+M7qQoCAEAVaNeuXbRr165o5/fq1ct9AFZCtb/A++53v1vU87faaquinp/ayy+/nHoCfKUGDRrEnnvumXpG2bj33ntjjz32EAGoeAIAkIV58+alnlBU3bt3L+r5DRs2jE022aSo16hG1R4Aiv1z17x58+jYsWNRr5HShAkTqvoTIlS+Qw45JPWEsvLoo4/GLrvsEnPnzk09BVaaAABkodr/kL3ZZpsV/Ro9evQo+jWqzZtvvpl6QtHU1NSU5MX5+uuvX/RrpLJo0aJ4//33U8+Ar7TTTjsV9dNllejvf/977LrrrlncW4jqJAAAWaj2AFDsd2IjoiiPGKx2kydPTj2haNq2bRsNGjQo+nU6dOhQ9GukVM0/I1S+evXqxcEHH5x6RtkZP3587Ljjjlk8YpjqIwAAWaj2rwCU4l3Sbt26Ff0a1aSuri7eeuut1DOKZu211y7JdVq3bl2S66QiAFDujjjiiNQTytKECRNihx12iKlTp6aeAt+KAABQBUrxEc1q/i52MUyfPr2qHxu1xhprVNV1UhEAKHff+c53ol+/fqlnlKXXX389evfuHVOmTEk9BVaYAABQBdq3b18V16gm1f7d7ubNm5fkOk2aNCnJdVKZMWNG6gnwjf77v/879YSy9dZbb8W2225b1fd8oboIAAAVbo011ojVV1+96Ndp1qxZyV70VQPfDS2Man/8ZLWHIqpD//79o3PnzqlnlK33338/dtxxR4/2pCIIAAAVrpQvytu2bVuya1W6adOmpZ5QFZo2bZp6QlEJRVSC2tra+NWvfpV6RlmbNm1a9O3bt+of/0rlEwAAKlyLFi1Kdq1GjRqV7FqVzgs7VoSfEyrFIYccEuutt17qGWVt9uzZsf3228e4ceNST4GvJAAAVLiampqSXava340tpGp/8gSFMWfOnNQTYIU0bNgwTj/99NQzyt68efNi1113jcceeyz1FPhSAgBAhWvZsmXJrlXt38cuJAGAFeHnhEpyxBFHeCLMCpg3b17svvvuMXr06NRT4P8QAABYYaWMDZVu/vz5qSdQAerq6mLBggWpZ8AKadiwYVxwwQWpZ1SERYsWRf/+/eOee+5JPQX+FwEAAIrAO7usqMWLF6eeACts//33j169eqWeURGWLl0a++67b9x5552pp8C/CQAAAAn5BACVpKamJi699NLUMyrG0qVL48ADD4xbbrkl9RSICAEAAIpiyZIlqScAFEWvXr3ikEMOST2jYixfvjwOPvjguOqqq1JPAQEAAIph0aJFqScAFM0ll1wSrVq1Sj2jovzkJz+JwYMHp55B5gQAAICEPvnkk9QT4Ftr1apVXHzxxalnVJyTTjrJjRRJSgAAAEho6dKlqSfASjn00ENj5513Tj2j4px22mlx2mmnpZ5BpgQAAABgpVx//fUeEbsSLrjggvjFL34RdXV1qaeQGQEAAABYKe3bt4+rr7469YyKdMkll8RPfvITEYCSEgAAAICVtv/++8fBBx+cekZFuvrqq+PQQw+NZcuWpZ5CJgQAAABglVx55ZXRuXPn1DMq0s033xwHH3xwfPrpp6mnkAEBAAAAWCXNmjWLoUOHRuPGjVNPqUi333577LvvviIARScAAAAAq2zTTTeNa6+9NvWMinXvvffGgAEDYuHChamnUMUEAAAAoCB+9KMfxfHHH596RsUaNWpU7LHHHjFv3rzUU6hSAgAAAFAwl156afTr1y/1jIr16KOPxi677BJz585NPYUqJAAAAAAFU69evbjzzjuje/fuqadUrPHjx8euu+4qAlBwAgAAAFBQzZs3jxEjRkTbtm1TT6lYIgDFIAAAAAAF16FDhxg5cmQ0b9489ZSKNX78+OjTp0/MmjUr9RSqhAAAAAAURY8ePeKBBx6IRo0apZ5SsZ5//vno27evCEBBCAAAAEDRbLvttjFs2LBo0KBB6ikVa8KECTFgwABfB2CVCQAAAEBR9evXL+666y4RYBU8/fTTMXDgwFi4cGHqKVQwAQAAACi6gQMHigCr6PHHH4999tknPv3009RTqFACAAAAUBIiwKp78MEH44ADDohly5alnkIFEgAAAICSGThwYAwdOtSNAVfBsGHD4qijjoq6urrUU6gwAgAAAFBSe+yxR4wYMSKaNWuWekrFuuGGG+Lss89OPYMKIwAAAAAl17dv33j44YejRYsWqadUrHPOOSf+8pe/pJ5BBREAAACAJHr27BlPPPFEtGrVKvWUinXMMcfEAw88kHoGFUIAAAAAkunevXv8/e9/j3XXXTf1lIq0fPny2HfffePZZ59NPYUKIAAAAABJde7cOcaOHRsbbrhh6ikVaeHChTFgwICYOnVq6imUOQEAAABIrlOnTvHYY4/FpptumnpKRZoxY0bstddesXDhwtRTKGMCAAAAUBbat28fo0ePjq222ir1lIr03HPPxZFHHunxgHwlAQAAACgbrVu3jkceeSS23Xbb1FMq0u233x7nn39+6hmUKQEAAAAoKy1atIiHH344dtppp9RTKtKvf/3ruOeee1LPoAwJAAAAQNlp3Lhx3H///bHnnnumnlJx6urq4qCDDopJkyalnkKZEQAAAICy1LBhwxg6dGj86Ec/Sj2l4ixYsCB++MMfxuLFi1NPoYwIAAAAQNmqX79+3HjjjfHjH/849ZSK8+KLL8bxxx+fegZlRAAAAADKWr169eLqq6+On//856mnVJy//OUv7gfAvwkAAABA2aupqYmLL744zjrrrNRTKs7RRx8ds2bNSj2DMiAAAAAAFeO3v/1t/PGPf0w9o6LMnDkzfvKTn6SeQRmon3oAAAAr5+OPP47BgwennlFwbdu2jWOPPTb1DMrYySefHE2aNImf/exnsXz58tRzKsJdd90V9957r6cqZE4AAACoUB9//HH89re/TT2j4Hr06CEA8I2OO+64aN68eRx66KEiwAr66U9/Gn369ImmTZumnkIivgIAAABUpIMOOiiGDRsWDRo0SD2lIrz33ntxzjnnpJ5BQgIAAABQsQYOHBj33XdfNGrUKPWUijB48OCYPHly6hkkIgAAAAAVbZdddokHH3wwmjdvnnpK2fv000/j5JNPTj2DRAQAAACg4m2//fYxatSoaNWqVeopZW/YsGHx1FNPpZ5BAgIAAABQFbbeeusYPXp0tGvXLvWUsnfaaaelnkACAgAAAFA1unfvHo8//nh06NAh9ZSy9thjj8UjjzySegYlJgAAAABVZaONNoonn3wyNtxww9RTyponAuRHAAAAAKpO+/bt47HHHotu3bqlnlK2xowZ414AmREAAACAqtS+ffsYM2ZMbLrppqmnlK3f//73qSdQQgIAAABQtVq3bh2jR4+O7373u6mnlKURI0bEpEmTUs+gRAQAAACgqrVu3TpGjRoV22yzTeopZaeuri4uv/zy1DMoEQEAAACoei1atIiHHnpIBPgS119/fSxYsCD1DEpAAAAAALLweQTwdYD/bf78+XHbbbelnkEJCAAAAEA2WrRoEffff78bA/6Hv/71r6knUAICAAAAkJXPbwwoAvw/48aNi1dffTX1DIpMAAAAALLzeQTYaKONUk8pGzfeeGPqCRSZAAAAAGSpdevW8fDDD8c666yTekpZ+Nvf/pZ6AkUmAAAAANnq1KlTjBw5Mlq0aJF6SnKTJ0+OZ599NvUMikgAAAAAsta9e/e47777olGjRqmnJHfXXXelnkARCQAAAED2vv/978edd94ZtbV5v0QaOXJk6gkUUd4/3QAAAP+yxx57xGWXXZZ6RlIvvPBCzJw5M/UMikQAAAAA+Jef/exncdxxx6WekdTDDz+cegJFIgAAAAB8wZ/+9KfYZZddUs9IZvTo0aknUCQCAAAAwBfUr18/7rzzzujatWvqKUn84x//SD2BIhEAAAAA/kPLli3j//v//r9o3Lhx6ikl9/rrr8fHH3+cegZFUD/1AAAAIL3BgwfH4MGDU88ouIsuuij23Xfflfq1m2yySfz5z3+OQw45pMCryltdXV2MHz8+dt1119RTKDABAAAAiI8//jjefffd1DMKbsGCBav06w8++OAYMWJE3HHHHQVaVBmee+45AaAK+QoAAADA17jqqquiXbt2qWeU1IQJE1JPoAgEAAAAgK+xxhprxOWXX556RkkJANVJAAAAAPgG++yzT+yxxx6pZ5TM66+/Hp999lnqGRSYAAAAALACLr744mjQoEHq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XLCzNtxww1hrrbWyCynz58+P5557LvWM5OrVq+cTAFVMAKDsPf300/H000+nnlE0hx12mABQIuuss07qCSUxbdq0+NWvfhVXXHHFKp918803x7hx4wqwKl9bbbVV/OUvf0k9o2g++eST+M1vfhNXXnllwc4cOnRoPPXUUwU7rxx17969YDfYatiwYWy00UZZfMedr9a3b9+Cnrf11ltX/X04+HKbb755NGrUKPUMisQ9AIBs5PIJgIiIK6+8cpWfnT1p0qT42c9+VqBF+crhY5RXX311PProowU568MPP4yf/vSnBTmrnG2zzTYFPe973/teQc+jstSrVy922GGHgp7Zs2fPgp5H5dhuu+1ST6CIBAAgGw0bNswqAhx55JFx5513rtSvnTBhQvTp0yfmzZtX4FX52WyzzWKNNdZIPaOo6urqYr/99ovXXnttlc5ZuHBh7LnnnvHBBx8UaFn56t27d0HPEwDy9r3vfa8gX/v6Ii8C89WnT5/UEygiAQDISocOHVJPKJmlS5fG/vvvH6ecckp88sknK/RrFi1aFH/84x/ju9/9brz//vtFXpiH2tra2HbbbVPPKLrZs2fHdtttFw899NBK/frJkyfHdtttF//4xz8KvKw8CQAU0qBBgwp+5rbbbhsNGjQo+LmUt9ra2oL//kR5EQCArHTq1Cn1hJK76KKLYoMNNohf//rXMW7cuP/zmMDp06fHgw8+GMcff3ysv/768ctf/jKWLFmSaG11yuXdlI8++ij69esXBxxwwArf+PD999+PM844IzbZZJOqvlniF33nO9+Jtm3bFvTMTTbZJJo1a1bQM6kcP/zhDwt+ZuPGjX0NIENbbrlltGjRIvUMishNAIGs5BgAIiJmzpwZ5513Xpx33nkREbHmmmtGbW1tzJ8/34v9Eth9993j5JNPTj2jZO6444644447onPnztG3b9/o1q1brLPOOtGgQYOoq6uLmTNnxqRJk+LJJ5+M8ePHZ3f3+v79+xf8zHr16sUuu+wSQ4cOLfjZlLetttqqaJ9u22mnnWLs2LFFOZvyNGDAgNQTKDIBAMhK165dU08oCx999FHqCVnp1q1brL/++vH222+nnlJSkyZNikmTJqWeUXb22GOPopy75557CgAZ2nfffYt2dv/+/eO3v/1t0c6n/AgA1c9XAICsCACkUqwXfVSWZs2axfbbb1+Us3ffffeoqakpytmUp9ra2vjRj35UtPO32WabWHvttYt2PuVl7bXXjq222ir1DIpMAACy0q1bt9QTyNQ+++yTegJlYI899oiGDRsW5ew2bdr4znZmBgwYUNSb29bW1npHOCODBg2K2lovD6udf8NAVlq3bu3dDJLYYYcdol27dqlnkFgx362NiDjwwAOLej7l5dhjjy36NYrxhAHKUzFuJkn5EQCA7Gy55ZapJ5Ch2tpaL84yt8Yaa0S/fv2Keo2DDjqoaJ8woLx06tSpKDeU/E/9+vWLNdZYo+jXIa3WrVt7/F8mBAAgO1tssUXqCWTqoIMOSj2BhA444ICiP1d9rbXWir322quo16A8HHfccSX5uHbDhg1jv/32K/p1SGvfffeNevXqpZ5BCQgAQHa22Wab1BPI1JZbbhlbb7116hkkcswxx5TkOkceeWRJrkM6a621VvzkJz8p2fWK/dUV0jviiCNST6BEBAAgO9tuu23qCWSsFN/Zpfx873vfix49epTkWrvssosbnla5k08+OZo2bVqy622//fbRpUuXkl2P0urevXt897vfTT2DEhEAgOy0bt3aH2RI5oADDog111wz9QxKrJTv1tbW1sZpp51WsutRWi1atCh5SKypqYnjjjuupNekdHxqKC8CAJClHXfcMfUEMtW4ceP42c9+lnoGJdShQ4c44IADSnrNAw88MDp16lTSa1Iav/jFL6Jly5Ylv+7hhx8ejRs3Lvl1Ka4mTZrEYYcdlnoGJSQAAFkq9p244escf/zx0aRJk9QzKJFTTjkl6tevX9Jr1q9fP371q1+V9JoUX8eOHePkk09Ocu2WLVvGoYcemuTaFM/hhx+eJCiRjgAAZKlv374luXsyfJlWrVrFUUcdlXoGJdC2bdtkH6898sgjo3PnzkmuTXFceOGF0ahRo2TX/9WvfuVO8VWkpqYmjj/++NQzKDF/+gWytMYaa7gZIEn9+te/jmbNmqWeQZGdeeaZyV6wNWjQIC688MIk16bwdthhh+SP4+vUqZPHmVaRgQMHRteuXVPPoMQEACBbe++9d+oJZKxVq1bxy1/+MvUMiqhz587x4x//OOmGQYMGxe677550A6uufv368T//8z+pZ0RExOmnn+5TAFXi7LPPTj2BBAQAIFv77LNP6glk7qSTTor27dunnkGRXHjhhSX/7v+Xufzyy91zosKdddZZsdlmm6WeERERXbt2jWOOOSb1DFbRwIEDY4sttkg9gwQEACBbnTp1ip49e6aeUVHcAbqwmjRpEn/6059Sz6AIBgwYEIMGDUo9IyIi1l9//bjkkktSz2AlbbXVVmX3WMezzz47mjZtmnoGK6mmpiZ+85vfpJ5BIgIAkDV3NF5xrVu3jt69e6eeUXX23nvvGDBgQOoZFFCjRo3iiiuuSD3jfzn66KNjt912Sz2Db6lhw4Zxww03lMUnSb6oTZs2ceaZZ6aewUo6+OCDvfufMQEAyNr+++8fDRs2TD2jIhx++OHRoEGD1DOq0lVXXRUtWrRIPYMCueCCC6Jjx46pZ/wvNTU1ce2118Zaa62Vegrfwh/+8IfYdNNNU8/4Uj//+c9j8803Tz2Db2n11VeP8847L/UMEhIAgKyttdZaye+qXAlqamqS38ysmq233npx1VVXpZ5BAey6665l+1itddddN26//XaPQK0Qe++9d5xwwgmpZ3yl+vXrxzXXXOPnqcKceuqpsd5666WeQUL+iwWy99Of/jT1hLK35557xkYbbZR6RlU78MAD48ADD0w9g1Ww1lprxfXXXx81NTWpp3ylnXfeOc4///zUM/gG3bp1iyFDhpT1z1JExNZbbx2nn3566hmsoM6dO8epp56aegaJCQBA9nr16uVmgN/glFNOST0hC9dcc01ssskmqWewEmpra+OOO+6IddZZJ/WUb3TKKafED3/4w9Qz+AprrrlmDB8+PJo1a5Z6ygo5++yz43vf+17qGayAK6+8MlZbbbXUM0hMAACIKLs7LJeTnj17xnbbbZd6RhaaNm0aw4cPj5YtW6aewrd04YUXxk477ZR6xgqpqamJG264IXr16pV6Cv+hYcOGMXz48OjSpUvqKSusfv36ceutt8Yaa6yRegpf47jjjoudd9459QzKgAAAEP98Hq6bGX25c889N/WErGy00Ubxt7/9zQ0XK8gRRxwRv/jFL1LP+FYaN24c99xzT3Tr1i31FP6ltrY2br311th+++1TT/nWOnXqFHfddVfZPa2Af+ratWtcdNFFqWdQJgQAgPjnO2J//OMfU88oOzvuuKN3DBLYeeed46abbko9gxWw1157xTXXXJN6xkpp3bp1PPTQQ7HhhhumnkL88ytAP/jBD1LPWGl9+/aN//mf/0k9g/+w+uqrx2233RaNGzdOPYUyIQAA/MvOO+8ce+21V+oZZeWCCy5IPSFb+++/f1x55ZWpZ/A1+vTpE7feemvUq1cv9ZSV1r59+3jsscdEgMSuvPLKOPLII1PPWGXHHntsnHHGGaln8AV//etfY4sttkg9gzIiAAB8weDBg6NJkyapZ5SFQw891HeEEzvuuONEgDLVp0+fGDFiRFW8q/Z5BCjX581Xs9ra2hgyZEgcd9xxqacUzLnnnhsnnnhi6hlExK9+9av40Y9+lHoGZUYAAPiCTp06xaWXXpp6RnLNmjXz7n+ZOO644+Lqq6/2rO0yMmDAgKp58f+59u3bxxNPPBE77LBD6inZaNSoUQwbNiwOPfTQ1FMK7pJLLhEBEjvssMM88pMv5U8TAP/hqKOOioEDB6aekdTFF18c7dq1Sz2DfznmmGPi7rvv9umUMnDsscfG3XffXVUv/j/XsmXLePjhh+PYY49NPaXqtWnTJh599NGq/d+ampqauPTSS+P3v/996ilZ+uEPfxh//etfo6amJvUUypAAAPAfampqYsiQIdG5c+fUU5LYZZdd4qijjko9g/+wxx57xBNPPBHt27dPPSVLtbW1cdFFF8VVV11V0d/5/yYNGzaMq666Kq666ipPoiiSLbfcMsaPHx89e/ZMPaXoTjvttBgyZIhnz5fQ/vvvHzfffHNV/z7FqhEAAL5Ey5YtY/jw4dG8efPUU0pqrbXWiuuuu867BmVqiy22iOeffz522WWX1FOysvbaa8eoUaMq7lF/q+LYY4+NJ554ws0BC+yYY46JsWPHRseOHVNPKZlDDz00nnzyyejQoUPqKVXvhBNOiNtuuy0aNmyYegplTAAA+Aobb7xx3H///dGoUaPUU0rmpptu8g5zmWvVqlWMHDkyzj33XM/cLoFdd901XnjhhejTp0/qKSXXs2fPeOGFF3wiqADWWGONGDp0aFx99dVZ/W/K57baaqt49tlnq/YrD6nVq1cvLr300hg8eLCAzzcSAAC+xve///0YPnx4Fn9g+81vfhO77bZb6hmsgNra2jjjjDPi6aefjh49eqSeU5WaNWsW11xzTYwcOTLatm2bek4yTZs2jWuvvTbuuece7+CupJ122ileeuml2HvvvVNPSapVq1Zx9913x3XXXRfNmjVLPadqrL322jF69Gg3XWSFCQAA32DXXXeNkSNHVvXXAQ4++OA466yzUs/gW9p8883j6aefjnPOOSeLSFUqe+21V0yYMCGOPvpo76b9y5577hmvvfZanH766T5evIJat24dN954Yzz88MM+WfUF//Vf/xWvvPJK7LvvvqmnVLzdd989nn/+eU/v4FsRAABWwA477BCPP/54VX5vs2/fvu4WXMEaNGgQv/71r2PixIlxwAEHpJ5T0TbeeON48MEHY/jw4d7t/hKNGzeO8847L1566aXYa6+9Us8pWzU1NXH00UfH66+/HocccojfW7/EeuutF3/729/ioYceio033jj1nIrTokWLuP766+O+++7zxB6+NQEAYAX16NEjnn322aq6AVufPn3i3nvv9Y5eFVhvvfXitttui3/84x/Rr1+/1HMqyoYbbhjXX399vPjii7HrrrumnlP2unbtGsOHD4/x48f7WfsPAwYMiOeeey6uueaaWHPNNVPPKXu77LJLvPzyy3HjjTe64eQKqKmpiaOOOiomTpwYhx9+eOo5VCgBAOBbWGutteKBBx6ICy+8sOIfa9S/f/8YMWJEVT7PPGe9evWKkSNHxj/+8Y/Yc889vfv4Nbp16xbXX399vP7663H44Ye7qeK3tPXWW//7Z23QoEFZ/6ztsMMOMXbs2BgxYkRsvvnmqedUlNra2jjkkEPi9ddfjyFDhsRmm22WelJZ6tevXzz33HNx7bXXxtprr516DhVMAAD4lurVqxennHJKPPPMM9GrV6/Uc1bKf//3f8c999zjxX8V69WrV9xzzz3xxhtvxPHHH++mW/9SU1MTu+22W4wcOTJeeeUVL/wLoFevXjFs2LB466234qSTTqrq+6V8Ub169WLfffeNsWPHxpgxY+L73/9+6kkVrX79+nHooYfGiy++GI888kjstdde/tuMf96T5KmnnoqRI0eKSxSEAACwkjbddNP4+9//Hrfddlt06tQp9ZwVss4668SIESPisssuiwYNGqSeQwlstNFG8ac//Sk++OCDuOmmm2KnnXbK8p3azp07x3nnnRdTpkyJ+++/P/r165fl/x+Kaf31149LLrkkpk2bFjfccEPV/qy1bt06fvGLX8Sbb74Zf/vb37zwL4K+ffvG8OHDY+rUqXHxxRdn96mANdZYI0444YR45ZVXYvjw4dGzZ8/Uk6giAgDAKqipqYkDDjggJk6cGEOGDInu3bunnvSlVl999TjxxBPjlVdeiQEDBqSeQwKNGzeOgw8+OEaNGhVTp06NK6+8Mnbeeeeqfodtk002iV//+tfx7LPPxhtvvBGnn366u7GXQJMmTeKwww6LUaNGxZQpU+KCCy6IXr16VXQMWH311eOAAw6IESNGxPvvvx8XXXRRxYTfSrb22mvHz3/+83jxxRfjjTfeiD/84Q8V/7P0VRo2bBh77LFH3HzzzTFt2rQYPHiwGyRSFDV1dXV1qUdQGC1btoy5c+emnsG3dNhhh8UNN9zwrX/dCy+8EFtssUXhB5WJYcOGxaBBg1LPWCmPPfZY3HrrrXHXXXfFnDlzkm5p2rRpHHLIIXHaaafFeuutt8rnDRo0KO6+++4CLCtPe+21VwwfPjz1jJL6+OOP49FHH41HHnkkHn744XjjjTdST1pprVq1ij59+sQuu+wSO+20U2ywwQapJ/EFM2bMiPvuuy/uvffeGDNmTPLfH79Ju3bton///rH77rtHv379fI2mjHz44Yfx6KOPxqhRo2L06NExadKk1JNWSps2bWLnnXeO/v37x8CBA6NFixapJ5EBAaCKzJ07N/zrrDwNGzZcqe9hL1u2LObPn1+EReWhSZMmFf8R9U8//TRGjx4dDz30UIwaNSpefvnlkly3YcOGsf3228dBBx0U++23XzRp0qRgZ3/yySexdOnSgp1Xbho0aFDQ/39VopkzZ8a4cePiqaeeivHjx8fLL78cM2bMSD3r/2jSpElsvPHGsfXWW0evXr1im222iS5dulTlO4PVaPny5TFhwoR4/PHH44knnohnnnkmJk+enHRTp06domfPntGzZ8/o27dvbLbZZn6eKsTs2bPj6aefjnHjxsUzzzwTEyZMiHfffTf1rP9jo402im222Sa22Wab6N27t58xkhAAAErkww8/jOeeey6effbZeOGFF2LSpEkxefLk+Pjjj1fp3DZt2kSPHj2iR48e0bt37+jdu3f2L2IprNmzZ8eECRPitddei7fffjveeeedmDx5crz33nsxe/bsWL58eVGu27Jly1h33XWjU6dOsf7668f6668fXbp0iU033TQ6duzoD85VZv78+fHSSy/Fiy++GK+//nq8/fbb//55++STTwp2nXXWWSe6dOkSnTt3jq5du8Z3vvOd2HrrraNNmzYFuwbpLViwIF577bV47bXX4p133vn3X++9915Mnz69oD9TX9SiRYt//77VpUuX6NatW3Tt2jW6d+/u0ZCUBQEAILGPP/44pk6dGh9++GHMmjUrPvroo1i4cGF89tlnsWDBgn//fZ9/KqJZs2axzjrrxLrrrhvrrLNOtGrVKuF6crd8+fKYPXt2zJo1K2bNmhXz5s2L+fPnx4IFC2LRokX/5+f4c6uvvnqsvvrq0aBBg2jatGm0aNEimjdvHi1atIi2bdtG69ato2HDhgn+iShHs2fPjg8//PB//fV5PF28eHEsXrz4339v8+bNo7a2Nho3bhxNmjSJVq1aRZs2bWLttdeO1q1bV/ynyyiMRYsWxaxZs2LGjBkxf/78mDdvXsybNy8++eSTWLJkyVd+0rJZs2ZRr169WH311aNFixbRsmXLaNmyZay55prRvn17AZ6yJwAAAABABjwFAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIwP8PWIabnjgcWq0AAAAASUVORK5CYII=',\n              scale: 3.508264580369843,\n            },\n            locked: false,\n            child: [],\n            parent: 'ROOT',\n          },\n        },\n      },\n    ],\n    img: '/assets/images/qr-code/1.png',\n  },\n  {\n    elements: [\n      {\n        rootId: '5c11f494-5d02-4d65-a816-c9669c519065',\n        layers: {\n          '5c11f494-5d02-4d65-a816-c9669c519065': {\n            type: { resolvedName: 'GroupLayer' },\n            props: {\n              position: { x: 23.478260869565247, y: 100.89354861209551 },\n              boxSize: { width: 395.04347826086956, height: 462 },\n              scale: 1,\n              rotate: 0,\n            },\n            locked: false,\n            child: [\n              'd78fb0c2-7a1c-4381-8571-c9871ccd9cac',\n              '3f39efa2-4017-4c77-b3a9-c98456c629f0',\n              '930dca01-95e0-4527-be58-ede3cc41bc2e',\n            ],\n            parent: 'ROOT',\n          },\n          'd78fb0c2-7a1c-4381-8571-c9871ccd9cac': {\n            type: { resolvedName: 'SvgLayer' },\n            props: {\n              image:\n                'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1OSIgaGVpZ2h0PSI2OSIgdmlld0JveD0iMCwtMC4wMDAwMDc2MjkzOTQ1MzEyNSwxNS40Nzk1NTMyMjI2NTYyNSwxOC4xNDQzNDA1MTUxMzY3MiIgdmVyc2lvbj0iMS4xIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDcuNDQxODM1LC0xMTUuODQ5NjcpIj4KICAgIDxyZWN0IHdpZHRoPSIxNS40Nzk1NTEiIGhlaWdodD0iMTguMTQ0MzM5IiB4PSI0Ny40NDE4MzMiIHk9Ii0xMzMuOTk0IiB0cmFuc2Zvcm09InNjYWxlKDEsLTEpIiByeT0iMC40NTEwMTUxNyIvPgogICAgPHJlY3QgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIwLjUyNTg1OyIgaWQ9ImNyYXlvbi11bmlxdWUtaWQtMzQtNCIgd2lkdGg9IjE0LjU5MTQzNyIgaGVpZ2h0PSIxNC41NTI4MjQiIHg9IjQ3LjkwMzUiIHk9Ii0xMzAuODUzMDkiIHRyYW5zZm9ybT0ic2NhbGUoMSwtMSkiIHJ5PSIwLjMxNjk5OTkxIi8+CiAgPC9nPgo8L3N2Zz4K',\n              position: { x: 0, y: 0 },\n              boxSize: { width: 395.04347826086956, height: 462 },\n              colors: ['rgb(0, 0, 0)', 'rgb(255, 255, 255)'],\n              rotate: 0,\n            },\n            locked: false,\n            child: [],\n            parent: '5c11f494-5d02-4d65-a816-c9669c519065',\n          },\n          '3f39efa2-4017-4c77-b3a9-c98456c629f0': {\n            type: { resolvedName: 'QrCodeLayer' },\n            props: {\n              text: 'https://lidojs.com',\n              position: { x: 22.108510111942678, y: 21.070943504373645 },\n              boxSize: {\n                width: 350.8264580369844,\n                height: 350.8264580369844,\n                x: 1082.586770981508,\n                y: 155.9961470707375,\n              },\n              rotate: 0,\n              bgColor: 'rgb(255, 255, 255)',\n              textColor: 'rgb(30, 30, 45)',\n              logo: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAAAACXBIWXMAAC4jAAAuIwF4pT92AABbQ0lEQVR4nO3defzVc/7//8f73UJ7qBSpLNWEZBlqjKWyFJEYYxnrxzKYGR/MMGMZzAyGMZbMxzbMIDvjVyGERGRG2cmSCElpIS1apN6/P2bM12c+ltQ553nOeV6vl4t/Phc9X3cfb03nds55vWrq6urqAgAAAKhqtakHAAAAAMUnAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIQP3UA4CV8/7778cf//jH1DOK5sgjj4zu3bunngEAAFVDAIAKNWvWrLjssstSzyia3r17CwAAAFBAvgIAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyED91AMAAAAKZenSpTF58uR48803Y+rUqTF9+vSYPn16zJo1K+bOnfvvv5YuXRrLli2L+fPn//vXNm7cOBo2bBgREY0aNYpmzZr9+68111wzWrduHW3atIl27dpFmzZtolOnTtGxY8do0KBBqn9c+FYEAAAAoCJ98MEHMX78+HjhhRfi2WefjQkTJsS7774by5YtW6nz5s6d+61/TW1tbay33nqxwQYbRLdu3WKzzTaLzTbbLDbddNNo1qzZSu2AYhEAqshVV10VS5YsST2j4DbeeOPYddddU88AIuLee++Nt956K/WMotlwww1jzz33TD0DKIHBgwennlA0xx13XKy22mqpZxTFhx9+GCNHjoxHH300xowZE2+++WbqSbF8+fJ499134913341HH3303//3mpqa6NatW3z/+9//918bbbRRwqUQUVNXV1eXegSF0bJly5WqluXusMMOixtuuCH1jLLzwgsvxBZbbJF6RtEMGzYsBg0alHoG/2HQoEFx9913p55RNHvttVcMHz489QygBGpqalJPKJo5c+ZEy5YtU88omClTpsTtt98e9957b/z973+P5cuXp5600tZff/3Yfffdo3///rHTTjtFo0aNUk8iMz4BAAAAlJWFCxfGbbfdFjfddFM8/vjjUS3vWb799ttxxRVXxBVXXBFNmjSJPffcM370ox/FrrvuWrWf2qC8eAoAAABQFiZPnhw///nPY911142jjjoqxowZUzUv/v/TJ598ErfffnsMHDgw2rVrFyeddFK88cYbqWdR5QQAAAAgqYkTJ8bhhx8eXbp0iUsvvTQ+/vjj1JNKas6cOTF48ODo2rVr7LLLLjFy5MjUk6hSAgAAAJDE+++/H4cffnh069YthgwZstJ3768mo0aNit122y169uwZw4cPr9pPQJCGAAAAAJTU4sWL45xzzokuXbrEkCFDvMj9EuPHj4+99947tttuuxg/fnzqOVQJAQAAACiZJ598MjbffPM466yzYuHChannlL2///3v0bNnzzj44INj1qxZqedQ4QQAAACg6JYsWRK/+MUvYvvtt4+JEyemnlNxbrnllujWrVvccsstqadQwQQAAACgqN58883Ydttt45JLLvFx/1Xw4YcfxsEHHxw/+MEPYs6cOannUIEEAAAAoGjuu+++2HLLLeO5555LPaVqDB06NL773e/Gs88+m3oKFUYAAAAAiuLiiy+OgQMHxvz581NPqTqTJ0+O73//+3HrrbemnkIFEQAAAICCqqurixNOOCFOPvnkWL58eeo5VWvJkiVx0EEHxQUXXJB6ChVCAAAAAApm2bJlceSRR8af/vSn1FOycdppp8Xxxx/v/gp8IwEAAAAoiLq6ujj88MPj+uuvTz0lO5dffnmceuqpqWdQ5gQAAACgIH72s5/FzTffnHpGti688MI444wzUs+gjAkAAADAKvvd734XV155ZeoZ2fv9738f11xzTeoZlCkBAAAAWCV33HFHnH322aln8C8//elP45FHHkk9gzIkAAAAACvtmWeeif/6r/9KPYMv+Oyzz+KHP/xhvPfee6mnUGYEAAAAYKXMnTs39t9//1i0aFHqKfyHOXPmxIEHHhifffZZ6imUEQEAAABYKUcddVRMnjw59Qy+wpNPPhm/+93vUs+gjAgAAADAt3bDDTfEXXfdlXoG3+D3v/99PPfcc6lnUCYEAAAA4Fv54IMP4sQTT0w9gxWwbNmyOPLII30VgIgQAAAAgG/puOOOi7lz56aewQp64YUX4pJLLkk9gzIgAAAAACts5MiRMXz48NQz+JbOPffcmDFjRuoZJCYAAAAAK+Szzz6Lk046KfUMVsL8+fPj17/+deoZJFY/9QBg5ay55ppx2GGHpZ5RNB06dEg9AQD4D1deeWW8/vrrqWewkv7617/GSSedFBtvvHHqKSQiAECF6tChQ9xwww2pZwAAmVi0aFGcf/75qWewCurq6uJ3v/td3H777amnkIivAAAAAN/oz3/+c3zwwQepZ7CK7rzzznj11VdTzyARAQAAAPhaixcvjvPOOy/1DAqgrq7Ov8uMCQAAAMDXuvnmm2P27NmpZ1Agd955Z7z//vupZ5CAAAAAAHylurq6GDx4cOoZFNBnn30WV1xxReoZJCAAAAAAX2n06NHxyiuvpJ5Bgf35z3+OxYsXp55BiQkAAADAV/rLX/6SegJF8NFHH8Xw4cNTz6DEBAAAAOBLzZkzJ4YNG5Z6BkVy3XXXpZ5AiQkAAADAl7r11ltjyZIlqWdQJKNGjYopU6aknkEJCQAAAMCXuvPOO1NPoIjq6ur8O86MAAAAAPwfM2fOjLFjx6aeQZHdddddqSdQQvVTDwDIxfLly+Pdd9+Nt99+O955552YMWNGfPTRR/HRRx/FsmXL4uOPP46IiNVWWy0aNWoU9erVi2bNmkWrVq2idevW0aZNm1h33XWjS5cu0bJly6T/LPC5uXPnxrRp0+L999+PGTNmxIcffhhz5879919Lly6Nurq6mDt37r9/TZMmTaJBgwYREdGyZcto0aLFv/9q165dtGvXLtZZZ51o06ZN1NTUpPpHg+wNHTo0li9fnnoGRTZu3LiYMmVKdOjQIfUUSkAAACiSmTNnxuOPPx6PPfZYPPvss/Hyyy/HJ598UpCz11577fjOd74TW265ZWy33Xax3XbbRZs2bQpyNnyZyZMnx/PPPx8vvfRSvPnmmzFx4sSYNGlSzJs3r2jXbNCgQWywwQbRtWvX2GijjWLjjTeOLbbYIjbddNNo2LBh0a4L/NOIESNST6BEhg4dGieeeGLqGZSAAAAVatGiRTFx4sTUM4pm/fXXjxYtWqSe8a299957ceutt8bw4cNj3LhxUVdXV5TrzJgxI2bMmBFjxoyJSy+9NCIiNt5449hnn31in332iS222KIo1yUPixcvjqeeeirGjBkTY8eOjaeffvp/vYNfKkuXLo2JEyf+n9/r6tevH927d49tt902dtxxx9h+++2jbdu2Jd8H1WzJkiXx6KOPpp5BiTzwwAMCQCYEAKhQEydOrOoXecOGDYtBgwalnrFC6urq4oEHHoj/+Z//iQcffLBoL/q/yauvvhqvvvpqnHvuudG5c+f46U9/GkcccUQ0a9YsyR4qy9tvvx333ntvjBgxIh5//PGyvuv3Z599Fs8//3w8//zzccUVV0RExCabbBIDBgyIPfbYI7bddtuoV69e4pVQ2caOHRsLFy5MPYMSGTNmTCxatCgaNWqUegpF5iaAAKtg+PDhsfnmm8eAAQNi5MiRyV78/6dJkybFiSeeGOuuu2788pe//Pf9BeCL3nvvvbjwwgtj8803jw022CBOOOGEePjhh8v6xf9XeeWVV+LCCy+MHXbYIdq0aRPHHntsjB07tmz+m4RKM2rUqNQTKKElS5bEY489lnoGJSAAAKyECRMmxI477hh77713vPTSS6nnfKX58+fHH//4x9hwww3jsssui88++yz1JBL77LPP4q677oq+fftGx44d41e/+lW8+OKLqWcV1EcffRR//vOfY/vtt49OnTrFueeeGx988EHqWVBRnnzyydQTKLFHHnkk9QRKQAAA+BaWLVsW55xzTmy11Vbx+OOPp56zwj766KM48cQTo1evXvHqq6+mnkMCc+bMiXPOOSc6duwYP/zhD+PRRx/N4t3xKVOmxJlnnhkdOnSIAw44IJ555pnUk6DsffrppzF+/PjUMyixSvpzDStPAABYQR988EHsvPPOcdZZZ8Wnn36aes5KefbZZ2PrrbeOm2++OfUUSmTGjBlx6qmnxnrrrRdnnXVWTJs2LfWkJJYuXRp33HFHbL311tG/f/8YM2ZM6klQtp555pmK/CoQq+a5556LBQsWpJ5BkQkAACvg5Zdfjq233roqvh+3cOHCOOSQQ+LMM8/M4h3gXC1YsCDOPvvs2GCDDeIPf/hDwR5BWQ0efPDB6N27d/Tr16+sv8IDqTz33HOpJ5DAsmXL4qmnnko9gyITAAC+wdixY2O77baLqVOnpp5SUOeee24cdthhsWzZstRTKKC6urr461//Gp07d47f/e537uL9NR566KHYfPPN44gjjoiZM2emngNl4/nnn089gUTGjRuXegJF5jGAAF9j3LhxMWDAgJg3b17qKUVx0003xbJly+LGG2/02LQq8Nprr8WPf/zjGDt2bOopFaOuri6uv/76GD58eFx44YVx5JFHRk1NTepZkFQuAaBt27ax4447Rvfu3aNTp07RpEmTiPjnPRDee++9ePHFF2P06NHx/vvvJ15aOs8++2zqCRSZAADwFSZOnBj9+vWr2hf/n7v11lujtrY2brzxRi98KtSyZcvi/PPPj3POOadi70+R2pw5c+Loo4+Om266KYYMGRKdOnVKPQmSWLZsWbzyyiupZxTV7rvvHieffHLsuOOOUVv79R+IrqurizFjxsR5552XxaMR3Si1+vkKAMCXmDNnTgwcODDmzp2bekpJ3HzzzXHGGWeknsFKeOedd6J3795x5plnevFfAI8//nj06NEjbr311tRTIIl33nmnan8vadGiRQwdOjTuu+++6NOnzze++I+IqKmpid69e8fDDz8ct912WzRt2rQES9N57733YtasWalnUEQCAMCXOPzww+ONN95IPaOkzj///LjuuutSz+BbuOeee6JHjx4+8l9g8+bNi4MOOij+67/+KxYvXpx6DpTUxIkTU08oipYtW8YTTzwRe++990qfccABB8SYMWOiefPmBVxWfl5++eXUEygiAQDgP1x99dVxzz33pJ6RxHHHHef7fxWgrq4ufvOb38Ree+1V9V9RSemGG26I7bffPt57773UU6BkqjV+33rrrdG9e/dVPmfLLbeMu+66qwCLyle1fwUkdwIAwBe89957ccopp6Sekcynn34a++23XzZffahECxcujB/84Afx29/+NvWULDzzzDPx3e9+152xycZbb72VekLBHXHEEbHbbrsV7LxddtkljjzyyIKdV25ef/311BMoIgEA4AtOOOGEWLBgQeoZSU2ePDlOOOGE1DP4EnPmzIldd901hg0blnpKVmbOnBl9+vSJ+++/P/UUKLpqe+RtgwYN4uyzzy74uWeeeeYK3UOgEr322mupJ1BE1flTC7ASRo8e7YXVvwwZMiQefPDB1DP4gqlTp8Z2220XTz75ZOopWVq0aFEMHDgwbrnlltRToKimTJmSekJBDRo0KDp06FDwczt27Bh9+/Yt+LnloFrvA8E/CQAA8c/vVP/yl79MPaOsHH300fHJJ5+knkH888V/796949VXX009JWvLli2LQw89VASgqlXbJwD233//op3dr1+/op2d0rRp02LJkiWpZ1AkAgBARNx9991ufvcf3nvvvfjDH/6Qekb2pk2bFr17967K7+VWouXLl4sAVK1ly5bFzJkzU88oqB133LFoZ2+11VZFOzu1d999N/UEikQAALJXV1fnhmpf4aKLLqq6d4Mqydy5c2O33Xbz4r/MfB4BRowYkXoKFNSHH36YekJBrbPOOtGqVauind++ffuinZ3a22+/nXoCRSIAANm7//7744UXXkg9oywtWrQozjzzzNQzsvTpp5/GPvvsEy+99FLqKXyJ5cuXx3777Rf/+Mc/Uk+Bgqm2AFCM7/5/0ZprrlnU81MSAKqXAABkb/DgwaknlLWbbrop3nzzzdQzsnPEEUfE6NGjU8/ga3x+Y8DJkyenngIFMXv27NQTCmqNNdYo6vn16tUr6vkpTZ8+PfUEikQAALI2YcKEGDVqVOoZZW3ZsmVx0UUXpZ6RlYsvvth3zCvE7NmzY9CgQW6YSVX46KOPUk8oqIYNG6aeULE++OCD1BMoEgEAyNq1116bekJFuO6662LatGmpZ2ThkUce8USKCvPyyy/HEUccEXV1damnwCqptpA1b9681BMqlk8AVC8BAMjW4sWL46abbko9oyIsXbo0rrnmmtQzqt706dPjwAMPjOXLl6eewrd05513xhVXXJF6BqyShQsXpp5QUNX2lYZSmjFjRuoJFIkAAGRrxIgRMWfOnNQzKsY111wTS5cuTT2jatXV1cXhhx8es2bNSj2FlXTyySfHhAkTUs+AlbZgwYLUEwrqnXfe8cmclVRtj4Pk/xEAgGzdeuutqSdUlOnTp8djjz2WekbVGjx4cDz00EOpZ7AKlixZEgceeGAsWbIk9RRYKfPnz089oaDmz5/vMaorqdruB8H/IwAAWVqwYEHcd999qWdUnGr7eGi5ePPNN+OMM85IPYMCmDBhQpx77rmpZ8BKWbZsWeoJBff888+nnlCR5s2b5+toVUoAALL0wAMPxKeffpp6BkRdXV0cc8wxsWjRotRTKJALLrjAVwGgTPz9739PPaFi+ZpkdRIAgCzdfffdqSdAREQMGTIkRo8enXoGBfTZZ5/FUUcd5bvHUAb87/3K+/jjj1NPoAgEACA7y5cvjwcffDD1DIgFCxbEaaedlnoGRTBu3Li45ZZbUs+A7L399ts+kbOSqu2eEPyTAABk5/nnn/doIMrC+eefHx988EHqGRTJqaee6r4ZUAb+9re/pZ5Qkfz+VZ0EACA7Dz/8cOoJEFOmTIlLLrkk9QyK6P3334+LLroo9QxYYbW11fnS4Nprr43PPvss9YyK415J1ak6/ysH+Bpjx45NPQHi97//fSxevDj1DIrskksu8T1aKkbz5s1TTyiK6dOnx/Dhw1PPqDhz585NPYEiEACArCxfvtwdgUluypQpcd1116WeQQnMnTs3Bg8enHoGrJBq/QRARMSf/vSn1BMqjk8AVKfq/a8c4EtMmjTJY21I7g9/+EMsXbo09QxKZPDgwbFgwYLUM+AbtWrVKvWEonniiSfiscceSz2jonzyySepJ1AEAgCQlRdeeCH1BDI3Z86cGDJkSOoZlNDcuXPj+uuvTz0DvtFaa62VekJRnXbaaR7PSfYEACArL774YuoJZO4vf/mLd1UydNlll8Xy5ctTz4CvVe0B4KmnnhLjyJ4AAGTFJwBIafny5XH55ZennkECb731Vtx///2pZ8DXatu2beoJRffLX/7S41fJWv3UAwBKSQAgpYceeiimTJmSegaJ/OUvf4k99tgj9Qz4Sm3bto369etX9SPzPvzwwzj66KPj3nvvXeWz6tWrFz169CjAqvLUsmXL1BMoAgEAyMbs2bNj+vTpqWeQsRtuuCH1BBK67777YubMmdGmTZvUU+BL1a9fPzp06BCTJ09OPaWoRowYEZdddlmccMIJq3ROs2bNvLFAxfEVACAbb775ZuoJZGzOnDkxbNiw1DNI6LPPPotbbrkl9Qz4WhtssEHqCSVxyimnxLhx41LPgJLzCQAgG++8807qCck0adIkdtppp9hiiy2ic+fO0bx582jcuHHMmTMnpk2bFk8//XQ89NBDMXPmzNRTq9bw4cOze6Zy+/bto3///rHZZpvFeuutFy1atIgFCxbErFmz4pVXXolHHnkkuxtz3nHHHXHSSSelngFfaaONNopRo0alnlF0S5cujUGDBsXTTz8d7du3Tz0HSkYAALKRYwDo1KlTnH322bH//vtHo0aNvvbvXbp0aQwbNixOPfXUePvtt0u0MB9Dhw5NPaFkttpqqzjnnHOif//+UVNT87V/78svvxznnXde3HHHHSVal9a4ceNiypQp0aFDh9RT4EttuummqSeUzAcffBADBw6MsWPHRuPGjVPPgZLwFQAgG7kFgJNOOikmTpwYhx9++De++I+IaNCgQey3337xyiuvxOGHH178gRmZO3duPPTQQ6lnFF1NTU2ce+65MX78+Nhtt92+8cV/RET37t3j9ttvj/vuuy+bG04NHz489QT4SptvvnnqCSX1/PPPx7777htLly5NPQVKQgAAspFTADjvvPPikksuiYYNG37rX9uoUaO47rrr4tBDDy3Csjw9/PDDWXz8/4Ybbogzzjgjamu//R8vdt9993j88cdjzTXXLMKy8nL33XenngBfqUePHisU76rJAw88EEcffXTU1dWlngJFJwAA2cglAOy7775x+umnr9IZNTU18ec//zm6d+9eoFV5e/DBB1NPKLozzzxzlaNR9+7d429/+9tKBYRK8uSTT8bChQtTz4Av1bRp0+jcuXPqGSU3ZMiQ+MlPfiICUPWq+39hAb7go48+Sj2h6Bo3bhyDBw8uyFmrr756XHbZZQU5K3fV/vH/LbfcMs4+++yCnNW3b99VfjRXuVuyZEk8/vjjqWfAV9p+++1TT0ji6quvjlNPPTX1DCgqAQDIRg4B4Mgjj4x11123YOf16dMn+vTpU7DzcjRp0qSYMmVK6hlFdfHFF0e9evUKdt5ZZ50Va621VsHOK0c53GWdytW7d+/UE5K58MIL45RTTvFJAKqWAABkYd68ebFs2bLUM4ruiCOOKPiZbgi4ap588snUE4qqZ8+eBX+x0LJlyzjmmGMKema5GTt2bOoJ8JVy/QTA5y666CJfB6BqCQBAFmbNmpV6QtF16NChKHdv3nvvvaN+fU+NXVn/+Mc/Uk8oqmOPPbYo5/74xz8uyrnl4rnnnovFixenngFfqmPHjtGpU6fUM5K6+uqr45hjjsnizQPyIgAAWcjh4/99+/YtyrnNmjWLnj17FuXsHFRzAGjQoEHsvffeRTm7Y8eOVf1zt3Tp0njuuedSz4CvNHDgwNQTkrv22mvj0EMPFQGoKgIAkIUcAsBOO+1UtLN33nnnop1dzRYuXBivvPJK6hlFs80220SLFi2Kdn7//v2LdnY5ePrpp1NPgK8kAPzTrbfeGvvuu28Wj3IlDwIAkIVFixalnlB0xQwAxfp0QbV79dVXY/ny5alnFM2OO+5Y0een9tJLL6WeAF9phx12KGrgqyTDhw+Pfffd1+M7qQoCAEAVaNeuXbRr165o5/fq1ct9AFZCtb/A++53v1vU87faaquinp/ayy+/nHoCfKUGDRrEnnvumXpG2bj33ntjjz32EAGoeAIAkIV58+alnlBU3bt3L+r5DRs2jE022aSo16hG1R4Aiv1z17x58+jYsWNRr5HShAkTqvoTIlS+Qw45JPWEsvLoo4/GLrvsEnPnzk09BVaaAABkodr/kL3ZZpsV/Ro9evQo+jWqzZtvvpl6QtHU1NSU5MX5+uuvX/RrpLJo0aJ4//33U8+Ar7TTTjsV9dNllejvf/977LrrrlncW4jqJAAAWaj2AFDsd2IjoiiPGKx2kydPTj2haNq2bRsNGjQo+nU6dOhQ9GukVM0/I1S+evXqxcEHH5x6RtkZP3587Ljjjlk8YpjqIwAAWaj2rwCU4l3Sbt26Ff0a1aSuri7eeuut1DOKZu211y7JdVq3bl2S66QiAFDujjjiiNQTytKECRNihx12iKlTp6aeAt+KAABQBUrxEc1q/i52MUyfPr2qHxu1xhprVNV1UhEAKHff+c53ol+/fqlnlKXXX389evfuHVOmTEk9BVaYAABQBdq3b18V16gm1f7d7ubNm5fkOk2aNCnJdVKZMWNG6gnwjf77v/879YSy9dZbb8W2225b1fd8oboIAAAVbo011ojVV1+96Ndp1qxZyV70VQPfDS2Man/8ZLWHIqpD//79o3PnzqlnlK33338/dtxxR4/2pCIIAAAVrpQvytu2bVuya1W6adOmpZ5QFZo2bZp6QlEJRVSC2tra+NWvfpV6RlmbNm1a9O3bt+of/0rlEwAAKlyLFi1Kdq1GjRqV7FqVzgs7VoSfEyrFIYccEuutt17qGWVt9uzZsf3228e4ceNST4GvJAAAVLiampqSXava340tpGp/8gSFMWfOnNQTYIU0bNgwTj/99NQzyt68efNi1113jcceeyz1FPhSAgBAhWvZsmXJrlXt38cuJAGAFeHnhEpyxBFHeCLMCpg3b17svvvuMXr06NRT4P8QAABYYaWMDZVu/vz5qSdQAerq6mLBggWpZ8AKadiwYVxwwQWpZ1SERYsWRf/+/eOee+5JPQX+FwEAAIrAO7usqMWLF6eeACts//33j169eqWeURGWLl0a++67b9x5552pp8C/CQAAAAn5BACVpKamJi699NLUMyrG0qVL48ADD4xbbrkl9RSICAEAAIpiyZIlqScAFEWvXr3ikEMOST2jYixfvjwOPvjguOqqq1JPAQEAAIph0aJFqScAFM0ll1wSrVq1Sj2jovzkJz+JwYMHp55B5gQAAICEPvnkk9QT4Ftr1apVXHzxxalnVJyTTjrJjRRJSgAAAEho6dKlqSfASjn00ENj5513Tj2j4px22mlx2mmnpZ5BpgQAAABgpVx//fUeEbsSLrjggvjFL34RdXV1qaeQGQEAAABYKe3bt4+rr7469YyKdMkll8RPfvITEYCSEgAAAICVtv/++8fBBx+cekZFuvrqq+PQQw+NZcuWpZ5CJgQAAABglVx55ZXRuXPn1DMq0s033xwHH3xwfPrpp6mnkAEBAAAAWCXNmjWLoUOHRuPGjVNPqUi333577LvvviIARScAAAAAq2zTTTeNa6+9NvWMinXvvffGgAEDYuHChamnUMUEAAAAoCB+9KMfxfHHH596RsUaNWpU7LHHHjFv3rzUU6hSAgAAAFAwl156afTr1y/1jIr16KOPxi677BJz585NPYUqJAAAAAAFU69evbjzzjuje/fuqadUrPHjx8euu+4qAlBwAgAAAFBQzZs3jxEjRkTbtm1TT6lYIgDFIAAAAAAF16FDhxg5cmQ0b9489ZSKNX78+OjTp0/MmjUr9RSqhAAAAAAURY8ePeKBBx6IRo0apZ5SsZ5//vno27evCEBBCAAAAEDRbLvttjFs2LBo0KBB6ikVa8KECTFgwABfB2CVCQAAAEBR9evXL+666y4RYBU8/fTTMXDgwFi4cGHqKVQwAQAAACi6gQMHigCr6PHHH4999tknPv3009RTqFACAAAAUBIiwKp78MEH44ADDohly5alnkIFEgAAAICSGThwYAwdOtSNAVfBsGHD4qijjoq6urrUU6gwAgAAAFBSe+yxR4wYMSKaNWuWekrFuuGGG+Lss89OPYMKIwAAAAAl17dv33j44YejRYsWqadUrHPOOSf+8pe/pJ5BBREAAACAJHr27BlPPPFEtGrVKvWUinXMMcfEAw88kHoGFUIAAAAAkunevXv8/e9/j3XXXTf1lIq0fPny2HfffePZZ59NPYUKIAAAAABJde7cOcaOHRsbbrhh6ikVaeHChTFgwICYOnVq6imUOQEAAABIrlOnTvHYY4/FpptumnpKRZoxY0bstddesXDhwtRTKGMCAAAAUBbat28fo0ePjq222ir1lIr03HPPxZFHHunxgHwlAQAAACgbrVu3jkceeSS23Xbb1FMq0u233x7nn39+6hmUKQEAAAAoKy1atIiHH344dtppp9RTKtKvf/3ruOeee1LPoAwJAAAAQNlp3Lhx3H///bHnnnumnlJx6urq4qCDDopJkyalnkKZEQAAAICy1LBhwxg6dGj86Ec/Sj2l4ixYsCB++MMfxuLFi1NPoYwIAAAAQNmqX79+3HjjjfHjH/849ZSK8+KLL8bxxx+fegZlRAAAAADKWr169eLqq6+On//856mnVJy//OUv7gfAvwkAAABA2aupqYmLL744zjrrrNRTKs7RRx8ds2bNSj2DMiAAAAAAFeO3v/1t/PGPf0w9o6LMnDkzfvKTn6SeQRmon3oAAAAr5+OPP47BgwennlFwbdu2jWOPPTb1DMrYySefHE2aNImf/exnsXz58tRzKsJdd90V9957r6cqZE4AAACoUB9//HH89re/TT2j4Hr06CEA8I2OO+64aN68eRx66KEiwAr66U9/Gn369ImmTZumnkIivgIAAABUpIMOOiiGDRsWDRo0SD2lIrz33ntxzjnnpJ5BQgIAAABQsQYOHBj33XdfNGrUKPWUijB48OCYPHly6hkkIgAAAAAVbZdddokHH3wwmjdvnnpK2fv000/j5JNPTj2DRAQAAACg4m2//fYxatSoaNWqVeopZW/YsGHx1FNPpZ5BAgIAAABQFbbeeusYPXp0tGvXLvWUsnfaaaelnkACAgAAAFA1unfvHo8//nh06NAh9ZSy9thjj8UjjzySegYlJgAAAABVZaONNoonn3wyNtxww9RTyponAuRHAAAAAKpO+/bt47HHHotu3bqlnlK2xowZ414AmREAAACAqtS+ffsYM2ZMbLrppqmnlK3f//73qSdQQgIAAABQtVq3bh2jR4+O7373u6mnlKURI0bEpEmTUs+gRAQAAACgqrVu3TpGjRoV22yzTeopZaeuri4uv/zy1DMoEQEAAACoei1atIiHHnpIBPgS119/fSxYsCD1DEpAAAAAALLweQTwdYD/bf78+XHbbbelnkEJCAAAAEA2WrRoEffff78bA/6Hv/71r6knUAICAAAAkJXPbwwoAvw/48aNi1dffTX1DIpMAAAAALLzeQTYaKONUk8pGzfeeGPqCRSZAAAAAGSpdevW8fDDD8c666yTekpZ+Nvf/pZ6AkUmAAAAANnq1KlTjBw5Mlq0aJF6SnKTJ0+OZ599NvUMikgAAAAAsta9e/e47777olGjRqmnJHfXXXelnkARCQAAAED2vv/978edd94ZtbV5v0QaOXJk6gkUUd4/3QAAAP+yxx57xGWXXZZ6RlIvvPBCzJw5M/UMikQAAAAA+Jef/exncdxxx6WekdTDDz+cegJFIgAAAAB8wZ/+9KfYZZddUs9IZvTo0aknUCQCAAAAwBfUr18/7rzzzujatWvqKUn84x//SD2BIhEAAAAA/kPLli3j//v//r9o3Lhx6ikl9/rrr8fHH3+cegZFUD/1AAAAIL3BgwfH4MGDU88ouIsuuij23Xfflfq1m2yySfz5z3+OQw45pMCryltdXV2MHz8+dt1119RTKDABAAAAiI8//jjefffd1DMKbsGCBav06w8++OAYMWJE3HHHHQVaVBmee+45AaAK+QoAAADA17jqqquiXbt2qWeU1IQJE1JPoAgEAAAAgK+xxhprxOWXX556RkkJANVJAAAAAPgG++yzT+yxxx6pZ5TM66+/Hp999lnqGRSYAAAAALACLr744mjQoEHq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XLCzNtxww1hrrbWyCynz58+P5557LvWM5OrVq+cTAFVMAKDsPf300/H000+nnlE0hx12mABQIuuss07qCSUxbdq0+NWvfhVXXHHFKp918803x7hx4wqwKl9bbbVV/OUvf0k9o2g++eST+M1vfhNXXnllwc4cOnRoPPXUUwU7rxx17969YDfYatiwYWy00UZZfMedr9a3b9+Cnrf11ltX/X04+HKbb755NGrUKPUMisQ9AIBs5PIJgIiIK6+8cpWfnT1p0qT42c9+VqBF+crhY5RXX311PProowU568MPP4yf/vSnBTmrnG2zzTYFPe973/teQc+jstSrVy922GGHgp7Zs2fPgp5H5dhuu+1ST6CIBAAgGw0bNswqAhx55JFx5513rtSvnTBhQvTp0yfmzZtX4FX52WyzzWKNNdZIPaOo6urqYr/99ovXXnttlc5ZuHBh7LnnnvHBBx8UaFn56t27d0HPEwDy9r3vfa8gX/v6Ii8C89WnT5/UEygiAQDISocOHVJPKJmlS5fG/vvvH6ecckp88sknK/RrFi1aFH/84x/ju9/9brz//vtFXpiH2tra2HbbbVPPKLrZs2fHdtttFw899NBK/frJkyfHdtttF//4xz8KvKw8CQAU0qBBgwp+5rbbbhsNGjQo+LmUt9ra2oL//kR5EQCArHTq1Cn1hJK76KKLYoMNNohf//rXMW7cuP/zmMDp06fHgw8+GMcff3ysv/768ctf/jKWLFmSaG11yuXdlI8++ij69esXBxxwwArf+PD999+PM844IzbZZJOqvlniF33nO9+Jtm3bFvTMTTbZJJo1a1bQM6kcP/zhDwt+ZuPGjX0NIENbbrlltGjRIvUMishNAIGs5BgAIiJmzpwZ5513Xpx33nkREbHmmmtGbW1tzJ8/34v9Eth9993j5JNPTj2jZO6444644447onPnztG3b9/o1q1brLPOOtGgQYOoq6uLmTNnxqRJk+LJJ5+M8ePHZ3f3+v79+xf8zHr16sUuu+wSQ4cOLfjZlLetttqqaJ9u22mnnWLs2LFFOZvyNGDAgNQTKDIBAMhK165dU08oCx999FHqCVnp1q1brL/++vH222+nnlJSkyZNikmTJqWeUXb22GOPopy75557CgAZ2nfffYt2dv/+/eO3v/1t0c6n/AgA1c9XAICsCACkUqwXfVSWZs2axfbbb1+Us3ffffeoqakpytmUp9ra2vjRj35UtPO32WabWHvttYt2PuVl7bXXjq222ir1DIpMAACy0q1bt9QTyNQ+++yTegJlYI899oiGDRsW5ew2bdr4znZmBgwYUNSb29bW1npHOCODBg2K2lovD6udf8NAVlq3bu3dDJLYYYcdol27dqlnkFgx362NiDjwwAOLej7l5dhjjy36NYrxhAHKUzFuJkn5EQCA7Gy55ZapJ5Ch2tpaL84yt8Yaa0S/fv2Keo2DDjqoaJ8woLx06tSpKDeU/E/9+vWLNdZYo+jXIa3WrVt7/F8mBAAgO1tssUXqCWTqoIMOSj2BhA444ICiP1d9rbXWir322quo16A8HHfccSX5uHbDhg1jv/32K/p1SGvfffeNevXqpZ5BCQgAQHa22Wab1BPI1JZbbhlbb7116hkkcswxx5TkOkceeWRJrkM6a621VvzkJz8p2fWK/dUV0jviiCNST6BEBAAgO9tuu23qCWSsFN/Zpfx873vfix49epTkWrvssosbnla5k08+OZo2bVqy622//fbRpUuXkl2P0urevXt897vfTT2DEhEAgOy0bt3aH2RI5oADDog111wz9QxKrJTv1tbW1sZpp51WsutRWi1atCh5SKypqYnjjjuupNekdHxqKC8CAJClHXfcMfUEMtW4ceP42c9+lnoGJdShQ4c44IADSnrNAw88MDp16lTSa1Iav/jFL6Jly5Ylv+7hhx8ejRs3Lvl1Ka4mTZrEYYcdlnoGJSQAAFkq9p244escf/zx0aRJk9QzKJFTTjkl6tevX9Jr1q9fP371q1+V9JoUX8eOHePkk09Ocu2WLVvGoYcemuTaFM/hhx+eJCiRjgAAZKlv374luXsyfJlWrVrFUUcdlXoGJdC2bdtkH6898sgjo3PnzkmuTXFceOGF0ahRo2TX/9WvfuVO8VWkpqYmjj/++NQzKDF/+gWytMYaa7gZIEn9+te/jmbNmqWeQZGdeeaZyV6wNWjQIC688MIk16bwdthhh+SP4+vUqZPHmVaRgQMHRteuXVPPoMQEACBbe++9d+oJZKxVq1bxy1/+MvUMiqhz587x4x//OOmGQYMGxe677550A6uufv368T//8z+pZ0RExOmnn+5TAFXi7LPPTj2BBAQAIFv77LNP6glk7qSTTor27dunnkGRXHjhhSX/7v+Xufzy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+OA466yzUs/gW9p8883j6aefjnPOOSeLSFUqe+21V0yYMCGOPvpo76b9y5577hmvvfZanH766T5evIJat24dN954Yzz88MM+WfUF//Vf/xWvvPJK7LvvvqmnVLzdd989nn/+eU/v4FsRAABWwA477BCPP/54VX5vs2/fvu4WXMEaNGgQv/71r2PixIlxwAEHpJ5T0TbeeON48MEHY/jw4d7t/hKNGzeO8847L1566aXYa6+9Us8pWzU1NXH00UfH66+/HocccojfW7/EeuutF3/729/ioYceio033jj1nIrTokWLuP766+O+++7zxB6+NQEAYAX16NEjnn322aq6AVufPn3i3nvv9Y5eFVhvvfXitttui3/84x/Rr1+/1HMqyoYbbhjXX399vPjii7HrrrumnlP2unbtGsOHD4/x48f7WfsPAwYMiOeeey6uueaaWHPNNVPPKXu77LJLvPzyy3HjjTe64eQKqKmpiaOOOiomTpwYhx9+eOo5VCgBAOBbWGutteKBBx6ICy+8sOIfa9S/f/8YMWJEVT7PPGe9evWKkSNHxj/+8Y/Yc889vfv4Nbp16xbXX399vP7663H44Ye7qeK3tPXWW//7Z23QoEFZ/6ztsMMOMXbs2BgxYkRsvvnmqedUlNra2jjkkEPi9ddfjyFDhsRmm22WelJZ6tevXzz33HNx7bXXxtprr516DhVMAAD4lurVqxennHJKPPPMM9GrV6/Uc1bKf//3f8c999zjxX8V69WrV9xzzz3xxhtvxPHHH++mW/9SU1MTu+22W4wcOTJeeeUVL/wLoFevXjFs2LB466234qSTTqrq+6V8Ub169WLfffeNsWPHxpgxY+L73/9+6kkVrX79+nHooYfGiy++GI888kjstdde/tuMf96T5KmnnoqRI0eKSxSEAACwkjbddNP4+9//Hrfddlt06tQp9ZwVss4668SIESPisssuiwYNGqSeQwlstNFG8ac//Sk++OCDuOmmm2KnnXbK8p3azp07x3nnnRdTpkyJ+++/P/r165fl/x+Kaf31149LLrkkpk2bFjfccEPV/qy1bt06fvGLX8Sbb74Zf/vb37zwL4K+ffvG8OHDY+rUqXHxxRdn96mANdZYI0444YR45ZVXYvjw4dGzZ8/Uk6giAgDAKqipqYkDDjggJk6cGEOGDInu3bunnvSlVl999TjxxBPjlVdeiQEDBqSeQwKNGzeOgw8+OEaNGhVTp06NK6+8Mnbeeeeqfodtk002iV//+tfx7LPPxhtvvBGnn366u7GXQJMmTeKwww6LUaNGxZQpU+KCCy6IXr16VXQMWH311eOAAw6IESNGxPvvvx8XXXRRxYTfSrb22mvHz3/+83jxxRfjjTfeiD/84Q8V/7P0VRo2bBh77LFH3HzzzTFt2rQYPHiwGyRSFDV1dXV1qUdQGC1btoy5c+emnsG3dNhhh8UNN9zwrX/dCy+8EFtssUXhB5WJYcOGxaBBg1LPWCmPPfZY3HrrrXHXXXfFnDlzkm5p2rRpHHLIIXHaaafFeuutt8rnDRo0KO6+++4CLCtPe+21VwwfPjz1jJL6+OOP49FHH41HHnkkHn744XjjjTdST1pprVq1ij59+sQuu+wSO+20U2ywwQapJ/EFM2bMiPvuuy/uvffeGDNmTPLfH79Ju3bton///rH77rtHv379fI2mjHz44Yfx6KOPxqhRo2L06NExadKk1JNWSps2bWLnnXeO/v37x8CBA6NFixapJ5EBAaCKzJ07N/zrrDwNGzZcqe9hL1u2LObPn1+EReWhSZMmFf8R9U8//TRGjx4dDz30UIwaNSpefvnlkly3YcOGsf3228dBBx0U++23XzRp0qRgZ3/yySexdOnSgp1Xbho0aFDQ/39VopkzZ8a4cePiqaeeivHjx8fLL78cM2bMSD3r/2jSpElsvPHGsfXWW0evXr1im222iS5dulTlO4PVaPny5TFhwoR4/PHH44knnohnnnkmJk+enHRTp06domfPntGzZ8/o27dvbLbZZn6eKsTs2bPj6aefjnHjxsUzzzwTEyZMiHfffTf1rP9jo402im222Sa22Wab6N27t58xkhAAAErkww8/jOeeey6effbZeOGFF2LSpEkxefLk+Pjjj1fp3DZt2kSPHj2iR48e0bt37+jdu3f2L2IprNmzZ8eECRPitddei7fffjveeeedmDx5crz33nsxe/bsWL58eVGu27Jly1h33XWjU6dOsf7668f6668fXbp0iU033TQ6duzoD85VZv78+fHSSy/Fiy++GK+//nq8/fbb//55++STTwp2nXXWWSe6dOkSnTt3jq5du8Z3vvOd2HrrraNNmzYFuwbpLViwIF577bV47bXX4p133vn3X++9915Mnz69oD9TX9SiRYt//77VpUuX6NatW3Tt2jW6d+/u0ZCUBQEAILGPP/44pk6dGh9++GHMmjUrPvroo1i4cGF89tlnsWDBgn//fZ9/KqJZs2axzjrrxLrrrhvrrLNOtGrVKuF6crd8+fKYPXt2zJo1K2bNmhXz5s2L+fPnx4IFC2LRokX/5+f4c6uvvnqsvvrq0aBBg2jatGm0aNEimjdvHi1atIi2bdtG69ato2HDhgn+iShHs2fPjg8//PB//fV5PF28eHEsXrz4339v8+bNo7a2Nho3bhxNmjSJVq1aRZs2bWLttdeO1q1bV/ynyyiMRYsWxaxZs2LGjBkxf/78mDdvXsybNy8++eSTWLJkyVd+0rJZs2ZRr169WH311aNFixbRsmXLaNmyZay55prRvn17AZ6yJwAAAABABjwFAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIwP8PWIabnjgcWq0AAAAASUVORK5CYII=',\n              scale: 3.508264580369843,\n            },\n            locked: false,\n            child: [],\n            parent: '5c11f494-5d02-4d65-a816-c9669c519065',\n          },\n          '930dca01-95e0-4527-be58-ede3cc41bc2e': {\n            type: { resolvedName: 'TextLayer' },\n            props: {\n              doc: {\n                type: 'doc',\n                content: [\n                  {\n                    type: 'paragraph',\n                    attrs: {\n                      textAlign: 'center',\n                      color: 'rgb(255, 255, 255)',\n                      fontFamily: 'Roboto',\n                      fontSize: '38px',\n                      lineHeight: '1.4',\n                      letterSpacing: 0,\n                      textTransform: null,\n                      marginLeft: null,\n                      indent: 0,\n                      listType: '',\n                    },\n                    content: [\n                      {\n                        type: 'text',\n                        marks: [\n                          { type: 'bold' },\n                          {\n                            type: 'color',\n                            attrs: { color: 'rgb(255, 255, 255)' },\n                          },\n                        ],\n                        text: 'SCAN ME',\n                      },\n                    ],\n                  },\n                ],\n              },\n              position: { x: 30.717362039152988, y: 393.1064513879045 },\n              boxSize: {\n                width: 333.60875418256376,\n                height: 64,\n                x: 1300.8495002212821,\n                y: 524.5,\n              },\n              scale: 1.2075471698113207,\n              rotate: 0,\n              fonts: [\n                {\n                  name: 'Roboto',\n                  fonts: [\n                    {\n                      style: 'Bold',\n                      urls: [\n                        'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                      ],\n                    },\n                    {\n                      style: 'Bold_Italic',\n                      urls: [\n                        'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                      ],\n                    },\n                    {\n                      style: 'Bold',\n                      urls: [\n                        'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                      ],\n                    },\n                    {\n                      urls: [\n                        'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                      ],\n                    },\n                    {\n                      style: 'Italic',\n                      urls: [\n                        'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                      ],\n                    },\n                    {\n                      urls: [\n                        'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                      ],\n                    },\n                  ],\n                },\n              ],\n              colors: ['rgb(0, 0, 0)', 'rgb(255, 255, 255)'],\n              fontSizes: [38],\n            },\n            locked: false,\n            child: [],\n            parent: '5c11f494-5d02-4d65-a816-c9669c519065',\n          },\n        },\n      },\n    ],\n    img: '/assets/images/qr-code/2.png',\n  },\n  {\n    elements: [\n      {\n        rootId: '54751aa8-e4cd-46d9-9baa-231efde747ac',\n        layers: {\n          '54751aa8-e4cd-46d9-9baa-231efde747ac': {\n            type: { resolvedName: 'GroupLayer' },\n            props: {\n              position: { x: 1207.2199999999998, y: 147.90937608922968 },\n              boxSize: { width: 329.5600000000002, height: 462 },\n              scale: 1,\n              rotate: 0,\n            },\n            locked: false,\n            child: [\n              'fc9cdd05-0d4a-4eaa-a2ad-1ab579a68be1',\n              '9fa1b8a2-7771-4d17-b319-d551e4001836',\n              'd9d46596-6424-4787-a583-f0f9a9f475d8',\n            ],\n            parent: 'ROOT',\n          },\n          'fc9cdd05-0d4a-4eaa-a2ad-1ab579a68be1': {\n            type: { resolvedName: 'SvgLayer' },\n            props: {\n              image:\n                'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJjcmF5b24tdW5pcXVlLWlkLTI1LTAiIHZpZXdCb3g9IjAsMCwzODMuMTYwMDAzNjYyMTA5NCw1MzUuNTEwMDA5NzY1NjI1IiB3aWR0aD0iMTA3IiBoZWlnaHQ9IjE1MCIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyI+PGRlZnM+PC9kZWZzPjxnIGlkPSJjcmF5b24tdW5pcXVlLWlkLTI1LTEiPjxyZWN0IHdpZHRoPSIzODMuMTYiIGhlaWdodD0iNTM1LjUxIiByeD0iMjEuNjUiIHJ5PSIyMS42NSI+PC9yZWN0PjxwYXRoIGQ9Im0xMzQuNTgsNDIxLjA5bDU1LjktMjQuMjhjLjcyLS4zMSwxLjQ3LS4zMSwyLjIsMGw1NS45LDI0LjI4Yy42Ny4yOS41NSwyLjAxLS4xNCwyLjAxaC0xMTMuNzJjLS42OSwwLS44LTEuNzItLjE0LTIuMDFaIiBmaWxsPSIjZmZmZmZmIj48L3BhdGg+PHJlY3QgeD0iMTUuNDEiIHk9IjE1LjciIHdpZHRoPSIzNTIuNTciIGhlaWdodD0iMzUyLjU3IiByeD0iMTYuNDciIHJ5PSIxNi40NyIgZmlsbD0iI2ZmZmZmZiI+PC9yZWN0PjwvZz48L3N2Zz4=',\n              position: { x: 2.2737367544323206e-13, y: 0 },\n              boxSize: { width: 329.56, height: 462 },\n              colors: ['rgb(0, 0, 0)', 'rgb(255, 255, 255)'],\n              rotate: 0,\n            },\n            locked: false,\n            child: [],\n            parent: '54751aa8-e4cd-46d9-9baa-231efde747ac',\n          },\n          '9fa1b8a2-7771-4d17-b319-d551e4001836': {\n            type: { resolvedName: 'QrCodeLayer' },\n            props: {\n              text: 'https://lidojs.com',\n              position: { x: 24.866770981508125, y: 25.24833839665183 },\n              boxSize: {\n                width: 279.8264580369843,\n                height: 279.8264580369843,\n                x: 1009.6934326710815,\n                y: 215.1577144858814,\n              },\n              rotate: 0,\n              bgColor: 'rgb(255, 255, 255)',\n              textColor: 'rgb(30, 30, 45)',\n              logo: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAAAACXBIWXMAAC4jAAAuIwF4pT92AABbQ0lEQVR4nO3defzVc/7//8f73UJ7qBSpLNWEZBlqjKWyFJEYYxnrxzKYGR/MMGMZzAyGMZbMxzbMIDvjVyGERGRG2cmSCElpIS1apN6/P2bM12c+ltQ553nOeV6vl4t/Phc9X3cfb03nds55vWrq6urqAgAAAKhqtakHAAAAAMUnAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIQP3UA4CV8/7778cf//jH1DOK5sgjj4zu3bunngEAAFVDAIAKNWvWrLjssstSzyia3r17CwAAAFBAvgIAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyED91AMAAAAKZenSpTF58uR48803Y+rUqTF9+vSYPn16zJo1K+bOnfvvv5YuXRrLli2L+fPn//vXNm7cOBo2bBgREY0aNYpmzZr9+68111wzWrduHW3atIl27dpFmzZtolOnTtGxY8do0KBBqn9c+FYEAAAAoCJ98MEHMX78+HjhhRfi2WefjQkTJsS7774by5YtW6nz5s6d+61/TW1tbay33nqxwQYbRLdu3WKzzTaLzTbbLDbddNNo1qzZSu2AYhEAqshVV10VS5YsST2j4DbeeOPYddddU88AIuLee++Nt956K/WMotlwww1jzz33TD0DKIHBgwennlA0xx13XKy22mqpZxTFhx9+GCNHjoxHH300xowZE2+++WbqSbF8+fJ499134913341HH3303//3mpqa6NatW3z/+9//918bbbRRwqUQUVNXV1eXegSF0bJly5WqluXusMMOixtuuCH1jLLzwgsvxBZbbJF6RtEMGzYsBg0alHoG/2HQoEFx9913p55RNHvttVcMHz489QygBGpqalJPKJo5c+ZEy5YtU88omClTpsTtt98e9957b/z973+P5cuXp5600tZff/3Yfffdo3///rHTTjtFo0aNUk8iMz4BAAAAlJWFCxfGbbfdFjfddFM8/vjjUS3vWb799ttxxRVXxBVXXBFNmjSJPffcM370ox/FrrvuWrWf2qC8eAoAAABQFiZPnhw///nPY911142jjjoqxowZUzUv/v/TJ598ErfffnsMHDgw2rVrFyeddFK88cYbqWdR5QQAAAAgqYkTJ8bhhx8eXbp0iUsvvTQ+/vjj1JNKas6cOTF48ODo2rVr7LLLLjFy5MjUk6hSAgAAAJDE+++/H4cffnh069YthgwZstJ3768mo0aNit122y169uwZw4cPr9pPQJCGAAAAAJTU4sWL45xzzokuXbrEkCFDvMj9EuPHj4+99947tttuuxg/fnzqOVQJAQAAACiZJ598MjbffPM466yzYuHChannlL2///3v0bNnzzj44INj1qxZqedQ4QQAAACg6JYsWRK/+MUvYvvtt4+JEyemnlNxbrnllujWrVvccsstqadQwQQAAACgqN58883Ydttt45JLLvFx/1Xw4YcfxsEHHxw/+MEPYs6cOannUIEEAAAAoGjuu+++2HLLLeO5555LPaVqDB06NL773e/Gs88+m3oKFUYAAAAAiuLiiy+OgQMHxvz581NPqTqTJ0+O73//+3HrrbemnkIFEQAAAICCqqurixNOOCFOPvnkWL58eeo5VWvJkiVx0EEHxQUXXJB6ChVCAAAAAApm2bJlceSRR8af/vSn1FOycdppp8Xxxx/v/gp8IwEAAAAoiLq6ujj88MPj+uuvTz0lO5dffnmceuqpqWdQ5gQAAACgIH72s5/FzTffnHpGti688MI444wzUs+gjAkAAADAKvvd734XV155ZeoZ2fv9738f11xzTeoZlCkBAAAAWCV33HFHnH322aln8C8//elP45FHHkk9gzIkAAAAACvtmWeeif/6r/9KPYMv+Oyzz+KHP/xhvPfee6mnUGYEAAAAYKXMnTs39t9//1i0aFHqKfyHOXPmxIEHHhifffZZ6imUEQEAAABYKUcddVRMnjw59Qy+wpNPPhm/+93vUs+gjAgAAADAt3bDDTfEXXfdlXoG3+D3v/99PPfcc6lnUCYEAAAA4Fv54IMP4sQTT0w9gxWwbNmyOPLII30VgIgQAAAAgG/puOOOi7lz56aewQp64YUX4pJLLkk9gzIgAAAAACts5MiRMXz48NQz+JbOPffcmDFjRuoZJCYAAAAAK+Szzz6Lk046KfUMVsL8+fPj17/+deoZJFY/9QBg5ay55ppx2GGHpZ5RNB06dEg9AQD4D1deeWW8/vrrqWewkv7617/GSSedFBtvvHHqKSQiAECF6tChQ9xwww2pZwAAmVi0aFGcf/75qWewCurq6uJ3v/td3H777amnkIivAAAAAN/oz3/+c3zwwQepZ7CK7rzzznj11VdTzyARAQAAAPhaixcvjvPOOy/1DAqgrq7Ov8uMCQAAAMDXuvnmm2P27NmpZ1Agd955Z7z//vupZ5CAAAAAAHylurq6GDx4cOoZFNBnn30WV1xxReoZJCAAAAAAX2n06NHxyiuvpJ5Bgf35z3+OxYsXp55BiQkAAADAV/rLX/6SegJF8NFHH8Xw4cNTz6DEBAAAAOBLzZkzJ4YNG5Z6BkVy3XXXpZ5AiQkAAADAl7r11ltjyZIlqWdQJKNGjYopU6aknkEJCQAAAMCXuvPOO1NPoIjq6ur8O86MAAAAAPwfM2fOjLFjx6aeQZHdddddqSdQQvVTDwDIxfLly+Pdd9+Nt99+O955552YMWNGfPTRR/HRRx/FsmXL4uOPP46IiNVWWy0aNWoU9erVi2bNmkWrVq2idevW0aZNm1h33XWjS5cu0bJly6T/LPC5uXPnxrRp0+L999+PGTNmxIcffhhz5879919Lly6Nurq6mDt37r9/TZMmTaJBgwYREdGyZcto0aLFv/9q165dtGvXLtZZZ51o06ZN1NTUpPpHg+wNHTo0li9fnnoGRTZu3LiYMmVKdOjQIfUUSkAAACiSmTNnxuOPPx6PPfZYPPvss/Hyyy/HJ598UpCz11577fjOd74TW265ZWy33Xax3XbbRZs2bQpyNnyZyZMnx/PPPx8vvfRSvPnmmzFx4sSYNGlSzJs3r2jXbNCgQWywwQbRtWvX2GijjWLjjTeOLbbYIjbddNNo2LBh0a4L/NOIESNST6BEhg4dGieeeGLqGZSAAAAVatGiRTFx4sTUM4pm/fXXjxYtWqSe8a299957ceutt8bw4cNj3LhxUVdXV5TrzJgxI2bMmBFjxoyJSy+9NCIiNt5449hnn31in332iS222KIo1yUPixcvjqeeeirGjBkTY8eOjaeffvp/vYNfKkuXLo2JEyf+n9/r6tevH927d49tt902dtxxx9h+++2jbdu2Jd8H1WzJkiXx6KOPpp5BiTzwwAMCQCYEAKhQEydOrOoXecOGDYtBgwalnrFC6urq4oEHHoj/+Z//iQcffLBoL/q/yauvvhqvvvpqnHvuudG5c+f46U9/GkcccUQ0a9YsyR4qy9tvvx333ntvjBgxIh5//PGyvuv3Z599Fs8//3w8//zzccUVV0RExCabbBIDBgyIPfbYI7bddtuoV69e4pVQ2caOHRsLFy5MPYMSGTNmTCxatCgaNWqUegpF5iaAAKtg+PDhsfnmm8eAAQNi5MiRyV78/6dJkybFiSeeGOuuu2788pe//Pf9BeCL3nvvvbjwwgtj8803jw022CBOOOGEePjhh8v6xf9XeeWVV+LCCy+MHXbYIdq0aRPHHntsjB07tmz+m4RKM2rUqNQTKKElS5bEY489lnoGJSAAAKyECRMmxI477hh77713vPTSS6nnfKX58+fHH//4x9hwww3jsssui88++yz1JBL77LPP4q677oq+fftGx44d41e/+lW8+OKLqWcV1EcffRR//vOfY/vtt49OnTrFueeeGx988EHqWVBRnnzyydQTKLFHHnkk9QRKQAAA+BaWLVsW55xzTmy11Vbx+OOPp56zwj766KM48cQTo1evXvHqq6+mnkMCc+bMiXPOOSc6duwYP/zhD+PRRx/N4t3xKVOmxJlnnhkdOnSIAw44IJ555pnUk6DsffrppzF+/PjUMyixSvpzDStPAABYQR988EHsvPPOcdZZZ8Wnn36aes5KefbZZ2PrrbeOm2++OfUUSmTGjBlx6qmnxnrrrRdnnXVWTJs2LfWkJJYuXRp33HFHbL311tG/f/8YM2ZM6klQtp555pmK/CoQq+a5556LBQsWpJ5BkQkAACvg5Zdfjq233roqvh+3cOHCOOSQQ+LMM8/M4h3gXC1YsCDOPvvs2GCDDeIPf/hDwR5BWQ0efPDB6N27d/Tr16+sv8IDqTz33HOpJ5DAsmXL4qmnnko9gyITAAC+wdixY2O77baLqVOnpp5SUOeee24cdthhsWzZstRTKKC6urr461//Gp07d47f/e537uL9NR566KHYfPPN44gjjoiZM2emngNl4/nnn089gUTGjRuXegJF5jGAAF9j3LhxMWDAgJg3b17qKUVx0003xbJly+LGG2/02LQq8Nprr8WPf/zjGDt2bOopFaOuri6uv/76GD58eFx44YVx5JFHRk1NTepZkFQuAaBt27ax4447Rvfu3aNTp07RpEmTiPjnPRDee++9ePHFF2P06NHx/vvvJ15aOs8++2zqCRSZAADwFSZOnBj9+vWr2hf/n7v11lujtrY2brzxRi98KtSyZcvi/PPPj3POOadi70+R2pw5c+Loo4+Om266KYYMGRKdOnVKPQmSWLZsWbzyyiupZxTV7rvvHieffHLsuOOOUVv79R+IrqurizFjxsR5552XxaMR3Si1+vkKAMCXmDNnTgwcODDmzp2bekpJ3HzzzXHGGWeknsFKeOedd6J3795x5plnevFfAI8//nj06NEjbr311tRTIIl33nmnan8vadGiRQwdOjTuu+++6NOnzze++I+IqKmpid69e8fDDz8ct912WzRt2rQES9N57733YtasWalnUEQCAMCXOPzww+ONN95IPaOkzj///LjuuutSz+BbuOeee6JHjx4+8l9g8+bNi4MOOij+67/+KxYvXpx6DpTUxIkTU08oipYtW8YTTzwRe++990qfccABB8SYMWOiefPmBVxWfl5++eXUEygiAQDgP1x99dVxzz33pJ6RxHHHHef7fxWgrq4ufvOb38Ree+1V9V9RSemGG26I7bffPt57773UU6BkqjV+33rrrdG9e/dVPmfLLbeMu+66qwCLyle1fwUkdwIAwBe89957ccopp6Sekcynn34a++23XzZffahECxcujB/84Afx29/+NvWULDzzzDPx3e9+152xycZbb72VekLBHXHEEbHbbrsV7LxddtkljjzyyIKdV25ef/311BMoIgEA4AtOOOGEWLBgQeoZSU2ePDlOOOGE1DP4EnPmzIldd901hg0blnpKVmbOnBl9+vSJ+++/P/UUKLpqe+RtgwYN4uyzzy74uWeeeeYK3UOgEr322mupJ1BE1flTC7ASRo8e7YXVvwwZMiQefPDB1DP4gqlTp8Z2220XTz75ZOopWVq0aFEMHDgwbrnlltRToKimTJmSekJBDRo0KDp06FDwczt27Bh9+/Yt+LnloFrvA8E/CQAA8c/vVP/yl79MPaOsHH300fHJJ5+knkH888V/796949VXX009JWvLli2LQw89VASgqlXbJwD233//op3dr1+/op2d0rRp02LJkiWpZ1AkAgBARNx9991ufvcf3nvvvfjDH/6Qekb2pk2bFr17967K7+VWouXLl4sAVK1ly5bFzJkzU88oqB133LFoZ2+11VZFOzu1d999N/UEikQAALJXV1fnhmpf4aKLLqq6d4Mqydy5c2O33Xbz4r/MfB4BRowYkXoKFNSHH36YekJBrbPOOtGqVauind++ffuinZ3a22+/nXoCRSIAANm7//7744UXXkg9oywtWrQozjzzzNQzsvTpp5/GPvvsEy+99FLqKXyJ5cuXx3777Rf/+Mc/Uk+Bgqm2AFCM7/5/0ZprrlnU81MSAKqXAABkb/DgwaknlLWbbrop3nzzzdQzsnPEEUfE6NGjU8/ga3x+Y8DJkyenngIFMXv27NQTCmqNNdYo6vn16tUr6vkpTZ8+PfUEikQAALI2YcKEGDVqVOoZZW3ZsmVx0UUXpZ6RlYsvvth3zCvE7NmzY9CgQW6YSVX46KOPUk8oqIYNG6aeULE++OCD1BMoEgEAyNq1116bekJFuO6662LatGmpZ2ThkUce8USKCvPyyy/HEUccEXV1damnwCqptpA1b9681BMqlk8AVC8BAMjW4sWL46abbko9oyIsXbo0rrnmmtQzqt706dPjwAMPjOXLl6eewrd05513xhVXXJF6BqyShQsXpp5QUNX2lYZSmjFjRuoJFIkAAGRrxIgRMWfOnNQzKsY111wTS5cuTT2jatXV1cXhhx8es2bNSj2FlXTyySfHhAkTUs+AlbZgwYLUEwrqnXfe8cmclVRtj4Pk/xEAgGzdeuutqSdUlOnTp8djjz2WekbVGjx4cDz00EOpZ7AKlixZEgceeGAsWbIk9RRYKfPnz089oaDmz5/vMaorqdruB8H/IwAAWVqwYEHcd999qWdUnGr7eGi5ePPNN+OMM85IPYMCmDBhQpx77rmpZ8BKWbZsWeoJBff888+nnlCR5s2b5+toVUoAALL0wAMPxKeffpp6BkRdXV0cc8wxsWjRotRTKJALLrjAVwGgTPz9739PPaFi+ZpkdRIAgCzdfffdqSdAREQMGTIkRo8enXoGBfTZZ5/FUUcd5bvHUAb87/3K+/jjj1NPoAgEACA7y5cvjwcffDD1DIgFCxbEaaedlnoGRTBu3Li45ZZbUs+A7L399ts+kbOSqu2eEPyTAABk5/nnn/doIMrC+eefHx988EHqGRTJqaee6r4ZUAb+9re/pZ5Qkfz+VZ0EACA7Dz/8cOoJEFOmTIlLLrkk9QyK6P3334+LLroo9QxYYbW11fnS4Nprr43PPvss9YyK415J1ak6/ysH+Bpjx45NPQHi97//fSxevDj1DIrskksu8T1aKkbz5s1TTyiK6dOnx/Dhw1PPqDhz585NPYEiEACArCxfvtwdgUluypQpcd1116WeQQnMnTs3Bg8enHoGrJBq/QRARMSf/vSn1BMqjk8AVKfq/a8c4EtMmjTJY21I7g9/+EMsXbo09QxKZPDgwbFgwYLUM+AbtWrVKvWEonniiSfiscceSz2jonzyySepJ1AEAgCQlRdeeCH1BDI3Z86cGDJkSOoZlNDcuXPj+uuvTz0DvtFaa62VekJRnXbaaR7PSfYEACArL774YuoJZO4vf/mLd1UydNlll8Xy5ctTz4CvVe0B4KmnnhLjyJ4AAGTFJwBIafny5XH55ZennkECb731Vtx///2pZ8DXatu2beoJRffLX/7S41fJWv3UAwBKSQAgpYceeiimTJmSegaJ/OUvf4k99tgj9Qz4Sm3bto369etX9SPzPvzwwzj66KPj3nvvXeWz6tWrFz169CjAqvLUsmXL1BMoAgEAyMbs2bNj+vTpqWeQsRtuuCH1BBK67777YubMmdGmTZvUU+BL1a9fPzp06BCTJ09OPaWoRowYEZdddlmccMIJq3ROs2bNvLFAxfEVACAbb775ZuoJZGzOnDkxbNiw1DNI6LPPPotbbrkl9Qz4WhtssEHqCSVxyimnxLhx41LPgJLzCQAgG++8807qCck0adIkdtppp9hiiy2ic+fO0bx582jcuHHMmTMnpk2bFk8//XQ89NBDMXPmzNRTq9bw4cOze6Zy+/bto3///rHZZpvFeuutFy1atIgFCxbErFmz4pVXXolHHnkkuxtz3nHHHXHSSSelngFfaaONNopRo0alnlF0S5cujUGDBsXTTz8d7du3Tz0HSkYAALKRYwDo1KlTnH322bH//vtHo0aNvvbvXbp0aQwbNixOPfXUePvtt0u0MB9Dhw5NPaFkttpqqzjnnHOif//+UVNT87V/78svvxznnXde3HHHHSVal9a4ceNiypQp0aFDh9RT4EttuummqSeUzAcffBADBw6MsWPHRuPGjVPPgZLwFQAgG7kFgJNOOikmTpwYhx9++De++I+IaNCgQey3337xyiuvxOGHH178gRmZO3duPPTQQ6lnFF1NTU2ce+65MX78+Nhtt92+8cV/RET37t3j9ttvj/vuuy+bG04NHz489QT4SptvvnnqCSX1/PPPx7777htLly5NPQVKQgAAspFTADjvvPPikksuiYYNG37rX9uoUaO47rrr4tBDDy3Csjw9/PDDWXz8/4Ybbogzzjgjamu//R8vdt9993j88cdjzTXXLMKy8nL33XenngBfqUePHisU76rJAw88EEcffXTU1dWlngJFJwAA2cglAOy7775x+umnr9IZNTU18ec//zm6d+9eoFV5e/DBB1NPKLozzzxzlaNR9+7d429/+9tKBYRK8uSTT8bChQtTz4Av1bRp0+jcuXPqGSU3ZMiQ+MlPfiICUPWq+39hAb7go48+Sj2h6Bo3bhyDBw8uyFmrr756XHbZZQU5K3fV/vH/LbfcMs4+++yCnNW3b99VfjRXuVuyZEk8/vjjqWfAV9p+++1TT0ji6quvjlNPPTX1DCgqAQDIRg4B4Mgjj4x11123YOf16dMn+vTpU7DzcjRp0qSYMmVK6hlFdfHFF0e9evUKdt5ZZ50Va621VsHOK0c53GWdytW7d+/UE5K58MIL45RTTvFJAKqWAABkYd68ebFs2bLUM4ruiCOOKPiZbgi4ap588snUE4qqZ8+eBX+x0LJlyzjmmGMKema5GTt2bOoJ8JVy/QTA5y666CJfB6BqCQBAFmbNmpV6QtF16NChKHdv3nvvvaN+fU+NXVn/+Mc/Uk8oqmOPPbYo5/74xz8uyrnl4rnnnovFixenngFfqmPHjtGpU6fUM5K6+uqr45hjjsnizQPyIgAAWcjh4/99+/YtyrnNmjWLnj17FuXsHFRzAGjQoEHsvffeRTm7Y8eOVf1zt3Tp0njuuedSz4CvNHDgwNQTkrv22mvj0EMPFQGoKgIAkIUcAsBOO+1UtLN33nnnop1dzRYuXBivvPJK6hlFs80220SLFi2Kdn7//v2LdnY5ePrpp1NPgK8kAPzTrbfeGvvuu28Wj3IlDwIAkIVFixalnlB0xQwAxfp0QbV79dVXY/ny5alnFM2OO+5Y0een9tJLL6WeAF9phx12KGrgqyTDhw+Pfffd1+M7qQoCAEAVaNeuXbRr165o5/fq1ct9AFZCtb/A++53v1vU87faaquinp/ayy+/nHoCfKUGDRrEnnvumXpG2bj33ntjjz32EAGoeAIAkIV58+alnlBU3bt3L+r5DRs2jE022aSo16hG1R4Aiv1z17x58+jYsWNRr5HShAkTqvoTIlS+Qw45JPWEsvLoo4/GLrvsEnPnzk09BVaaAABkodr/kL3ZZpsV/Ro9evQo+jWqzZtvvpl6QtHU1NSU5MX5+uuvX/RrpLJo0aJ4//33U8+Ar7TTTjsV9dNllejvf/977LrrrlncW4jqJAAAWaj2AFDsd2IjoiiPGKx2kydPTj2haNq2bRsNGjQo+nU6dOhQ9GukVM0/I1S+evXqxcEHH5x6RtkZP3587Ljjjlk8YpjqIwAAWaj2rwCU4l3Sbt26Ff0a1aSuri7eeuut1DOKZu211y7JdVq3bl2S66QiAFDujjjiiNQTytKECRNihx12iKlTp6aeAt+KAABQBUrxEc1q/i52MUyfPr2qHxu1xhprVNV1UhEAKHff+c53ol+/fqlnlKXXX389evfuHVOmTEk9BVaYAABQBdq3b18V16gm1f7d7ubNm5fkOk2aNCnJdVKZMWNG6gnwjf77v/879YSy9dZbb8W2225b1fd8oboIAAAVbo011ojVV1+96Ndp1qxZyV70VQPfDS2Man/8ZLWHIqpD//79o3PnzqlnlK33338/dtxxR4/2pCIIAAAVrpQvytu2bVuya1W6adOmpZ5QFZo2bZp6QlEJRVSC2tra+NWvfpV6RlmbNm1a9O3bt+of/0rlEwAAKlyLFi1Kdq1GjRqV7FqVzgs7VoSfEyrFIYccEuutt17qGWVt9uzZsf3228e4ceNST4GvJAAAVLiampqSXava340tpGp/8gSFMWfOnNQTYIU0bNgwTj/99NQzyt68efNi1113jcceeyz1FPhSAgBAhWvZsmXJrlXt38cuJAGAFeHnhEpyxBFHeCLMCpg3b17svvvuMXr06NRT4P8QAABYYaWMDZVu/vz5qSdQAerq6mLBggWpZ8AKadiwYVxwwQWpZ1SERYsWRf/+/eOee+5JPQX+FwEAAIrAO7usqMWLF6eeACts//33j169eqWeURGWLl0a++67b9x5552pp8C/CQAAAAn5BACVpKamJi699NLUMyrG0qVL48ADD4xbbrkl9RSICAEAAIpiyZIlqScAFEWvXr3ikEMOST2jYixfvjwOPvjguOqqq1JPAQEAAIph0aJFqScAFM0ll1wSrVq1Sj2jovzkJz+JwYMHp55B5gQAAICEPvnkk9QT4Ftr1apVXHzxxalnVJyTTjrJjRRJSgAAAEho6dKlqSfASjn00ENj5513Tj2j4px22mlx2mmnpZ5BpgQAAABgpVx//fUeEbsSLrjggvjFL34RdXV1qaeQGQEAAABYKe3bt4+rr7469YyKdMkll8RPfvITEYCSEgAAAICVtv/++8fBBx+cekZFuvrqq+PQQw+NZcuWpZ5CJgQAAABglVx55ZXRuXPn1DMq0s033xwHH3xwfPrpp6mnkAEBAAAAWCXNmjWLoUOHRuPGjVNPqUi333577LvvviIARScAAAAAq2zTTTeNa6+9NvWMinXvvffGgAEDYuHChamnUMUEAAAAoCB+9KMfxfHHH596RsUaNWpU7LHHHjFv3rzUU6hSAgAAAFAwl156afTr1y/1jIr16KOPxi677BJz585NPYUqJAAAAAAFU69evbjzzjuje/fuqadUrPHjx8euu+4qAlBwAgAAAFBQzZs3jxEjRkTbtm1TT6lYIgDFIAAAAAAF16FDhxg5cmQ0b9489ZSKNX78+OjTp0/MmjUr9RSqhAAAAAAURY8ePeKBBx6IRo0apZ5SsZ5//vno27evCEBBCAAAAEDRbLvttjFs2LBo0KBB6ikVa8KECTFgwABfB2CVCQAAAEBR9evXL+666y4RYBU8/fTTMXDgwFi4cGHqKVQwAQAAACi6gQMHigCr6PHHH4999tknPv3009RTqFACAAAAUBIiwKp78MEH44ADDohly5alnkIFEgAAAICSGThwYAwdOtSNAVfBsGHD4qijjoq6urrUU6gwAgAAAFBSe+yxR4wYMSKaNWuWekrFuuGGG+Lss89OPYMKIwAAAAAl17dv33j44YejRYsWqadUrHPOOSf+8pe/pJ5BBREAAACAJHr27BlPPPFEtGrVKvWUinXMMcfEAw88kHoGFUIAAAAAkunevXv8/e9/j3XXXTf1lIq0fPny2HfffePZZ59NPYUKIAAAAABJde7cOcaOHRsbbrhh6ikVaeHChTFgwICYOnVq6imUOQEAAABIrlOnTvHYY4/FpptumnpKRZoxY0bstddesXDhwtRTKGMCAAAAUBbat28fo0ePjq222ir1lIr03HPPxZFHHunxgHwlAQAAACgbrVu3jkceeSS23Xbb1FMq0u233x7nn39+6hmUKQEAAAAoKy1atIiHH344dtppp9RTKtKvf/3ruOeee1LPoAwJAAAAQNlp3Lhx3H///bHnnnumnlJx6urq4qCDDopJkyalnkKZEQAAAICy1LBhwxg6dGj86Ec/Sj2l4ixYsCB++MMfxuLFi1NPoYwIAAAAQNmqX79+3HjjjfHjH/849ZSK8+KLL8bxxx+fegZlRAAAAADKWr169eLqq6+On//856mnVJy//OUv7gfAvwkAAABA2aupqYmLL744zjrrrNRTKs7RRx8ds2bNSj2DMiAAAAAAFeO3v/1t/PGPf0w9o6LMnDkzfvKTn6SeQRmon3oAAAAr5+OPP47BgwennlFwbdu2jWOPPTb1DMrYySefHE2aNImf/exnsXz58tRzKsJdd90V9957r6cqZE4AAACoUB9//HH89re/TT2j4Hr06CEA8I2OO+64aN68eRx66KEiwAr66U9/Gn369ImmTZumnkIivgIAAABUpIMOOiiGDRsWDRo0SD2lIrz33ntxzjnnpJ5BQgIAAABQsQYOHBj33XdfNGrUKPWUijB48OCYPHly6hkkIgAAAAAVbZdddokHH3wwmjdvnnpK2fv000/j5JNPTj2DRAQAAACg4m2//fYxatSoaNWqVeopZW/YsGHx1FNPpZ5BAgIAAABQFbbeeusYPXp0tGvXLvWUsnfaaaelnkACAgAAAFA1unfvHo8//nh06NAh9ZSy9thjj8UjjzySegYlJgAAAABVZaONNoonn3wyNtxww9RTyponAuRHAAAAAKpO+/bt47HHHotu3bqlnlK2xowZ414AmREAAACAqtS+ffsYM2ZMbLrppqmnlK3f//73qSdQQgIAAABQtVq3bh2jR4+O7373u6mnlKURI0bEpEmTUs+gRAQAAACgqrVu3TpGjRoV22yzTeopZaeuri4uv/zy1DMoEQEAAACoei1atIiHHnpIBPgS119/fSxYsCD1DEpAAAAAALLweQTwdYD/bf78+XHbbbelnkEJCAAAAEA2WrRoEffff78bA/6Hv/71r6knUAICAAAAkJXPbwwoAvw/48aNi1dffTX1DIpMAAAAALLzeQTYaKONUk8pGzfeeGPqCRSZAAAAAGSpdevW8fDDD8c666yTekpZ+Nvf/pZ6AkUmAAAAANnq1KlTjBw5Mlq0aJF6SnKTJ0+OZ599NvUMikgAAAAAsta9e/e47777olGjRqmnJHfXXXelnkARCQAAAED2vv/978edd94ZtbV5v0QaOXJk6gkUUd4/3QAAAP+yxx57xGWXXZZ6RlIvvPBCzJw5M/UMikQAAAAA+Jef/exncdxxx6WekdTDDz+cegJFIgAAAAB8wZ/+9KfYZZddUs9IZvTo0aknUCQCAAAAwBfUr18/7rzzzujatWvqKUn84x//SD2BIhEAAAAA/kPLli3j//v//r9o3Lhx6ikl9/rrr8fHH3+cegZFUD/1AAAAIL3BgwfH4MGDU88ouIsuuij23Xfflfq1m2yySfz5z3+OQw45pMCryltdXV2MHz8+dt1119RTKDABAAAAiI8//jjefffd1DMKbsGCBav06w8++OAYMWJE3HHHHQVaVBmee+45AaAK+QoAAADA17jqqquiXbt2qWeU1IQJE1JPoAgEAAAAgK+xxhprxOWXX556RkkJANVJAAAAAPgG++yzT+yxxx6pZ5TM66+/Hp999lnqGRSYAAAAALACLr744mjQoEHq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XLCzNtxww1hrrbWyCynz58+P5557LvWM5OrVq+cTAFVMAKDsPf300/H000+nnlE0hx12mABQIuuss07qCSUxbdq0+NWvfhVXXHHFKp918803x7hx4wqwKl9bbbVV/OUvf0k9o2g++eST+M1vfhNXXnllwc4cOnRoPPXUUwU7rxx17969YDfYatiwYWy00UZZfMedr9a3b9+Cnrf11ltX/X04+HKbb755NGrUKPUMisQ9AIBs5PIJgIiIK6+8cpWfnT1p0qT42c9+VqBF+crhY5RXX311PProowU568MPP4yf/vSnBTmrnG2zzTYFPe973/teQc+jstSrVy922GGHgp7Zs2fPgp5H5dhuu+1ST6CIBAAgGw0bNswqAhx55JFx5513rtSvnTBhQvTp0yfmzZtX4FX52WyzzWKNNdZIPaOo6urqYr/99ovXXnttlc5ZuHBh7LnnnvHBBx8UaFn56t27d0HPEwDy9r3vfa8gX/v6Ii8C89WnT5/UEygiAQDISocOHVJPKJmlS5fG/vvvH6ecckp88sknK/RrFi1aFH/84x/ju9/9brz//vtFXpiH2tra2HbbbVPPKLrZs2fHdtttFw899NBK/frJkyfHdtttF//4xz8KvKw8CQAU0qBBgwp+5rbbbhsNGjQo+LmUt9ra2oL//kR5EQCArHTq1Cn1hJK76KKLYoMNNohf//rXMW7cuP/zmMDp06fHgw8+GMcff3ysv/768ctf/jKWLFmSaG11yuXdlI8++ij69esXBxxwwArf+PD999+PM844IzbZZJOqvlniF33nO9+Jtm3bFvTMTTbZJJo1a1bQM6kcP/zhDwt+ZuPGjX0NIENbbrlltGjRIvUMishNAIGs5BgAIiJmzpwZ5513Xpx33nkREbHmmmtGbW1tzJ8/34v9Eth9993j5JNPTj2jZO6444644447onPnztG3b9/o1q1brLPOOtGgQYOoq6uLmTNnxqRJk+LJJ5+M8ePHZ3f3+v79+xf8zHr16sUuu+wSQ4cOLfjZlLetttqqaJ9u22mnnWLs2LFFOZvyNGDAgNQTKDIBAMhK165dU08oCx999FHqCVnp1q1brL/++vH222+nnlJSkyZNikmTJqWeUXb22GOPopy75557CgAZ2nfffYt2dv/+/eO3v/1t0c6n/AgA1c9XAICsCACkUqwXfVSWZs2axfbbb1+Us3ffffeoqakpytmUp9ra2vjRj35UtPO32WabWHvttYt2PuVl7bXXjq222ir1DIpMAACy0q1bt9QTyNQ+++yTegJlYI899oiGDRsW5ew2bdr4znZmBgwYUNSb29bW1npHOCODBg2K2lovD6udf8NAVlq3bu3dDJLYYYcdol27dqlnkFgx362NiDjwwAOLej7l5dhjjy36NYrxhAHKUzFuJkn5EQCA7Gy55ZapJ5Ch2tpaL84yt8Yaa0S/fv2Keo2DDjqoaJ8woLx06tSpKDeU/E/9+vWLNdZYo+jXIa3WrVt7/F8mBAAgO1tssUXqCWTqoIMOSj2BhA444ICiP1d9rbXWir322quo16A8HHfccSX5uHbDhg1jv/32K/p1SGvfffeNevXqpZ5BCQgAQHa22Wab1BPI1JZbbhlbb7116hkkcswxx5TkOkceeWRJrkM6a621VvzkJz8p2fWK/dUV0jviiCNST6BEBAAgO9tuu23qCWSsFN/Zpfx873vfix49epTkWrvssosbnla5k08+OZo2bVqy622//fbRpUuXkl2P0urevXt897vfTT2DEhEAgOy0bt3aH2RI5oADDog111wz9QxKrJTv1tbW1sZpp51WsutRWi1atCh5SKypqYnjjjuupNekdHxqKC8CAJClHXfcMfUEMtW4ceP42c9+lnoGJdShQ4c44IADSnrNAw88MDp16lTSa1Iav/jFL6Jly5Ylv+7hhx8ejRs3Lvl1Ka4mTZrEYYcdlnoGJSQAAFkq9p244escf/zx0aRJk9QzKJFTTjkl6tevX9Jr1q9fP371q1+V9JoUX8eOHePkk09Ocu2WLVvGoYcemuTaFM/hhx+eJCiRjgAAZKlv374luXsyfJlWrVrFUUcdlXoGJdC2bdtkH6898sgjo3PnzkmuTXFceOGF0ahRo2TX/9WvfuVO8VWkpqYmjj/++NQzKDF/+gWytMYaa7gZIEn9+te/jmbNmqWeQZGdeeaZyV6wNWjQIC688MIk16bwdthhh+SP4+vUqZPHmVaRgQMHRteuXVPPoMQEACBbe++9d+oJZKxVq1bxy1/+MvUMiqhz587x4x//OOmGQYMGxe677550A6uufv368T//8z+pZ0RExOmnn+5TAFXi7LPPTj2BBAQAIFv77LNP6glk7qSTTor27dunnkGRXHjhhSX/7v+Xufzy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+OA466yzUs/gW9p8883j6aefjnPOOSeLSFUqe+21V0yYMCGOPvpo76b9y5577hmvvfZanH766T5evIJat24dN954Yzz88MM+WfUF//Vf/xWvvPJK7LvvvqmnVLzdd989nn/+eU/v4FsRAABWwA477BCPP/54VX5vs2/fvu4WXMEaNGgQv/71r2PixIlxwAEHpJ5T0TbeeON48MEHY/jw4d7t/hKNGzeO8847L1566aXYa6+9Us8pWzU1NXH00UfH66+/HocccojfW7/EeuutF3/729/ioYceio033jj1nIrTokWLuP766+O+++7zxB6+NQEAYAX16NEjnn322aq6AVufPn3i3nvv9Y5eFVhvvfXitttui3/84x/Rr1+/1HMqyoYbbhjXX399vPjii7HrrrumnlP2unbtGsOHD4/x48f7WfsPAwYMiOeeey6uueaaWHPNNVPPKXu77LJLvPzyy3HjjTe64eQKqKmpiaOOOiomTpwYhx9+eOo5VCgBAOBbWGutteKBBx6ICy+8sOIfa9S/f/8YMWJEVT7PPGe9evWKkSNHxj/+8Y/Yc889vfv4Nbp16xbXX399vP7663H44Ye7qeK3tPXWW//7Z23QoEFZ/6ztsMMOMXbs2BgxYkRsvvnmqedUlNra2jjkkEPi9ddfjyFDhsRmm22WelJZ6tevXzz33HNx7bXXxtprr516DhVMAAD4lurVqxennHJKPPPMM9GrV6/Uc1bKf//3f8c999zjxX8V69WrV9xzzz3xxhtvxPHHH++mW/9SU1MTu+22W4wcOTJeeeUVL/wLoFevXjFs2LB466234qSTTqrq+6V8Ub169WLfffeNsWPHxpgxY+L73/9+6kkVrX79+nHooYfGiy++GI888kjstdde/tuMf96T5KmnnoqRI0eKSxSEAACwkjbddNP4+9//Hrfddlt06tQp9ZwVss4668SIESPisssuiwYNGqSeQwlstNFG8ac//Sk++OCDuOmmm2KnnXbK8p3azp07x3nnnRdTpkyJ+++/P/r165fl/x+Kaf31149LLrkkpk2bFjfccEPV/qy1bt06fvGLX8Sbb74Zf/vb37zwL4K+ffvG8OHDY+rUqXHxxRdn96mANdZYI0444YR45ZVXYvjw4dGzZ8/Uk6giAgDAKqipqYkDDjggJk6cGEOGDInu3bunnvSlVl999TjxxBPjlVdeiQEDBqSeQwKNGzeOgw8+OEaNGhVTp06NK6+8Mnbeeeeqfodtk002iV//+tfx7LPPxhtvvBGnn366u7GXQJMmTeKwww6LUaNGxZQpU+KCCy6IXr16VXQMWH311eOAAw6IESNGxPvvvx8XXXRRxYTfSrb22mvHz3/+83jxxRfjjTfeiD/84Q8V/7P0VRo2bBh77LFH3HzzzTFt2rQYPHiwGyRSFDV1dXV1qUdQGC1btoy5c+emnsG3dNhhh8UNN9zwrX/dCy+8EFtssUXhB5WJYcOGxaBBg1LPWCmPPfZY3HrrrXHXXXfFnDlzkm5p2rRpHHLIIXHaaafFeuutt8rnDRo0KO6+++4CLCtPe+21VwwfPjz1jJL6+OOP49FHH41HHnkkHn744XjjjTdST1pprVq1ij59+sQuu+wSO+20U2ywwQapJ/EFM2bMiPvuuy/uvffeGDNmTPLfH79Ju3bton///rH77rtHv379fI2mjHz44Yfx6KOPxqhRo2L06NExadKk1JNWSps2bWLnnXeO/v37x8CBA6NFixapJ5EBAaCKzJ07N/zrrDwNGzZcqe9hL1u2LObPn1+EReWhSZMmFf8R9U8//TRGjx4dDz30UIwaNSpefvnlkly3YcOGsf3228dBBx0U++23XzRp0qRgZ3/yySexdOnSgp1Xbho0aFDQ/39VopkzZ8a4cePiqaeeivHjx8fLL78cM2bMSD3r/2jSpElsvPHGsfXWW0evXr1im222iS5dulTlO4PVaPny5TFhwoR4/PHH44knnohnnnkmJk+enHRTp06domfPntGzZ8/o27dvbLbZZn6eKsTs2bPj6aefjnHjxsUzzzwTEyZMiHfffTf1rP9jo402im222Sa22Wab6N27t58xkhAAAErkww8/jOeeey6effbZeOGFF2LSpEkxefLk+Pjjj1fp3DZt2kSPHj2iR48e0bt37+jdu3f2L2IprNmzZ8eECRPitddei7fffjveeeedmDx5crz33nsxe/bsWL58eVGu27Jly1h33XWjU6dOsf7668f6668fXbp0iU033TQ6duzoD85VZv78+fHSSy/Fiy++GK+//nq8/fbb//55++STTwp2nXXWWSe6dOkSnTt3jq5du8Z3vvOd2HrrraNNmzYFuwbpLViwIF577bV47bXX4p133vn3X++9915Mnz69oD9TX9SiRYt//77VpUuX6NatW3Tt2jW6d+/u0ZCUBQEAILGPP/44pk6dGh9++GHMmjUrPvroo1i4cGF89tlnsWDBgn//fZ9/KqJZs2axzjrrxLrrrhvrrLNOtGrVKuF6crd8+fKYPXt2zJo1K2bNmhXz5s2L+fPnx4IFC2LRokX/5+f4c6uvvnqsvvrq0aBBg2jatGm0aNEimjdvHi1atIi2bdtG69ato2HDhgn+iShHs2fPjg8//PB//fV5PF28eHEsXrz4339v8+bNo7a2Nho3bhxNmjSJVq1aRZs2bWLttdeO1q1bV/ynyyiMRYsWxaxZs2LGjBkxf/78mDdvXsybNy8++eSTWLJkyVd+0rJZs2ZRr169WH311aNFixbRsmXLaNmyZay55prRvn17AZ6yJwAAAABABjwFAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIgAAAAAAAGRAAAAAAIAMCAAAAAGRAAAAAAIAMCAAAAACQAQEAAAAAMiAAAAAAQAYEAAAAAMiAAAAAAAAZEAAAAAAgAwIAAAAAZEAAAAAAgAwIAAAAAJABAQAAAAAyIAAAAABABgQAAAAAyIAAAAAAABkQAAAAACADAgAAAABkQAAAAACADAgAAAAAkAEBAAAAADIgAAAAAEAGBAAAAADIwP8PWIabnjgcWq0AAAAASUVORK5CYII=',\n              scale: 2.7982645803698425,\n            },\n            locked: false,\n            child: [],\n            parent: '54751aa8-e4cd-46d9-9baa-231efde747ac',\n          },\n          'd9d46596-6424-4787-a583-f0f9a9f475d8': {\n            type: { resolvedName: 'TextLayer' },\n            props: {\n              doc: {\n                type: 'doc',\n                content: [\n                  {\n                    type: 'paragraph',\n                    attrs: {\n                      textAlign: 'center',\n                      color: 'rgb(255, 255, 255)',\n                      fontFamily: 'Roboto',\n                      fontSize: '38px',\n                      lineHeight: '1.4',\n                      letterSpacing: 0,\n                      textTransform: null,\n                      marginLeft: null,\n                      indent: 0,\n                      listType: '',\n                    },\n                    content: [\n                      {\n                        type: 'text',\n                        marks: [\n                          { type: 'bold' },\n                          {\n                            type: 'color',\n                            attrs: { color: 'rgb(255, 255, 255)' },\n                          },\n                        ],\n                        text: 'SCAN ME',\n                      },\n                    ],\n                  },\n                ],\n              },\n              position: { x: 0, y: 382.98417252286583 },\n              boxSize: {\n                width: 325.60875418256376,\n                height: 64,\n                x: 1016.2199999999999,\n                y: 530.8935486120955,\n              },\n              scale: 1.2075471698113207,\n              rotate: 0,\n              fonts: [\n                {\n                  name: 'Roboto',\n                  fonts: [\n                    {\n                      style: 'Bold',\n                      urls: [\n                        'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                      ],\n                    },\n                    {\n                      style: 'Bold_Italic',\n                      urls: [\n                        'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                      ],\n                    },\n                    {\n                      style: 'Bold',\n                      urls: [\n                        'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Bold.woff2',\n                      ],\n                    },\n                    {\n                      urls: [\n                        'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                      ],\n                    },\n                    {\n                      style: 'Italic',\n                      urls: [\n                        'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                      ],\n                    },\n                    {\n                      urls: [\n                        'https://lidojs-fonts.s3.us-east-2.amazonaws.com/Roboto/Roboto-Regular.woff2',\n                      ],\n                    },\n                  ],\n                },\n              ],\n              colors: ['rgb(0, 0, 0)', 'rgb(255, 255, 255)'],\n              fontSizes: [38],\n            },\n            locked: false,\n            child: [],\n            parent: '54751aa8-e4cd-46d9-9baa-231efde747ac',\n          },\n        },\n      },\n    ],\n    img: '/assets/images/qr-code/3.png',\n  },\n];\n"
  },
  {
    "path": "src/features/design/config/shape.tsx",
    "content": "import ArrowBottomIcon from '@duyank/icons/shape/ArrowBottom';\nimport ArrowLeftIcon from '@duyank/icons/shape/ArrowLeft';\nimport ArrowPentagonIcon from '@duyank/icons/shape/ArrowPentagon';\nimport ArrowRightIcon from '@duyank/icons/shape/ArrowRight';\nimport ArrowTopIcon from '@duyank/icons/shape/ArrowTop';\nimport ChevronIcon from '@duyank/icons/shape/Chevron';\nimport CircleIcon from '@duyank/icons/shape/Circle';\nimport CrossIcon from '@duyank/icons/shape/Cross';\nimport HexagonIcon from '@duyank/icons/shape/Hexagon';\nimport OctagonIcon from '@duyank/icons/shape/Octagon';\nimport ParallelogramIcon from '@duyank/icons/shape/Parallelogram';\nimport PentagonIcon from '@duyank/icons/shape/Pentagon';\nimport RectangleIcon from '@duyank/icons/shape/Rectangle';\nimport RhombusIcon from '@duyank/icons/shape/Rhombus';\nimport TrapezoidIcon from '@duyank/icons/shape/Trapezoid';\nimport TriangleIcon from '@duyank/icons/shape/Triangle';\nimport type { CSSObject } from '@emotion/react';\nimport type { ShapeType } from '@lidojs/design-core';\nimport type { FC, PropsWithChildren, ReactElement } from 'react';\n\nexport type Shape = {\n  type: ShapeType;\n  width: number;\n  height: number;\n  icon: ReactElement;\n};\n\nconst IconBox: FC<PropsWithChildren<{ extraCss?: CSSObject }>> = ({\n  children,\n  extraCss = {},\n}) => {\n  return (\n    <div\n      css={{\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        width: '100%',\n        height: '100%',\n        ...extraCss,\n      }}\n    >\n      {children}\n    </div>\n  );\n};\nexport const shapes: Shape[] = [\n  {\n    type: 'rectangle',\n    width: 64,\n    height: 64,\n    icon: (\n      <IconBox>\n        <RectangleIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'circle',\n    width: 64,\n    height: 64,\n    icon: (\n      <IconBox>\n        <CircleIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'triangle',\n    width: 64,\n    height: 56,\n    icon: (\n      <IconBox>\n        <TriangleIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'triangleUpsideDown',\n    width: 64,\n    height: 56,\n    icon: (\n      <IconBox extraCss={{ transform: 'rotate(180deg)' }}>\n        <TriangleIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'rhombus',\n    width: 64,\n    height: 64,\n    icon: (\n      <IconBox>\n        <RhombusIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'arrowRight',\n    width: 64,\n    height: 64,\n    icon: (\n      <IconBox>\n        <ArrowRightIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'arrowLeft',\n    width: 64,\n    height: 64,\n    icon: (\n      <IconBox>\n        <ArrowLeftIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'arrowTop',\n    width: 64,\n    height: 64,\n    icon: (\n      <IconBox>\n        <ArrowTopIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'arrowBottom',\n    width: 64,\n    height: 64,\n    icon: (\n      <IconBox>\n        <ArrowBottomIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'arrowPentagon',\n    width: 64,\n    height: 32,\n    icon: (\n      <IconBox>\n        <ArrowPentagonIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'chevron',\n    width: 64,\n    height: 32,\n    icon: (\n      <IconBox>\n        <ChevronIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'cross',\n    width: 64,\n    height: 64,\n    icon: (\n      <IconBox>\n        <CrossIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'parallelogram',\n    width: 64,\n    height: 48,\n    icon: (\n      <IconBox>\n        <ParallelogramIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'parallelogramUpsideDown',\n    width: 64,\n    height: 48,\n    icon: (\n      <IconBox extraCss={{ transform: 'scaleY(-1)' }}>\n        <ParallelogramIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'trapezoid',\n    width: 64,\n    height: 48,\n    icon: (\n      <IconBox>\n        <TrapezoidIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'trapezoidUpsideDown',\n    width: 64,\n    height: 48,\n    icon: (\n      <IconBox extraCss={{ transform: 'rotate(180deg)' }}>\n        <TrapezoidIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'pentagon',\n    width: 64,\n    height: 64,\n    icon: (\n      <IconBox>\n        <PentagonIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'hexagonVertical',\n    width: 55,\n    height: 64,\n    icon: (\n      <IconBox extraCss={{ transform: 'rotate(90deg)' }}>\n        <HexagonIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'hexagonHorizontal',\n    width: 64,\n    height: 55,\n    icon: (\n      <IconBox>\n        <HexagonIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n  {\n    type: 'octagon',\n    width: 64,\n    height: 64,\n    icon: (\n      <IconBox>\n        <OctagonIcon height=\"100%\" width=\"100%\" />\n      </IconBox>\n    ),\n  },\n];\n"
  },
  {
    "path": "src/features/design/pages/DesignPage.tsx",
    "content": "'use client';\n\nimport type { FontData } from '@lidojs/design-core';\nimport axios from 'axios';\nimport { useEffect, useState } from 'react';\nimport { LidoJSEditor } from '../components';\n\ntype FontVariant =\n  | 'regular'\n  | 'italic'\n  | '100'\n  | '200'\n  | '300'\n  | '400'\n  | '500'\n  | '600'\n  | '700'\n  | '800'\n  | '900';\n\nexport const DesignPage = () => {\n  const [googleFontList, setGoogleFontList] = useState<FontData[]>([]);\n  useEffect(() => {\n    const getFont = async () => {\n      const data = await axios.get<{\n        items: {\n          family: string;\n          variants: FontVariant[];\n          files: Record<FontVariant, string>;\n        }[];\n      }>(\n        `https://www.googleapis.com/webfonts/v1/webfonts?key=${process.env.FONT_API_KEY}`,\n      );\n      const items = data.data.items;\n      const res: FontData[] = items.map((i) => {\n        const fonts = Object.entries(i.files).reduce(\n          (acc, [fontWeight, file]) => {\n            if (fontWeight === 'regular' || fontWeight === '400') {\n              if (i.variants.includes('italic')) {\n                acc.push({\n                  style: 'Italic',\n                  urls: [file],\n                });\n              }\n              acc.push({\n                urls: [file],\n              });\n            } else if (fontWeight === '600') {\n              if (i.variants.includes('italic')) {\n                acc.push({\n                  style: 'Bold_Italic',\n                  urls: [file],\n                });\n              }\n              acc.push({\n                style: 'Bold',\n                urls: [file],\n              });\n            }\n            return acc;\n          },\n          [] as FontData['fonts'],\n        );\n        return {\n          name: i.family,\n          fonts: fonts,\n        };\n      });\n      setGoogleFontList(res);\n    };\n    getFont();\n  }, []);\n\n  return <LidoJSEditor googleFontList={googleFontList} />;\n};\n"
  },
  {
    "path": "src/features/design/pages/index.ts",
    "content": "export * from './DesignPage';\n"
  },
  {
    "path": "src/main.tsx",
    "content": "import * as ReactDOM from 'react-dom/client';\nimport './styles.css';\nimport axios from 'axios';\nimport Page from './pages/Main';\n\naxios.defaults.baseURL = process.env.API_ENDPOINT;\n\nconst root = ReactDOM.createRoot(\n  document.getElementById('root') as HTMLElement,\n);\n\nroot.render(<Page />);\n"
  },
  {
    "path": "src/pages/Main.tsx",
    "content": "import { DesignPage } from '../features/design/pages';\n\nexport default function Page() {\n  return <DesignPage />;\n}\n"
  },
  {
    "path": "src/shared/components/index.ts",
    "content": "export * from './masonry';\n"
  },
  {
    "path": "src/shared/components/masonry/Masonry.tsx",
    "content": "import React, { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface MasonryProps {\n  children: React.ReactNode;\n  columnsCount?: number;\n  gutter?: string;\n  className?: string | null;\n  style?: React.CSSProperties;\n  containerTag?: string;\n  itemTag?: string;\n  itemStyle?: React.CSSProperties;\n  sequential?: boolean;\n}\n\ninterface ColumnData {\n  columns: React.ReactNode[][];\n  childRefs: React.RefObject<HTMLDivElement>[];\n}\n\nconst Masonry: React.FC<MasonryProps> = ({\n  children,\n  columnsCount = 3,\n  gutter = '0',\n  className = null,\n  style = {},\n  containerTag = 'div',\n  itemTag = 'div',\n  itemStyle = {},\n  sequential = false,\n}) => {\n  const [state, setState] = useState<\n    ColumnData & {\n      hasDistributed: boolean;\n      children: React.ReactNode;\n    }\n  >({\n    columns: [],\n    childRefs: [],\n    hasDistributed: false,\n    children: null,\n  });\n\n  const prevChildrenRef = useRef<React.ReactNode>(null);\n  const prevColumnsCountRef = useRef<number>(columnsCount);\n\n  const getEqualCountColumns = useCallback(\n    (children: React.ReactNode, columnsCount: number): ColumnData => {\n      const columns: React.ReactNode[][] = Array.from(\n        { length: columnsCount },\n        () => [],\n      );\n      let validIndex = 0;\n      const childRefs: React.RefObject<HTMLDivElement>[] = [];\n\n      React.Children.forEach(children, (child) => {\n        if (child && React.isValidElement(child)) {\n          const ref = React.createRef<HTMLDivElement>();\n          childRefs.push(ref);\n          columns[validIndex % columnsCount].push(\n            <div\n              style={{ display: 'flex', justifyContent: 'stretch' }}\n              key={validIndex}\n              ref={ref}\n            >\n              {child}\n            </div>,\n          );\n          validIndex++;\n        }\n      });\n      return { columns, childRefs };\n    },\n    [],\n  );\n\n  const distributeChildren = useCallback(() => {\n    const columnHeights = Array(columnsCount).fill(0);\n\n    const isReady = state.childRefs.every(\n      (ref) => ref.current?.getBoundingClientRect().height,\n    );\n\n    if (!isReady) return;\n\n    const columns: React.ReactNode[][] = Array.from(\n      { length: columnsCount },\n      () => [],\n    );\n    let validIndex = 0;\n    React.Children.forEach(children, (child) => {\n      if (child && React.isValidElement(child)) {\n        const childHeight =\n          state.childRefs[validIndex].current?.getBoundingClientRect().height ||\n          0;\n        const minHeightColumnIndex = columnHeights.indexOf(\n          Math.min(...columnHeights),\n        );\n        columnHeights[minHeightColumnIndex] += childHeight;\n        columns[minHeightColumnIndex].push(child);\n        validIndex++;\n      }\n    });\n\n    setState((prev) => ({ ...prev, columns, hasDistributed: true }));\n  }, [children, columnsCount, state.childRefs]);\n\n  useEffect(() => {\n    // Check if children or columnsCount have changed by comparing current vs previous\n    const childrenChanged = prevChildrenRef.current !== children;\n    const columnsCountChanged = prevColumnsCountRef.current !== columnsCount;\n\n    if (childrenChanged || columnsCountChanged) {\n      const newState = getEqualCountColumns(children, columnsCount);\n      setState((prev) => ({\n        ...prev,\n        ...newState,\n        children,\n        hasDistributed: false,\n      }));\n\n      // Update refs to current values\n      prevChildrenRef.current = children;\n      prevColumnsCountRef.current = columnsCount;\n    }\n  }, [children, columnsCount, getEqualCountColumns]);\n\n  useEffect(() => {\n    if (!state.hasDistributed && !sequential) {\n      distributeChildren();\n    }\n  }, [state.hasDistributed, sequential, distributeChildren]);\n\n  const renderColumns = () => {\n    return state.columns.map((column, i) =>\n      React.createElement(\n        itemTag,\n        {\n          key: i,\n          style: {\n            display: 'flex',\n            flexDirection: 'column',\n            justifyContent: 'flex-start',\n            alignContent: 'stretch',\n            flex: 1,\n            width: 0,\n            gap: gutter,\n            ...itemStyle,\n          },\n        },\n        column.map((item) => item),\n      ),\n    );\n  };\n\n  return React.createElement(\n    containerTag,\n    {\n      style: {\n        display: 'flex',\n        flexDirection: 'row',\n        justifyContent: 'center',\n        alignContent: 'stretch',\n        boxSizing: 'border-box',\n        width: '100%',\n        gap: gutter,\n        ...style,\n      },\n      className,\n    },\n    renderColumns(),\n  );\n};\n\nexport default Masonry;\n"
  },
  {
    "path": "src/shared/components/masonry/index.ts",
    "content": "export * from './Masonry';\n"
  },
  {
    "path": "src/shared/icons/pencil/Highlighter.tsx",
    "content": "import type { ComponentProps, FC } from 'react';\n\nexport const Highlighter: FC<ComponentProps<'svg'>> = (props) => {\n  return (\n    <svg\n      role=\"img\"\n      aria-label=\"Highlighter\"\n      fill=\"none\"\n      height=\"50\"\n      viewBox=\"0 0 183 50\"\n      width=\"183\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path d=\"M89 1H0v49h89V1Z\" fill=\"#EEE\" />\n      <path d=\"M89 1H0v49h89V1Z\" fill=\"url(#_1675523858__a)\" />\n      <path\n        d=\"M125.39 50H89V1h36.39c.4 0 .78.12 1.11.34l9.43 6.3c4.93 3.3 10.74 5.06 16.67 5.06h8.4c1.1 0 2 .9 2 2v21.6c0 1.1-.9 2-2 2h-8.4a29.96 29.96 0 0 0-16.67 5.06l-9.43 6.3c-.32.22-.71.34-1.11.34Z\"\n        fill=\"#EEE\"\n      />\n      <path\n        d=\"M125.39 50H89V1h36.39c.4 0 .78.12 1.11.34l9.43 6.3c4.93 3.3 10.74 5.06 16.67 5.06h8.4c1.1 0 2 .9 2 2v21.6c0 1.1-.9 2-2 2h-8.4a29.96 29.96 0 0 0-16.67 5.06l-9.43 6.3c-.32.22-.71.34-1.11.34Z\"\n        fill=\"url(#_1675523858__b)\"\n      />\n      <path\n        d=\"M176.25 15c.45 0 .84.3.96.73l5.43 19c.18.64-.3 1.27-.96 1.27H163V15h13.25Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M176.849 15.83v.003l5.43 18.998v.001a.623.623 0 0 1-.599.793h-18.305v-20.25h12.875c.28 0 .524.186.599.456Z\"\n        stroke=\"#000\"\n        strokeOpacity=\".1\"\n        strokeWidth=\".75\"\n      />\n      <path d=\"M89 45H0v3h89v-3Z\" fill=\"#D9D9D9\" />\n      <path\n        d=\"M115.07 9c4.42 0 8.65 1.83 11.67 5.06 5.77 6.15 5.77 15.73 0 21.89a15.98 15.98 0 0 1-11.67 5.06H95V25c0-8.84 7.16-16 16-16h4.07Z\"\n        fill=\"url(#_1675523858__c)\"\n        fillOpacity=\".5\"\n      />\n      <path\n        clipRule=\"evenodd\"\n        d=\"M89 48h35.42c.38 0 .75-.11 1.07-.31l10.67-6.74c4.8-3.03 10.36-4.64 16.03-4.64H161c1.1 0 2-.9 2-2v1c0 1.1-.9 2-2 2h-8.4a29.96 29.96 0 0 0-16.67 5.06l-9.43 6.3c-.33.22-.72.34-1.11.34H89V48Zm36.39-48Z\"\n        fill=\"#C9C9C9\"\n        fillOpacity=\".5\"\n        fillRule=\"evenodd\"\n      />\n      <path d=\"M95 1h-6v49h6V1Z\" fill=\"currentColor\" />\n      <path\n        d=\"M89.375 49.625V1.375h5.25v48.25h-5.25Z\"\n        stroke=\"#000\"\n        strokeOpacity=\".1\"\n        strokeWidth=\".75\"\n      />\n      <path\n        d=\"m29 28.44 2.82-6.74 6.96 2.91-.9-3.21 4.83-4.4L56 22.14l-2.64 6.81-6.48-2.51.97 3.46-4.93 4.35L29 28.44Z\"\n        fill=\"url(#_1675523858__d)\"\n      />\n      <path\n        d=\"m39.141 24.509-.837-2.988 4.487-4.088 12.724 4.921-2.37 6.11-6.13-2.374-.698-.27.202.721.906 3.234-4.577 4.038-13.357-5.575 2.53-6.047 6.614 2.765.715.299-.209-.746Z\"\n        stroke=\"url(#_1675523858__e)\"\n        strokeOpacity=\".07\"\n        strokeWidth=\".75\"\n      />\n      <defs>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_1675523858__a\"\n          x1=\"44.5\"\n          x2=\"44.5\"\n          y1=\"1\"\n          y2=\"55.5\"\n        >\n          <stop stopColor=\"#fff\" stopOpacity=\"0\" />\n          <stop offset=\".245\" stopColor=\"#fff\" />\n          <stop offset=\"1\" stopColor=\"#C4C4C4\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_1675523858__b\"\n          x1=\"126\"\n          x2=\"126\"\n          y1=\"50\"\n          y2=\"1\"\n        >\n          <stop stopColor=\"#C4C4C4\" />\n          <stop offset=\".725\" stopColor=\"#fff\" />\n          <stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_1675523858__d\"\n          x1=\"41.15\"\n          x2=\"32.65\"\n          y1=\"24.778\"\n          y2=\"21.278\"\n        >\n          <stop offset=\".177\" stopColor=\"currentColor\" />\n          <stop offset=\"1\" stopColor=\"currentColor\" stopOpacity=\"0\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_1675523858__e\"\n          x1=\"56\"\n          x2=\"29\"\n          y1=\"26\"\n          y2=\"26\"\n        >\n          <stop />\n          <stop offset=\"1\" stopOpacity=\"0\" />\n        </linearGradient>\n        <radialGradient\n          cx=\"0\"\n          cy=\"0\"\n          gradientTransform=\"matrix(-47 0 0 -32 129.001 41)\"\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_1675523858__c\"\n          r=\"1\"\n        >\n          <stop stopColor=\"#fff\" />\n          <stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\" />\n        </radialGradient>\n      </defs>\n    </svg>\n  );\n};\n"
  },
  {
    "path": "src/shared/icons/pencil/Marker.tsx",
    "content": "import type { ComponentProps, FC } from 'react';\n\nexport const Marker: FC<ComponentProps<'svg'>> = (props) => {\n  return (\n    <svg\n      role=\"img\"\n      aria-label=\"Marker\"\n      fill=\"none\"\n      height=\"49\"\n      viewBox=\"0 0 184 49\"\n      width=\"184\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M161.96 35.07h-.5v-21h.5c11.5 0 21.5 4.7 21.5 10.5s-10 10.5-21.5 10.5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M161.85 34.695h-.015V14.445h.125c5.704 0 11.022 1.166 14.9 3.038 3.907 1.885 6.225 4.416 6.225 7.087 0 2.671-2.318 5.202-6.225 7.087-3.878 1.872-9.196 3.038-14.9 3.038H161.85Z\"\n        stroke=\"#000\"\n        strokeOpacity=\".1\"\n        strokeWidth=\".75\"\n      />\n      <path d=\"M89 0H0v49h89V0Z\" fill=\"#EEE\" />\n      <path\n        d=\"M89 0H0v49h89V0Z\"\n        fill=\"url(#_1063316517__a)\"\n        fillOpacity=\".08\"\n      />\n      <path d=\"M89 44H0v3h89v-3Z\" fill=\"#D9D9D9\" />\n      <path d=\"M95 0h-6v49h6V0Z\" fill=\"currentColor\" />\n      <path\n        d=\"M89.375 48.625V.375h5.25v48.25h-5.25Z\"\n        stroke=\"#000\"\n        strokeOpacity=\".1\"\n        strokeWidth=\".75\"\n      />\n      <path d=\"M124 49H95V0h29a2 2 0 0 1 2 2v45a2 2 0 0 1-2 2Z\" fill=\"#EEE\" />\n      <path\n        d=\"M124 49H95V0h29a2 2 0 0 1 2 2v45a2 2 0 0 1-2 2Z\"\n        fill=\"url(#_1063316517__b)\"\n      />\n      <path d=\"M126 47c.35 0 26-10 26-10V11.5L126 2v45Z\" fill=\"#EEE\" />\n      <path\n        d=\"M126 47c.35 0 26-10 26-10V11.5L126 2v45Z\"\n        fill=\"url(#_1063316517__c)\"\n      />\n      <path\n        d=\"M163 13.4V35c0 1.1-.9 2-2 2h-9V11.4h9a2 2 0 0 1 2 2Z\"\n        fill=\"#EEE\"\n      />\n      <path\n        d=\"M163 13.4V35c0 1.1-.9 2-2 2h-9V11.4h9a2 2 0 0 1 2 2Z\"\n        fill=\"url(#_1063316517__d)\"\n      />\n      <path d=\"M163 13.4V35c0 1.1-.9 2-2 2V11.4a2 2 0 0 1 2 2Z\" fill=\"#EEE\" />\n      <path d=\"M126 44H95v3h31v-3Z\" fill=\"#D9D9D9\" />\n      <path\n        d=\"m126 46 26-10v-1l-26 10v1ZM161 35h-9v1h9v-1Z\"\n        fill=\"#C9C9C9\"\n        fillOpacity=\".5\"\n      />\n      <path\n        d=\"M29.38 22.98c0-.47-.2.47 0 0l2.25-3.29 7.24 3.25-.91-3.25a3.694 3.694 0 0 1 4.89-4.44l10.88 4.21c1.91.74 2.85 2.88 2.11 4.78a3.697 3.697 0 0 1-4.78 2.11l-4-1.55.98 3.5c.38 1.36-.05 2.83-1.11 3.77a3.681 3.681 0 0 1-3.87.64L28 26l1.38-3.02Z\"\n        fill=\"url(#_1063316517__e)\"\n      />\n      <path\n        d=\"m46.699 24.901.98 3.5a3.338 3.338 0 0 1-.998 3.388 3.306 3.306 0 0 1-3.472.577L28.5 25.812l1.186-2.596a1.53 1.53 0 0 0 .025-.054l2.052-3.001 6.954 3.121.731.328-.216-.771-.91-3.25a3.318 3.318 0 0 1 4.393-3.99l10.88 4.21a3.313 3.313 0 0 1 1.897 4.295A3.322 3.322 0 0 1 51.196 26l-4-1.55-.7-.271.203.721Zm-17.06-1.811-.259-.11h.266a.34.34 0 0 1 .018.074l-.004.006a.325.325 0 0 1-.022.03Zm.027.003Z\"\n        stroke=\"url(#_1063316517__f)\"\n        strokeOpacity=\".07\"\n        strokeWidth=\".75\"\n      />\n      <defs>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_1063316517__a\"\n          x1=\"44.5\"\n          x2=\"44.5\"\n          y1=\"0\"\n          y2=\"54.5\"\n        >\n          <stop stopColor=\"#fff\" stopOpacity=\"0\" />\n          <stop offset=\".245\" stopColor=\"#fff\" />\n          <stop offset=\"1\" stopColor=\"#C4C4C4\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_1063316517__b\"\n          x1=\"110.5\"\n          x2=\"110.5\"\n          y1=\"49\"\n          y2=\"0\"\n        >\n          <stop stopColor=\"#C4C4C4\" />\n          <stop offset=\".725\" stopColor=\"#fff\" />\n          <stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_1063316517__c\"\n          x1=\"134.358\"\n          x2=\"141.358\"\n          y1=\"53.324\"\n          y2=\"2.324\"\n        >\n          <stop stopColor=\"#C4C4C4\" />\n          <stop offset=\".748\" stopColor=\"#fff\" />\n          <stop offset=\".889\" stopColor=\"#fff\" stopOpacity=\"0\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_1063316517__d\"\n          x1=\"157.5\"\n          x2=\"157.5\"\n          y1=\"43.5\"\n          y2=\"11\"\n        >\n          <stop stopColor=\"#C4C4C4\" />\n          <stop offset=\".777\" stopColor=\"#fff\" />\n          <stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_1063316517__e\"\n          x1=\"40.383\"\n          x2=\"29.883\"\n          y1=\"22.496\"\n          y2=\"17.496\"\n        >\n          <stop offset=\".209\" stopColor=\"currentColor\" />\n          <stop offset=\".632\" stopColor=\"currentColor\" stopOpacity=\"0\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_1063316517__f\"\n          x1=\"55\"\n          x2=\"29.5\"\n          y1=\"23.5\"\n          y2=\"24\"\n        >\n          <stop />\n          <stop offset=\"1\" stopOpacity=\"0\" />\n        </linearGradient>\n      </defs>\n    </svg>\n  );\n};\n"
  },
  {
    "path": "src/shared/icons/pencil/Pencil.tsx",
    "content": "import type { ComponentProps, FC } from 'react';\n\nexport const Pencil: FC<ComponentProps<'svg'>> = (props) => {\n  return (\n    <svg\n      role=\"img\"\n      aria-label=\"Pencil\"\n      fill=\"none\"\n      height=\"51\"\n      viewBox=\"0 0 185 51\"\n      width=\"185\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M182.49 28.48c1.44-.22 2.51-1.44 2.51-2.87 0-1.42-1.05-2.64-2.48-2.87l-22.85-3.65c-4.02-.64-7.67 2.41-7.67 6.41 0 3.98 3.61 7.03 7.61 6.42l22.88-3.44Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M159.554 31.55h-.001c-3.779.576-7.178-2.306-7.178-6.05 0-3.761 3.436-6.645 7.236-6.04l22.849 3.65c1.253.202 2.165 1.268 2.165 2.5 0 1.239-.928 2.306-2.191 2.5h-.001l-22.879 3.44Z\"\n        stroke=\"#000\"\n        strokeOpacity=\".1\"\n        strokeWidth=\".75\"\n      />\n      <path\n        d=\"M163 18.57 108.92 4.31C106.5 3.5 104 3 104 1v49c0-2 2.5-2.5 4.51-3.08L163 33.06V18.57Z\"\n        fill=\"#EEE\"\n      />\n      <path\n        d=\"M163 18.57 108.92 4.31C106.5 3.5 104 3 104 1v49c0-2 2.5-2.5 4.51-3.08L163 33.06V18.57Z\"\n        fill=\"url(#_868415490__a)\"\n      />\n      <path\n        d=\"M163 18.57 108.92 4.31C106.5 3.5 104 3 104 1v49c0-2 2.5-2.5 4.51-3.08L163 33.06V18.57Z\"\n        fill=\"url(#_868415490__b)\"\n        fillOpacity=\".3\"\n      />\n      <path d=\"M81 1H0v49h81V1Z\" fill=\"#EEE\" />\n      <path d=\"M81 1H0v49h81V1Z\" fill=\"url(#_868415490__c)\" />\n      <path d=\"M81 1H0v49h81V1Z\" fill=\"url(#_868415490__d)\" fillOpacity=\".3\" />\n      <path\n        d=\"M104 50V1c0-.55-.45-1-1-1H82c-.55 0-1 .45-1 1v49c0 .55.45 1 1 1h21c.55 0 1-.45 1-1Z\"\n        fill=\"#EEE\"\n      />\n      <path\n        d=\"M104 50V1c0-.55-.45-1-1-1H82c-.55 0-1 .45-1 1v49c0 .55.45 1 1 1h21c.55 0 1-.45 1-1Z\"\n        fill=\"url(#_868415490__e)\"\n      />\n      <path\n        d=\"M104 50V1c0-.55-.45-1-1-1H82c-.55 0-1 .45-1 1v49c0 .55.45 1 1 1h21c.55 0 1-.45 1-1Z\"\n        fill=\"url(#_868415490__f)\"\n        fillOpacity=\".3\"\n      />\n      <path\n        clipRule=\"evenodd\"\n        d=\"M163 18.57 108.92 4.31c-.31-.1-.61-.2-.92-.29-2.08-.66-3.97-1.26-4-2.97V1c0-.55-.45-1-1-1H82c-.55 0-1 .45-1 1H0v49h81c0 .55.45 1 1 1h21c.55 0 1-.45 1-1v-.04c.03-1.79 2.08-2.36 3.95-2.89.19-.05.38-.11.56-.16L163 33.06V18.57Z\"\n        fill=\"url(#_868415490__g)\"\n        fillOpacity=\".1\"\n        fillRule=\"evenodd\"\n      />\n      <path d=\"M95 0h-6v51h6V0Z\" fill=\"currentColor\" />\n      <path\n        d=\"M89.375 50.625V.375h5.25v50.25h-5.25Z\"\n        stroke=\"#000\"\n        strokeOpacity=\".1\"\n        strokeWidth=\".75\"\n      />\n      <path\n        d=\"M41.16 32.94c.81-.21 1.32-1.24 1.03-2.1-.1-.37-.41-.73-.59-1.05-.81-1.31-1.64-2.62-2.5-3.89l-.25-.41 3.44 2.36c1.6 1.37 3.29 2.62 5 3.86 1 .82 2.47.11 2.58-1.27.05-.49-.1-.99-.39-1.35l-.24-.32c-.32-.41-.64-.81-1-1.18-.02-.02-.03-.04-.03-.06l-2.75-4.51 4.39 2.23c.76.52 1.54.97 2.33 1.42.27.15.54.34.84.43.68.21 1.45-.15 1.77-.86.46-.88.07-2.08-.78-2.45a69.8 69.8 0 0 0-1.22-.6c-1.62-.79-3.26-1.55-4.95-2.21l-2.99-1.52c-.62-.37-1.32-.79-1.96-1.14l-.68-.37c-.51-.26-1.17-.15-1.59.28-.56.54-.68 1.54-.25 2.19.14.22.49.79.64 1.01.83 1.29 1.76 2.7 2.65 3.93L39.1 22.2c-.83-.71-1.69-1.37-2.55-2-.42-.32-.86-.64-1.3-.95-.49-.41-1.17-.51-1.71-.19-.69.39-1.03 1.39-.73 2.19.17.41.46.75.68 1.12.61.94 1.23 1.85 1.91 2.73l1.65 2.71-4.47-2.25c-.73-.54-1.49-1.01-2.26-1.46-.29-.15-.54-.34-.84-.45-.71-.22-1.54.17-1.87.9-.46.9-.08 2.13.76 2.55 0 0 .42.22.46.22 1.89.94 3.8 1.83 5.79 2.53-.03-.02-.07-.04-.08-.06l2.75 1.39c.88.58 1.81 1.1 2.72 1.59.24.19.78.3 1.15.17Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"m41.066 32.577-.015.004-.015.005a.935.935 0 0 1-.438.02.853.853 0 0 1-.355-.13l-.026-.02-.03-.016c-.907-.489-1.825-1.002-2.69-1.573l-.019-.012-.019-.01-2.75-1.39-1.011-.51.102.203c-1.633-.63-3.22-1.377-4.803-2.164l-.079-.039h-.02a5.489 5.489 0 0 1-.29-.144l-.047-.024-.013-.007-.003-.002h-.001l-.006-.003c-.31-.155-.557-.473-.676-.868-.12-.394-.098-.824.082-1.176l.004-.008.004-.009c.257-.568.895-.852 1.408-.698.114.042.226.102.354.177l.097.058c.1.06.213.128.328.188.762.445 1.506.906 2.218 1.433l.026.019.028.014 4.47 2.25 1.17.59-.68-1.12-1.65-2.71-.011-.018-.013-.016a39.922 39.922 0 0 1-1.889-2.7c-.082-.137-.177-.276-.264-.405a16.951 16.951 0 0 1-.1-.148 3.056 3.056 0 0 1-.285-.505c-.237-.642.052-1.436.566-1.726l.006-.004c.383-.227.891-.17 1.278.155l.012.01.013.009c.437.308.873.625 1.289.941l.005.005c.856.626 1.708 1.28 2.528 1.982l.015.012.015.011 4.56 3.16.518-.528c-.884-1.221-1.81-2.625-2.639-3.913l-.005-.008a27.477 27.477 0 0 1-.442-.695c-.075-.12-.143-.23-.192-.305l-.003-.006a1.34 1.34 0 0 1-.187-.886c.038-.327.176-.627.384-.827l.008-.008c.308-.315.79-.39 1.148-.21l.674.367c.594.325 1.242.712 1.834 1.065l.114.068.01.007.012.005 2.99 1.52.017.009.017.006c1.676.655 3.306 1.41 4.922 2.198h.001c.272.132.966.469 1.21.596l.011.006.012.005c.307.134.554.43.674.804.12.374.101.789-.076 1.128l-.005.01-.005.01c-.249.552-.833.805-1.317.656l-.003-.001c-.177-.053-.328-.143-.516-.254-.076-.045-.157-.093-.248-.144-.79-.45-1.557-.892-2.302-1.402l-.02-.014-.022-.011-4.39-2.23-1.178-.599.688 1.128 2.72 4.462a.486.486 0 0 0 .111.175c.344.353.653.738.971 1.146l.238.317.008.01c.227.282.35.683.309 1.077v.008c-.045.558-.36.964-.748 1.153a1.11 1.11 0 0 1-1.221-.143l-.009-.007-.009-.006c-1.71-1.24-3.389-2.482-4.976-3.842l-.015-.013-.017-.011-3.44-2.36-.532.504.25.41.005.008.005.007c.854 1.262 1.68 2.565 2.487 3.871.064.113.15.241.227.357l.105.16c.109.17.185.313.219.44l.003.011.004.01c.11.326.07.695-.084 1.01-.155.314-.407.536-.685.608Zm-6.19-2.955-.12.06.068-.135.008.009a.334.334 0 0 1 .043.066Z\"\n        stroke=\"#000\"\n        strokeOpacity=\".07\"\n        strokeWidth=\".75\"\n      />\n      <defs>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_868415490__a\"\n          x1=\"133.5\"\n          x2=\"133.5\"\n          y1=\"1\"\n          y2=\"64\"\n        >\n          <stop stopColor=\"#fff\" stopOpacity=\"0\" />\n          <stop offset=\".245\" stopColor=\"#fff\" />\n          <stop offset=\"1\" stopColor=\"#C4C4C4\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_868415490__b\"\n          x1=\"135.251\"\n          x2=\"126.751\"\n          y1=\"44.791\"\n          y2=\"-6.209\"\n        >\n          <stop offset=\".13\" stopColor=\"#fff\" stopOpacity=\"0\" />\n          <stop offset=\".226\" stopColor=\"#fff\" />\n          <stop offset=\".394\" stopColor=\"#fff\" stopOpacity=\"0\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_868415490__c\"\n          x1=\"40.5\"\n          x2=\"40.5\"\n          y1=\"1\"\n          y2=\"55.5\"\n        >\n          <stop stopColor=\"#fff\" stopOpacity=\"0\" />\n          <stop offset=\".245\" stopColor=\"#fff\" />\n          <stop offset=\"1\" stopColor=\"#C4C4C4\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_868415490__d\"\n          x1=\"40.5\"\n          x2=\"40.5\"\n          y1=\"1\"\n          y2=\"50\"\n        >\n          <stop offset=\".474\" stopColor=\"#fff\" stopOpacity=\"0\" />\n          <stop offset=\".75\" stopColor=\"#fff\" />\n          <stop offset=\".854\" stopColor=\"#fff\" stopOpacity=\"0\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_868415490__e\"\n          x1=\"92.5\"\n          x2=\"92.5\"\n          y1=\"0\"\n          y2=\"62\"\n        >\n          <stop stopColor=\"#fff\" stopOpacity=\"0\" />\n          <stop offset=\".245\" stopColor=\"#fff\" />\n          <stop offset=\"1\" stopColor=\"#C4C4C4\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_868415490__f\"\n          x1=\"92.5\"\n          x2=\"92.5\"\n          y1=\"54\"\n          y2=\"0\"\n        >\n          <stop offset=\".157\" stopColor=\"#fff\" stopOpacity=\"0\" />\n          <stop offset=\".255\" stopColor=\"#fff\" />\n          <stop offset=\".529\" stopColor=\"#fff\" stopOpacity=\"0\" />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id=\"_868415490__g\"\n          x1=\"160.654\"\n          x2=\"-4.846\"\n          y1=\"58.613\"\n          y2=\"7.613\"\n        >\n          <stop stopColor=\"#C9C9C9\" />\n          <stop offset=\"1\" stopColor=\"#C9C9C9\" stopOpacity=\"0\" />\n        </linearGradient>\n      </defs>\n    </svg>\n  );\n};\n"
  },
  {
    "path": "src/shared/theme/index.ts",
    "content": "export * from './palette';\nexport * from './theme';\n"
  },
  {
    "path": "src/shared/theme/palette.ts",
    "content": "// Helper function to convert hex to rgb values\nconst hexToRgb = (hex: string) => {\n  const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n  return result\n    ? `${Number.parseInt(result[1], 16)}, ${Number.parseInt(result[2], 16)}, ${Number.parseInt(result[3], 16)}`\n    : null;\n};\n\n// Helper function to create rgba from hex\nexport const rgba = (hex: string, alpha: number) => {\n  const rgb = hexToRgb(hex);\n  return rgb ? `rgba(${rgb}, ${alpha})` : hex;\n};\n\n// Main colors\nconst primary = '#735DFF';\nconst secondary = '#FF5A29';\nconst error = '#FF383C';\nconst warning = '#FF9A13';\nconst info = '#0C9CFC';\nconst success = '#0CC763';\nconst dark = '#0A0A0A';\n\nexport const palette = {\n  mode: 'light',\n  header: {\n    main: '#61748f',\n  },\n  primary: {\n    main: primary,\n    light: rgba(primary, 0.3),\n    dark: rgba(primary, 0.8),\n    contrastText: '#fff',\n  },\n  secondary: {\n    main: secondary,\n    light: rgba(secondary, 0.3),\n    dark: rgba(secondary, 0.8),\n    contrastText: '#fff',\n  },\n  error: {\n    main: error,\n    light: rgba(error, 0.3),\n    dark: rgba(error, 0.8),\n    contrastText: '#fff',\n  },\n  warning: {\n    main: warning,\n    light: rgba(warning, 0.3),\n    dark: rgba(warning, 0.8),\n    contrastText: '#fff',\n  },\n  info: {\n    main: info,\n    light: rgba(info, 0.3),\n    dark: rgba(info, 0.8),\n    contrastText: '#fff',\n  },\n  success: {\n    main: success,\n    light: rgba(success, 0.3),\n    dark: rgba(success, 0.8),\n    contrastText: '#fff',\n  },\n  grey: {\n    50: '#f9fafb',\n    100: '#f2f4f5',\n    200: '#e6eaeb',\n    300: '#dbdfe1',\n    400: '#949eb7',\n    500: '#7987a1',\n    600: '#4d5875',\n    700: '#383853',\n    800: '#323251',\n    900: '#110f0f',\n    A100: '#8699A3',\n    A200: rgba('#8699A3', 0.2),\n    A400: rgba('#8699A3', 0.4),\n    A700: rgba('#8699A3', 0.7),\n  },\n  text: {\n    primary: '#222f36',\n    secondary: '#98a5c3',\n    disabled: rgba(dark, 0.38),\n  },\n  divider: '#e6eff1',\n  background: {\n    default: '#f5f6fa',\n    paper: '#ffffff',\n  },\n  action: {\n    active: rgba(dark, 0.54),\n    hover: rgba(dark, 0.04),\n    hoverOpacity: 0.04,\n    selected: rgba(dark, 0.08),\n    selectedOpacity: 0.08,\n    disabled: rgba(dark, 0.26),\n    disabledBackground: rgba(dark, 0.12),\n    disabledOpacity: 0.38,\n    focus: rgba(dark, 0.12),\n    focusOpacity: 0.12,\n    activatedOpacity: 0.12,\n  },\n} as const;\n\n// Additional custom colors that can be used with sx prop or styled components\nexport const extendedColors = {\n  blue: '#0082FF',\n  indigo: '#4d5ddb',\n  yellow: '#fff621',\n  teal: '#00D8D8',\n  orange: '#FE7C58',\n  purple: '#7B76FE',\n  pink: '#FE549B',\n  cyan: '#00D1D1',\n};\n\n// Gradient backgrounds\nexport const gradients = {\n  primary: `linear-gradient(to bottom right, ${primary} 0%, ${secondary} 100%)`,\n  secondary: `linear-gradient(to bottom right, ${secondary} 0%, #970312 100%)`,\n  warning: `linear-gradient(to bottom right, ${warning} 0%, #4b5002 100%)`,\n  info: `linear-gradient(to bottom right, ${info} 0%, #00428d 100%)`,\n  success: `linear-gradient(to bottom right, ${success} 0%, #035643 100%)`,\n  danger: `linear-gradient(to bottom right, ${error} 0%, #DE4980 100%)`,\n  orange: 'linear-gradient(to bottom right, #FE7C58 0%, #c3072d 100%)',\n  purple: 'linear-gradient(to bottom right, #7B76FE 0%, #0046d1 100%)',\n  teal: 'linear-gradient(to bottom right, #00D8D8 0%, #086a5a 100%)',\n  light: 'linear-gradient(to bottom right, #F7F8FA 0%, #D7FCFF 100%)',\n  dark: 'linear-gradient(to bottom right, #0A0A0A 0%, #16657A 100%)',\n};\n\n// Dark mode palette override\nexport const darkPalette = {\n  ...palette,\n  background: {\n    default: '#191814',\n    paper: '#232226',\n  },\n  text: {\n    primary: rgba('#ffffff', 0.8),\n    secondary: rgba('#ffffff', 0.5),\n    disabled: rgba('#ffffff', 0.38),\n  },\n  action: {\n    active: rgba('#ffffff', 0.54),\n    hover: rgba('#ffffff', 0.04),\n    selected: rgba('#ffffff', 0.08),\n    disabled: rgba('#ffffff', 0.26),\n    disabledBackground: rgba('#ffffff', 0.12),\n  },\n} as const;\n"
  },
  {
    "path": "src/shared/theme/theme.ts",
    "content": "'use client';\n\nimport { alpha, createTheme } from '@mui/material/styles';\nimport { palette, rgba } from './palette';\n\ndeclare module '@mui/material/styles' {\n  interface Palette {\n    sidebar: {\n      background: string;\n      textColor: string;\n      activeBackground: string;\n      hoverBackground: string;\n    };\n  }\n  interface PaletteOptions {\n    sidebar: {\n      background: string;\n      textColor: string;\n      activeBackground: string;\n      hoverBackground: string;\n    };\n  }\n}\n\nconst themeOptions = {\n  palette: {\n    primary: {\n      main: 'rgb(115, 93, 255)', // --primary-rgb\n      light: alpha('rgb(115, 93, 255)', 0.1),\n    },\n    secondary: {\n      main: 'rgb(255, 90, 41)', // --secondary-rgb\n    },\n    text: {\n      primary: '#222f36', // --default-text-color\n      secondary: '#657a99', // --menu-prime-color\n    },\n    background: {\n      default: 'rgb(245, 246, 250)', // --body-bg-rgb\n      paper: '#ffffff', // --menu-bg\n    },\n    divider: '#e6eff1', // --menu-border-color\n    sidebar: {\n      background: '#ffffff',\n      textColor: '#657a99',\n      activeBackground: alpha('rgb(115, 93, 255)', 0.1),\n      hoverBackground: alpha('rgb(115, 93, 255)', 0.05),\n    },\n  },\n  typography: {\n    fontFamily: 'inherit',\n    fontWeightRegular: 400,\n    fontWeightMedium: 500,\n    fontWeightBold: 700,\n    h1: {\n      fontSize: '2.5rem', // 40px\n      fontWeight: 700,\n      lineHeight: 1.2,\n    },\n    h2: {\n      fontSize: '2rem', // 32px\n      fontWeight: 700,\n      lineHeight: 1.2,\n    },\n    h3: {\n      fontSize: '1.75rem', // 28px\n      fontWeight: 600,\n      lineHeight: 1.2,\n    },\n    h4: {\n      fontSize: '1.5rem', // 24px\n      fontWeight: 600,\n      lineHeight: 1.2,\n    },\n    h5: {\n      fontSize: '1.25rem', // 20px\n      fontWeight: 600,\n      lineHeight: 1.2,\n    },\n    h6: {\n      fontSize: '1rem', // 16px\n      fontWeight: 600,\n      lineHeight: 1.2,\n    },\n    subtitle1: {\n      fontSize: '1.125rem', // 18px\n      fontWeight: 500,\n      lineHeight: 1.5,\n    },\n    subtitle2: {\n      fontSize: '0.85rem', // 14px\n      fontWeight: 500,\n      lineHeight: 1.57,\n    },\n    body1: {\n      fontSize: '0.85rem', // 14px\n      lineHeight: 1.5,\n    },\n    body2: {\n      fontSize: '0.75rem', // 12px\n      lineHeight: 1.57,\n    },\n    button: {\n      fontSize: '0.875rem',\n      textTransform: 'none',\n      fontWeight: 500,\n    },\n    caption: {\n      fontSize: '0.75rem',\n      lineHeight: 1.66,\n    },\n    overline: {\n      fontSize: '0.75rem',\n      fontWeight: 600,\n      letterSpacing: '0.5px',\n      lineHeight: 2.5,\n      textTransform: 'uppercase',\n    },\n  },\n  shadows: [\n    'none',\n    '0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)', // shadow-sm\n    '0 0.5rem 1rem rgba(0, 0, 0, 0.15)', // shadow\n    '0 1rem 3rem rgba(0, 0, 0, 0.175)', // shadow-lg\n    '0 0.25rem 0.5rem rgba(0, 0, 0, 0.1)',\n    '0 0.5rem 1.5rem rgba(0, 0, 0, 0.1)',\n    '0 0.75rem 2rem rgba(0, 0, 0, 0.1)',\n    '0 1rem 2.5rem rgba(0, 0, 0, 0.1)',\n    '0 1.25rem 3rem rgba(0, 0, 0, 0.1)',\n    '0 1.5rem 3.5rem rgba(0, 0, 0, 0.1)',\n    '0 1.75rem 4rem rgba(0, 0, 0, 0.1)',\n    '0 2rem 4.5rem rgba(0, 0, 0, 0.1)',\n    '0 2.25rem 5rem rgba(0, 0, 0, 0.1)',\n    '0 2.5rem 5.5rem rgba(0, 0, 0, 0.1)',\n    '0 2.75rem 6rem rgba(0, 0, 0, 0.1)',\n    '0 3rem 6.5rem rgba(0, 0, 0, 0.1)',\n    '0 3.25rem 7rem rgba(0, 0, 0, 0.1)',\n    '0 3.5rem 7.5rem rgba(0, 0, 0, 0.1)',\n    '0 3.75rem 8rem rgba(0, 0, 0, 0.1)',\n    '0 4rem 8.5rem rgba(0, 0, 0, 0.1)',\n    '0 4.25rem 9rem rgba(0, 0, 0, 0.1)',\n    '0 4.5rem 9.5rem rgba(0, 0, 0, 0.1)',\n    '0 4.75rem 10rem rgba(0, 0, 0, 0.1)',\n    '0 5rem 10.5rem rgba(0, 0, 0, 0.1)',\n    '0 5.25rem 11rem rgba(0, 0, 0, 0.1)',\n  ],\n  shape: {\n    borderRadius: 4,\n  },\n  spacing: 8, // Base spacing unit in pixels\n  breakpoints: {\n    values: {\n      xs: 0,\n      sm: 600,\n      md: 900,\n      lg: 1200,\n      xl: 1536,\n    },\n  },\n  components: {\n    MuiCssBaseline: {\n      styleOverrides: {\n        body: {\n          backgroundColor: palette.background?.default ?? '#f9fafb',\n          color: palette.text?.primary ?? '#222f36',\n          fontFamily: '\"Quicksand\", sans-serif',\n          fontWeight: 500,\n        },\n      },\n    },\n    MuiButton: {\n      styleOverrides: {\n        root: {\n          // Base styles\n          textTransform: 'none',\n          fontWeight: 500,\n          borderRadius: '6px',\n          padding: '6px 12px',\n          minWidth: 'auto',\n          fontSize: '0.85rem',\n          lineHeight: 1.5,\n        },\n        contained: {\n          boxShadow: 'none',\n          '&:hover': {\n            boxShadow: 'none',\n          },\n        },\n        outlined: {\n          borderWidth: '1px',\n        },\n        sizeLarge: {\n          padding: '10px 16px',\n        },\n        sizeSmall: {\n          padding: '4px 8px',\n        },\n      },\n      defaultProps: {\n        variant: 'contained',\n        disableElevation: true,\n      },\n    },\n    MuiCard: {\n      styleOverrides: {\n        root: {\n          borderRadius: '0.3rem',\n          border: '1px solid #f3f2f9',\n          boxShadow: '0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)',\n        },\n      },\n    },\n    MuiCardHeader: {\n      styleOverrides: {\n        root: {\n          padding: '1rem',\n          borderBottom: '1px solid #f3f2f9',\n        },\n        title: {\n          fontSize: 17,\n          fontWeight: 600,\n        },\n        action: {\n          marginRight: 0,\n          marginTop: 0,\n          marginBottom: 0,\n        },\n      },\n    },\n    MuiCardContent: {\n      styleOverrides: {\n        root: {\n          padding: '1rem',\n          '&:last-child': {\n            paddingBottom: '1rem',\n          },\n        },\n      },\n    },\n    MuiInputBase: {\n      styleOverrides: {\n        root: {\n          borderRadius: '4px',\n          fontSize: 13,\n          padding: 0,\n        },\n        input: {\n          padding: '9px 12px',\n        },\n      },\n    },\n    MuiOutlinedInput: {\n      defaultProps: {\n        margin: 'dense',\n      },\n      styleOverrides: {\n        root: {\n          padding: 0,\n          borderRadius: '4px',\n          '& .MuiOutlinedInput-notchedOutline': {\n            borderColor: '#e2e6f1',\n            borderWidth: '1px',\n          },\n          '&:hover .MuiOutlinedInput-notchedOutline': {\n            borderColor: '#e2e6f1',\n            borderWidth: '1px',\n          },\n          '&.Mui-focused .MuiOutlinedInput-notchedOutline': {\n            borderColor: rgba(palette.primary.main, 0.1),\n            boxShadow: `0 0 4px ${rgba(palette.primary.main, 0.1)}`,\n          },\n        },\n        input: {\n          padding: '9px 12px',\n        },\n      },\n    },\n    MuiCheckbox: {\n      styleOverrides: {\n        root: {\n          padding: 4,\n          paddingLeft: 9,\n          '& .MuiSvgIcon-root': {\n            fill: '#e2e6f1',\n          },\n          '&.Mui-checked': {\n            '& .MuiSvgIcon-root': {\n              fill: palette.primary.main,\n            },\n          },\n        },\n      },\n    },\n    MuiFormLabel: {\n      styleOverrides: {\n        root: {\n          display: 'inline-block',\n          color: '#222f36',\n          fontSize: 13,\n          fontWeight: 500,\n        },\n      },\n    },\n    MuiFormHelperText: {\n      styleOverrides: {\n        root: {\n          marginLeft: 0,\n          marginRight: 0,\n        },\n      },\n    },\n    MuiPaginationItem: {\n      styleOverrides: {\n        root: {\n          borderRadius: '0.25rem',\n          height: 32,\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          '&:hover': {\n            background: palette.primary.main,\n            color: '#ffffff',\n          },\n          '&.Mui-selected': {\n            background: palette.primary.main,\n            color: '#ffffff',\n          },\n        },\n        icon: {\n          fontSize: 12,\n        },\n      },\n    },\n    MuiAlert: {\n      styleOverrides: {\n        root: {\n          borderRadius: '0.3rem',\n        },\n      },\n    },\n    MuiPaper: {\n      styleOverrides: {\n        root: {\n          borderRadius: '0.3rem',\n        },\n      },\n    },\n    MuiTable: {\n      styleOverrides: {\n        root: {\n          borderCollapse: 'separate',\n          borderSpacing: 0,\n        },\n      },\n    },\n    MuiTableRow: {\n      styleOverrides: {\n        root: {},\n      },\n    },\n    MuiTableCell: {\n      styleOverrides: {\n        root: {\n          borderBottom: '1px solid rgb(243, 242, 249)',\n          padding: '12px 16px',\n          fontWeight: 500,\n          fontSize: 13.6,\n        },\n        head: {\n          fontSize: 14,\n          fontWeight: 600,\n        },\n      },\n    },\n    MuiListItemText: {\n      styleOverrides: {\n        root: {\n          margin: 0,\n        },\n      },\n    },\n    MuiAppBar: {\n      styleOverrides: {\n        root: {\n          color: palette.header.main,\n        },\n      },\n    },\n  },\n  zIndex: {\n    appBar: 1200,\n    drawer: 1100,\n  },\n} as const;\n\n// @ts-ignore\nexport const theme = createTheme(themeOptions);\n\n// Dark theme options\nexport const darkThemeOptions = {\n  ...themeOptions,\n  components: {\n    ...themeOptions.components,\n    MuiCssBaseline: {\n      styleOverrides: {\n        body: {\n          backgroundColor: '#191814',\n          color: 'rgba(255, 255, 255, 0.8)',\n        },\n      },\n    },\n    MuiCard: {\n      styleOverrides: {\n        root: {\n          backgroundColor: '#232226',\n          borderColor: 'rgba(255, 255, 255, 0.1)',\n        },\n      },\n    },\n    MuiTableCell: {\n      styleOverrides: {\n        root: {\n          borderColor: 'rgba(255, 255, 255, 0.1)',\n        },\n        head: {\n          fontSize: 14,\n          fontWeight: 600,\n        },\n      },\n    },\n  },\n} as const;\n\n// @ts-ignore\nexport const darkTheme = createTheme(darkThemeOptions);\n"
  },
  {
    "path": "src/styles.css",
    "content": "\nhtml, body {\n    margin: 0;\n    font-family: 'Nunito', sans-serif;\n    color: #5E6278;\n    font-size: 14px;\n}\n\nhtml,\nbody {\n    overflow-wrap: break-word;\n    -webkit-hyphens: none;\n    hyphens: none;\n    word-break: break-word;\n    margin: 0;\n    display: flex;\n    flex-direction: column;\n    height: unset;\n    overscroll-behavior: none;\n}\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n    margin: 0;\n}\n\nbutton {\n    background-color: transparent;\n    background-image: none;\n}\n\nfieldset {\n    margin: 0;\n    padding: 0;\n}\n\nol,\nul {\n    list-style: none;\n    margin: 0;\n    padding: 0;\n}\n\nbody {\n    font-family: inherit;\n    line-height: inherit;\n}\n\n*,\n::before,\n::after {\n    box-sizing: border-box; /* 1 */\n    border-width: 0; /* 2 */\n    border-style: solid; /* 2 */\n    border-color: currentColor; /* 2 */\n    outline: none;\n}\n\nhr {\n    border-top-width: 1px;\n}\n\nimg {\n    border-style: solid;\n}\n\ntextarea {\n    resize: vertical;\n}\n\ninput::placeholder,\ntextarea::placeholder {\n    opacity: 1;\n    color: #a1a1aa;\n}\n\nbutton,\n[role='button'] {\n    cursor: pointer;\n}\n\ntable {\n    border-collapse: collapse;\n}\n\na {\n    color: inherit;\n    text-decoration: inherit;\n}\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n    padding: 0;\n    line-height: inherit;\n    color: inherit;\n}\n\npre,\ncode,\nkbd,\nsamp {\n    font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;\n}\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n    display: block;\n    vertical-align: middle;\n}\n\nimg,\nvideo {\n    max-width: 100%;\n    height: auto;\n}\n"
  },
  {
    "path": "src/utils/download.ts",
    "content": "export const downloadObjectAsJson = (exportName: string, data: unknown) => {\n  const dataStr = `data:text/json;charset=utf-8,${encodeURIComponent(JSON.stringify(data))}`;\n  const downloadAnchorNode = document.createElement('a');\n  downloadAnchorNode.setAttribute('href', dataStr);\n  downloadAnchorNode.setAttribute('download', `${exportName}.json`);\n  document.body.appendChild(downloadAnchorNode); // required for firefox\n  downloadAnchorNode.click();\n  downloadAnchorNode.remove();\n};\n"
  },
  {
    "path": "src/utils/thumbnail.ts",
    "content": "export const getThumbnail = (url: string) => {\n  const parts = url.split('/');\n\n  // get the filename\n  const fileName = parts.pop();\n  const segments = fileName?.split('.');\n  const fileExtension = segments?.pop();\n\n  const fileNameWithoutExtension = segments?.join('.');\n  return `${parts.join('/')}/${fileNameWithoutExtension}m.${fileExtension}`;\n};\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"jsx\": \"preserve\",\n    \"allowJs\": false,\n    \"strict\": true,\n    \"jsxImportSource\": \"@emotion/react\",\n    \"types\": [\"vite/client\"]\n  },\n  \"files\": [],\n  \"include\": [],\n  \"exclude\": [\"dist\", \"node_modules\"],\n  \"references\": [\n    {\n      \"path\": \"../../libs/draw\"\n    },\n    {\n      \"path\": \"../../libs/design-editor\"\n    },\n    {\n      \"path\": \"../../libs/design-utils\"\n    },\n    {\n      \"path\": \"../../libs/text-editor\"\n    },\n    {\n      \"path\": \"../../libs/design-screen\"\n    },\n    {\n      \"path\": \"../../libs/design-layers\"\n    },\n    {\n      \"path\": \"../../libs/design-core\"\n    },\n    {\n      \"path\": \"../../libs/color-picker\"\n    },\n    {\n      \"path\": \"./tsconfig.app.json\"\n    }\n  ],\n  \"extends\": \"../../tsconfig.base.json\"\n}\n"
  },
  {
    "path": "vite.config.ts",
    "content": "import react from '@vitejs/plugin-react';\nimport { defineConfig } from 'vite';\nimport { analyzer } from 'vite-bundle-analyzer';\nimport EnvironmentPlugin from 'vite-plugin-environment';\n\nconst isProd = process.env.NODE_ENV === 'production';\nconst plugins = [react(), EnvironmentPlugin(['API_ENDPOINT', 'FONT_API_KEY'])];\nif (isProd) {\n  plugins.push(\n    analyzer({\n      analyzerMode: 'static',\n      openAnalyzer: false,\n    }),\n  );\n}\n\nexport default defineConfig({\n  plugins,\n  server: {\n    port: 4200,\n  },\n  build: {\n    sourcemap: true, // Generate source maps for debugging\n    rollupOptions: {\n      treeshake: true,\n    },\n  },\n});\n"
  }
]