px-jspreadsheet-ce 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +292 -0
- package/dist/index.d.ts +2382 -0
- package/dist/index.js +11286 -0
- package/dist/index.js.map +1 -0
- package/dist/jspreadsheet.css +723 -0
- package/dist/jspreadsheet.themes.css +104 -0
- package/package.json +57 -0
- package/src/index.js +95 -0
- package/src/test.js +50 -0
- package/src/utils/cells.js +36 -0
- package/src/utils/columns.js +742 -0
- package/src/utils/comments.js +87 -0
- package/src/utils/config.js +46 -0
- package/src/utils/copyPaste.js +438 -0
- package/src/utils/data.js +419 -0
- package/src/utils/dispatch.js +115 -0
- package/src/utils/download.js +38 -0
- package/src/utils/editor.js +430 -0
- package/src/utils/events.js +1639 -0
- package/src/utils/factory.js +216 -0
- package/src/utils/filter.js +128 -0
- package/src/utils/footer.js +51 -0
- package/src/utils/freeze.js +19 -0
- package/src/utils/headers.js +74 -0
- package/src/utils/helpers.js +409 -0
- package/src/utils/history.js +336 -0
- package/src/utils/internal.js +1299 -0
- package/src/utils/internalHelpers.js +96 -0
- package/src/utils/keys.js +406 -0
- package/src/utils/lazyLoading.js +143 -0
- package/src/utils/libraryBase.js +5 -0
- package/src/utils/merges.js +275 -0
- package/src/utils/meta.js +81 -0
- package/src/utils/orderBy.js +185 -0
- package/src/utils/pagination.js +181 -0
- package/src/utils/rows.js +624 -0
- package/src/utils/search.js +83 -0
- package/src/utils/selection.js +744 -0
- package/src/utils/style.js +147 -0
- package/src/utils/toolbar.js +566 -0
- package/src/utils/version.js +9 -0
- package/src/utils/worksheets.js +731 -0
- package/src/webcomponent.js +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","mappings":";;;;;;;;;;;;;;;;;;;AAC0C;AACL;AACiB;AACV;AACF;;AAE1C;AACA;AACA;AACO;AACP;;AAEA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;;AAEA;AACA,oBAAoB,iBAAiB;AACrC;;AAEA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;;AAEA;AACA,IAAI,yEAAqB;;AAEzB;AACA;AACA;AACA;AACA,UAAU;AACV,YAAY,6DAAW;AACvB;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV,YAAY,+DAAQ;AACpB,UAAU;AACV,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,6BAA6B;AACzD;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,4BAA4B,6BAA6B;AACzD;AACA;AACA,UAAU;AACV,4BAA4B,6BAA6B;AACzD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;;AAEA;AACA,QAAQ,6DAAU;AAClB;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA,QAAQ,6DAAQ;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACxL2C;;AAEpC;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,gCAAgC;AACxD;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;;AAEA;;AAEA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA,iCAAiC,8DAAU;;AAE3C;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AChDqC;AACiB;;AAEtD;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAsC,kBAAkB;AACxD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wCAAwC,MAAM;AAC9C;AACA,iBAAiB;AACjB;;AAEA,2FAA2F,GAAG,IAAI,GAAG;AACrG;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,IAAI,yEAAoB;;AAExB;AACA,IAAI,6DAAQ;AACZ;;AAEO;AACP;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;;;;;;;;;;ACpLA;AACO;AACP;;AAEA;AACA;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACjBqD;AACA;;AAErD;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEO;AACP;AACA;;AAEA;AACA,eAAe,wEAAoB;AACnC;;AAEA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,kEAAqB;AAChD;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;;AAEA,0DAA0D;AAC1D;;AAEA,mDAAmD,uBAAuB;AAC1E;AACA,uDAAuD,uBAAuB;AAC9E;AACA,sCAAsC,kEAAqB;;AAE3D;AACA,0CAA0C,kEAAqB;AAC/D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6DAA6D,aAAa,wBAAwB;AAClG,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gCAAgC;AACzF;AACA,qDAAqD,gCAAgC;AACrF,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;;AAEA,oBAAoB,kBAAkB;AACtC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,0CAA0C,wEAAoB;;AAE9D;;AAEA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,8CAA8C,wEAAoB;;AAElE;;AAEA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA,yBAAyB;AACzB;AACA;AACA,yBAAyB;AACzB,qBAAqB;;AAErB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;;AAEA;AACA;;AAEO;AACP;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;ACrjBA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3IqC;AACmC;AACJ;AAC7B;AACM;AACM;AACX;AAC8E;;AAE/G;AACP;;AAEA;AACA;AACA;AACA,0CAA0C,QAAQ;AAClD;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,0DAAS;AACjB;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,yEAAoB;AAC5B,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,qBAAqB,kEAAqB;AAC1C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,kFAAmB;;AAE5C;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA,2BAA2B,kFAAmB;AAC9C,2BAA2B,kFAAmB;;AAE9C;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA,iCAAiC,SAAS;AAC1C,qCAAqC,SAAS;AAC9C,+BAA+B,kFAAmB;AAClD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,gCAAgC,mBAAmB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,kFAAmB;AAC5D;AACA;;AAEA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,6DAAQ;AAChC;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAqB,kEAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,wBAAwB,mBAAmB;AAC3C;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA,mEAAmE;;AAEnE,wBAAwB,iBAAiB;AACzC;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA,4CAA4C;AAC5C;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,YAAY;AAC3D;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,qBAAqB,kEAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,UAAU;AACV;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB,8EAAe;AACtC;;AAEA;AACA;AACA,wBAAwB,kFAAmB;AAC3C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI,6DAAQ;;AAEZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,6DAAQ;;AAE5B;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,kEAAqB;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,oCAAoC,6BAA6B;AACjE;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,QAAQ,6DAAQ;AAChB;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEO;AACP;;AAEA,mBAAmB,kFAAmB;AACtC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA,4BAA4B,gCAAgC;AAC5D,6BAA6B,kFAAmB;AAChD;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,6BAA6B;AACjD,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,wBAAwB;AAC5C;;AAEA;AACA;AACA;AACA;AACA;AACA,2CAA2C,0DAAa;AACxD;AACA;AACA;;AAEA;AACA,oBAAoB,qBAAqB;AACzC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC,kFAAmB;AACpD,+BAA+B,kFAAmB;AAClD;AACA;AACA;;AAEA,oBAAoB,wBAAwB;AAC5C,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAyC,kFAAmB;AAC5D,uCAAuC,kFAAmB;AAC1D;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,6BAA6B,kFAAmB;AAChD;AACA;AACA;;AAEA;AACA;AACA,gCAAgC,oDAAoD;AACpF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,IAAI,0DAAU;;AAEd;AACA,IAAI,qEAAgB;;AAEpB;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,oBAAoB,+DAAc;;AAElC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,QAAQ,sEAAgB;AACxB;;AAEA,IAAI,yEAAoB;;AAExB,IAAI,6DAAQ;;AAEZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA,qBAAqB,kFAAmB;;AAExC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA,qBAAqB,kFAAmB;;AAExC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,8CAA8C,2BAA2B;AACzE,WAAW,SAAS;AACpB;AACO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oBAAoB,8BAA8B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;;AAEA;AACA;;AAEO;AACP;;AAEA;;AAEA;AACA;;;;;;;;;;;;;;AClxCqC;;AAErC;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,QAAQ,6DAAQ,kCAAkC,OAAO,UAAU;AACnE,MAAM;AACN;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;;AAEA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;;AAEA,QAAQ,6DAAQ;AAChB;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChFqC;AACQ;AACQ;AACX;AACiD;AACX;AACnC;;AAEtC;AACP;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B,+DAAc;AACxC;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA,IAAI,oEAAa;AACjB;;AAEO;AACP;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;;AAEA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA,6BAA6B,SAAS;AACtC;AACA;AACA;AACA;;AAEA;AACA,6BAA6B,SAAS;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,QAAQ,6DAAQ;AAChB;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,qBAAqB,SAAS;AAC9B,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,SAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,SAAS;AAC9B,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,6DAAQ;AACxB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,SAAS;AAC9B,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA,6BAA6B,kBAAkB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ,6DAAQ;;AAEhB;AACA;;AAEA,IAAI,6DAAQ;;AAEZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;;AAEA,qEAAqE,yDAAyD;AAC9H;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qBAAqB,SAAS;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oDAAoD,uBAAuB;AAC3E,qDAAqD,kFAAmB;AACxE;AACA;AACA;AACA;AACA;AACA,kDAAkD,kFAAmB;;AAErE;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,qEAAa;AACzD;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6BAA6B,8DAAU;;AAEvC;AACA,gBAAgB,sEAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI,6DAAU;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA,IAAI,+DAAW;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,IAAI,6DAAQ;AACZ;;AAEO;AACP;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;;AAEA,qEAAqE,yDAAyD;AAC9H;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,mCAAmC,uBAAuB;AAC1D,uCAAuC,uBAAuB;AAC9D;AACA,2BAA2B,kEAAqB;AAChD,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;;AAEA;;AAEA;AACA;AACA;;AAEA,kBAAkB,kEAAqB;AACvC,gBAAgB,kEAAqB;;AAErC;AACA;AACA;;AAEA;AACA;;AAEO;AACP;;AAEA;;AAEA;AACA;;AAEO;AACP;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;ACvuB6C;;AAE7C;AACA;AACA;AACO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;AAEA,WAAW,0DAAa;AACxB;;AAEA;AACA;AACA;AACA;AACO;AACP,mBAAmB;AACnB;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP,kBAAkB;AAClB;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;;;;;;;;;;AC7FA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4BAA4B;AAC5C;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yCAAyC,oCAAoC;AAC7E;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,0DAA0D,gBAAgB;AAC1E;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sDAAe,QAAQ,EAAC;;;;;;;;;;;;;;;;ACjHqB;AACK;;AAElD;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,0BAA0B;AAC7D,mCAAmC,4BAA4B;AAC/D,UAAU;AACV;AACA;AACA,4BAA4B,6BAA6B;AACzD;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C,uCAAuC,qCAAqC;AAC5E;AACA;AACA;AACA,uCAAuC,qCAAqC;AAC5E;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qEAAgB;AAChC,aAAa;AACb;;AAEA;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,6BAA6B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI,gEAAY;AAChB;;AAEO;AACP;;AAEA;AACA,wBAAwB,gCAAgC;AACxD,sDAAsD;AACtD;AACA;AACA;;AAEA;AACA,IAAI,gEAAY;AAChB;;;;;;;;;;;;;;;;;;;;;;;AC7HgF;AACrC;AACD;AACL;AACY;;AAEjD;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC,yBAAyB,kFAAmB;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC,yBAAyB,kFAAmB;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,uBAAuB,kFAAmB;AAC1C;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA,iBAAiB,kFAAmB;;AAEpC;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,8BAA8B,uBAAuB;AACrD,kCAAkC,uBAAuB;AACzD,iCAAiC,kFAAmB;AACpD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,uBAAuB;AACrD,kCAAkC,uBAAuB;AACzD;AACA;AACA,oBAAoB,8DAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oEAAe;;AAEvB;AACA,YAAY,6DAAU;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb,YAAY,6DAAQ,6BAA6B,gCAAgC;AACjF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA,+BAA+B;AAC/B,qBAAqB,kFAAmB;AACxC;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,oBAAoB,aAAa;AACjC,wBAAwB,aAAa;AACrC;AACA;AACA;AACA;AACA;AACA,wBAAwB,8DAAU;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,oEAAe;;AAEvB;AACA;AACA;;AAEA,QAAQ,6DAAQ;AAChB;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AClRqC;AACc;AACG;AACf;AACsB;AACD;;AAE5D;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,+BAA+B,0BAA0B;AACzD;AACA;AACA;AACA;AACA;AACA;;AAEA,QAAQ,+EAA0B;AAClC,MAAM;AACN;AACA;AACA;AACA,SAAS;AACT,sBAAsB,0EAAW;;AAEjC;AACA;AACA,SAAS;AACT,2BAA2B,0EAAW;;AAEtC,mBAAmB,0EAAW;AAC9B;AACA;AACA,+BAA+B,wCAAwC;AACvE;AACA;AACA;AACA;;AAEA,2BAA2B,qBAAqB;AAChD;AACA;;AAEA,2BAA2B,wBAAwB;AACnD,wBAAwB,2BAA2B;AACnD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,IAAI,yEAAqB;AACzB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,kCAAkC,gCAAgC;AAClE;AACA;AACA;AACA;AACA;AACA,wBAAwB,+BAA+B;AACvD,sCAAsC,gCAAgC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gCAAgC;AAC5D;AACA;AACA;AACA,MAAM;AACN;AACA,8BAA8B,0EAAW;AACzC,sBAAsB,0EAAW;AACjC,mBAAmB,0EAAW;;AAE9B;AACA,kCAAkC,8CAA8C;AAChF;AACA;AACA;AACA;;AAEA,wBAAwB,+BAA+B;AACvD,kCAAkC,0EAAW;AAC7C,6BAA6B,0EAAW;AACxC;AACA,sCAAsC,8CAA8C;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gCAAgC;AAC5D,yCAAyC,0EAAW;AACpD;AACA;AACA;;AAEA,8BAA8B,qBAAqB;AACnD;AACA;;AAEA,oBAAoB,wBAAwB;AAC5C,kCAAkC,2BAA2B;AAC7D;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,sCAAsC;AAC9D;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI,yEAAqB;AACzB;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,4BAA4B,+BAA+B;AAC3D;AACA;AACA,YAAY,mEAAgB;AAC5B,YAAY,8DAAW;AACvB,UAAU;AACV;AACA,4BAA4B,kCAAkC;AAC9D;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI,6DAAQ;AACZ;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV,YAAY,0DAAQ;AACpB,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV,YAAY,mEAAgB;AAC5B,YAAY,8DAAW;AACvB,UAAU;AACV;AACA;AACA,4BAA4B,kCAAkC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI,6DAAQ;AACZ;;;;;;;;;;;;;;;;;;;;;AC/U2D;;AAE5B;;AAE/B;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;AACA;;AAEO;AACP;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;;AAEA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC,aAAa;AAC9C;AACA;AACA,KAAK;AACL;AACA;;AAEO;AACP;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA,gCAAgC,gCAAgC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA,gCAAgC,gCAAgC;AAChE;AACA;AACA,cAAc;AACd,gCAAgC,gCAAgC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA,qCAAqC,kFAAmB;;AAExD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,iBAAiB;AACnE,0BAA0B;AAC1B,gEAAgE;AAChE;AACA;AACA;;AAEA;AACA;AACA,gCAAgC;AAChC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA,gCAAgC,gCAAgC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,4BAA4B;AACxD;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;UCxZA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA,E;;;;;WCPA,8CAA8C,yD;;;;;WCA9C;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;;;;;;;;ACNA;AACA,oBAAoB;AACpB;;AAEA,gDAAe,GAAG,EAAC;;;;;;;;;;;;;ACFkB;AAC0B;AACrB;AACW;;AAErD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;AACA,IAAI,uBAAQ;;AAEZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA,yBAAyB,iCAAqB;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,uBAAQ;AACpB,UAAU;AACV;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,0CAA0C;AAC1C;;AAEA;AACA;;AAEA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;AACA,oCAAoC,mBAAmB;AACvD;AACA;AACA;;AAEA;AACA;;AAEA;AACA,gBAAgB,uBAAQ;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAW;AACnC,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA,gBAAgB,uBAAQ;;AAExB;;AAEA,mDAAmD,oBAAoB;;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAW;AAC/B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA,gBAAgB,uBAAQ;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA,gBAAgB,uBAAQ;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA,cAAc;AACd;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA,gBAAgB,uBAAQ;;AAExB;AACA;;AAEA;AACA;;AAEA;AACA,qBAAqB,8BAAS;AAC9B;AACA;AACA,oCAAoC,4BAAO;;AAE3C;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,kBAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,kBAAW;AACxB;;AAEA;AACA;;AAEA;AACA,qBAAqB,iCAAqB;AAC1C;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gCAAgC,4BAAO;AACvC;AACA;AACA,6CAA6C,8BAAS;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV,uCAAuC;AACvC;AACA,MAAM;AACN;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,IAAI,uBAAQ;;AAEZ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;;AAEA;AACA,yBAAyB,iCAAqB;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,2BAAU;AACnC;AACA;;AAEA;AACA;AACA,QAAQ,gCAAU;AAClB;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET,QAAQ,uBAAQ;AAChB;AACA;;;;;AC7a6C;AACiC;;AAE9E;AACA;;AAEA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAY,4BAAQ;AACpB;AACA,UAAU;AACV,gBAAgB,kCAAc;AAC9B;AACA,cAAc;AACd;AACA;AACA,oBAAoB,0BAAM;AAC1B;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA,IAAI,6BAAY;AAChB;;AAEO;AACP;;AAEA;AACA;;AAEA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,6CAA6C,OAAO;AACpD;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI,6BAAY;AAChB;;AAEO;AACP;;AAEA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,0CAA0C,OAAO;AACjD;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAY,4BAAQ;AACpB;AACA,UAAU;AACV,gBAAgB,kCAAc;AAC9B;AACA,cAAc;AACd;AACA;AACA,oBAAoB,4BAAQ;AAC5B;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA,IAAI,6BAAY;AAChB;;AAEA;AACA;;AAEA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI,6BAAY;AAChB;;AAEO;AACP;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,4BAAQ;AAChB,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI,6BAAY;AAChB;;AAEO;AACP;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,4BAAQ;AAChB,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI,6BAAY;AAChB;;;;;;;;;;;ACnZwC;AACH;AACK;AACyD;AACrD;AAC2C;AAC9B;;AAE3D;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,4BAA4B,gBAAgB;AAC5C;AACA,gCAAgC,mBAAmB;AACnD;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,OAAO;AAC3B;AACA;;AAEA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,uBAAQ;;AAE/B;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,qBAAqB,sBAAI;;AAEzB;AACA;AACA,QAAQ,wCAAsB;;AAE9B;AACA;AACA,4BAA4B,4BAA4B;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA,qBAAqB,0BAAI;AACzB;;AAEA;AACA;AACA;AACA;;AAEA;AACA,WAAW,oBAAQ;;AAEnB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA,gCAAgC,aAAa;AAC7C;AACA;AACA;AACA;AACA;;AAEA;AACA,+CAA+C,8BAA8B;AAC7E;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,aAAa;AACzC;AACA;AACA;AACA;AACA,2CAA2C,wBAAwB;AACnE;AACA,SAAS;AACT;AACA;;AAEA;AACA,gBAAgB,uBAAQ;AACxB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,aAAa;AACb,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,sCAAqB;AACjC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,2BAAU;AACzC;AACA;AACA;AACA,gBAAgB,mCAAkB;AAClC;AACA;AACA,uCAAuC,+CAAmB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,+BAA+B,QAAQ;AACvC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,2BAA2B,OAAO;AAClC;AACA;;AAEA;AACA,QAAQ,2CAAyB;;AAEjC;AACA,QAAQ,gCAAU;AAClB;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,QAAQ,4BAAW;;AAEnB;AACA;;AAEA,wBAAwB,iBAAiB;AACzC,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA,QAAQ,uBAAQ;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET,QAAQ,uBAAQ;AAChB;;AAEA,IAAI,4CAAsB;AAC1B;;;;;;;;ACpbqC;AACQ;AACH;AACA;AACwB;AACgB;AAC1C;AACqD;;AAE7F;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,2GAA2G,yBAAa;;AAExH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4CAA4C,+CAAmB;AAC/D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;;AAEA;;AAEA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA,6CAA6C;AAC7C;;AAEA;AACA;AACA,UAAU;AACV;;AAEA,4BAA4B,6BAA6B;AACzD;AACA;;AAEA;AACA;AACA,yCAAyC;AACzC;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,uBAAQ;AACpB;AACA;;AAEA;AACA;AACA,gBAAgB,0BAAW;AAC3B;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B,uCAAW;;AAEzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAoC,kCAAkC;AACtE;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,gCAAgC;AAC5D;AACA,gCAAgC,kBAAkB;AAClD;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAA0B,+BAA+B;AACzD;AACA;AACA;;AAEA;AACA;AACA;;AAEA,wCAAwC,kCAAkC;AAC1E;AACA;AACA;AACA;AACA,2BAA2B,2BAAU;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,2CAA2C,6BAA6B;AACxE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,kCAAkC,qBAAqB;AACvD;AACA;;AAEA,wBAAwB,wBAAwB;AAChD,4BAA4B,2BAA2B;AACvD;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,sCAAsC;AAClE;AACA;AACA;AACA;AACA;AACA,4CAA4C,kCAAkC;AAC9E;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,gCAAU;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,QAAQ,sCAAqB;;AAE7B;AACA,QAAQ,uBAAQ;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA,YAAY,0BAAW,wBAAwB,0BAAW;AAC1D;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,wBAAwB,qBAAqB;AAC7C;AACA;AACA,MAAM;AACN;AACA;;AAEA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAoB,qBAAqB;AACzC;AACA;AACA;;AAEA,qCAAqC,wBAAwB;AAC7D;AACA;;AAEA,oBAAoB,wBAAwB;AAC5C,yCAAyC,wBAAwB;AACjE;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;;AAEA;AACA,IAAI,gCAAU;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA,IAAI,sCAAqB;;AAEzB;AACA,IAAI,uBAAQ;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;;AAEA;AACA,gBAAgB,uBAAQ;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iDAAiD,mCAAmC;AACpF,4BAA4B,0BAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;;AAEA,6CAA6C,mCAAmC;AAChF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,kCAAkC,+BAA+B;AACjE,iDAAiD,mCAAmC;AACpF;AACA;AACA;AACA;;AAEA;AACA,kCAAkC,+BAA+B;AACjE;AACA;AACA;AACA;;AAEA,2CAA2C,qBAAqB;AAChE;AACA;;AAEA,gCAAgC,wBAAwB;AACxD,+CAA+C,2BAA2B;AAC1E;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,kCAAkC;AACxE;AACA;AACA;;AAEA;AACA,gBAAgB,4CAA0B;;AAE1C;AACA;AACA,oCAAoC,sCAAsC;AAC1E;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,gCAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA,gBAAgB,sCAAqB;;AAErC;AACA,gBAAgB,uBAAQ;AACxB;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;;AAEA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,QAAQ,gCAAU;AAClB;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,QAAQ,uBAAQ;;AAEhB;AACA,QAAQ,sCAAoB;AAC5B;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA,oBAAoB,sBAAsB;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6BAA6B;AACrD;AACA;AACA;;AAEA;AACA;AACA,QAAQ,uBAAS;AACjB;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA,oBAAoB,sBAAsB;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6BAA6B;AACrD;AACA;AACA;;AAEA;AACA;AACA,QAAQ,uBAAS;AACjB;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA,oBAAoB,6BAA6B;AACjD;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA,oBAAoB,qBAAqB;AACzC;AACA,2BAA2B,+CAAmB;AAC9C;AACA;AACA;AACA;AACA;AACA;;;;ACpuBkD;AACgB;AAC7B;AACK;AACyD;AACzD;AACkC;;AAE5E;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,2CAAe;AACtC;AACA;;AAEA,4BAA4B,kBAAkB;;AAE9C;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA,qBAAqB,2BAAU;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,0BAA0B,iBAAiB;AAC3C;;AAEA,8BAA8B,kCAAkC;AAChE;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA,YAAY,uBAAQ;AACpB;AACA;;AAEA;AACA;AACA,gBAAgB,0BAAW;AAC3B;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iCAAiC,4BAA4B;AAC7D;AACA;AACA,8BAA8B,kCAAkC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,+BAA+B,qBAAqB;AACpD;AACA;;AAEA,+BAA+B,wBAAwB;AACvD,4BAA4B,2BAA2B;AACvD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,gCAAU;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,QAAQ,sCAAqB;;AAE7B;AACA,QAAQ,uBAAQ;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA,YAAY,0BAAW,wBAAwB,0BAAW;AAC1D;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,qCAAqC,wBAAwB;AAC7D;AACA;;AAEA,qCAAqC,wBAAwB;AAC7D,wBAAwB,2BAA2B;AACnD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAI,gCAAU;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA,IAAI,sCAAqB;;AAEzB;AACA,IAAI,uBAAQ;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,+BAA+B,iCAAe;;AAE9C;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,eAAe;AAC3C;AACA;;AAEA,gBAAgB,uBAAQ;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA,8CAA8C,6BAA6B;AAC3E,4BAA4B,0BAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,0CAA0C,6BAA6B;AACvE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,wCAAwC,qBAAqB;AAC7D;AACA;;AAEA,wCAAwC,wBAAwB;AAChE,oCAAoC,2BAA2B;AAC/D;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,4CAA0B;;AAE1C;AACA,gBAAgB,gCAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA,gBAAgB,sCAAqB;;AAErC;AACA,gBAAgB,uBAAQ;AACxB;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;;AAEA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,gCAAU;AAClB;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,QAAQ,uBAAQ;;AAEhB;AACA,QAAQ,sCAAoB;AAC5B;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA,SAAS;AACT,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA,oBAAoB,wBAAwB;AAC5C;AACA,2BAA2B,+CAAmB;AAC9C;AACA;AACA;AACA;AACA;AACA;;;AC/mBA;AACA,4CAAe;AACf;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC,EAAC;;;;;ACNwE;AAC/B;AACoB;AACR;AACoF;AAC9F;AACJ;AACW;AACZ;AACO;AACZ;AACkB;;AAErD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,QAAQ,WAAW;AACnB;AACA,YAAY,WAAW;AACvB;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA,oBAAoB,WAAW,2BAA2B,WAAW;AACrE;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA,oCAAoC,oBAAoB;AACxD,mDAAmD,WAAW;AAC9D;AACA;AACA,2DAA2D,WAAW;AACtE,0CAA0C,WAAW;AACrD,oBAAoB,QAAQ,MAAM,WAAW;AAC7C,kBAAkB;AAClB,oBAAoB,QAAQ;AAC5B,wBAAwB,WAAW;AACnC,iCAAiC,WAAW;AAC5C;AACA,wBAAwB,WAAW;AACnC;AACA;AACA;AACA,gBAAgB,WAAW,8BAA8B,WAAW;AACpE,gCAAgC,IAAI,WAAW,sCAAsC;AACrF,wBAAwB,WAAW,iCAAiC,WAAW;AAC/E,wBAAwB,WAAW,iCAAiC,WAAW;AAC/E;AACA;AACA,cAAc;AACd;AACA,gBAAgB,WAAW,2BAA2B,WAAW;AACjE,gCAAgC,WAAW,2BAA2B,WAAW;AACjF,gBAAgB,SAAS;AACzB,oBAAoB,WAAW;AAC/B,oBAAoB,WAAW;AAC/B;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA,YAAY,WAAW;AACvB,UAAU,SAAS,WAAW;AAC9B;AACA,gBAAgB,WAAW;AAC3B,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA,oBAAoB,WAAW,8BAA8B,WAAW;AACxE,oCAAoC,IAAI,WAAW,mCAAmC;AACtF,4BAA4B,WAAW,iCAAiC,WAAW;AACnF,4BAA4B,WAAW,iCAAiC,WAAW;AACnF;AACA;AACA,oCAAoC,IAAI,WAAW,sCAAsC;AACzF,wBAAwB,WAAW;AACnC,wBAAwB,WAAW;AACnC;AACA;AACA;AACA,4BAA4B,WAAW,yCAAyC,WAAW;AAC3F,4BAA4B,WAAW;AACvC,gCAAgC,WAAW;AAC3C,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA,wBAAwB,WAAW;AACnC,4CAA4C,WAAW;AACvD,4BAA4B,WAAW;AACvC;AACA;AACA,sBAAsB;AACtB,4CAA4C,WAAW;AACvD;AACA,wBAAwB,WAAW,sCAAsC,WAAW;AACpF,wBAAwB,OAAO,MAAM,WAAW,uBAAuB,WAAW;AAClF;AACA,oBAAoB,WAAW;AAC/B;AACA,gBAAgB,WAAW;AAC3B;AACA,UAAU;AACV;AACA,gBAAgB,WAAW;AAC3B,gBAAgB,WAAW;;AAE3B;AACA,oBAAoB,WAAW;AAC/B;AACA,oBAAoB,0BAAQ;AAC5B,wBAAwB,WAAW;AACnC,wBAAwB,WAAW;AACnC,wBAAwB,WAAW,gCAAgC,WAAW;AAC9E;;AAEA;AACA,oBAAoB,qCAAmB,MAAM,WAAW;AACxD;AACA;AACA;AACA;;AAEA;AACA,QAAQ,WAAW;AACnB,qBAAqB,WAAW;AAChC,QAAQ,WAAW;AACnB;;AAEA;AACA,IAAI,WAAW;AACf;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,WAAW;AACvB,gBAAgB,WAAW;AAC3B,oBAAoB,WAAW;AAC/B,oBAAoB,kBAAW,MAAM,WAAW,uBAAuB,WAAW;AAClF;AACA,gBAAgB,WAAW;AAC3B;AACA,YAAY,WAAW;AACvB;AACA,MAAM;AACN,YAAY,WAAW;AACvB,gBAAgB,WAAW;AAC3B,gBAAgB,kBAAW,MAAM,WAAW,uBAAuB,WAAW;AAC9E;;AAEA;AACA,gBAAgB,gCAAc,MAAM,WAAW;AAC/C,gBAAgB,WAAW;AAC3B;AACA;AACA;;AAEA,QAAQ,WAAW;AACnB;AACA,gBAAgB,WAAW;AAC3B,gBAAgB,2BAAS,MAAM,WAAW;AAC1C;AACA,UAAU;AACV,gBAAgB,WAAW;AAC3B,gBAAgB,WAAW;AAC3B;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,WAAW;AACnC;AACA,wBAAwB,WAAW;AACnC;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,WAAW;AACnC,wCAAwC,IAAI,WAAW,sCAAsC;AAC7F,gCAAgC,WAAW;AAC3C,gCAAgC,WAAW;AAC3C;AACA;AACA,sBAAsB,SAAS,WAAW;AAC1C,4BAA4B,0BAAW,MAAM,WAAW;AACxD;AACA,0BAA0B;AAC1B;AACA,4BAA4B,WAAW;AACvC;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC,4CAA4C,IAAI,WAAW,sCAAsC;AACjG,oCAAoC,WAAW;AAC/C,oCAAoC,WAAW;AAC/C;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA,4BAA4B,WAAW;AACvC,gCAAgC,WAAW;AAC3C;AACA,0BAA0B;AAC1B;AACA;AACA,gCAAgC,WAAW;AAC3C,gCAAgC,WAAW;AAC3C;AACA,gCAAgC,WAAW;AAC3C,oCAAoC,WAAW;AAC/C,iCAAiC;AACjC;;AAEA;AACA,4BAA4B,WAAW;;AAEvC;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,2CAAyB,MAAM,WAAW,gCAAgC,WAAW;AAC7G;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,iCAAiC,WAAW;AAC5C;AACA,wBAAwB,2CAAyB;AACjD,4BAA4B,WAAW;AACvC;AACA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA,cAAc;AACd,gBAAgB,WAAW;AAC3B;;AAEA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,WAAW;AACnC;AACA,wBAAwB,WAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,SAAS,WAAW;AAC1C,4BAA4B,0BAAW,MAAM,WAAW;AACxD;AACA,0BAA0B,SAAS,WAAW,gDAAgD,WAAW;AACzG;AACA,0BAA0B;AAC1B;AACA,4BAA4B,WAAW;AACvC;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,4BAA4B,WAAW;AACvC,gCAAgC,WAAW;AAC3C;AACA,0BAA0B;AAC1B;AACA,4BAA4B,WAAW;;AAEvC;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,2CAAyB,MAAM,WAAW;AAClE;AACA,kBAAkB;AAClB;AACA;AACA,wBAAwB,kBAAW,MAAM,WAAW,uBAAuB,WAAW;AACtF,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,WAAW;AAC3C,oCAAoC,WAAW,gDAAgD,WAAW;AAC1G,oCAAoC,kBAAW,MAAM,WAAW,uBAAuB,WAAW;AAClG;AACA;;AAEA,iCAAiC,WAAW;AAC5C;AACA;AACA,oCAAoC,2CAAyB;AAC7D,wCAAwC,WAAW;AACnD,wCAAwC,WAAW;AACnD,wCAAwC,WAAW;AACnD;AACA;AACA;AACA;AACA,kCAAkC;AAClC,oCAAoC,2CAAyB,MAAM,WAAW;AAC9E;AACA;;AAEA;AACA,4BAA4B,WAAW;AACvC,4BAA4B,WAAW;AACvC;AACA;AACA;AACA,cAAc;AACd,gBAAgB,WAAW;AAC3B;;AAEA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B,kBAAkB;AAClB,oBAAoB,WAAW;AAC/B,kBAAkB;AAClB,oBAAoB,WAAW;AAC/B;AACA;AACA;;AAEA,YAAY,WAAW;AACvB,YAAY,WAAW;AACvB,UAAU;AACV,YAAY,WAAW;AACvB;AACA,MAAM;AACN,QAAQ,WAAW;AACnB;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA,QAAQ,WAAW;AACnB;;AAEA,QAAQ,WAAW;AACnB,YAAY,WAAW;AACvB;AACA,gBAAgB,WAAW;AAC3B,oBAAoB,WAAW;AAC/B,4CAA4C,WAAW;;AAEvD,wBAAwB,WAAW;AACnC,0CAA0C,WAAW;AACrD,wBAAwB,WAAW,2BAA2B,WAAW;;AAEzE,wBAAwB,sCAAoB,MAAM,WAAW;AAC7D;AACA,kBAAkB;AAClB,6CAA6C,WAAW;;AAExD,wBAAwB,WAAW;AACnC,2CAA2C,WAAW;AACtD,wBAAwB,WAAW,2BAA2B,WAAW;;AAEzE,wBAAwB,sCAAoB,MAAM,WAAW;AAC7D;AACA;AACA,cAAc,SAAS,WAAW;AAClC,oBAAoB,WAAW;AAC/B;AACA;AACA,4BAA4B,0BAAW,MAAM,WAAW;AACxD;AACA,0BAA0B;AAC1B,4CAA4C,IAAI,WAAW,sCAAsC;AACjG,gCAAgC,WAAW;AAC3C,gCAAgC,WAAW;AAC3C;;AAEA,gCAAgC,WAAW;AAC3C,gCAAgC,WAAW;AAC3C,8BAA8B;AAC9B;AACA,wCAAwC,WAAW;AACnD,wCAAwC,WAAW;AACnD,sCAAsC;AACtC,wCAAwC,WAAW;AACnD;AACA,oCAAoC,WAAW;AAC/C,kCAAkC;AAClC,wCAAwC,WAAW;AACnD,wCAAwC,WAAW;AACnD,sCAAsC;AACtC,wCAAwC,WAAW;AACnD;AACA,oCAAoC,WAAW;AAC/C;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,4BAA4B,0BAAW,MAAM,WAAW;AACxD;AACA,0BAA0B;AAC1B;AACA,gCAAgC,WAAW;AAC3C,4EAA4E,WAAW;AACvF,gCAAgC,WAAW;AAC3C,oCAAoC,WAAW;AAC/C,oCAAoC,WAAW;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA,gBAAgB,WAAW;AAC3B,gBAAgB,WAAW;AAC3B,gBAAgB,WAAW;AAC3B;;AAEA;AACA;AACA;AACA,wBAAwB,WAAW;AACnC,wBAAwB,WAAW;AACnC,sBAAsB;AACtB,wBAAwB,WAAW;AACnC,wBAAwB,WAAW;AACnC;AACA;;AAEA;AACA;AACA,wBAAwB,WAAW;AACnC,wBAAwB,WAAW;AACnC,sBAAsB;AACtB,wBAAwB,WAAW;AACnC,wBAAwB,WAAW;AACnC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI,qCAAmB;;AAEvB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA,yBAAyB,SAAS;AAClC,6BAA6B,SAAS;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA,QAAQ,WAAW;AACnB;;AAEA,QAAQ,WAAW,yBAAyB,WAAW;AACvD;AACA;;AAEA;AACA;AACA,gBAAgB,WAAW;AAC3B,oBAAoB,WAAW;AAC/B;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,WAAW,kCAAkC,WAAW;AACxE;AACA,cAAc;AACd;AACA;AACA,wBAAwB,WAAW;AACnC;AACA,kCAAkC,WAAW;AAC7C;AACA;AACA,wBAAwB,2CAAyB,MAAM,WAAW,gCAAgC,WAAW;AAC7G;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC,sCAAsC,WAAW;AACjD;AACA;AACA,4BAA4B,2CAAyB;AACrD,gCAAgC,WAAW;AAC3C;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,6BAA6B,WAAW;AACxC;AACA,oCAAoC,WAAW;AAC/C,6DAA6D,WAAW;AACxE,kCAAkC;AAClC,wCAAwC,WAAW;AACnD,wCAAwC,2CAAyB;AACjE,4CAA4C,WAAW;AACvD,4CAA4C,WAAW;AACvD,4CAA4C,WAAW;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,WAAW;AACnB,qBAAqB,WAAW;AAChC,QAAQ,WAAW;AACnB;AACA;;AAEA;AACA;AACA,QAAQ,WAAW;AACnB;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA,2BAA2B,WAAW;AACtC;AACA;AACA,wBAAwB,WAAW,kCAAkC,WAAW;AAChF;AACA;AACA,2BAA2B,WAAW,kCAAkC,WAAW;AACnF,2BAA2B,WAAW;AACtC;AACA,gBAAgB,0BAAQ;AACxB,oBAAoB,WAAW;AAC/B,oBAAoB,WAAW;AAC/B,oBAAoB,WAAW;AAC/B;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,YAAY,yBAAU,MAAM,WAAW;AACvC,UAAU;AACV;AACA;;AAEA;AACA,oCAAoC,WAAW;AAC/C;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;;AAEA;AACA,oCAAoC,WAAW;AAC/C,qBAAqB,WAAW;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU,MAAM,WAAW;AACnD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,WAAW,yBAAyB,WAAW;AACvD,aAAa,WAAW;AACxB,gBAAgB,WAAW;AAC3B;AACA,oBAAoB,KAAK;AACzB,wBAAwB,WAAW;AACnC,wBAAwB,WAAW;AACnC,wBAAwB,WAAW;AACnC;AACA;AACA;AACA,kBAAkB;AAClB,oBAAoB,KAAK;AACzB,wBAAwB,WAAW;AACnC,wBAAwB,WAAW;AACnC,wBAAwB,WAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,iBAAiB;AACjB,aAAa;AACb;;AAEA;AACA;AACA;AACA,yBAAyB,cAAc;;AAEvC;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;;AAEb;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;;AAEA;AACA;AACA,yBAAyB,cAAc;;AAEvC;;AAEA;AACA;AACA;AACA;AACA;AACA,8CAA8C,iCAAqB;AACnE;AACA,iBAAiB;AACjB,aAAa;;AAEb;AACA;AACA;AACA;AACA,8CAA8C,iCAAqB;AACnE,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,cAAc;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,IAAI;AACpB,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,KAAK;AACrC;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,OAAO;AACjC,kBAAkB;AAClB;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;;AAEA,oBAAoB,2BAA2B;AAC/C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA,QAAQ,WAAW;AACnB,4BAA4B,WAAW;;AAEvC,YAAY,WAAW;AACvB;AACA,UAAU;AACV;;AAEA,gBAAgB,WAAW;AAC3B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,yBAAyB,WAAW;AACpC,qCAAqC,WAAW;AAChD,qCAAqC,WAAW;AAChD,qCAAqC,WAAW;AAChD,qCAAqC,WAAW;AAChD;AACA,wBAAwB,2CAAyB,MAAM,WAAW;AAClE;AACA,kBAAkB;AAClB;AACA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA,yBAAyB,WAAW;AACpC,qCAAqC,WAAW;AAChD,qCAAqC,WAAW;AAChD,qCAAqC,WAAW;AAChD,qCAAqC,WAAW;AAChD;AACA,wBAAwB,2CAAyB,MAAM,WAAW;AAClE;AACA,kBAAkB;AAClB;;AAEA;AACA;;AAEA;AACA,yBAAyB,WAAW;AACpC,+CAA+C,WAAW;AAC1D,gEAAgE,WAAW;AAC3E,wBAAwB,WAAW;AACnC,wBAAwB,WAAW;AACnC;AACA,wBAAwB,2CAAyB,MAAM,WAAW;AAClE;AACA,kBAAkB;AAClB,oBAAoB,2BAAS,MAAM,WAAW;AAC9C,kBAAkB;AAClB;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA,+CAA+C,WAAW;;AAE1D;AACA,kEAAkE,WAAW;;AAE7E;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,WAAW;AACvB,gBAAgB,WAAW;AAC3B,gBAAgB,WAAW;AAC3B;AACA,YAAY,WAAW;AACvB;AACA,MAAM;AACN,YAAY,WAAW;AACvB,YAAY,WAAW;AACvB,YAAY,WAAW;AACvB;AACA;;AAEA,QAAQ,WAAW;AACnB,aAAa,WAAW;AACxB;AACA;;AAEA;AACA,gBAAgB,2CAAyB,MAAM,WAAW;;AAE1D,gBAAgB,WAAW;AAC3B;AACA,wBAAwB,WAAW;AACnC,wBAAwB,WAAW;AACnC,sBAAsB;AACtB,wBAAwB,WAAW;AACnC;AACA,oBAAoB,UAAU,MAAM,WAAW;AAC/C,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,WAAW;AACnB,qBAAqB,WAAW;AAChC,QAAQ,WAAW;AACnB;AACA,YAAY,WAAW,4BAA4B,WAAW;AAC9D,YAAY,WAAW;AACvB;AACA,QAAQ,WAAW;AACnB;AACA;;AAEO;AACP,QAAQ,WAAW;AACnB,aAAa,WAAW;AACxB,YAAY,IAAI,MAAM,WAAW;AACjC,gBAAgB,WAAW;AAC3B,gBAAgB,WAAW;AAC3B,oBAAoB,WAAW;AAC/B;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,WAAW;AACnB,aAAa,WAAW;AACxB,YAAY,IAAI,MAAM,WAAW;AACjC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,QAAQ,WAAW;AACnB,YAAY,WAAW;AACvB;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA,oBAAoB,kBAAW,MAAM,WAAW,uBAAuB,WAAW;AAClF;AACA;AACA,cAAc;AACd;AACA;AACA,oBAAoB,WAAW;AAC/B,oBAAoB,WAAW,sCAAsC,WAAW;AAChF,oBAAoB,WAAW,sCAAsC,WAAW;AAChF;AACA,oBAAoB,kBAAW,MAAM,WAAW,uBAAuB,WAAW;AAClF,kBAAkB;AAClB,oBAAoB,WAAW;AAC/B,oBAAoB,WAAW,sCAAsC,WAAW;AAChF,oBAAoB,WAAW,sCAAsC,WAAW;AAChF;AACA;AACA,kBAAkB;AAClB;AACA;AACA,yBAAyB,WAAW;AACpC,6BAA6B,WAAW;AACxC,gCAAgC,WAAW,sCAAsC,WAAW;AAC5F,gCAAgC,WAAW,sCAAsC,WAAW;AAC5F,6BAA6B,WAAW,mCAAmC,WAAW;AACtF,gCAAgC,WAAW;AAC3C;AACA,gCAAgC,WAAW,mCAAmC,WAAW;AACzF,oCAAoC,WAAW;AAC/C;AACA;AACA;AACA;AACA,+CAA+C,WAAW;AAC1D,0CAA0C,WAAW;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,wBAAwB,WAAW;AACnC;AACA;AACA,cAAc;AACd;AACA;AACA,oBAAoB,WAAW;AAC/B,oBAAoB,WAAW,sCAAsC,WAAW;AAChF,kDAAkD,WAAW,sCAAsC,WAAW;AAC9G;AACA,oBAAoB,kBAAW,MAAM,WAAW,uBAAuB,WAAW;AAClF,kBAAkB;AAClB,oBAAoB,WAAW;AAC/B;AACA;AACA;;AAEA,aAAa,WAAW,iCAAiC,WAAW;AACpE;AACA;AACA,gBAAgB,IAAI,MAAM,WAAW;AACrC;AACA,cAAc;AACd,gBAAgB,KAAK,MAAM,WAAW;AACtC;AACA,cAAc;AACd,gBAAgB,EAAE,MAAM,WAAW;AACnC;AACA,cAAc;AACd,gBAAgB,IAAI,MAAM,WAAW;AACrC;AACA,cAAc;AACd,gBAAgB,KAAK,MAAM,WAAW;AACtC;AACA,cAAc;AACd,gBAAgB,IAAI,MAAM,WAAW;AACrC;AACA,cAAc;AACd;AACA,oBAAoB,WAAW;AAC/B,wBAAwB,WAAW;AACnC,4BAA4B,WAAW;AACvC;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA,sBAAsB,SAAS,WAAW;AAC1C,4BAA4B,WAAW;AACvC;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA,sBAAsB;AACtB;AACA,wBAAwB,WAAW;AACnC,4BAA4B,WAAW;AACvC;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,oBAAoB,EAAE,MAAM,WAAW;AACvC,kBAAkB;AAClB,wBAAwB,WAAW;AACnC,4BAA4B,WAAW;AACvC,gCAAgC,WAAW,yCAAyC,WAAW;AAC/F;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;;AAEA,oBAAoB,IAAI,MAAM,WAAW;AACzC;AACA;AACA,cAAc;AACd;AACA;AACA,oBAAoB,IAAI,MAAM,WAAW;AACzC,kBAAkB;AAClB,wBAAwB,WAAW;AACnC,4BAA4B,WAAW;AACvC,gCAAgC,WAAW,yCAAyC,WAAW;AAC/F;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;;AAEA,oBAAoB,KAAK,MAAM,WAAW;AAC1C;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,wBAAwB,2BAAS,MAAM,WAAW;AAClD;AACA,sBAAsB;AACtB;AACA,wBAAwB,WAAW;AACnC;AACA,sBAAsB;AACtB;AACA,wBAAwB,WAAW;AACnC;AACA,sBAAsB;AACtB;AACA,wBAAwB,WAAW;AACnC;AACA,sBAAsB;AACtB;AACA,wBAAwB,IAAI,MAAM,WAAW;AAC7C;AACA,sBAAsB;AACtB;AACA,4BAA4B,WAAW;AACvC;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,kBAAkB;AAClB,wBAAwB,WAAW;AACnC,4BAA4B,WAAW;AACvC,0CAA0C,WAAW;AACrD,6CAA6C,WAAW;;AAExD;AACA;AACA;AACA;AACA;AACA,oCAAoC,WAAW;AAC/C,oCAAoC,WAAW;AAC/C;AACA,oCAAoC,kBAAkB,MAAM,WAAW;AACvE,kCAAkC;AAClC;AACA,oCAAoC,UAAU;AAC9C,wCAAwC,WAAW;AACnD,wCAAwC,WAAW;AACnD;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,gCAAgC,UAAU,MAAM,WAAW,uBAAuB,WAAW;AAC7F,8BAA8B;AAC9B;AACA,gCAAgC,UAAU,MAAM,WAAW,uBAAuB,WAAW;AAC7F;AACA;AACA,oCAAoC,WAAW;AAC/C,oCAAoC,WAAW;AAC/C,oCAAoC,WAAW;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,oBAAoB,WAAW;AAC/B,iCAAiC,WAAW;AAC5C;;AAEA,gBAAgB,WAAW;AAC3B,oBAAoB,WAAW;AAC/B,iBAAiB;AACjB;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA,YAAY,WAAW;AACvB,YAAY,WAAW;AACvB;AACA,wBAAwB,4BAAQ;AAChC;AACA;AACA;AACA,wBAAwB,sCAAoB;AAC5C;AACA,kBAAkB;AAClB,wBAAwB,0BAAM;AAC9B;AACA;AACA;AACA,wBAAwB,sCAAoB;AAC5C;AACA;;AAEA,gBAAgB,WAAW;AAC3B,aAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,wBAAwB,+BAA+B;AACvD;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEO;AACP;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtmDsC;AACsC;AACjB;AACtB;AACK;AACS;AACZ;AACW;;AAE3C;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,4BAA4B,6BAA6B;AACzD;AACA;AACA,gCAAgC,gCAAgC;AAChE;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,WAAW;AAC3B,oBAAoB,WAAW;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,gBAAgB,6BAA6B;AAC7C;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN,QAAQ,mCAAgB;AACxB;;AAEA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,YAAY,uBAAQ;AACpB;AACA;;AAEA;AACA,IAAI,4BAAW;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,WAAW,+CAAmB;AAC9B;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;;AAEA;AACA,yBAAyB,+CAAmB;AAC5C;AACA;;AAEA;AACA,qBAAqB,2BAAU;;AAE/B;AACA,QAAQ,mCAAkB;AAC1B,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,2BAAU;;AAEnC;AACA,YAAY,mCAAkB;AAC9B,UAAU;AACV;AACA;AACA,gCAAgC,iBAAiB;AACjD;;AAEA;AACA,yCAAyC,+CAAmB;AAC5D;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA,qCAAqC,2BAAU;;AAE/C;AACA,wBAAwB,mCAAkB;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI,gCAAU;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA,IAAI,4BAAW;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,IAAI,uBAAQ;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA,iBAAiB,2BAAU;;AAE3B;AACA,IAAI,mCAAkB;;AAEtB;AACA,IAAI,gCAAU;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA,IAAI,4BAAW;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,IAAI,uBAAQ;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA,oBAAoB,OAAO;AAC3B;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa;;AAEb;AACA,SAAS;AACT;;AAEA;AACA;;AAEO;AACP;;AAEA,mBAAmB,8BAAkB;;AAErC;;AAEA,4BAA4B,gBAAgB;AAC5C;;AAEA,gCAAgC,gBAAgB;AAChD;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;;ACla2C;AACgB;AACd;AACH;;AAE1C;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA,QAAQ,2BAAY;AACpB;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,gDAAgD;AAChD;;AAEA;AACA;AACA;AACA;AACA,6BAA6B,0BAAW;AACxC;AACA,oCAAoC,iBAAiB;AACrD,oCAAoC,+CAAmB;AACvD,wCAAwC,wCAAwC;AAChF;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,SAAS;AACT,MAAM;AACN;AACA;;AAEA,IAAI,6BAAY;AAChB;;AAEA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;;;AClF0C;AACL;AACQ;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;;AAEA,oBAAoB,wBAAwB;AAC5C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;AACA,uBAAuB,yBAAa;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,QAAQ,gCAAU;AAClB;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,QAAQ,uBAAQ;AAChB;AACA;;;ACzEqC;AAC2C;AACtC;;AAE1C;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,wBAAwB,OAAO;AAC/B,4BAA4B,OAAO;AACnC;AACA;;AAEA;AACA;AACA;AACA,8BAA8B,+CAAmB;AACjD;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN,eAAe,+CAAmB;;AAElC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB,+CAAmB;;AAExC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,iBAAiB;AACrC,qDAAqD;AACrD;AACA;AACA,oBAAoB,iBAAiB;AACrC,qDAAqD;AACrD;;AAEA;AACA;AACA,QAAQ,gCAAU;AAClB;AACA;AACA;AACA,SAAS;AACT;;AAEA,IAAI,uBAAQ;AACZ;;AAEO;AACP;;AAEA;AACA,oBAAoB,iBAAiB;AACrC;AACA,qBAAqB,+CAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;;;AClJsC;;AAEtC;AACA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA,gBAAgB,IAAI;;AAEpB;AACA,mDAAmD,gBAAgB,cAAc,GAAG;;AAEpF;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrCqC;AACgB;AACX;AACsC;;AAEhF;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;;AAEA,eAAe,+CAAmB;;AAElC;AACA,MAAM;AACN;AACA,wBAAwB,6BAA6B;AACrD,4BAA4B,gCAAgC;AAC5D;AACA;AACA,iCAAiC,+CAAmB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;AACP;;AAEA;;AAEA;AACA,wBAAwB;AACxB,MAAM;AACN;AACA;;AAEA;;AAEA;AACA,2BAA2B,iCAAqB;;AAEhD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,IAAI,gCAAU;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA,IAAI,uBAAQ;AACZ;;;;;ACtFA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEO;AACP;;AAEA;AACA;;AAEO;AACP;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,KAAK;AACL;;;;;AC7CqD;;AAE9C;AACP;;AAEA;;AAEA;AACA,uBAAuB,iCAAqB;;AAE5C;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEO;AACP;;AAEA;AACA,uBAAuB,iCAAqB;;AAE5C;AACA;;AAEA;AACA;;;;;ACjC2C;;AAEH;AAalB;AACqG;AAClD;AAYjD;AACkG;AAC9C;AAC1B;AACc;AACJ;AACM;AACzB;AACsB;AACoF;AAC1F;AAClB;AACqB;AACf;AACS;AACjB;AACsB;AACd;AACQ;AACE;AACb;;AAE1C;AACA,oBAAoB,kCAAkC;AACtD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ,aAAa;AACrB;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,0CAA0C;AAClE;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,sCAAsC;AAC9D,kCAAkC,mCAAkB;AACpD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,4BAA4B,kBAAkB;;AAE9C,oBAAoB,qBAAqB;AACzC;AACA,QAAQ,gBAAgB;AACxB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,gCAAgC;AACxD;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC,yBAAyB,+CAAmB;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wCAAwC,iBAAiB;AACzD;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,SAAS;AACT;AACA;;AAEO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA,IAAI,WAAW;;AAEf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oBAAQ;;AAE5C;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,4CAA4C,oBAAoB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;;AAET;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;;AAET;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEO;AACP;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEO;AACP;AACA;;AAEA;AACA;;AAEO;AACP;;AAEA;;AAEA;;AAEA,IAAI,uBAAQ;AACZ;;AAEA;AACA,kBAAkB,2BAAS;AAC3B;AACA;AACA;AACA,mBAAmB,2CAAyB;AAC5C,SAAS;AACT;AACA;AACA;AACA;AACA,mBAAmB,gCAAc;AACjC,SAAS;AACT;AACA,qBAAqB,8BAAY;AACjC,oBAAoB,6BAAW;AAC/B,2BAA2B,oCAAkB;AAC7C,wBAAwB,iCAAe;AACvC,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB,iBAAiB,QAAQ;AACzB,2BAA2B,kBAAkB;AAC7C,iBAAiB,QAAQ;AACzB,2BAA2B,kBAAkB;AAC7C,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B,SAAS;AACT;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,SAAS;AACT;AACA,kBAAkB,SAAS;AAC3B,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB,mBAAmB,UAAU;AAC7B,mBAAmB,UAAU;AAC7B,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA,mBAAmB,SAAS;AAC5B,SAAS;AACT;AACA,iBAAiB,uBAAQ;AACzB;AACA;AACA;AACA,mBAAmB,uBAAQ;AAC3B,SAAS;AACT;AACA;AACA;AACA;AACA,mBAAmB,2BAAY;AAC/B,SAAS;AACT;AACA;AACA;AACA;AACA,mBAAmB,0BAAW;AAC9B,SAAS;AACT;AACA,eAAe,MAAM;AACrB,oBAAoB,WAAW;AAC/B,kBAAkB,SAAS;AAC3B,mBAAmB,UAAU;AAC7B,kBAAkB,SAAS;AAC3B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B,SAAS;AACT;AACA,mBAAmB,UAAU;AAC7B,qBAAqB,YAAY;AACjC,mBAAmB,UAAU;AAC7B,qBAAqB,YAAY;AACjC,sBAAsB,aAAa;AACnC,sBAAsB,aAAa;AACnC,kBAAkB,4BAAS;AAC3B,aAAa,uBAAI;AACjB,iBAAiB,QAAQ;AACzB,oBAAoB,WAAW;AAC/B,oBAAoB,WAAW;AAC/B,gBAAgB,uBAAO;AACvB,aAAa,0BAAI;AACjB,aAAa,0BAAI;AACjB,gBAAgB,wBAAO;AACvB,0BAA0B,kCAAiB;AAC3C,iBAAiB,yBAAQ;AACzB,kBAAkB,kBAAkB;AACpC,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA,mBAAmB,oBAAO;AAC1B,SAAS;AACT;AACA,gBAAgB,oBAAO;AACvB,mBAAmB,UAAU;AAC7B,mBAAmB,UAAU;AAC7B,kBAAkB,0BAAS;AAC3B,kBAAkB,0BAAS;AAC3B,2BAA2B,mCAAkB;AAC7C,mBAAmB,UAAU;AAC7B,oBAAoB,kBAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B,cAAc;AACd,gBAAgB,IAAI;AACpB;AACA,SAAS;AACT;AACA,cAAc,KAAK;AACnB,uBAAuB,+BAAc;AACrC,yBAAyB,gBAAgB;AACzC,uBAAuB,iCAAc;AACrC,iBAAiB,0BAAQ;AACzB,mBAAmB,4BAAU;AAC7B,oBAAoB,WAAW;AAC/B,mBAAmB,UAAU;AAC7B,uBAAuB,gCAAc;AACrC,iBAAiB,uBAAQ;AACzB,aAAa,IAAI;AACjB,cAAc,KAAK;AACnB,aAAa,IAAI;AACjB,aAAa,IAAI;AACjB,cAAc,KAAK;AACnB,WAAW,EAAE;AACb,mBAAmB,yBAAU;AAC7B,qBAAqB,2BAAY;AACjC;;AAEA;;;;;ACxtB2C;AACH;AACuB;AACQ;AAC2B;AAC7D;AACU;AACe;;AAE9D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB,2BAA2B,2BAA2B;AACtD;AACA,aAAa;AACb;AACA;AACA;;AAEA,oBAAoB,kBAAkB;AACtC;AACA;AACA,qBAAqB;AACrB,kBAAkB;AAClB;AACA;;AAEA;;AAEA;;AAEA,gBAAgB,cAAc;AAC9B,oBAAoB,iCAAa;;AAEjC,oBAAoB,uBAAQ;AAC5B,iBAAiB;AACjB,aAAa;AACb;AACA;AACA,oBAAoB,iCAAa;AACjC;AACA,aAAa;AACb;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;;AAEA;;AAEA,wBAAwB,cAAc;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb,kBAAkB,cAAc;AAChC;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,6BAA6B,2BAAe;;AAE5C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qCAAqC,mCAAkB;AACvD,6BAA6B,2BAAU;AACvC,8BAA8B,2BAAW;AACzC,8BAA8B,2BAAW;AACzC,4BAA4B,oBAAoB;AAChD,4BAA4B,SAAS;;AAErC;AACA;AACA;AACA;;AAEA;AACA;AACA,8DAA8D,WAAW,8BAA8B;AACvG,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;;AAEA,IAAI,2BAAW;;AAEf;AACA;AACA,QAAQ,SAAS;AACjB,MAAM;AACN,QAAQ,SAAS;AACjB;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA,kDAAe,OAAO,EAAC;;;;ACtNvB;;AAEiD;;AAER;AACS;;AAEJ;AACH;AACF;;AAEzC,WAAW;AACX;AACA;;AAEA;AACA,QAAQ,aAAO;AACf,YAAY,WAAW;;AAEvB;AACA,YAAY,uBAAQ;AACpB,SAAS;;AAET;AACA,MAAM;AACN;AACA;AACA;;AAEA,WAAW;AACX,8BAA8B,WAAW;AACzC;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA,WAAW;AACX;AACA;;AAEA,WAAW;AACX;AACA,iCAAiC,WAAW;AAC5C,QAAQ,WAAW;;AAEnB;;AAEA;AACA;;AAEA;AACA,YAAY,aAAa;AACzB;AACA;AACA;;AAEA,WAAW;AACX,mCAAmC,mBAAmB,WAAW,kCAAkC;AACnG,4BAA4B,WAAW;;AAEvC,QAAQ,WAAW;AACnB;AACA;;AAEA,WAAW;;AAEX,WAAW;;AAEX,WAAW;;AAEX,WAAW;AACX,WAAW,OAAO;AAClB;;AAEA,eAAe,OAAO;AACtB,IAAI,WAAW;AACf,CAAC;;AAED,wCAAe,WAAW,aAAa,EAAC","sources":["webpack://jspreadsheet/./src/utils/orderBy.js","webpack://jspreadsheet/./src/utils/footer.js","webpack://jspreadsheet/./src/utils/pagination.js","webpack://jspreadsheet/./src/utils/freeze.js","webpack://jspreadsheet/./src/utils/toolbar.js","webpack://jspreadsheet/./src/utils/lazyLoading.js","webpack://jspreadsheet/./src/utils/internal.js","webpack://jspreadsheet/./src/utils/meta.js","webpack://jspreadsheet/./src/utils/selection.js","webpack://jspreadsheet/./src/utils/internalHelpers.js","webpack://jspreadsheet/./src/utils/dispatch.js","webpack://jspreadsheet/./src/utils/filter.js","webpack://jspreadsheet/./src/utils/merges.js","webpack://jspreadsheet/./src/utils/history.js","webpack://jspreadsheet/./src/utils/helpers.js","webpack://jspreadsheet/webpack/bootstrap","webpack://jspreadsheet/webpack/runtime/define property getters","webpack://jspreadsheet/webpack/runtime/hasOwnProperty shorthand","webpack://jspreadsheet/webpack/runtime/make namespace object","webpack://jspreadsheet/./src/utils/libraryBase.js","webpack://jspreadsheet/./src/utils/editor.js","webpack://jspreadsheet/./src/utils/keys.js","webpack://jspreadsheet/./src/utils/copyPaste.js","webpack://jspreadsheet/./src/utils/columns.js","webpack://jspreadsheet/./src/utils/rows.js","webpack://jspreadsheet/./src/utils/version.js","webpack://jspreadsheet/./src/utils/events.js","webpack://jspreadsheet/./src/utils/data.js","webpack://jspreadsheet/./src/utils/search.js","webpack://jspreadsheet/./src/utils/headers.js","webpack://jspreadsheet/./src/utils/style.js","webpack://jspreadsheet/./src/utils/download.js","webpack://jspreadsheet/./src/utils/comments.js","webpack://jspreadsheet/./src/utils/config.js","webpack://jspreadsheet/./src/utils/cells.js","webpack://jspreadsheet/./src/utils/worksheets.js","webpack://jspreadsheet/./src/utils/factory.js","webpack://jspreadsheet/./src/index.js"],"sourcesContent":["\nimport { setHistory } from './history.js';\nimport dispatch from './dispatch.js';\nimport { updateTableReferences } from './internal.js';\nimport { loadPage } from './lazyLoading.js';\nimport { closeFilter } from './filter.js';\n\n/**\n * Update order arrow\n */\nexport const updateOrderArrow = function (column, order) {\n const obj = this;\n\n // Remove order\n for (let i = 0; i < obj.headers.length; i++) {\n obj.headers[i].classList.remove('arrow-up');\n obj.headers[i].classList.remove('arrow-down');\n }\n\n // No order specified then toggle order\n if (order) {\n obj.headers[column].classList.add('arrow-up');\n } else {\n obj.headers[column].classList.add('arrow-down');\n }\n};\n\n/**\n * Update rows position\n */\nexport const updateOrder = function (rows) {\n const obj = this;\n\n // History\n let data = [];\n for (let j = 0; j < rows.length; j++) {\n data[j] = obj.options.data[rows[j]];\n }\n obj.options.data = data;\n\n data = [];\n for (let j = 0; j < rows.length; j++) {\n data[j] = obj.records[rows[j]];\n\n for (let i = 0; i < data[j].length; i++) {\n data[j][i].y = j;\n }\n }\n obj.records = data;\n\n data = [];\n for (let j = 0; j < rows.length; j++) {\n data[j] = obj.rows[rows[j]];\n data[j].y = j;\n }\n obj.rows = data;\n\n // Update references\n updateTableReferences.call(obj);\n\n // Redo search\n if (obj.results && obj.results.length) {\n if (obj.searchInput.value) {\n obj.search(obj.searchInput.value);\n } else {\n closeFilter.call(obj);\n }\n } else {\n // Create page\n obj.results = null;\n obj.pageNumber = 0;\n\n if (obj.options.pagination > 0) {\n obj.page(0);\n } else if (obj.options.lazyLoading == true) {\n loadPage.call(obj, 0);\n } else {\n for (let j = 0; j < obj.rows.length; j++) {\n obj.tbody.appendChild(obj.rows[j].element);\n }\n }\n }\n};\n\n/**\n * Sort data and reload table\n */\nexport const orderBy = function (column, order) {\n const obj = this;\n\n if (column >= 0) {\n // Merged cells\n if (obj.options.mergeCells && Object.keys(obj.options.mergeCells).length > 0) {\n if (!confirm(jSuites.translate('This action will destroy any existing merged cells. Are you sure?'))) {\n return false;\n } else {\n // Remove merged cells\n obj.destroyMerge();\n }\n }\n\n // Direction\n if (order == null) {\n order = obj.headers[column].classList.contains('arrow-down') ? 1 : 0;\n } else {\n order = order ? 1 : 0;\n }\n\n // Test order\n let temp = [];\n if (\n obj.options.columns &&\n obj.options.columns[column] &&\n (obj.options.columns[column].type == 'number' ||\n obj.options.columns[column].type == 'numeric' ||\n obj.options.columns[column].type == 'percentage' ||\n obj.options.columns[column].type == 'autonumber' ||\n obj.options.columns[column].type == 'color')\n ) {\n for (let j = 0; j < obj.options.data.length; j++) {\n temp[j] = [j, Number(obj.options.data[j][column])];\n }\n } else if (\n obj.options.columns &&\n obj.options.columns[column] &&\n (obj.options.columns[column].type == 'calendar' || obj.options.columns[column].type == 'checkbox' || obj.options.columns[column].type == 'radio')\n ) {\n for (let j = 0; j < obj.options.data.length; j++) {\n temp[j] = [j, obj.options.data[j][column]];\n }\n } else {\n for (let j = 0; j < obj.options.data.length; j++) {\n temp[j] = [j, obj.records[j][column].element.textContent.toLowerCase()];\n }\n }\n\n // Default sorting method\n if (typeof obj.parent.config.sorting !== 'function') {\n obj.parent.config.sorting = function (direction) {\n return function (a, b) {\n const valueA = a[1];\n const valueB = b[1];\n\n if (!direction) {\n return valueA === '' && valueB !== '' ? 1 : valueA !== '' && valueB === '' ? -1 : valueA > valueB ? 1 : valueA < valueB ? -1 : 0;\n } else {\n return valueA === '' && valueB !== '' ? 1 : valueA !== '' && valueB === '' ? -1 : valueA > valueB ? -1 : valueA < valueB ? 1 : 0;\n }\n };\n };\n }\n\n temp = temp.sort(obj.parent.config.sorting(order));\n\n // Save history\n const newValue = [];\n for (let j = 0; j < temp.length; j++) {\n newValue[j] = temp[j][0];\n }\n\n // Save history\n setHistory.call(obj, {\n action: 'orderBy',\n rows: newValue,\n column: column,\n order: order,\n });\n\n // Update order\n updateOrderArrow.call(obj, column, order);\n updateOrder.call(obj, newValue);\n\n // On sort event\n dispatch.call(\n obj,\n 'onsort',\n obj,\n column,\n order,\n newValue.map((row) => row)\n );\n\n return true;\n }\n};\n","import { parseValue } from './internal.js';\n\nexport const setFooter = function (data) {\n const obj = this;\n\n if (data) {\n obj.options.footers = data;\n }\n\n if (obj.options.footers) {\n if (!obj.tfoot) {\n obj.tfoot = document.createElement('tfoot');\n obj.table.appendChild(obj.tfoot);\n }\n\n for (let j = 0; j < obj.options.footers.length; j++) {\n let tr;\n\n if (obj.tfoot.children[j]) {\n tr = obj.tfoot.children[j];\n } else {\n tr = document.createElement('tr');\n const td = document.createElement('td');\n tr.appendChild(td);\n obj.tfoot.appendChild(tr);\n }\n for (let i = 0; i < obj.headers.length; i++) {\n if (!obj.options.footers[j][i]) {\n obj.options.footers[j][i] = '';\n }\n\n let td;\n\n if (obj.tfoot.children[j].children[i + 1]) {\n td = obj.tfoot.children[j].children[i + 1];\n } else {\n td = document.createElement('td');\n tr.appendChild(td);\n\n // Text align\n const colAlign = obj.options.columns[i].align || obj.options.defaultColAlign || 'center';\n td.style.textAlign = colAlign;\n }\n td.textContent = parseValue.call(obj, +obj.records.length + i, j, obj.options.footers[j][i]);\n\n // Hide/Show with hideColumn()/showColumn()\n td.style.display = obj.cols[i].colElement.style.display;\n }\n }\n }\n};\n","\n\nimport dispatch from './dispatch.js';\nimport { updateCornerPosition } from './selection.js';\n\n/**\n * Which page the row is\n */\nexport const whichPage = function (row) {\n const obj = this;\n\n // Search\n if ((obj.options.search == true || obj.options.filters == true) && obj.results) {\n row = obj.results.indexOf(row);\n }\n\n return Math.ceil((parseInt(row) + 1) / parseInt(obj.options.pagination)) - 1;\n};\n\n/**\n * Update the pagination\n */\nexport const updatePagination = function () {\n const obj = this;\n\n // Reset container\n obj.pagination.children[0].innerHTML = '';\n obj.pagination.children[1].innerHTML = '';\n\n // Start pagination\n if (obj.options.pagination) {\n // Searchable\n let results;\n\n if ((obj.options.search == true || obj.options.filters == true) && obj.results) {\n results = obj.results.length;\n } else {\n results = obj.rows.length;\n }\n\n if (!results) {\n // No records found\n obj.pagination.children[0].innerHTML = jSuites.translate('No records found');\n } else {\n // Pagination container\n const quantyOfPages = Math.ceil(results / obj.options.pagination);\n\n let startNumber, finalNumber;\n\n if (obj.pageNumber < 6) {\n startNumber = 1;\n finalNumber = quantyOfPages < 10 ? quantyOfPages : 10;\n } else if (quantyOfPages - obj.pageNumber < 5) {\n startNumber = quantyOfPages - 9;\n finalNumber = quantyOfPages;\n if (startNumber < 1) {\n startNumber = 1;\n }\n } else {\n startNumber = obj.pageNumber - 4;\n finalNumber = obj.pageNumber + 5;\n }\n\n // First\n if (startNumber > 1) {\n const paginationItem = document.createElement('div');\n paginationItem.className = 'jss_page';\n paginationItem.innerHTML = '<';\n paginationItem.title = 1;\n obj.pagination.children[1].appendChild(paginationItem);\n }\n\n // Get page links\n for (let i = startNumber; i <= finalNumber; i++) {\n const paginationItem = document.createElement('div');\n paginationItem.className = 'jss_page';\n paginationItem.innerHTML = i;\n obj.pagination.children[1].appendChild(paginationItem);\n\n if (obj.pageNumber == i - 1) {\n paginationItem.classList.add('jss_page_selected');\n }\n }\n\n // Last\n if (finalNumber < quantyOfPages) {\n const paginationItem = document.createElement('div');\n paginationItem.className = 'jss_page';\n paginationItem.innerHTML = '>';\n paginationItem.title = quantyOfPages;\n obj.pagination.children[1].appendChild(paginationItem);\n }\n\n // Text\n const format = function (format) {\n const args = Array.prototype.slice.call(arguments, 1);\n return format.replace(/{(\\d+)}/g, function (match, number) {\n return typeof args[number] != 'undefined' ? args[number] : match;\n });\n };\n\n obj.pagination.children[0].innerHTML = format(jSuites.translate('Showing page {0} of {1} entries'), obj.pageNumber + 1, quantyOfPages);\n }\n }\n};\n\n/**\n * Go to page\n */\nexport const page = function (pageNumber) {\n const obj = this;\n\n const oldPage = obj.pageNumber;\n\n // Search\n let results;\n\n if ((obj.options.search == true || obj.options.filters == true) && obj.results) {\n results = obj.results;\n } else {\n results = obj.rows;\n }\n\n // Per page\n const quantityPerPage = parseInt(obj.options.pagination);\n\n // pageNumber\n if (pageNumber == null || pageNumber == -1) {\n // Last page\n pageNumber = Math.ceil(results.length / quantityPerPage) - 1;\n }\n\n // Page number\n obj.pageNumber = pageNumber;\n\n let startRow = pageNumber * quantityPerPage;\n let finalRow = pageNumber * quantityPerPage + quantityPerPage;\n if (finalRow > results.length) {\n finalRow = results.length;\n }\n if (startRow < 0) {\n startRow = 0;\n }\n\n // Reset container\n while (obj.tbody.firstChild) {\n obj.tbody.removeChild(obj.tbody.firstChild);\n }\n\n // Appeding items\n for (let j = startRow; j < finalRow; j++) {\n if ((obj.options.search == true || obj.options.filters == true) && obj.results) {\n obj.tbody.appendChild(obj.rows[results[j]].element);\n } else {\n obj.tbody.appendChild(obj.rows[j].element);\n }\n }\n\n if (obj.options.pagination > 0) {\n updatePagination.call(obj);\n }\n\n // Update corner position\n updateCornerPosition.call(obj);\n\n // Events\n dispatch.call(obj, 'onchangepage', obj, pageNumber, oldPage, obj.options.pagination);\n};\n\nexport const quantiyOfPages = function () {\n const obj = this;\n\n let results;\n if ((obj.options.search == true || obj.options.filters == true) && obj.results) {\n results = obj.results.length;\n } else {\n results = obj.rows.length;\n }\n\n return Math.ceil(results / obj.options.pagination);\n};\n","// Get width of all freezed cells together\nexport const getFreezeWidth = function () {\n const obj = this;\n\n let width = 0;\n if (obj.options.freezeColumns > 0) {\n for (let i = 0; i < obj.options.freezeColumns; i++) {\n let columnWidth;\n if (obj.options.columns && obj.options.columns[i] && obj.options.columns[i].width !== undefined) {\n columnWidth = parseInt(obj.options.columns[i].width);\n } else {\n columnWidth = obj.options.defaultColWidth !== undefined ? parseInt(obj.options.defaultColWidth) : 100;\n }\n\n width += columnWidth;\n }\n }\n return width;\n};\n","\nimport { getCellNameFromCoords } from './helpers.js';\nimport { getWorksheetInstance } from './internal.js';\n\nconst setItemStatus = function (toolbarItem, worksheet) {\n if (worksheet.options.editable != false) {\n toolbarItem.classList.remove('jtoolbar-disabled');\n } else {\n toolbarItem.classList.add('jtoolbar-disabled');\n }\n};\n\nexport const getDefault = function () {\n const items = [];\n const spreadsheet = this;\n\n const getActive = function () {\n return getWorksheetInstance.call(spreadsheet);\n };\n\n items.push({\n content: 'undo',\n onclick: function () {\n const worksheet = getActive();\n\n worksheet.undo();\n },\n });\n\n items.push({\n content: 'redo',\n onclick: function () {\n const worksheet = getActive();\n\n worksheet.redo();\n },\n });\n\n items.push({\n content: 'save',\n onclick: function () {\n const worksheet = getActive();\n\n if (worksheet) {\n worksheet.download();\n }\n },\n });\n\n items.push({\n type: 'divisor',\n });\n\n items.push({\n type: 'select',\n width: '120px',\n options: ['Default', 'Verdana', 'Arial', 'Courier New'],\n render: function (e) {\n return '<span style=\"font-family:' + e + '\">' + e + '</span>';\n },\n onchange: function (a, b, c, d, e) {\n const worksheet = getActive();\n\n let cells = worksheet.getSelected(true);\n if (cells) {\n let value = !e ? '' : d;\n\n worksheet.setStyle(\n Object.fromEntries(\n cells.map(function (cellName) {\n return [cellName, 'font-family: ' + value];\n })\n )\n );\n }\n },\n updateState: function (a, b, toolbarItem) {\n setItemStatus(toolbarItem, getActive());\n },\n });\n\n items.push({\n type: 'select',\n width: '48px',\n content: 'format_size',\n options: ['x-small', 'small', 'medium', 'large', 'x-large'],\n render: function (e) {\n return '<span style=\"font-size:' + e + '\">' + e + '</span>';\n },\n onchange: function (a, b, c, value) {\n const worksheet = getActive();\n\n let cells = worksheet.getSelected(true);\n if (cells) {\n worksheet.setStyle(\n Object.fromEntries(\n cells.map(function (cellName) {\n return [cellName, 'font-size: ' + value];\n })\n )\n );\n }\n },\n updateState: function (a, b, toolbarItem) {\n setItemStatus(toolbarItem, getActive());\n },\n });\n\n items.push({\n type: 'select',\n options: ['left', 'center', 'right', 'justify'],\n render: function (e) {\n return '<i class=\"material-icons\">format_align_' + e + '</i>';\n },\n onchange: function (a, b, c, value) {\n const worksheet = getActive();\n\n let cells = worksheet.getSelected(true);\n if (cells) {\n worksheet.setStyle(\n Object.fromEntries(\n cells.map(function (cellName) {\n return [cellName, 'text-align: ' + value];\n })\n )\n );\n }\n },\n updateState: function (a, b, toolbarItem) {\n setItemStatus(toolbarItem, getActive());\n },\n });\n\n items.push({\n content: 'format_bold',\n onclick: function () {\n const worksheet = getActive();\n\n let cells = worksheet.getSelected(true);\n if (cells) {\n worksheet.setStyle(\n Object.fromEntries(\n cells.map(function (cellName) {\n return [cellName, 'font-weight:bold'];\n })\n )\n );\n }\n },\n updateState: function (a, b, toolbarItem) {\n setItemStatus(toolbarItem, getActive());\n },\n });\n\n items.push({\n type: 'color',\n content: 'format_color_text',\n k: 'color',\n updateState: function (a, b, toolbarItem) {\n setItemStatus(toolbarItem, getActive());\n },\n });\n\n items.push({\n type: 'color',\n content: 'format_color_fill',\n k: 'background-color',\n updateState: function (a, b, toolbarItem, d) {\n setItemStatus(toolbarItem, getActive());\n },\n });\n\n let verticalAlign = ['top', 'middle', 'bottom'];\n\n items.push({\n type: 'select',\n options: ['vertical_align_top', 'vertical_align_center', 'vertical_align_bottom'],\n render: function (e) {\n return '<i class=\"material-icons\">' + e + '</i>';\n },\n value: 1,\n onchange: function (a, b, c, d, value) {\n const worksheet = getActive();\n\n let cells = worksheet.getSelected(true);\n if (cells) {\n worksheet.setStyle(\n Object.fromEntries(\n cells.map(function (cellName) {\n return [cellName, 'vertical-align: ' + verticalAlign[value]];\n })\n )\n );\n }\n },\n updateState: function (a, b, toolbarItem) {\n setItemStatus(toolbarItem, getActive());\n },\n });\n\n items.push({\n content: 'web',\n tooltip: jSuites.translate('Merge the selected cells'),\n onclick: function () {\n const worksheet = getActive();\n\n if (worksheet.selectedCell && confirm(jSuites.translate('The merged cells will retain the value of the top-left cell only. Are you sure?'))) {\n const selectedRange = [\n Math.min(worksheet.selectedCell[0], worksheet.selectedCell[2]),\n Math.min(worksheet.selectedCell[1], worksheet.selectedCell[3]),\n Math.max(worksheet.selectedCell[0], worksheet.selectedCell[2]),\n Math.max(worksheet.selectedCell[1], worksheet.selectedCell[3]),\n ];\n\n let cell = getCellNameFromCoords(selectedRange[0], selectedRange[1]);\n if (worksheet.records[selectedRange[1]][selectedRange[0]].element.getAttribute('data-merged')) {\n worksheet.removeMerge(cell);\n } else {\n let colspan = selectedRange[2] - selectedRange[0] + 1;\n let rowspan = selectedRange[3] - selectedRange[1] + 1;\n\n if (colspan !== 1 || rowspan !== 1) {\n worksheet.setMerge(cell, colspan, rowspan);\n }\n }\n }\n },\n updateState: function (a, b, toolbarItem) {\n setItemStatus(toolbarItem, getActive());\n },\n });\n\n items.push({\n type: 'select',\n options: [\n 'border_all',\n 'border_outer',\n 'border_inner',\n 'border_horizontal',\n 'border_vertical',\n 'border_left',\n 'border_top',\n 'border_right',\n 'border_bottom',\n 'border_clear',\n ],\n columns: 5,\n render: function (e) {\n return '<i class=\"material-icons\">' + e + '</i>';\n },\n right: true,\n onchange: function (a, b, c, d) {\n const worksheet = getActive();\n\n if (worksheet.selectedCell) {\n const selectedRange = [\n Math.min(worksheet.selectedCell[0], worksheet.selectedCell[2]),\n Math.min(worksheet.selectedCell[1], worksheet.selectedCell[3]),\n Math.max(worksheet.selectedCell[0], worksheet.selectedCell[2]),\n Math.max(worksheet.selectedCell[1], worksheet.selectedCell[3]),\n ];\n\n let type = d;\n\n if (selectedRange) {\n // Default options\n let thickness = b.thickness || 1;\n let color = b.color || 'black';\n const borderStyle = b.style || 'solid';\n\n if (borderStyle === 'double') {\n thickness += 2;\n }\n\n let style = {};\n\n // Matrix\n let px = selectedRange[0];\n let py = selectedRange[1];\n let ux = selectedRange[2];\n let uy = selectedRange[3];\n\n const setBorder = function (columnName, i, j) {\n let border = ['', '', '', ''];\n\n if (\n ((type === 'border_top' || type === 'border_outer') && j === py) ||\n ((type === 'border_inner' || type === 'border_horizontal') && j > py) ||\n type === 'border_all'\n ) {\n border[0] = 'border-top: ' + thickness + 'px ' + borderStyle + ' ' + color;\n } else {\n border[0] = 'border-top: ';\n }\n\n if ((type === 'border_all' || type === 'border_right' || type === 'border_outer') && i === ux) {\n border[1] = 'border-right: ' + thickness + 'px ' + borderStyle + ' ' + color;\n } else {\n border[1] = 'border-right: ';\n }\n\n if ((type === 'border_all' || type === 'border_bottom' || type === 'border_outer') && j === uy) {\n border[2] = 'border-bottom: ' + thickness + 'px ' + borderStyle + ' ' + color;\n } else {\n border[2] = 'border-bottom: ';\n }\n\n if (\n ((type === 'border_left' || type === 'border_outer') && i === px) ||\n ((type === 'border_inner' || type === 'border_vertical') && i > px) ||\n type === 'border_all'\n ) {\n border[3] = 'border-left: ' + thickness + 'px ' + borderStyle + ' ' + color;\n } else {\n border[3] = 'border-left: ';\n }\n\n style[columnName] = border.join(';');\n };\n\n for (let j = selectedRange[1]; j <= selectedRange[3]; j++) {\n // Row - py - uy\n for (let i = selectedRange[0]; i <= selectedRange[2]; i++) {\n // Col - px - ux\n setBorder(getCellNameFromCoords(i, j), i, j);\n\n if (worksheet.records[j][i].element.getAttribute('data-merged')) {\n setBorder(getCellNameFromCoords(selectedRange[0], selectedRange[1]), i, j);\n }\n }\n }\n\n if (Object.keys(style)) {\n worksheet.setStyle(style);\n }\n }\n }\n },\n onload: function (a, b) {\n // Border color\n let container = document.createElement('div');\n let div = document.createElement('div');\n container.appendChild(div);\n\n let colorPicker = jSuites.color(div, {\n closeOnChange: false,\n onchange: function (o, v) {\n o.parentNode.children[1].style.color = v;\n b.color = v;\n },\n });\n\n let i = document.createElement('i');\n i.classList.add('material-icons');\n i.innerHTML = 'color_lens';\n i.onclick = function () {\n colorPicker.open();\n };\n container.appendChild(i);\n a.children[1].appendChild(container);\n\n div = document.createElement('div');\n jSuites.picker(div, {\n type: 'select',\n data: [1, 2, 3, 4, 5],\n render: function (e) {\n return '<div style=\"height: ' + e + 'px; width: 30px; background-color: black;\"></div>';\n },\n onchange: function (a, k, c, d) {\n b.thickness = d;\n },\n width: '50px',\n });\n a.children[1].appendChild(div);\n\n const borderStylePicker = document.createElement('div');\n jSuites.picker(borderStylePicker, {\n type: 'select',\n data: ['solid', 'dotted', 'dashed', 'double'],\n render: function (e) {\n if (e === 'double') {\n return '<div style=\"width: 30px; border-top: 3px ' + e + ' black;\"></div>';\n }\n return '<div style=\"width: 30px; border-top: 2px ' + e + ' black;\"></div>';\n },\n onchange: function (a, k, c, d) {\n b.style = d;\n },\n width: '50px',\n });\n a.children[1].appendChild(borderStylePicker);\n\n div = document.createElement('div');\n div.style.flex = '1';\n a.children[1].appendChild(div);\n },\n updateState: function (a, b, toolbarItem) {\n setItemStatus(toolbarItem, getActive());\n },\n });\n\n items.push({\n type: 'divisor',\n });\n\n items.push({\n content: 'fullscreen',\n tooltip: 'Toggle Fullscreen',\n onclick: function (a, b, c) {\n if (c.children[0].textContent === 'fullscreen') {\n spreadsheet.fullscreen(true);\n c.children[0].textContent = 'fullscreen_exit';\n } else {\n spreadsheet.fullscreen(false);\n c.children[0].textContent = 'fullscreen';\n }\n },\n updateState: function (a, b, c, d) {\n if (d.parent.config.fullscreen === true) {\n c.children[0].textContent = 'fullscreen_exit';\n } else {\n c.children[0].textContent = 'fullscreen';\n }\n },\n });\n\n return items;\n};\n\nconst adjustToolbarSettingsForJSuites = function (toolbar) {\n const spreadsheet = this;\n\n const items = toolbar.items;\n\n for (let i = 0; i < items.length; i++) {\n // Tooltip\n if (items[i].tooltip) {\n items[i].title = items[i].tooltip;\n\n delete items[i].tooltip;\n }\n\n if (items[i].type == 'select') {\n if (items[i].options) {\n items[i].data = items[i].options;\n delete items[i].options;\n } else {\n items[i].data = items[i].v;\n delete items[i].v;\n\n if (items[i].k && !items[i].onchange) {\n items[i].onchange = function (el, config, value) {\n const worksheet = getWorksheetInstance.call(spreadsheet);\n\n const cells = worksheet.getSelected(true);\n\n worksheet.setStyle(\n Object.fromEntries(\n cells.map(function (cellName) {\n return [cellName, items[i].k + ': ' + value];\n })\n )\n );\n };\n }\n }\n } else if (items[i].type == 'color') {\n items[i].type = 'i';\n\n items[i].onclick = function (a, b, c) {\n if (!c.color) {\n jSuites.color(c, {\n onchange: function (o, v) {\n const worksheet = getWorksheetInstance.call(spreadsheet);\n\n const cells = worksheet.getSelected(true);\n\n worksheet.setStyle(\n Object.fromEntries(\n cells.map(function (cellName) {\n return [cellName, items[i].k + ': ' + v];\n })\n )\n );\n },\n onopen: function (o) {\n o.color.select('');\n },\n });\n\n c.color.open();\n }\n };\n }\n }\n};\n\n/**\n * Create toolbar\n */\nexport const createToolbar = function (toolbar) {\n const spreadsheet = this;\n\n const toolbarElement = document.createElement('div');\n toolbarElement.classList.add('jss_toolbar');\n\n adjustToolbarSettingsForJSuites.call(spreadsheet, toolbar);\n\n if (typeof spreadsheet.plugins === 'object') {\n Object.entries(spreadsheet.plugins).forEach(function ([, plugin]) {\n if (typeof plugin.toolbar === 'function') {\n const result = plugin.toolbar(toolbar);\n\n if (result) {\n toolbar = result;\n }\n }\n });\n }\n\n jSuites.toolbar(toolbarElement, toolbar);\n\n return toolbarElement;\n};\n\nexport const updateToolbar = function (worksheet) {\n if (worksheet.parent.toolbar) {\n worksheet.parent.toolbar.toolbar.update(worksheet);\n }\n};\n\nexport const showToolbar = function () {\n const spreadsheet = this;\n\n if (spreadsheet.config.toolbar && !spreadsheet.toolbar) {\n let toolbar;\n\n if (Array.isArray(spreadsheet.config.toolbar)) {\n toolbar = {\n items: spreadsheet.config.toolbar,\n };\n } else if (typeof spreadsheet.config.toolbar === 'object') {\n toolbar = spreadsheet.config.toolbar;\n } else {\n toolbar = {\n items: getDefault.call(spreadsheet),\n };\n\n if (typeof spreadsheet.config.toolbar === 'function') {\n toolbar = spreadsheet.config.toolbar(toolbar);\n }\n }\n\n spreadsheet.toolbar = spreadsheet.element.insertBefore(createToolbar.call(spreadsheet, toolbar), spreadsheet.element.children[1]);\n }\n};\n\nexport const hideToolbar = function () {\n const spreadsheet = this;\n\n if (spreadsheet.toolbar) {\n spreadsheet.toolbar.parentNode.removeChild(spreadsheet.toolbar);\n\n delete spreadsheet.toolbar;\n }\n};\n","/**\n * Go to a page in a lazyLoading\n */\nexport const loadPage = function (pageNumber) {\n const obj = this;\n\n // Search\n let results;\n\n if ((obj.options.search == true || obj.options.filters == true) && obj.results) {\n results = obj.results;\n } else {\n results = obj.rows;\n }\n\n // Per page\n const quantityPerPage = 100;\n\n // pageNumber\n if (pageNumber == null || pageNumber == -1) {\n // Last page\n pageNumber = Math.ceil(results.length / quantityPerPage) - 1;\n }\n\n let startRow = pageNumber * quantityPerPage;\n let finalRow = pageNumber * quantityPerPage + quantityPerPage;\n if (finalRow > results.length) {\n finalRow = results.length;\n }\n startRow = finalRow - 100;\n if (startRow < 0) {\n startRow = 0;\n }\n\n // Appeding items\n for (let j = startRow; j < finalRow; j++) {\n if ((obj.options.search == true || obj.options.filters == true) && obj.results) {\n obj.tbody.appendChild(obj.rows[results[j]].element);\n } else {\n obj.tbody.appendChild(obj.rows[j].element);\n }\n\n if (obj.tbody.children.length > quantityPerPage) {\n obj.tbody.removeChild(obj.tbody.firstChild);\n }\n }\n};\n\nexport const loadValidation = function () {\n const obj = this;\n\n if (obj.selectedCell) {\n const currentPage = parseInt(obj.tbody.firstChild.getAttribute('data-y')) / 100;\n const selectedPage = parseInt(obj.selectedCell[3] / 100);\n const totalPages = parseInt(obj.rows.length / 100);\n\n if (currentPage != selectedPage && selectedPage <= totalPages) {\n if (!Array.prototype.indexOf.call(obj.tbody.children, obj.rows[obj.selectedCell[3]].element)) {\n obj.loadPage(selectedPage);\n return true;\n }\n }\n }\n\n return false;\n};\n\nexport const loadUp = function () {\n const obj = this;\n\n // Search\n let results;\n\n if ((obj.options.search == true || obj.options.filters == true) && obj.results) {\n results = obj.results;\n } else {\n results = obj.rows;\n }\n let test = 0;\n if (results.length > 100) {\n // Get the first element in the page\n let item = parseInt(obj.tbody.firstChild.getAttribute('data-y'));\n if ((obj.options.search == true || obj.options.filters == true) && obj.results) {\n item = results.indexOf(item);\n }\n if (item > 0) {\n for (let j = 0; j < 30; j++) {\n item = item - 1;\n if (item > -1) {\n if ((obj.options.search == true || obj.options.filters == true) && obj.results) {\n obj.tbody.insertBefore(obj.rows[results[item]].element, obj.tbody.firstChild);\n } else {\n obj.tbody.insertBefore(obj.rows[item].element, obj.tbody.firstChild);\n }\n if (obj.tbody.children.length > 100) {\n obj.tbody.removeChild(obj.tbody.lastChild);\n test = 1;\n }\n }\n }\n }\n }\n return test;\n};\n\nexport const loadDown = function () {\n const obj = this;\n\n // Search\n let results;\n\n if ((obj.options.search == true || obj.options.filters == true) && obj.results) {\n results = obj.results;\n } else {\n results = obj.rows;\n }\n let test = 0;\n if (results.length > 100) {\n // Get the last element in the page\n let item = parseInt(obj.tbody.lastChild.getAttribute('data-y'));\n if ((obj.options.search == true || obj.options.filters == true) && obj.results) {\n item = results.indexOf(item);\n }\n if (item < obj.rows.length - 1) {\n for (let j = 0; j <= 30; j++) {\n if (item < results.length) {\n if ((obj.options.search == true || obj.options.filters == true) && obj.results) {\n obj.tbody.appendChild(obj.rows[results[item]].element);\n } else {\n obj.tbody.appendChild(obj.rows[item].element);\n }\n if (obj.tbody.children.length > 100) {\n obj.tbody.removeChild(obj.tbody.firstChild);\n test = 1;\n }\n }\n item = item + 1;\n }\n }\n }\n\n return test;\n};\n","\n\n\nimport dispatch from './dispatch.js';\nimport { refreshSelection, updateCornerPosition } from './selection.js';\nimport { getCellNameFromCoords, getColumnName } from './helpers.js';\nimport { updateMeta } from './meta.js';\nimport { getFreezeWidth } from './freeze.js';\nimport { updatePagination } from './pagination.js';\nimport { setFooter } from './footer.js';\nimport { getColumnNameFromId, getIdFromColumnName, getFreezeColumnLeft, getFreezeRowTop } from './internalHelpers.js';\n\nexport const updateTable = function () {\n const obj = this;\n\n // Check for spare\n if (obj.options.minSpareRows > 0) {\n let numBlankRows = 0;\n for (let j = obj.rows.length - 1; j >= 0; j--) {\n let test = false;\n for (let i = 0; i < obj.headers.length; i++) {\n if (obj.options.data[j][i]) {\n test = true;\n }\n }\n if (test) {\n break;\n } else {\n numBlankRows++;\n }\n }\n\n if (obj.options.minSpareRows - numBlankRows > 0) {\n obj.insertRow(obj.options.minSpareRows - numBlankRows);\n }\n }\n\n if (obj.options.minSpareCols > 0) {\n let numBlankCols = 0;\n for (let i = obj.headers.length - 1; i >= 0; i--) {\n let test = false;\n for (let j = 0; j < obj.rows.length; j++) {\n if (obj.options.data[j][i]) {\n test = true;\n }\n }\n if (test) {\n break;\n } else {\n numBlankCols++;\n }\n }\n\n if (obj.options.minSpareCols - numBlankCols > 0) {\n obj.insertColumn(obj.options.minSpareCols - numBlankCols);\n }\n }\n\n // Update footers\n if (obj.options.footers) {\n setFooter.call(obj);\n }\n\n if (obj.options.columns.length < obj.options.minDimensions[0]) {\n obj.options.minDimensions[0] = obj.options.columns.length;\n }\n\n // Update corner position\n setTimeout(function () {\n updateCornerPosition.call(obj);\n }, 0);\n};\n\n/**\n * Trying to extract a number from a string\n */\nconst parseNumber = function (value, i, j) {\n const obj = this;\n\n let config = obj.options.columns && obj.options.columns[i];\n\n const cellName = getCellNameFromCoords(i, j);\n const cells = obj.options.cells;\n if (typeof cells === 'object' && cells[cellName]) {\n config = cells[cellName];\n }\n\n // Decimal point\n const decimal = config && config.decimal ? config : '.';\n\n // Parse both parts of the number\n let number = '' + value;\n number = number.split(decimal);\n number[0] = number[0].match(/[+-]?[0-9]/g);\n if (number[0]) {\n number[0] = number[0].join('');\n }\n if (number[1]) {\n number[1] = number[1].match(/[0-9]*/g).join('');\n }\n\n // Is a valid number\n if (number[0] && Number.isInteger(Number(number[0]))) {\n if (!number[1]) {\n value = Number(number[0] + '.00');\n } else {\n value = Number(number[0] + '.' + number[1]);\n }\n } else {\n value = null;\n }\n\n return value;\n};\n\n/**\n * Parse formulas\n */\nexport const executeFormula = function (expression, x, y) {\n const obj = this;\n\n const formulaResults = [];\n const formulaLoopProtection = [];\n\n // Execute formula with loop protection\n const execute = function (expression, x, y) {\n // Parent column identification\n const parentId = getColumnNameFromId([x, y]);\n\n // Code protection\n if (formulaLoopProtection[parentId]) {\n console.error('Reference loop detected');\n return '#ERROR';\n }\n\n formulaLoopProtection[parentId] = true;\n\n // Convert range tokens\n const tokensUpdate = function (tokens) {\n for (let index = 0; index < tokens.length; index++) {\n const f = [];\n const token = tokens[index].split(':');\n const e1 = getIdFromColumnName(token[0], true);\n const e2 = getIdFromColumnName(token[1], true);\n\n let x1, x2;\n\n if (e1[0] <= e2[0]) {\n x1 = e1[0];\n x2 = e2[0];\n } else {\n x1 = e2[0];\n x2 = e1[0];\n }\n\n let y1, y2;\n\n if (e1[1] <= e2[1]) {\n y1 = e1[1];\n y2 = e2[1];\n } else {\n y1 = e2[1];\n y2 = e1[1];\n }\n\n for (let j = y1; j <= y2; j++) {\n for (let i = x1; i <= x2; i++) {\n f.push(getColumnNameFromId([i, j]));\n }\n }\n\n expression = expression.replace(tokens[index], f.join(','));\n }\n };\n\n // Range with $ remove $\n expression = expression.replace(/\\$?([A-Z]+)\\$?([0-9]+)/g, '$1$2');\n\n let tokens = expression.match(/([A-Z]+[0-9]+):([A-Z]+[0-9]+)/g);\n if (tokens && tokens.length) {\n tokensUpdate(tokens);\n }\n\n // Get tokens\n tokens = expression.match(/([A-Z]+[0-9]+)/g);\n\n // Direct self-reference protection\n if (tokens && tokens.indexOf(parentId) > -1) {\n console.error('Self Reference detected');\n return '#ERROR';\n } else {\n // Expressions to be used in the parsing\n const formulaExpressions = {};\n\n if (tokens) {\n for (let i = 0; i < tokens.length; i++) {\n // Keep chain\n if (!obj.formula[tokens[i]]) {\n obj.formula[tokens[i]] = [];\n }\n // Is already in the register\n if (obj.formula[tokens[i]].indexOf(parentId) < 0) {\n obj.formula[tokens[i]].push(parentId);\n }\n\n // Do not calculate again\n if (eval('typeof(' + tokens[i] + ') == \"undefined\"')) {\n // Coords\n const position = getIdFromColumnName(tokens[i], 1);\n // Get value\n let value;\n\n if (typeof obj.options.data[position[1]] != 'undefined' && typeof obj.options.data[position[1]][position[0]] != 'undefined') {\n value = obj.options.data[position[1]][position[0]];\n } else {\n value = '';\n }\n // Get column data\n if (('' + value).substr(0, 1) == '=') {\n if (typeof formulaResults[tokens[i]] !== 'undefined') {\n value = formulaResults[tokens[i]];\n } else {\n value = execute(value, position[0], position[1]);\n formulaResults[tokens[i]] = value;\n }\n }\n // Type!\n if (('' + value).trim() == '') {\n // Null\n formulaExpressions[tokens[i]] = null;\n } else {\n if (value == Number(value) && obj.parent.config.autoCasting != false) {\n // Number\n formulaExpressions[tokens[i]] = Number(value);\n } else {\n // Trying any formatted number\n const number = parseNumber.call(obj, value, position[0], position[1]);\n if (obj.parent.config.autoCasting != false && number) {\n formulaExpressions[tokens[i]] = number;\n } else {\n formulaExpressions[tokens[i]] = '\"' + value + '\"';\n }\n }\n }\n }\n }\n }\n\n const ret = dispatch.call(obj, 'onbeforeformula', obj, expression, x, y);\n if (ret === false) {\n return expression;\n } else if (ret) {\n expression = ret;\n }\n\n // Convert formula to javascript\n let res;\n\n try {\n res = formula(expression.substr(1), formulaExpressions, x, y, obj);\n\n if (typeof res === 'function') {\n res = '#ERROR';\n }\n } catch (e) {\n res = '#ERROR';\n\n if (obj.parent.config.debugFormulas === true) {\n console.log(expression.substr(1), formulaExpressions, e);\n }\n }\n\n return res;\n }\n };\n\n return execute(expression, x, y);\n};\n\nexport const parseValue = function (i, j, value, cell) {\n const obj = this;\n\n if (('' + value).substr(0, 1) == '=' && obj.parent.config.parseFormulas != false) {\n value = executeFormula.call(obj, value, i, j);\n }\n\n let config = obj.options.columns && obj.options.columns[i];\n\n const cellName = getCellNameFromCoords(i, j);\n const cells = obj.options.cells;\n if (typeof cells === 'object' && cells[cellName]) {\n config = cells[cellName];\n }\n if (config && !isFormula(value)) {\n // Mask options\n let opt = null;\n if ((opt = getMask(config))) {\n if (value && value == Number(value)) {\n value = Number(value);\n }\n // Process the decimals to match the mask\n let masked = jSuites.mask.render(value, opt, true);\n // Negative indication\n if (cell) {\n if (opt.mask) {\n const t = opt.mask.split(';');\n if (t[1]) {\n const t1 = t[1].match(new RegExp('\\\\[Red\\\\]', 'gi'));\n if (t1) {\n if (value < 0) {\n cell.classList.add('red');\n } else {\n cell.classList.remove('red');\n }\n }\n const t2 = t[1].match(new RegExp('\\\\(', 'gi'));\n if (t2) {\n if (value < 0) {\n masked = '(' + masked + ')';\n }\n }\n }\n }\n }\n\n if (masked) {\n value = masked;\n }\n }\n }\n\n return value;\n};\n\n/**\n * Get dropdown value from key\n */\nconst getDropDownValue = function (source, key) {\n const obj = this;\n\n const value = [];\n\n if (source) {\n // Create array from source\n const combo = [];\n\n for (let i = 0; i < source.length; i++) {\n if (typeof source[i] == 'object') {\n combo[source[i].id] = source[i].name;\n } else {\n combo[source[i]] = source[i];\n }\n }\n\n // Guarantee single multiple compatibility\n const keys = Array.isArray(key) ? key : ('' + key).split(';');\n\n for (let i = 0; i < keys.length; i++) {\n if (typeof keys[i] === 'object') {\n value.push(combo[keys[i].id]);\n } else {\n if (combo[keys[i]]) {\n value.push(combo[keys[i]]);\n }\n }\n }\n } else {\n console.error('Invalid column');\n }\n\n return value.length > 0 ? value.join('; ') : '';\n};\n\nconst validDate = function (date) {\n date = '' + date;\n if (date.substr(4, 1) == '-' && date.substr(7, 1) == '-') {\n return true;\n } else {\n date = date.split('-');\n if (date[0].length == 4 && date[0] == Number(date[0]) && date[1].length == 2 && date[1] == Number(date[1])) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Strip tags\n */\nconst stripScript = function (a) {\n const b = new Option();\n b.innerHTML = a;\n let c = null;\n for (a = b.getElementsByTagName('script'); (c = a[0]); ) c.parentNode.removeChild(c);\n return b.innerHTML;\n};\n// i:col j: row\nexport const createCell = function (i, j, value) {\n const obj = this;\n\n // Create cell and properties\n let td = document.createElement('td');\n td.setAttribute('data-x', i);\n td.setAttribute('data-y', j);\n\n if (obj.headers[i].style.display === 'none') {\n td.style.display = 'none';\n }\n // Security\n if (('' + value).substr(0, 1) == '=' && obj.options.secureFormulas == true) {\n const val = secureFormula(value);\n if (val != value) {\n // Update the data container\n value = val;\n }\n }\n\n let config = obj.options.columns && obj.options.columns[i];\n\n const cellName = getCellNameFromCoords(i, j);\n const cells = obj.options.cells;\n if (typeof cells === 'object' && cells[cellName]) {\n config = cells[cellName];\n }\n // 先默认处理,然后渲染定制editor\n // Hidden column\n if (config && config.type == 'hidden') {\n td.style.display = 'none';\n td.textContent = value;\n } else if (config && (config.type == 'checkbox' || config.type == 'radio')) {\n // Create input\n const element = document.createElement('input');\n element.type = config.type;\n element.name = 'c' + i;\n element.checked = value == 1 || value == true || value == 'true' ? true : false;\n element.onclick = function () {\n obj.setValue(td, this.checked);\n };\n\n if (config.readOnly == true || obj.options.editable == false) {\n element.setAttribute('disabled', 'disabled');\n }\n\n // Append to the table\n td.appendChild(element);\n // Make sure the values are correct\n obj.options.data[j][i] = element.checked;\n } else if (config && config.type == 'calendar') {\n // Try formatted date\n let formatted = null;\n if (!validDate(value)) {\n const tmp = jSuites.calendar.extractDateFromString(value, (config.options && config.options.format) || 'YYYY-MM-DD');\n if (tmp) {\n formatted = tmp;\n }\n }\n // Create calendar cell\n td.textContent = jSuites.calendar.getDateString(formatted ? formatted : value, config.options && config.options.format);\n } else if (config && config.type == 'dropdown') {\n // Create dropdown cell\n td.classList.add('jss_dropdown');\n td.textContent = getDropDownValue.call(obj, config.source, value);\n } else if (config && config.type == 'color') {\n if (config.render == 'square') {\n const color = document.createElement('div');\n color.className = 'color';\n color.style.backgroundColor = value;\n td.appendChild(color);\n } else {\n td.style.color = value;\n td.textContent = value;\n }\n } else if (config && config.type == 'image') {\n if (value && value.substr(0, 10) == 'data:image') {\n const img = document.createElement('img');\n img.src = value;\n td.appendChild(img);\n }\n } else {\n if (config && config.type == 'html') {\n td.innerHTML = stripScript(parseValue.call(this, i, j, value, td));\n } else {\n if (obj.parent.config.parseHTML === true) {\n td.innerHTML = stripScript(parseValue.call(this, i, j, value, td));\n } else {\n td.textContent = parseValue.call(this, i, j, value, td);\n }\n }\n }\n\n // Custom column\n if (config && typeof config.type === 'object') {\n if (obj.parent.config.parseHTML === true) {\n td.innerHTML = value;\n }\n if (typeof config.type.createCell == 'function') {\n config.type.createCell(td, value, parseInt(i), parseInt(j), obj, config);\n }\n }\n\n // Readonly\n if (config && config.readOnly == true) {\n td.classList.add('readonly');\n }\n\n if (obj.options.freezeRows > j) {\n td.classList.add('jss_frozen_row');\n td.style.top = getFreezeRowTop(j, obj.options.rows);\n }\n\n if (obj.options.freezeColumns > i) {\n td.classList.add('jss_frozen');\n td.style.left = getFreezeColumnLeft(i, obj.options.columns);\n }\n\n // Text align\n const colAlign = (config && config.align) || obj.options.defaultColAlign || 'center';\n td.style.textAlign = colAlign;\n\n // Wrap option\n if ((!config || config.wordWrap != false) && (obj.options.wordWrap == true || (config && config.wordWrap == true) || td.innerHTML.length > 200)) {\n td.style.whiteSpace = 'pre-wrap';\n }\n\n // Overflow\n if (i > 0) {\n if (obj.options.textOverflow == true) {\n if (value || td.innerHTML) {\n obj.records[j][i - 1].element.style.overflow = 'hidden';\n } else {\n if (i == obj.options.columns.length - 1) {\n td.style.overflow = 'hidden';\n }\n }\n }\n }\n\n dispatch.call(obj, 'oncreatecell', obj, td, i, j, value);\n\n return td;\n};\n\n/**\n * Update cell content\n *\n * @param object cell\n * @return void\n */\nexport const updateCell = function (x, y, value, force) {\n const obj = this;\n\n let record;\n\n // Changing value depending on the column type\n if (obj.records[y][x].element.classList.contains('readonly') == true && !force) {\n // Do nothing\n record = {\n x: x,\n y: y,\n col: x,\n row: y,\n };\n } else {\n // Security\n if (('' + value).substr(0, 1) == '=' && obj.options.secureFormulas == true) {\n const val = secureFormula(value);\n if (val != value) {\n // Update the data container\n value = val;\n }\n }\n\n // On change\n const val = dispatch.call(obj, 'onbeforechange', obj, obj.records[y][x].element, x, y, value);\n\n // If you return something this will overwrite the value\n if (val != undefined) {\n value = val;\n }\n\n let config = obj.options.columns && obj.options.columns[x];\n const cellName = getCellNameFromCoords(x, y);\n const cells = obj.options.cells;\n if (typeof cells === 'object' && cells[cellName]) {\n config = cells[cellName];\n }\n\n // custom editor\n if (config && typeof config.type === 'object' && typeof config.type.updateCell === 'function') {\n const result = config.type.updateCell(obj.records[y][x].element, value, parseInt(x), parseInt(y), obj, config);\n\n if (result !== undefined) {\n value = result;\n }\n }\n\n // History format\n record = {\n x: x,\n y: y,\n col: x,\n row: y,\n value: value,\n oldValue: obj.options.data[y][x],\n };\n\n let editor = config && typeof config.type === 'object' ? config.type : null;\n if (editor) {\n // Update data and cell\n obj.options.data[y][x] = value;\n if (typeof editor.setValue === 'function') {\n editor.setValue(obj.records[y][x].element, value);\n }\n } else {\n // Native functions\n if (config && (config.type == 'checkbox' || config.type == 'radio')) {\n // Unchecked all options\n if (config.type == 'radio') {\n for (let j = 0; j < obj.options.data.length; j++) {\n obj.options.data[j][x] = false;\n }\n }\n\n // Update data and cell\n obj.records[y][x].element.children[0].checked = value == 1 || value == true || value == 'true' || value == 'TRUE' ? true : false;\n obj.options.data[y][x] = obj.records[y][x].element.children[0].checked;\n } else if (config && config.type == 'dropdown') {\n // Update data and cell\n obj.options.data[y][x] = value;\n obj.records[y][x].element.textContent = getDropDownValue.call(obj, config.source, value);\n } else if (config && config.type == 'calendar') {\n // Try formatted date\n let formatted = null;\n if (!validDate(value)) {\n const tmp = jSuites.calendar.extractDateFromString(value, (config.options && config.options.format) || 'YYYY-MM-DD');\n if (tmp) {\n formatted = tmp;\n }\n }\n // Update data and cell\n obj.options.data[y][x] = value;\n obj.records[y][x].element.textContent = jSuites.calendar.getDateString(formatted ? formatted : value, config.options && config.options.format);\n } else if (config && config.type == 'color') {\n // Update color\n obj.options.data[y][x] = value;\n // Render\n if (config.render == 'square') {\n const color = document.createElement('div');\n color.className = 'color';\n color.style.backgroundColor = value;\n obj.records[y][x].element.textContent = '';\n obj.records[y][x].element.appendChild(color);\n } else {\n obj.records[y][x].element.style.color = value;\n obj.records[y][x].element.textContent = value;\n }\n } else if (config && config.type == 'image') {\n value = '' + value;\n obj.options.data[y][x] = value;\n obj.records[y][x].element.innerHTML = '';\n if (value && value.substr(0, 10) == 'data:image') {\n const img = document.createElement('img');\n img.src = value;\n obj.records[y][x].element.appendChild(img);\n }\n } else {\n // Update data and cell\n obj.options.data[y][x] = value;\n // Label\n if (config && config.type == 'html') {\n obj.records[y][x].element.innerHTML = stripScript(parseValue.call(obj, x, y, value));\n } else {\n if (obj.parent.config.parseHTML === true) {\n obj.records[y][x].element.innerHTML = stripScript(parseValue.call(obj, x, y, value, obj.records[y][x].element));\n } else {\n obj.records[y][x].element.textContent = parseValue.call(obj, x, y, value, obj.records[y][x].element);\n }\n }\n // Handle big text inside a cell\n if (\n (!config || config.wordWrap != false) &&\n (obj.options.wordWrap == true || (config && config.wordWrap == true) || obj.records[y][x].element.innerHTML.length > 200)\n ) {\n obj.records[y][x].element.style.whiteSpace = 'pre-wrap';\n } else {\n obj.records[y][x].element.style.whiteSpace = '';\n }\n }\n }\n\n // Overflow\n if (x > 0) {\n if (value) {\n obj.records[y][x - 1].element.style.overflow = 'hidden';\n } else {\n obj.records[y][x - 1].element.style.overflow = '';\n }\n }\n\n if (config && typeof config.render === 'function') {\n config.render(obj.records[y] && obj.records[y][x] ? obj.records[y][x].element : null, value, parseInt(x), parseInt(y), obj, config);\n }\n\n // On change\n dispatch.call(obj, 'onchange', obj, obj.records[y] && obj.records[y][x] ? obj.records[y][x].element : null, x, y, value, record.oldValue);\n }\n\n return record;\n};\n\n/**\n * The value is a formula\n */\nexport const isFormula = function (value) {\n const v = ('' + value)[0];\n return v == '=' || v == '#' ? true : false;\n};\n\n/**\n * Get the mask in the jSuites.mask format\n */\nexport const getMask = function (o) {\n if (o.format || o.mask || o.locale) {\n const opt = {};\n if (o.mask) {\n opt.mask = o.mask;\n } else if (o.format) {\n opt.mask = o.format;\n } else {\n opt.locale = o.locale;\n opt.options = o.options;\n }\n\n if (o.decimal) {\n if (!opt.options) {\n opt.options = {};\n }\n opt.options = { decimal: o.decimal };\n }\n return opt;\n }\n\n return null;\n};\n\n/**\n * Secure formula\n */\nconst secureFormula = function (oldValue) {\n let newValue = '';\n let inside = 0;\n\n for (let i = 0; i < oldValue.length; i++) {\n if (oldValue[i] == '\"') {\n if (inside == 0) {\n inside = 1;\n } else {\n inside = 0;\n }\n }\n\n if (inside == 1) {\n newValue += oldValue[i];\n } else {\n newValue += oldValue[i].toUpperCase();\n }\n }\n\n return newValue;\n};\n\n/**\n * Update all related cells in the chain\n */\nlet chainLoopProtection = [];\n\nexport const updateFormulaChain = function (x, y, records) {\n const obj = this;\n\n const cellId = getColumnNameFromId([x, y]);\n if (obj.formula[cellId] && obj.formula[cellId].length > 0) {\n if (chainLoopProtection[cellId]) {\n obj.records[y][x].element.innerHTML = '#ERROR';\n obj.formula[cellId] = '';\n } else {\n // Protection\n chainLoopProtection[cellId] = true;\n\n for (let i = 0; i < obj.formula[cellId].length; i++) {\n const cell = getIdFromColumnName(obj.formula[cellId][i], true);\n // Update cell\n const value = '' + obj.options.data[cell[1]][cell[0]];\n if (value.substr(0, 1) == '=') {\n records.push(updateCell.call(obj, cell[0], cell[1], value, true));\n } else {\n // No longer a formula, remove from the chain\n Object.keys(obj.formula)[i] = null;\n }\n updateFormulaChain.call(obj, cell[0], cell[1], records);\n }\n }\n }\n\n chainLoopProtection = [];\n};\n\n/**\n * Update formula\n */\nexport const updateFormula = function (formula, referencesToUpdate) {\n const testLetter = /[A-Z]/;\n const testNumber = /[0-9]/;\n\n let newFormula = '';\n let letter = null;\n let number = null;\n let token = '';\n\n for (let index = 0; index < formula.length; index++) {\n if (testLetter.exec(formula[index])) {\n letter = 1;\n number = 0;\n token += formula[index];\n } else if (testNumber.exec(formula[index])) {\n number = letter ? 1 : 0;\n token += formula[index];\n } else {\n if (letter && number) {\n token = referencesToUpdate[token] ? referencesToUpdate[token] : token;\n }\n newFormula += token;\n newFormula += formula[index];\n letter = 0;\n number = 0;\n token = '';\n }\n }\n\n if (token) {\n if (letter && number) {\n token = referencesToUpdate[token] ? referencesToUpdate[token] : token;\n }\n newFormula += token;\n }\n\n return newFormula;\n};\n\n/**\n * Update formulas\n */\nconst updateFormulas = function (referencesToUpdate) {\n const obj = this;\n\n // Update formulas\n for (let j = 0; j < obj.options.data.length; j++) {\n for (let i = 0; i < obj.options.data[0].length; i++) {\n const value = '' + obj.options.data[j][i];\n // Is formula\n if (value.substr(0, 1) == '=') {\n // Replace tokens\n const newFormula = updateFormula(value, referencesToUpdate);\n if (newFormula != value) {\n obj.options.data[j][i] = newFormula;\n }\n }\n }\n }\n\n // Update formula chain\n const formula = [];\n const keys = Object.keys(obj.formula);\n for (let j = 0; j < keys.length; j++) {\n // Current key and values\n let key = keys[j];\n const value = obj.formula[key];\n // Update key\n if (referencesToUpdate[key]) {\n key = referencesToUpdate[key];\n }\n // Update values\n formula[key] = [];\n for (let i = 0; i < value.length; i++) {\n let letter = value[i];\n if (referencesToUpdate[letter]) {\n letter = referencesToUpdate[letter];\n }\n formula[key].push(letter);\n }\n }\n obj.formula = formula;\n};\n\n/**\n * Update cell references\n *\n * @return void\n */\nexport const updateTableReferences = function () {\n const obj = this;\n if (obj.skipUpdateTableReferences) {\n return;\n }\n\n // Update headers\n for (let i = 0; i < obj.headers.length; i++) {\n const x = obj.headers[i].getAttribute('data-x');\n\n if (x != i) {\n // Update coords\n obj.headers[i].setAttribute('data-x', i);\n // Title\n if (!obj.headers[i].getAttribute('title')) {\n obj.headers[i].innerHTML = getColumnName(i);\n }\n }\n }\n\n // Update all rows\n for (let j = 0; j < obj.rows.length; j++) {\n if (obj.rows[j]) {\n const y = obj.rows[j].element.getAttribute('data-y');\n\n if (y != j) {\n // Update coords\n obj.rows[j].element.setAttribute('data-y', j);\n obj.rows[j].element.children[0].setAttribute('data-y', j);\n // Row number\n obj.rows[j].element.children[0].innerHTML = j + 1;\n }\n }\n }\n\n // Regular cells affected by this change\n const affectedTokens = [];\n const mergeCellUpdates = [];\n\n // Update cell\n const updatePosition = function (x, y, i, j) {\n if (x != i) {\n obj.records[j][i].element.setAttribute('data-x', i);\n }\n if (y != j) {\n obj.records[j][i].element.setAttribute('data-y', j);\n }\n\n // Other updates\n if (x != i || y != j) {\n const columnIdFrom = getColumnNameFromId([x, y]);\n const columnIdTo = getColumnNameFromId([i, j]);\n affectedTokens[columnIdFrom] = columnIdTo;\n }\n };\n\n for (let j = 0; j < obj.records.length; j++) {\n for (let i = 0; i < obj.records[0].length; i++) {\n if (obj.records[j][i]) {\n // Current values\n const x = obj.records[j][i].element.getAttribute('data-x');\n const y = obj.records[j][i].element.getAttribute('data-y');\n\n // Update column\n if (obj.records[j][i].element.getAttribute('data-merged')) {\n const columnIdFrom = getColumnNameFromId([x, y]);\n const columnIdTo = getColumnNameFromId([i, j]);\n if (mergeCellUpdates[columnIdFrom] == null) {\n if (columnIdFrom == columnIdTo) {\n mergeCellUpdates[columnIdFrom] = false;\n } else {\n const totalX = parseInt(i - x);\n const totalY = parseInt(j - y);\n mergeCellUpdates[columnIdFrom] = [columnIdTo, totalX, totalY];\n }\n }\n } else {\n updatePosition(x, y, i, j);\n }\n }\n }\n }\n\n // Update merged if applicable\n const keys = Object.keys(mergeCellUpdates);\n if (keys.length) {\n for (let i = 0; i < keys.length; i++) {\n if (mergeCellUpdates[keys[i]]) {\n const info = getIdFromColumnName(keys[i], true);\n let x = info[0];\n let y = info[1];\n updatePosition(x, y, x + mergeCellUpdates[keys[i]][1], y + mergeCellUpdates[keys[i]][2]);\n\n const columnIdFrom = keys[i];\n const columnIdTo = mergeCellUpdates[keys[i]][0];\n for (let j = 0; j < obj.options.mergeCells[columnIdFrom][2].length; j++) {\n x = parseInt(obj.options.mergeCells[columnIdFrom][2][j].getAttribute('data-x'));\n y = parseInt(obj.options.mergeCells[columnIdFrom][2][j].getAttribute('data-y'));\n obj.options.mergeCells[columnIdFrom][2][j].setAttribute('data-x', x + mergeCellUpdates[keys[i]][1]);\n obj.options.mergeCells[columnIdFrom][2][j].setAttribute('data-y', y + mergeCellUpdates[keys[i]][2]);\n }\n\n obj.options.mergeCells[columnIdTo] = obj.options.mergeCells[columnIdFrom];\n delete obj.options.mergeCells[columnIdFrom];\n }\n }\n }\n\n // Update formulas\n updateFormulas.call(obj, affectedTokens);\n\n // Update meta data\n updateMeta.call(obj, affectedTokens);\n\n // Refresh selection\n refreshSelection.call(obj);\n\n // Update table with custom configuration if applicable\n updateTable.call(obj);\n};\n\n/**\n * Update scroll position based on the selection\n */\nexport const updateScroll = function (direction) {\n const obj = this;\n\n // Jspreadsheet Container information\n const contentRect = obj.content.getBoundingClientRect();\n const x1 = contentRect.left;\n const y1 = contentRect.top;\n const w1 = contentRect.width;\n const h1 = contentRect.height;\n\n // Direction Left or Up\n const reference = obj.records[obj.selectedCell[3]][obj.selectedCell[2]].element;\n\n // Reference\n const referenceRect = reference.getBoundingClientRect();\n const x2 = referenceRect.left;\n const y2 = referenceRect.top;\n const w2 = referenceRect.width;\n const h2 = referenceRect.height;\n\n let x, y;\n\n // Direction\n if (direction == 0 || direction == 1) {\n x = x2 - x1 + obj.content.scrollLeft;\n y = y2 - y1 + obj.content.scrollTop - 2;\n } else {\n x = x2 - x1 + obj.content.scrollLeft + w2;\n y = y2 - y1 + obj.content.scrollTop + h2;\n }\n\n // Top position check\n if (y > obj.content.scrollTop + 30 && y < obj.content.scrollTop + h1) {\n // In the viewport\n } else {\n // Out of viewport\n if (y < obj.content.scrollTop + 30) {\n obj.content.scrollTop = y - h2;\n } else {\n obj.content.scrollTop = y - (h1 - 2);\n }\n }\n\n // Freeze columns?\n const freezed = getFreezeWidth.call(obj);\n\n // Left position check - TODO: change that to the bottom border of the element\n if (x > obj.content.scrollLeft + freezed && x < obj.content.scrollLeft + w1) {\n // In the viewport\n } else {\n // Out of viewport\n if (x < obj.content.scrollLeft + 30) {\n obj.content.scrollLeft = x;\n if (obj.content.scrollLeft < 50) {\n obj.content.scrollLeft = 0;\n }\n } else if (x < obj.content.scrollLeft + freezed) {\n obj.content.scrollLeft = x - freezed - 1;\n } else {\n obj.content.scrollLeft = x - (w1 - 20);\n }\n }\n};\n\nexport const updateResult = function () {\n const obj = this;\n\n let total = 0;\n let index = 0;\n\n // Page 1\n if (obj.options.lazyLoading == true) {\n total = 100;\n } else if (obj.options.pagination > 0) {\n total = obj.options.pagination;\n } else {\n if (obj.results) {\n total = obj.results.length;\n } else {\n total = obj.rows.length;\n }\n }\n\n // Reset current nodes\n while (obj.tbody.firstChild) {\n obj.tbody.removeChild(obj.tbody.firstChild);\n }\n\n // Hide all records from the table\n for (let j = 0; j < obj.rows.length; j++) {\n if (!obj.results || obj.results.indexOf(j) > -1) {\n if (index < total) {\n obj.tbody.appendChild(obj.rows[j].element);\n index++;\n }\n obj.rows[j].element.style.display = '';\n } else {\n obj.rows[j].element.style.display = 'none';\n }\n }\n\n // Update pagination\n if (obj.options.pagination > 0) {\n updatePagination.call(obj);\n }\n\n updateCornerPosition.call(obj);\n\n dispatch.call(obj, 'onupdateresult', obj, obj.results);\n\n return total;\n};\n\n/**\n * Get the cell object\n *\n * @param object cell\n * @return string value\n */\nexport const getCell = function (x, y) {\n const obj = this;\n\n if (typeof x === 'string') {\n // Convert in case name is excel liked ex. A10, BB92\n const cell = getIdFromColumnName(x, true);\n\n x = cell[0];\n y = cell[1];\n }\n\n return obj.records[y][x].element;\n};\n\n/**\n * Get the cell object from coords\n *\n * @param object cell\n * @return string value\n */\nexport const getCellFromCoords = function (x, y) {\n const obj = this;\n\n return obj.records[y][x].element;\n};\n\n/**\n * Get label\n *\n * @param object cell\n * @return string value\n */\nexport const getLabel = function (x, y) {\n const obj = this;\n\n if (typeof x === 'string') {\n // Convert in case name is excel liked ex. A10, BB92\n const cell = getIdFromColumnName(x, true);\n\n x = cell[0];\n y = cell[1];\n }\n\n return obj.records[y][x].element.innerHTML;\n};\n\n/**\n * Activate/Disable fullscreen\n * use programmatically : table.fullscreen(); or table.fullscreen(true); or table.fullscreen(false);\n * @Param {boolean} activate\n */\nexport const fullscreen = function (activate) {\n const spreadsheet = this;\n\n // If activate not defined, get reverse options.fullscreen\n if (activate == null) {\n activate = !spreadsheet.config.fullscreen;\n }\n\n // If change\n if (spreadsheet.config.fullscreen != activate) {\n spreadsheet.config.fullscreen = activate;\n\n // Test LazyLoading conflict\n if (activate == true) {\n spreadsheet.element.classList.add('fullscreen');\n } else {\n spreadsheet.element.classList.remove('fullscreen');\n }\n }\n};\n\n/**\n * Show index column\n */\nexport const showIndex = function () {\n const obj = this;\n\n obj.table.classList.remove('jss_hidden_index');\n};\n\n/**\n * Hide index column\n */\nexport const hideIndex = function () {\n const obj = this;\n\n obj.table.classList.add('jss_hidden_index');\n};\n\n/**\n * Create a nested header object\n */\nexport const createNestedHeader = function (nestedInformation) {\n const obj = this;\n\n const tr = document.createElement('tr');\n tr.classList.add('jss_nested');\n const td = document.createElement('td');\n td.classList.add('jss_selectall');\n\n tr.appendChild(td);\n // Element\n nestedInformation.element = tr;\n\n let headerIndex = 0;\n for (let i = 0; i < nestedInformation.length; i++) {\n // Default values\n if (!nestedInformation[i].colspan) {\n nestedInformation[i].colspan = 1;\n }\n if (!nestedInformation[i].title) {\n nestedInformation[i].title = '';\n }\n if (!nestedInformation[i].id) {\n nestedInformation[i].id = '';\n }\n\n // Number of columns\n let numberOfColumns = nestedInformation[i].colspan;\n\n // Classes container\n const column = [];\n // Header classes for this cell\n for (let x = 0; x < numberOfColumns; x++) {\n if (obj.options.columns[headerIndex] && obj.options.columns[headerIndex].type == 'hidden') {\n numberOfColumns++;\n }\n column.push(headerIndex);\n headerIndex++;\n }\n\n // Created the nested cell\n const td = document.createElement('td');\n td.setAttribute('data-column', column.join(','));\n td.setAttribute('colspan', nestedInformation[i].colspan);\n td.setAttribute('align', nestedInformation[i].align || 'center');\n td.setAttribute('id', nestedInformation[i].id);\n td.textContent = nestedInformation[i].title;\n tr.appendChild(td);\n }\n\n return tr;\n};\n\nexport const getWorksheetActive = function () {\n const spreadsheet = this.parent ? this.parent : this;\n\n return spreadsheet.element.tabs ? spreadsheet.element.tabs.getActive() : 0;\n};\n\nexport const getWorksheetInstance = function (index) {\n const spreadsheet = this;\n\n const worksheetIndex = typeof index !== 'undefined' ? index : getWorksheetActive.call(spreadsheet);\n\n return spreadsheet.worksheets[worksheetIndex];\n};\n","import dispatch from './dispatch.js';\n\n/**\n * Get meta information from cell(s)\n *\n * @return integer\n */\nexport const getMeta = function (cell, key) {\n const obj = this;\n\n if (!cell) {\n return obj.options.meta;\n } else {\n if (key) {\n return obj.options.meta && obj.options.meta[cell] && obj.options.meta[cell][key] ? obj.options.meta[cell][key] : null;\n } else {\n return obj.options.meta && obj.options.meta[cell] ? obj.options.meta[cell] : null;\n }\n }\n};\n\n/**\n * Update meta information\n *\n * @return integer\n */\nexport const updateMeta = function (affectedCells) {\n const obj = this;\n\n if (obj.options.meta) {\n const newMeta = {};\n const keys = Object.keys(obj.options.meta);\n for (let i = 0; i < keys.length; i++) {\n if (affectedCells[keys[i]]) {\n newMeta[affectedCells[keys[i]]] = obj.options.meta[keys[i]];\n } else {\n newMeta[keys[i]] = obj.options.meta[keys[i]];\n }\n }\n // Update meta information\n obj.options.meta = newMeta;\n }\n};\n\n/**\n * Set meta information to cell(s)\n *\n * @return integer\n */\nexport const setMeta = function (o, k, v) {\n const obj = this;\n\n if (!obj.options.meta) {\n obj.options.meta = {};\n }\n\n if (k && v) {\n // Set data value\n if (!obj.options.meta[o]) {\n obj.options.meta[o] = {};\n }\n obj.options.meta[o][k] = v;\n\n dispatch.call(obj, 'onchangemeta', obj, { [o]: { [k]: v } });\n } else {\n // Apply that for all cells\n const keys = Object.keys(o);\n for (let i = 0; i < keys.length; i++) {\n if (!obj.options.meta[keys[i]]) {\n obj.options.meta[keys[i]] = {};\n }\n\n const prop = Object.keys(o[keys[i]]);\n for (let j = 0; j < prop.length; j++) {\n obj.options.meta[keys[i]][prop[j]] = o[keys[i]][prop[j]];\n }\n }\n\n dispatch.call(obj, 'onchangemeta', obj, o);\n }\n};\n","import dispatch from './dispatch.js';\nimport { getFreezeWidth } from './freeze.js';\nimport { getCellNameFromCoords } from './helpers.js';\nimport { setHistory } from './history.js';\nimport { updateCell, updateFormula, updateFormulaChain, updateTable } from './internal.js';\nimport { getColumnNameFromId, getIdFromColumnName } from './internalHelpers.js';\nimport { updateToolbar } from './toolbar.js';\n\nexport const updateCornerPosition = function () {\n const obj = this;\n\n // If any selected cells\n if (!obj.highlighted || !obj.highlighted.length) {\n obj.corner.style.top = '-2000px';\n obj.corner.style.left = '-2000px';\n } else {\n // Get last cell\n const last = obj.highlighted[obj.highlighted.length - 1].element;\n const lastX = last.getAttribute('data-x');\n\n const contentRect = obj.content.getBoundingClientRect();\n const x1 = contentRect.left;\n const y1 = contentRect.top;\n\n const lastRect = last.getBoundingClientRect();\n const x2 = lastRect.left;\n const y2 = lastRect.top;\n const w2 = lastRect.width;\n const h2 = lastRect.height;\n\n const x = x2 - x1 + obj.content.scrollLeft + w2 - 4;\n const y = y2 - y1 + obj.content.scrollTop + h2 - 4;\n\n // Place the corner in the correct place\n obj.corner.style.top = y + 'px';\n obj.corner.style.left = x + 'px';\n\n if (obj.options.freezeColumns) {\n const width = getFreezeWidth.call(obj);\n // Only check if the last column is not part of the merged cells\n if (lastX > obj.options.freezeColumns - 1 && x2 - x1 + w2 < width) {\n obj.corner.style.display = 'none';\n } else {\n if (obj.options.selectionCopy != false) {\n obj.corner.style.display = '';\n }\n }\n } else {\n if (obj.options.selectionCopy != false) {\n obj.corner.style.display = '';\n }\n }\n }\n\n updateToolbar(obj);\n};\n\nexport const resetSelection = function (blur) {\n const obj = this;\n\n let previousStatus;\n\n // Remove style\n if (!obj.highlighted || !obj.highlighted.length) {\n previousStatus = 0;\n } else {\n previousStatus = 1;\n\n for (let i = 0; i < obj.highlighted.length; i++) {\n obj.highlighted[i].element.classList.remove('highlight');\n obj.highlighted[i].element.classList.remove('highlight-left');\n obj.highlighted[i].element.classList.remove('highlight-right');\n obj.highlighted[i].element.classList.remove('highlight-top');\n obj.highlighted[i].element.classList.remove('highlight-bottom');\n obj.highlighted[i].element.classList.remove('highlight-selected');\n\n const px = parseInt(obj.highlighted[i].element.getAttribute('data-x'));\n const py = parseInt(obj.highlighted[i].element.getAttribute('data-y'));\n\n // Check for merged cells\n let ux, uy;\n\n if (obj.highlighted[i].element.getAttribute('data-merged')) {\n const colspan = parseInt(obj.highlighted[i].element.getAttribute('colspan'));\n const rowspan = parseInt(obj.highlighted[i].element.getAttribute('rowspan'));\n ux = colspan > 0 ? px + (colspan - 1) : px;\n uy = rowspan > 0 ? py + (rowspan - 1) : py;\n } else {\n ux = px;\n uy = py;\n }\n\n // Remove selected from headers\n for (let j = px; j <= ux; j++) {\n if (obj.headers[j]) {\n obj.headers[j].classList.remove('selected');\n }\n }\n\n // Remove selected from rows\n for (let j = py; j <= uy; j++) {\n if (obj.rows[j]) {\n obj.rows[j].element.classList.remove('selected');\n }\n }\n }\n }\n\n // Reset highlighted cells\n obj.highlighted = [];\n\n // Reset\n obj.selectedCell = null;\n\n // Hide corner\n obj.corner.style.top = '-2000px';\n obj.corner.style.left = '-2000px';\n\n if (blur == true && previousStatus == 1) {\n dispatch.call(obj, 'onblur', obj);\n }\n\n return previousStatus;\n};\n\n/**\n * Update selection based on two cells\n */\nexport const updateSelection = function (el1, el2, origin) {\n const obj = this;\n\n const x1 = el1.getAttribute('data-x');\n const y1 = el1.getAttribute('data-y');\n\n let x2, y2;\n if (el2) {\n x2 = el2.getAttribute('data-x');\n y2 = el2.getAttribute('data-y');\n } else {\n x2 = x1;\n y2 = y1;\n }\n\n updateSelectionFromCoords.call(obj, x1, y1, x2, y2, origin);\n};\n\nexport const removeCopyingSelection = function () {\n const copying = document.querySelectorAll('.jss_worksheet .copying');\n for (let i = 0; i < copying.length; i++) {\n copying[i].classList.remove('copying');\n copying[i].classList.remove('copying-left');\n copying[i].classList.remove('copying-right');\n copying[i].classList.remove('copying-top');\n copying[i].classList.remove('copying-bottom');\n }\n};\n\nexport const updateSelectionFromCoords = function (x1, y1, x2, y2, origin) {\n const obj = this;\n\n // select column\n if (y1 == null) {\n y1 = 0;\n y2 = obj.rows.length - 1;\n\n if (x1 == null) {\n return;\n }\n } else if (x1 == null) {\n // select row\n x1 = 0;\n x2 = obj.options.data[0].length - 1;\n }\n\n // Same element\n if (x2 == null) {\n x2 = x1;\n }\n if (y2 == null) {\n y2 = y1;\n }\n\n // Selection must be within the existing data\n if (x1 >= obj.headers.length) {\n x1 = obj.headers.length - 1;\n }\n if (y1 >= obj.rows.length) {\n y1 = obj.rows.length - 1;\n }\n if (x2 >= obj.headers.length) {\n x2 = obj.headers.length - 1;\n }\n if (y2 >= obj.rows.length) {\n y2 = obj.rows.length - 1;\n }\n\n // Limits\n let borderLeft = null;\n let borderRight = null;\n let borderTop = null;\n let borderBottom = null;\n\n // Origin & Destination\n let px, ux;\n\n if (parseInt(x1) < parseInt(x2)) {\n px = parseInt(x1);\n ux = parseInt(x2);\n } else {\n px = parseInt(x2);\n ux = parseInt(x1);\n }\n\n let py, uy;\n\n if (parseInt(y1) < parseInt(y2)) {\n py = parseInt(y1);\n uy = parseInt(y2);\n } else {\n py = parseInt(y2);\n uy = parseInt(y1);\n }\n\n // Verify merged columns\n for (let i = px; i <= ux; i++) {\n for (let j = py; j <= uy; j++) {\n if (obj.records[j][i] && obj.records[j][i].element.getAttribute('data-merged')) {\n const x = parseInt(obj.records[j][i].element.getAttribute('data-x'));\n const y = parseInt(obj.records[j][i].element.getAttribute('data-y'));\n const colspan = parseInt(obj.records[j][i].element.getAttribute('colspan'));\n const rowspan = parseInt(obj.records[j][i].element.getAttribute('rowspan'));\n\n if (colspan > 1) {\n if (x < px) {\n px = x;\n }\n if (x + colspan > ux) {\n ux = x + colspan - 1;\n }\n }\n\n if (rowspan) {\n if (y < py) {\n py = y;\n }\n if (y + rowspan > uy) {\n uy = y + rowspan - 1;\n }\n }\n }\n }\n }\n\n // Vertical limits\n for (let j = py; j <= uy; j++) {\n if (obj.rows[j].element.style.display != 'none') {\n if (borderTop == null) {\n borderTop = j;\n }\n borderBottom = j;\n }\n }\n\n for (let i = px; i <= ux; i++) {\n for (let j = py; j <= uy; j++) {\n // Horizontal limits\n if (!obj.options.columns || !obj.options.columns[i] || obj.options.columns[i].type != 'hidden') {\n if (borderLeft == null) {\n borderLeft = i;\n }\n borderRight = i;\n }\n }\n }\n\n // Create borders\n if (!borderLeft) {\n borderLeft = 0;\n }\n if (!borderRight) {\n borderRight = 0;\n }\n\n const ret = dispatch.call(obj, 'onbeforeselection', obj, borderLeft, borderTop, borderRight, borderBottom, origin);\n if (ret === false) {\n return false;\n }\n\n // Reset Selection\n const previousState = obj.resetSelection();\n\n // Keep selected cell\n obj.selectedCell = [x1, y1, x2, y2];\n\n // Add selected cell\n if (obj.records[y1][x1]) {\n obj.records[y1][x1].element.classList.add('highlight-selected');\n }\n\n // Redefining styles\n for (let i = px; i <= ux; i++) {\n for (let j = py; j <= uy; j++) {\n if (obj.rows[j].element.style.display != 'none' && obj.records[j][i].element.style.display != 'none') {\n obj.records[j][i].element.classList.add('highlight');\n obj.highlighted.push(obj.records[j][i]);\n }\n }\n }\n\n for (let i = borderLeft; i <= borderRight; i++) {\n if (\n (!obj.options.columns || !obj.options.columns[i] || obj.options.columns[i].type != 'hidden') &&\n obj.cols[i].colElement.style &&\n obj.cols[i].colElement.style.display != 'none'\n ) {\n // Top border\n if (obj.records[borderTop] && obj.records[borderTop][i]) {\n obj.records[borderTop][i].element.classList.add('highlight-top');\n }\n // Bottom border\n if (obj.records[borderBottom] && obj.records[borderBottom][i]) {\n obj.records[borderBottom][i].element.classList.add('highlight-bottom');\n }\n // Add selected from headers\n obj.headers[i].classList.add('selected');\n }\n }\n\n for (let j = borderTop; j <= borderBottom; j++) {\n if (obj.rows[j] && obj.rows[j].element.style.display != 'none') {\n // Left border\n obj.records[j][borderLeft].element.classList.add('highlight-left');\n // Right border\n obj.records[j][borderRight].element.classList.add('highlight-right');\n // Add selected from rows\n obj.rows[j].element.classList.add('selected');\n }\n }\n\n obj.selectedContainer = [borderLeft, borderTop, borderRight, borderBottom];\n\n // Handle events\n if (previousState == 0) {\n dispatch.call(obj, 'onfocus', obj);\n\n removeCopyingSelection();\n }\n\n dispatch.call(obj, 'onselection', obj, borderLeft, borderTop, borderRight, borderBottom, origin);\n\n // Find corner cell\n updateCornerPosition.call(obj);\n};\n\n/**\n * Get selected column numbers\n *\n * @return array\n */\nexport const getSelectedColumns = function (visibleOnly) {\n const obj = this;\n\n if (!obj.selectedCell) {\n return [];\n }\n\n const result = [];\n\n for (let i = Math.min(obj.selectedCell[0], obj.selectedCell[2]); i <= Math.max(obj.selectedCell[0], obj.selectedCell[2]); i++) {\n if (!visibleOnly || obj.headers[i].style.display != 'none') {\n result.push(i);\n }\n }\n\n return result;\n};\n\n/**\n * Refresh current selection\n */\nexport const refreshSelection = function () {\n const obj = this;\n\n if (obj.selectedCell) {\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n }\n};\n\n/**\n * Remove copy selection\n *\n * @return void\n */\nexport const removeCopySelection = function () {\n const obj = this;\n\n // Remove current selection\n for (let i = 0; i < obj.selection.length; i++) {\n obj.selection[i].classList.remove('selection');\n obj.selection[i].classList.remove('selection-left');\n obj.selection[i].classList.remove('selection-right');\n obj.selection[i].classList.remove('selection-top');\n obj.selection[i].classList.remove('selection-bottom');\n }\n\n obj.selection = [];\n};\n\nconst doubleDigitFormat = function (v) {\n v = '' + v;\n if (v.length == 1) {\n v = '0' + v;\n }\n return v;\n};\n\n/**\n * Helper function to copy data using the corner icon\n */\nexport const copyData = function (o, d) {\n const obj = this;\n\n // Get data from all selected cells\n const data = obj.getData(true, false);\n\n // Selected cells\n const h = obj.selectedContainer;\n\n // Cells\n const x1 = parseInt(o.getAttribute('data-x'));\n const y1 = parseInt(o.getAttribute('data-y'));\n const x2 = parseInt(d.getAttribute('data-x'));\n const y2 = parseInt(d.getAttribute('data-y'));\n\n // Records\n const records = [];\n let breakControl = false;\n\n let rowNumber, colNumber;\n\n if (h[0] == x1) {\n // Vertical copy\n if (y1 < h[1]) {\n rowNumber = y1 - h[1];\n } else {\n rowNumber = 1;\n }\n colNumber = 0;\n } else {\n if (x1 < h[0]) {\n colNumber = x1 - h[0];\n } else {\n colNumber = 1;\n }\n rowNumber = 0;\n }\n\n // Copy data procedure\n let posx = 0;\n let posy = 0;\n\n for (let j = y1; j <= y2; j++) {\n // Skip hidden rows\n if (obj.rows[j] && obj.rows[j].element.style.display == 'none') {\n continue;\n }\n\n // Controls\n if (data[posy] == undefined) {\n posy = 0;\n }\n posx = 0;\n\n // Data columns\n if (h[0] != x1) {\n if (x1 < h[0]) {\n colNumber = x1 - h[0];\n } else {\n colNumber = 1;\n }\n }\n // Data columns\n for (let i = x1; i <= x2; i++) {\n // Update non-readonly\n if (\n obj.records[j][i] &&\n !obj.records[j][i].element.classList.contains('readonly') &&\n obj.records[j][i].element.style.display != 'none' &&\n breakControl == false\n ) {\n // Stop if contains value\n if (!obj.selection.length) {\n if (obj.options.data[j][i] != '') {\n breakControl = true;\n continue;\n }\n }\n\n // Column\n if (data[posy] == undefined) {\n posx = 0;\n } else if (data[posy][posx] == undefined) {\n posx = 0;\n }\n\n // Value\n let value = data[posy][posx];\n\n if (value && !data[1] && obj.parent.config.autoIncrement != false) {\n if (\n obj.options.columns &&\n obj.options.columns[i] &&\n (!obj.options.columns[i].type || obj.options.columns[i].type == 'text' || obj.options.columns[i].type == 'number')\n ) {\n if (('' + value).substr(0, 1) == '=') {\n const tokens = value.match(/([A-Z]+[0-9]+)/g);\n\n if (tokens) {\n const affectedTokens = [];\n for (let index = 0; index < tokens.length; index++) {\n const position = getIdFromColumnName(tokens[index], 1);\n position[0] += colNumber;\n position[1] += rowNumber;\n if (position[1] < 0) {\n position[1] = 0;\n }\n const token = getColumnNameFromId([position[0], position[1]]);\n\n if (token != tokens[index]) {\n affectedTokens[tokens[index]] = token;\n }\n }\n // Update formula\n if (affectedTokens) {\n value = updateFormula(value, affectedTokens);\n }\n }\n } else {\n if (value == Number(value)) {\n value = Number(value) + rowNumber;\n }\n }\n } else if (obj.options.columns && obj.options.columns[i] && obj.options.columns[i].type == 'calendar') {\n const date = new Date(value);\n date.setDate(date.getDate() + rowNumber);\n value =\n date.getFullYear() +\n '-' +\n doubleDigitFormat(parseInt(date.getMonth() + 1)) +\n '-' +\n doubleDigitFormat(date.getDate()) +\n ' ' +\n '00:00:00';\n }\n }\n\n records.push(updateCell.call(obj, i, j, value));\n\n // Update all formulas in the chain\n updateFormulaChain.call(obj, i, j, records);\n }\n posx++;\n if (h[0] != x1) {\n colNumber++;\n }\n }\n posy++;\n rowNumber++;\n }\n\n // Update history\n setHistory.call(obj, {\n action: 'setValue',\n records: records,\n selection: obj.selectedCell,\n });\n\n // Update table with custom configuration if applicable\n updateTable.call(obj);\n\n // On after changes\n const onafterchangesRecords = records.map(function (record) {\n return {\n x: record.x,\n y: record.y,\n value: record.value,\n oldValue: record.oldValue,\n };\n });\n\n dispatch.call(obj, 'onafterchanges', obj, onafterchangesRecords);\n};\n\nexport const hash = function (str) {\n let hash = 0,\n i,\n chr;\n\n if (!str || str.length === 0) {\n return hash;\n } else {\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0;\n }\n }\n return hash;\n};\n\n/**\n * Move coords to A1 in case overlaps with an excluded cell\n */\nexport const conditionalSelectionUpdate = function (type, o, d) {\n const obj = this;\n\n if (type == 1) {\n if (obj.selectedCell && ((o >= obj.selectedCell[1] && o <= obj.selectedCell[3]) || (d >= obj.selectedCell[1] && d <= obj.selectedCell[3]))) {\n obj.resetSelection();\n return;\n }\n } else {\n if (obj.selectedCell && ((o >= obj.selectedCell[0] && o <= obj.selectedCell[2]) || (d >= obj.selectedCell[0] && d <= obj.selectedCell[2]))) {\n obj.resetSelection();\n return;\n }\n }\n};\n\n/**\n * Get selected rows numbers\n *\n * @return array\n */\nexport const getSelectedRows = function (visibleOnly) {\n const obj = this;\n\n if (!obj.selectedCell) {\n return [];\n }\n\n const result = [];\n\n for (let i = Math.min(obj.selectedCell[1], obj.selectedCell[3]); i <= Math.max(obj.selectedCell[1], obj.selectedCell[3]); i++) {\n if (!visibleOnly || obj.rows[i].element.style.display != 'none') {\n result.push(i);\n }\n }\n\n return result;\n};\n\nexport const selectAll = function () {\n const obj = this;\n\n if (!obj.selectedCell) {\n obj.selectedCell = [];\n }\n\n obj.selectedCell[0] = 0;\n obj.selectedCell[1] = 0;\n obj.selectedCell[2] = obj.headers.length - 1;\n obj.selectedCell[3] = obj.records.length - 1;\n\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n};\n\nexport const getSelection = function () {\n const obj = this;\n\n if (!obj.selectedCell) {\n return null;\n }\n\n return [\n Math.min(obj.selectedCell[0], obj.selectedCell[2]),\n Math.min(obj.selectedCell[1], obj.selectedCell[3]),\n Math.max(obj.selectedCell[0], obj.selectedCell[2]),\n Math.max(obj.selectedCell[1], obj.selectedCell[3]),\n ];\n};\n\nexport const getSelected = function (columnNameOnly) {\n const obj = this;\n\n const selectedRange = getSelection.call(obj);\n\n if (!selectedRange) {\n return [];\n }\n\n const cells = [];\n\n for (let y = selectedRange[1]; y <= selectedRange[3]; y++) {\n for (let x = selectedRange[0]; x <= selectedRange[2]; x++) {\n if (columnNameOnly) {\n cells.push(getCellNameFromCoords(x, y));\n } else {\n cells.push(obj.records[y][x]);\n }\n }\n }\n\n return cells;\n};\n\nexport const getRange = function () {\n const obj = this;\n\n const selectedRange = getSelection.call(obj);\n\n if (!selectedRange) {\n return '';\n }\n\n const start = getCellNameFromCoords(selectedRange[0], selectedRange[1]);\n const end = getCellNameFromCoords(selectedRange[2], selectedRange[3]);\n\n if (start === end) {\n return obj.options.worksheetName + '!' + start;\n }\n\n return obj.options.worksheetName + '!' + start + ':' + end;\n};\n\nexport const isSelected = function (x, y) {\n const obj = this;\n\n const selection = getSelection.call(obj);\n\n return x >= selection[0] && x <= selection[2] && y >= selection[1] && y <= selection[3];\n};\n\nexport const getHighlighted = function () {\n const obj = this;\n\n const selection = getSelection.call(obj);\n\n if (selection) {\n return [selection];\n }\n\n return [];\n};\n","import { getColumnName } from './helpers.js';\n\n/**\n * Helper injectArray\n */\nexport const injectArray = function (o, idx, arr) {\n if (idx <= o.length) {\n return o.slice(0, idx).concat(arr).concat(o.slice(idx));\n }\n\n const array = o.slice(0, o.length);\n\n while (idx > array.length) {\n array.push(undefined);\n }\n\n return array.concat(arr);\n};\n\n/**\n * Convert excel like column to jss id\n *\n * @param string id\n * @return string id\n */\nexport const getIdFromColumnName = function (id, arr) {\n // Get the letters\n const t = /^[a-zA-Z]+/.exec(id);\n\n if (t) {\n // Base 26 calculation\n let code = 0;\n for (let i = 0; i < t[0].length; i++) {\n code += parseInt(t[0].charCodeAt(i) - 64) * Math.pow(26, t[0].length - 1 - i);\n }\n code--;\n // Make sure jss starts on zero\n if (code < 0) {\n code = 0;\n }\n\n // Number\n let number = parseInt(/[0-9]+$/.exec(id));\n if (number > 0) {\n number--;\n }\n\n if (arr == true) {\n id = [code, number];\n } else {\n id = code + '-' + number;\n }\n }\n\n return id;\n};\n\n/**\n * Convert jss id to excel like column name\n *\n * @param string id\n * @return string id\n */\nexport const getColumnNameFromId = function (cellId) {\n if (!Array.isArray(cellId)) {\n cellId = cellId.split('-');\n }\n\n return getColumnName(parseInt(cellId[0])) + (parseInt(cellId[1]) + 1);\n};\n\n/**\n * 获取静态的左侧距离\n *\n */\nexport const getFreezeColumnLeft = function (colNumber, columns) {\n let left = 50; // 距离左侧的位置\n while (colNumber > 0) {\n const obj = columns[colNumber - 1]; // 左侧单元格\n if (obj.type !== 'hidden') {\n left += parseInt(obj.width);\n }\n colNumber -= 1;\n }\n return left + 'px';\n};\n\nexport const getFreezeRowTop = function (rowNumber, rows) {\n let top = 30; // 距离顶部的位置\n while (rowNumber > 0) {\n const obj = rows[rowNumber - 1]; // 左侧单元格\n top += parseInt(obj.height);\n rowNumber -= 1;\n }\n return top + 'px';\n};\n","\n\n/**\n * Prepare JSON in the correct format\n */\nconst prepareJson = function (data) {\n const obj = this;\n\n const rows = [];\n for (let i = 0; i < data.length; i++) {\n const x = data[i].x;\n const y = data[i].y;\n const k = obj.options.columns[x].name ? obj.options.columns[x].name : x;\n\n // Create row\n if (!rows[y]) {\n rows[y] = {\n row: y,\n data: {},\n };\n }\n rows[y].data[k] = data[i].value;\n }\n\n // Filter rows\n return rows.filter(function (el) {\n return el != null;\n });\n};\n\n/**\n * Post json to a remote server\n */\nconst save = function (url, data) {\n const obj = this;\n\n // Parse anything in the data before sending to the server\n const ret = dispatch.call(obj.parent, 'onbeforesave', obj.parent, obj, data);\n if (ret) {\n data = ret;\n } else {\n if (ret === false) {\n return false;\n }\n }\n\n // Remove update\n jSuites.ajax({\n url: url,\n method: 'POST',\n dataType: 'json',\n data: { data: JSON.stringify(data) },\n success: function (result) {\n // Event\n dispatch.call(obj, 'onsave', obj.parent, obj, data);\n },\n });\n};\n\n/**\n * Trigger events\n */\nconst dispatch = function (event) {\n const obj = this;\n let ret = null;\n\n let spreadsheet = obj.parent ? obj.parent : obj;\n\n // Dispatch events\n if (!spreadsheet.ignoreEvents) {\n // Call global event\n if (typeof spreadsheet.config.onevent == 'function') {\n ret = spreadsheet.config.onevent.apply(this, arguments);\n }\n // Call specific events\n if (typeof spreadsheet.config[event] == 'function') {\n ret = spreadsheet.config[event].apply(this, Array.prototype.slice.call(arguments, 1));\n }\n\n if (typeof spreadsheet.plugins === 'object') {\n const pluginKeys = Object.keys(spreadsheet.plugins);\n\n for (let pluginKeyIndex = 0; pluginKeyIndex < pluginKeys.length; pluginKeyIndex++) {\n const key = pluginKeys[pluginKeyIndex];\n const plugin = spreadsheet.plugins[key];\n\n if (typeof plugin.onevent === 'function') {\n ret = plugin.onevent.apply(this, arguments);\n }\n }\n }\n }\n\n if (event == 'onafterchanges') {\n const scope = arguments;\n\n if (typeof spreadsheet.plugins === 'object') {\n Object.entries(spreadsheet.plugins).forEach(function ([, plugin]) {\n if (typeof plugin.persistence === 'function') {\n plugin.persistence(obj, 'setValue', { data: scope[2] });\n }\n });\n }\n\n if (obj.options.persistence) {\n const url = obj.options.persistence == true ? obj.options.url : obj.options.persistence;\n const data = prepareJson.call(obj, arguments[2]);\n save.call(obj, url, data);\n }\n }\n\n return ret;\n};\n\nexport default dispatch;\n","\nimport { updateResult } from './internal.js';\nimport { refreshSelection } from './selection.js';\n\n/**\n * Open the column filter\n */\nexport const openFilter = function (columnId) {\n const obj = this;\n\n if (!obj.options.filters) {\n console.log('Jspreadsheet: filters not enabled.');\n } else {\n // Make sure is integer\n columnId = parseInt(columnId);\n // Reset selection\n obj.resetSelection();\n // Load options\n let optionsFiltered = [];\n if (obj.options.columns[columnId].type == 'checkbox') {\n optionsFiltered.push({ id: 'true', name: 'True' });\n optionsFiltered.push({ id: 'false', name: 'False' });\n } else {\n const options = [];\n let hasBlanks = false;\n for (let j = 0; j < obj.options.data.length; j++) {\n const k = obj.options.data[j][columnId];\n const v = obj.records[j][columnId].element.innerHTML;\n if (k && v) {\n options[k] = v;\n } else {\n hasBlanks = true;\n }\n }\n const keys = Object.keys(options);\n optionsFiltered = [];\n for (let j = 0; j < keys.length; j++) {\n optionsFiltered.push({ id: keys[j], name: options[keys[j]] });\n }\n // Has blank options\n if (hasBlanks) {\n optionsFiltered.push({ value: '', id: '', name: '(Blanks)' });\n }\n }\n\n // Create dropdown\n const div = document.createElement('div');\n obj.filter.children[columnId + 1].innerHTML = '';\n obj.filter.children[columnId + 1].appendChild(div);\n obj.filter.children[columnId + 1].style.paddingLeft = '0px';\n obj.filter.children[columnId + 1].style.paddingRight = '0px';\n obj.filter.children[columnId + 1].style.overflow = 'initial';\n\n const opt = {\n data: optionsFiltered,\n multiple: true,\n autocomplete: true,\n opened: true,\n value: obj.filters[columnId] !== undefined ? obj.filters[columnId] : null,\n width: '100%',\n position: obj.options.tableOverflow == true || obj.parent.config.fullscreen == true ? true : false,\n onclose: function (o) {\n resetFilters.call(obj);\n obj.filters[columnId] = o.dropdown.getValue(true);\n obj.filter.children[columnId + 1].innerHTML = o.dropdown.getText();\n obj.filter.children[columnId + 1].style.paddingLeft = '';\n obj.filter.children[columnId + 1].style.paddingRight = '';\n obj.filter.children[columnId + 1].style.overflow = '';\n closeFilter.call(obj, columnId);\n refreshSelection.call(obj);\n },\n };\n\n // Dynamic dropdown\n jSuites.dropdown(div, opt);\n }\n};\n\nexport const closeFilter = function (columnId) {\n const obj = this;\n\n if (!columnId) {\n for (let i = 0; i < obj.filter.children.length; i++) {\n if (obj.filters[i]) {\n columnId = i;\n }\n }\n }\n\n // Search filter\n const search = function (query, x, y) {\n for (let i = 0; i < query.length; i++) {\n const value = '' + obj.options.data[y][x];\n const label = '' + obj.records[y][x].element.innerHTML;\n if (query[i] == value || query[i] == label) {\n return true;\n }\n }\n return false;\n };\n\n const query = obj.filters[columnId];\n obj.results = [];\n for (let j = 0; j < obj.options.data.length; j++) {\n if (search(query, columnId, j)) {\n obj.results.push(j);\n }\n }\n if (!obj.results.length) {\n obj.results = null;\n }\n\n updateResult.call(obj);\n};\n\nexport const resetFilters = function () {\n const obj = this;\n\n if (obj.options.filters) {\n for (let i = 0; i < obj.filter.children.length; i++) {\n obj.filter.children[i].innerHTML = ' ';\n obj.filters[i] = null;\n }\n }\n\n obj.results = null;\n updateResult.call(obj);\n};\n","\n\nimport { getColumnNameFromId, getIdFromColumnName } from './internalHelpers.js';\nimport { updateCell } from './internal.js';\nimport { setHistory } from './history.js';\nimport dispatch from './dispatch.js';\nimport { updateSelection } from './selection.js';\n\n/**\n * Is column merged\n */\nexport const isColMerged = function (x, insertBefore) {\n const obj = this;\n\n const cols = [];\n // Remove any merged cells\n if (obj.options.mergeCells) {\n const keys = Object.keys(obj.options.mergeCells);\n for (let i = 0; i < keys.length; i++) {\n const info = getIdFromColumnName(keys[i], true);\n const colspan = obj.options.mergeCells[keys[i]][0];\n const x1 = info[0];\n const x2 = info[0] + (colspan > 1 ? colspan - 1 : 0);\n\n if (insertBefore == null) {\n if (x1 <= x && x2 >= x) {\n cols.push(keys[i]);\n }\n } else {\n if (insertBefore) {\n if (x1 < x && x2 >= x) {\n cols.push(keys[i]);\n }\n } else {\n if (x1 <= x && x2 > x) {\n cols.push(keys[i]);\n }\n }\n }\n }\n }\n\n return cols;\n};\n\n/**\n * Is rows merged\n */\nexport const isRowMerged = function (y, insertBefore) {\n const obj = this;\n\n const rows = [];\n // Remove any merged cells\n if (obj.options.mergeCells) {\n const keys = Object.keys(obj.options.mergeCells);\n for (let i = 0; i < keys.length; i++) {\n const info = getIdFromColumnName(keys[i], true);\n const rowspan = obj.options.mergeCells[keys[i]][1];\n const y1 = info[1];\n const y2 = info[1] + (rowspan > 1 ? rowspan - 1 : 0);\n\n if (insertBefore == null) {\n if (y1 <= y && y2 >= y) {\n rows.push(keys[i]);\n }\n } else {\n if (insertBefore) {\n if (y1 < y && y2 >= y) {\n rows.push(keys[i]);\n }\n } else {\n if (y1 <= y && y2 > y) {\n rows.push(keys[i]);\n }\n }\n }\n }\n }\n\n return rows;\n};\n\n/**\n * Merge cells\n * @param cellName\n * @param colspan\n * @param rowspan\n * @param ignoreHistoryAndEvents\n */\nexport const getMerge = function (cellName) {\n const obj = this;\n\n let data = {};\n if (cellName) {\n if (obj.options.mergeCells && obj.options.mergeCells[cellName]) {\n data = [obj.options.mergeCells[cellName][0], obj.options.mergeCells[cellName][1]];\n } else {\n data = null;\n }\n } else {\n if (obj.options.mergeCells) {\n var mergedCells = obj.options.mergeCells;\n const keys = Object.keys(obj.options.mergeCells);\n for (let i = 0; i < keys.length; i++) {\n data[keys[i]] = [obj.options.mergeCells[keys[i]][0], obj.options.mergeCells[keys[i]][1]];\n }\n }\n }\n\n return data;\n};\n\n/**\n * Merge cells\n * @param cellName\n * @param colspan\n * @param rowspan\n * @param ignoreHistoryAndEvents\n */\nexport const setMerge = function (cellName, colspan, rowspan, ignoreHistoryAndEvents) {\n const obj = this;\n\n let test = false;\n\n if (!cellName) {\n if (!obj.highlighted.length) {\n alert(jSuites.translate('No cells selected'));\n return null;\n } else {\n const x1 = parseInt(obj.highlighted[0].getAttribute('data-x'));\n const y1 = parseInt(obj.highlighted[0].getAttribute('data-y'));\n const x2 = parseInt(obj.highlighted[obj.highlighted.length - 1].getAttribute('data-x'));\n const y2 = parseInt(obj.highlighted[obj.highlighted.length - 1].getAttribute('data-y'));\n cellName = getColumnNameFromId([x1, y1]);\n colspan = x2 - x1 + 1;\n rowspan = y2 - y1 + 1;\n }\n } else if (typeof cellName !== 'string') {\n return null;\n }\n\n const cell = getIdFromColumnName(cellName, true);\n\n if (obj.options.mergeCells && obj.options.mergeCells[cellName]) {\n if (obj.records[cell[1]][cell[0]].element.getAttribute('data-merged')) {\n test = 'Cell already merged';\n }\n } else if ((!colspan || colspan < 2) && (!rowspan || rowspan < 2)) {\n test = 'Invalid merged properties';\n } else {\n var cells = [];\n for (let j = cell[1]; j < cell[1] + rowspan; j++) {\n for (let i = cell[0]; i < cell[0] + colspan; i++) {\n var columnName = getColumnNameFromId([i, j]);\n if (obj.records[j][i].element.getAttribute('data-merged')) {\n test = 'There is a conflict with another merged cell';\n }\n }\n }\n }\n\n if (test) {\n alert(jSuites.translate(test));\n } else {\n // Add property\n if (colspan > 1) {\n obj.records[cell[1]][cell[0]].element.setAttribute('colspan', colspan);\n } else {\n colspan = 1;\n }\n if (rowspan > 1) {\n obj.records[cell[1]][cell[0]].element.setAttribute('rowspan', rowspan);\n } else {\n rowspan = 1;\n }\n // Keep links to the existing nodes\n if (!obj.options.mergeCells) {\n obj.options.mergeCells = {};\n }\n\n obj.options.mergeCells[cellName] = [colspan, rowspan, []];\n // Mark cell as merged\n obj.records[cell[1]][cell[0]].element.setAttribute('data-merged', 'true');\n // Overflow\n obj.records[cell[1]][cell[0]].element.style.overflow = 'hidden';\n // History data\n const data = [];\n // Adjust the nodes\n for (let y = cell[1]; y < cell[1] + rowspan; y++) {\n for (let x = cell[0]; x < cell[0] + colspan; x++) {\n if (!(cell[0] == x && cell[1] == y)) {\n data.push(obj.options.data[y][x]);\n updateCell.call(obj, x, y, '', true);\n obj.options.mergeCells[cellName][2].push(obj.records[y][x].element);\n obj.records[y][x].element.style.display = 'none';\n obj.records[y][x].element = obj.records[cell[1]][cell[0]].element;\n }\n }\n }\n // In the initialization is not necessary keep the history\n updateSelection.call(obj, obj.records[cell[1]][cell[0]].element);\n\n if (!ignoreHistoryAndEvents) {\n setHistory.call(obj, {\n action: 'setMerge',\n column: cellName,\n colspan: colspan,\n rowspan: rowspan,\n data: data,\n });\n\n dispatch.call(obj, 'onmerge', obj, { [cellName]: [colspan, rowspan] });\n }\n }\n};\n\n/**\n * Remove merge by cellname\n * @param cellName\n */\nexport const removeMerge = function (cellName, data, keepOptions) {\n const obj = this;\n\n if (obj.options.mergeCells && obj.options.mergeCells[cellName]) {\n const beforeMerges = { [cellName]: obj.options.mergeCells[cellName] };\n const cell = getIdFromColumnName(cellName, true);\n obj.records[cell[1]][cell[0]].element.removeAttribute('colspan');\n obj.records[cell[1]][cell[0]].element.removeAttribute('rowspan');\n obj.records[cell[1]][cell[0]].element.removeAttribute('data-merged');\n const info = obj.options.mergeCells[cellName];\n\n let index = 0;\n\n let j, i;\n\n for (j = 0; j < info[1]; j++) {\n for (i = 0; i < info[0]; i++) {\n if (j > 0 || i > 0) {\n obj.records[cell[1] + j][cell[0] + i].element = info[2][index];\n obj.records[cell[1] + j][cell[0] + i].element.style.display = '';\n // Recover data\n if (data && data[index]) {\n updateCell.call(obj, cell[0] + i, cell[1] + j, data[index]);\n }\n index++;\n }\n }\n }\n\n // Update selection\n updateSelection.call(obj, obj.records[cell[1]][cell[0]].element, obj.records[cell[1] + j - 1][cell[0] + i - 1].element);\n\n if (!keepOptions) {\n delete obj.options.mergeCells[cellName];\n }\n\n dispatch.call(obj, 'onunmerge', obj, cellName, beforeMerges);\n }\n};\n\n/**\n * Remove all merged cells\n */\nexport const destroyMerge = function (keepOptions) {\n const obj = this;\n\n // Remove any merged cells\n if (obj.options.mergeCells) {\n var mergedCells = obj.options.mergeCells;\n const keys = Object.keys(obj.options.mergeCells);\n for (let i = 0; i < keys.length; i++) {\n removeMerge.call(obj, keys[i], null, keepOptions);\n }\n }\n};\n","import dispatch from './dispatch.js';\nimport { injectArray } from './internalHelpers.js';\nimport { updateTableReferences } from './internal.js';\nimport { setMerge } from './merges.js';\nimport { updateOrder, updateOrderArrow } from './orderBy.js';\nimport { conditionalSelectionUpdate } from './selection.js';\n\n/**\n * Initializes a new history record for undo/redo\n *\n * @return null\n */\nexport const setHistory = function (changes) {\n const obj = this;\n\n if (obj.ignoreHistory != true) {\n // Increment and get the current history index\n const index = ++obj.historyIndex;\n\n // Slice the array to discard undone changes\n obj.history = obj.history = obj.history.slice(0, index + 1);\n\n // Keep history\n obj.history[index] = changes;\n }\n};\n\n/**\n * Process row\n */\nconst historyProcessRow = function (type, historyRecord) {\n const obj = this;\n\n const rowIndex = !historyRecord.insertBefore ? historyRecord.rowNumber + 1 : +historyRecord.rowNumber;\n\n if (obj.options.search == true) {\n if (obj.results && obj.results.length != obj.rows.length) {\n obj.resetSearch();\n }\n }\n\n // Remove row\n if (type == 1) {\n const numOfRows = historyRecord.numOfRows;\n // Remove nodes\n for (let j = rowIndex; j < numOfRows + rowIndex; j++) {\n obj.rows[j].element.parentNode.removeChild(obj.rows[j].element);\n }\n // Remove references\n obj.records.splice(rowIndex, numOfRows);\n obj.options.data.splice(rowIndex, numOfRows);\n obj.rows.splice(rowIndex, numOfRows);\n\n conditionalSelectionUpdate.call(obj, 1, rowIndex, numOfRows + rowIndex - 1);\n } else {\n // Insert data\n const records = historyRecord.rowRecords.map((row) => {\n return [...row];\n });\n obj.records = injectArray(obj.records, rowIndex, records);\n\n const data = historyRecord.rowData.map((row) => {\n return [...row];\n });\n obj.options.data = injectArray(obj.options.data, rowIndex, data);\n\n obj.rows = injectArray(obj.rows, rowIndex, historyRecord.rowNode);\n // Insert nodes\n let index = 0;\n for (let j = rowIndex; j < historyRecord.numOfRows + rowIndex; j++) {\n obj.tbody.insertBefore(historyRecord.rowNode[index].element, obj.tbody.children[j]);\n index++;\n }\n }\n\n for (let j = rowIndex; j < obj.rows.length; j++) {\n obj.rows[j].y = j;\n }\n\n for (let j = rowIndex; j < obj.records.length; j++) {\n for (let i = 0; i < obj.records[j].length; i++) {\n obj.records[j][i].y = j;\n }\n }\n\n // Respect pagination\n if (obj.options.pagination > 0) {\n obj.page(obj.pageNumber);\n }\n\n updateTableReferences.call(obj);\n};\n\n/**\n * Process column\n */\nconst historyProcessColumn = function (type, historyRecord) {\n const obj = this;\n\n const columnIndex = !historyRecord.insertBefore ? historyRecord.columnNumber + 1 : historyRecord.columnNumber;\n\n // Remove column\n if (type == 1) {\n const numOfColumns = historyRecord.numOfColumns;\n\n obj.options.columns.splice(columnIndex, numOfColumns);\n for (let i = columnIndex; i < numOfColumns + columnIndex; i++) {\n obj.headers[i].parentNode.removeChild(obj.headers[i]);\n obj.cols[i].colElement.parentNode.removeChild(obj.cols[i].colElement);\n }\n obj.headers.splice(columnIndex, numOfColumns);\n obj.cols.splice(columnIndex, numOfColumns);\n for (let j = 0; j < historyRecord.data.length; j++) {\n for (let i = columnIndex; i < numOfColumns + columnIndex; i++) {\n obj.records[j][i].element.parentNode.removeChild(obj.records[j][i].element);\n }\n obj.records[j].splice(columnIndex, numOfColumns);\n obj.options.data[j].splice(columnIndex, numOfColumns);\n }\n // Process footers\n if (obj.options.footers) {\n for (let j = 0; j < obj.options.footers.length; j++) {\n obj.options.footers[j].splice(columnIndex, numOfColumns);\n }\n }\n } else {\n // Insert data\n obj.options.columns = injectArray(obj.options.columns, columnIndex, historyRecord.columns);\n obj.headers = injectArray(obj.headers, columnIndex, historyRecord.headers);\n obj.cols = injectArray(obj.cols, columnIndex, historyRecord.cols);\n\n let index = 0;\n for (let i = columnIndex; i < historyRecord.numOfColumns + columnIndex; i++) {\n obj.headerContainer.insertBefore(historyRecord.headers[index], obj.headerContainer.children[i + 1]);\n obj.colgroupContainer.insertBefore(historyRecord.cols[index].colElement, obj.colgroupContainer.children[i + 1]);\n index++;\n }\n\n for (let j = 0; j < historyRecord.data.length; j++) {\n obj.options.data[j] = injectArray(obj.options.data[j], columnIndex, historyRecord.data[j]);\n obj.records[j] = injectArray(obj.records[j], columnIndex, historyRecord.records[j]);\n let index = 0;\n for (let i = columnIndex; i < historyRecord.numOfColumns + columnIndex; i++) {\n obj.rows[j].element.insertBefore(historyRecord.records[j][index].element, obj.rows[j].element.children[i + 1]);\n index++;\n }\n }\n // Process footers\n if (obj.options.footers) {\n for (let j = 0; j < obj.options.footers.length; j++) {\n obj.options.footers[j] = injectArray(obj.options.footers[j], columnIndex, historyRecord.footers[j]);\n }\n }\n }\n\n for (let i = columnIndex; i < obj.cols.length; i++) {\n obj.cols[i].x = i;\n }\n\n for (let j = 0; j < obj.records.length; j++) {\n for (let i = columnIndex; i < obj.records[j].length; i++) {\n obj.records[j][i].x = i;\n }\n }\n\n // Adjust nested headers\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0 && obj.options.nestedHeaders[0] && obj.options.nestedHeaders[0][0]) {\n for (let j = 0; j < obj.options.nestedHeaders.length; j++) {\n let colspan;\n\n if (type == 1) {\n colspan = parseInt(obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length - 1].colspan) - historyRecord.numOfColumns;\n } else {\n colspan = parseInt(obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length - 1].colspan) + historyRecord.numOfColumns;\n }\n obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length - 1].colspan = colspan;\n obj.thead.children[j].children[obj.thead.children[j].children.length - 1].setAttribute('colspan', colspan);\n }\n }\n\n updateTableReferences.call(obj);\n};\n\n/**\n * Undo last action\n */\nexport const undo = function () {\n const obj = this;\n\n // Ignore events and history\n const ignoreEvents = obj.parent.ignoreEvents ? true : false;\n const ignoreHistory = obj.ignoreHistory ? true : false;\n\n obj.parent.ignoreEvents = true;\n obj.ignoreHistory = true;\n\n // Records\n const records = [];\n\n // Update cells\n let historyRecord;\n\n if (obj.historyIndex >= 0) {\n // History\n historyRecord = obj.history[obj.historyIndex--];\n\n if (historyRecord.action == 'insertRow') {\n historyProcessRow.call(obj, 1, historyRecord);\n } else if (historyRecord.action == 'deleteRow') {\n historyProcessRow.call(obj, 0, historyRecord);\n } else if (historyRecord.action == 'insertColumn') {\n historyProcessColumn.call(obj, 1, historyRecord);\n } else if (historyRecord.action == 'deleteColumn') {\n historyProcessColumn.call(obj, 0, historyRecord);\n } else if (historyRecord.action == 'moveRow') {\n obj.moveRow(historyRecord.newValue, historyRecord.oldValue);\n } else if (historyRecord.action == 'moveColumn') {\n obj.moveColumn(historyRecord.newValue, historyRecord.oldValue);\n } else if (historyRecord.action == 'setMerge') {\n obj.removeMerge(historyRecord.column, historyRecord.data);\n } else if (historyRecord.action == 'setStyle') {\n obj.setStyle(historyRecord.oldValue, null, null, 1);\n } else if (historyRecord.action == 'setWidth') {\n obj.setWidth(historyRecord.column, historyRecord.oldValue);\n } else if (historyRecord.action == 'setHeight') {\n obj.setHeight(historyRecord.row, historyRecord.oldValue);\n } else if (historyRecord.action == 'setHeader') {\n obj.setHeader(historyRecord.column, historyRecord.oldValue);\n } else if (historyRecord.action == 'setComments') {\n obj.setComments(historyRecord.oldValue);\n } else if (historyRecord.action == 'orderBy') {\n let rows = [];\n for (let j = 0; j < historyRecord.rows.length; j++) {\n rows[historyRecord.rows[j]] = j;\n }\n updateOrderArrow.call(obj, historyRecord.column, historyRecord.order ? 0 : 1);\n updateOrder.call(obj, rows);\n } else if (historyRecord.action == 'setValue') {\n // Redo for changes in cells\n for (let i = 0; i < historyRecord.records.length; i++) {\n records.push({\n x: historyRecord.records[i].x,\n y: historyRecord.records[i].y,\n value: historyRecord.records[i].oldValue,\n });\n\n if (historyRecord.oldStyle) {\n obj.resetStyle(historyRecord.oldStyle);\n }\n }\n // Update records\n obj.setValue(records);\n\n // Update selection\n if (historyRecord.selection) {\n obj.updateSelectionFromCoords(historyRecord.selection[0], historyRecord.selection[1], historyRecord.selection[2], historyRecord.selection[3]);\n }\n }\n }\n obj.parent.ignoreEvents = ignoreEvents;\n obj.ignoreHistory = ignoreHistory;\n\n // Events\n dispatch.call(obj, 'onundo', obj, historyRecord);\n};\n\n/**\n * Redo previously undone action\n */\nexport const redo = function () {\n const obj = this;\n\n // Ignore events and history\n const ignoreEvents = obj.parent.ignoreEvents ? true : false;\n const ignoreHistory = obj.ignoreHistory ? true : false;\n\n obj.parent.ignoreEvents = true;\n obj.ignoreHistory = true;\n\n // Records\n var records = [];\n\n // Update cells\n let historyRecord;\n\n if (obj.historyIndex < obj.history.length - 1) {\n // History\n historyRecord = obj.history[++obj.historyIndex];\n\n if (historyRecord.action == 'insertRow') {\n historyProcessRow.call(obj, 0, historyRecord);\n } else if (historyRecord.action == 'deleteRow') {\n historyProcessRow.call(obj, 1, historyRecord);\n } else if (historyRecord.action == 'insertColumn') {\n historyProcessColumn.call(obj, 0, historyRecord);\n } else if (historyRecord.action == 'deleteColumn') {\n historyProcessColumn.call(obj, 1, historyRecord);\n } else if (historyRecord.action == 'moveRow') {\n obj.moveRow(historyRecord.oldValue, historyRecord.newValue);\n } else if (historyRecord.action == 'moveColumn') {\n obj.moveColumn(historyRecord.oldValue, historyRecord.newValue);\n } else if (historyRecord.action == 'setMerge') {\n setMerge.call(obj, historyRecord.column, historyRecord.colspan, historyRecord.rowspan, 1);\n } else if (historyRecord.action == 'setStyle') {\n obj.setStyle(historyRecord.newValue, null, null, 1);\n } else if (historyRecord.action == 'setWidth') {\n obj.setWidth(historyRecord.column, historyRecord.newValue);\n } else if (historyRecord.action == 'setHeight') {\n obj.setHeight(historyRecord.row, historyRecord.newValue);\n } else if (historyRecord.action == 'setHeader') {\n obj.setHeader(historyRecord.column, historyRecord.newValue);\n } else if (historyRecord.action == 'setComments') {\n obj.setComments(historyRecord.newValue);\n } else if (historyRecord.action == 'orderBy') {\n updateOrderArrow.call(obj, historyRecord.column, historyRecord.order);\n updateOrder.call(obj, historyRecord.rows);\n } else if (historyRecord.action == 'setValue') {\n obj.setValue(historyRecord.records);\n // Redo for changes in cells\n for (let i = 0; i < historyRecord.records.length; i++) {\n if (historyRecord.oldStyle) {\n obj.resetStyle(historyRecord.newStyle);\n }\n }\n // Update selection\n if (historyRecord.selection) {\n obj.updateSelectionFromCoords(historyRecord.selection[0], historyRecord.selection[1], historyRecord.selection[2], historyRecord.selection[3]);\n }\n }\n }\n obj.parent.ignoreEvents = ignoreEvents;\n obj.ignoreHistory = ignoreHistory;\n\n // Events\n dispatch.call(obj, 'onredo', obj, historyRecord);\n};\n","import { getColumnNameFromId } from './internalHelpers.js';\n\nexport { getColumnNameFromId };\n\n/**\n * Get carret position for one element\n */\nexport const getCaretIndex = function (e) {\n let d;\n\n if (this.config.root) {\n d = this.config.root;\n } else {\n d = window;\n }\n let pos = 0;\n const s = d.getSelection();\n if (s) {\n if (s.rangeCount !== 0) {\n const r = s.getRangeAt(0);\n const p = r.cloneRange();\n p.selectNodeContents(e);\n p.setEnd(r.endContainer, r.endOffset);\n pos = p.toString().length;\n }\n }\n return pos;\n};\n\n/**\n * Invert keys and values\n */\nexport const invert = function (o) {\n const d = [];\n const k = Object.keys(o);\n for (let i = 0; i < k.length; i++) {\n d[o[k[i]]] = k[i];\n }\n return d;\n};\n\n/**\n * Get letter based on a number\n *\n * @param {number} columnNumber\n * @return string letter\n */\nexport const getColumnName = function (columnNumber) {\n let dividend = columnNumber + 1;\n let columnName = '';\n let modulo;\n\n while (dividend > 0) {\n modulo = (dividend - 1) % 26;\n columnName = String.fromCharCode(65 + modulo).toString() + columnName;\n dividend = parseInt((dividend - modulo) / 26);\n }\n\n return columnName;\n};\n\n/**\n * Get column name from coords\n */\nexport const getCellNameFromCoords = function (x, y) {\n return getColumnName(parseInt(x)) + (parseInt(y) + 1);\n};\n\nexport const getCoordsFromCellName = function (columnName) {\n // Get the letters\n const t = /^[a-zA-Z]+/.exec(columnName);\n\n if (t) {\n // Base 26 calculation\n let code = 0;\n for (let i = 0; i < t[0].length; i++) {\n code += parseInt(t[0].charCodeAt(i) - 64) * Math.pow(26, t[0].length - 1 - i);\n }\n code--;\n // Make sure jspreadsheet starts on zero\n if (code < 0) {\n code = 0;\n }\n\n // Number\n let number = parseInt(/[0-9]+$/.exec(columnName)) || null;\n if (number > 0) {\n number--;\n }\n\n return [code, number];\n }\n};\n\nexport const getCoordsFromRange = function (range) {\n const [start, end] = range.split(':');\n\n return [...getCoordsFromCellName(start), ...getCoordsFromCellName(end)];\n};\n\n/**\n * From stack overflow contributions\n */\nexport const parseCSV = function (str, delimiter) {\n // user-supplied delimeter or default comma\n delimiter = delimiter || ',';\n // Remove last line break\n str = str.replace(/\\r?\\n$|\\r$|\\n$/g, '');\n\n const arr = [];\n let quote = false; // true means we're inside a quoted field\n // iterate over each character, keep track of current row and column (of the returned array)\n let maxCol = 0;\n let row = 0,\n col = 0;\n for (let c = 0; c < str.length; c++) {\n const cc = str[c],\n nc = str[c + 1];\n arr[row] = arr[row] || [];\n arr[row][col] = arr[row][col] || '';\n\n // If the current character is a quotation mark, and we're inside a quoted field, and the next character is also a quotation mark, add a quotation mark to the current column and skip the next character\n if (cc == '\"' && quote && nc == '\"') {\n arr[row][col] += cc;\n ++c;\n continue;\n }\n\n // If it's just one quotation mark, begin/end quoted field\n if (cc == '\"') {\n quote = !quote;\n continue;\n }\n\n // If it's a comma and we're not in a quoted field, move on to the next column\n if (cc == delimiter && !quote) {\n ++col;\n continue;\n }\n\n // If it's a newline (CRLF) and we're not in a quoted field, skip the next character and move on to the next row and move to column 0 of that new row\n if (cc == '\\r' && nc == '\\n' && !quote) {\n ++row;\n maxCol = Math.max(maxCol, col);\n col = 0;\n ++c;\n continue;\n }\n\n // If it's a newline (LF or CR) and we're not in a quoted field, move on to the next row and move to column 0 of that new row\n if (cc == '\\n' && !quote) {\n ++row;\n maxCol = Math.max(maxCol, col);\n col = 0;\n continue;\n }\n if (cc == '\\r' && !quote) {\n ++row;\n maxCol = Math.max(maxCol, col);\n col = 0;\n continue;\n }\n\n // Otherwise, append the current character to the current column\n arr[row][col] += cc;\n }\n\n // fix array length\n arr.forEach((row, i) => {\n for (let i = row.length; i <= maxCol; i++) {\n row.push('');\n }\n });\n return arr;\n};\n\nexport const createFromTable = function (el, options) {\n if (el.tagName != 'TABLE') {\n console.log('Element is not a table');\n } else {\n // Configuration\n if (!options) {\n options = {};\n }\n\n options.columns = [];\n options.data = [];\n\n // Colgroup\n const colgroup = el.querySelectorAll('colgroup > col');\n if (colgroup.length) {\n // Get column width\n for (let i = 0; i < colgroup.length; i++) {\n let width = colgroup[i].style.width;\n if (!width) {\n width = colgroup[i].getAttribute('width');\n }\n // Set column width\n if (width) {\n if (!options.columns[i]) {\n options.columns[i] = {};\n }\n options.columns[i].width = width;\n }\n }\n }\n\n // Parse header\n const parseHeader = function (header, i) {\n // Get width information\n let info = header.getBoundingClientRect();\n const width = info.width > 50 ? info.width : 50;\n\n // Create column option\n if (!options.columns[i]) {\n options.columns[i] = {};\n }\n if (header.getAttribute('data-celltype')) {\n options.columns[i].type = header.getAttribute('data-celltype');\n } else {\n options.columns[i].type = 'text';\n }\n options.columns[i].width = width + 'px';\n options.columns[i].title = header.innerHTML;\n if (header.style.textAlign) {\n options.columns[i].align = header.style.textAlign;\n }\n\n if ((info = header.getAttribute('name'))) {\n options.columns[i].name = info;\n }\n if ((info = header.getAttribute('id'))) {\n options.columns[i].id = info;\n }\n if ((info = header.getAttribute('data-mask'))) {\n options.columns[i].mask = info;\n }\n };\n\n // Headers\n const nested = [];\n let headers = el.querySelectorAll(':scope > thead > tr');\n if (headers.length) {\n for (let j = 0; j < headers.length - 1; j++) {\n const cells = [];\n for (let i = 0; i < headers[j].children.length; i++) {\n const row = {\n title: headers[j].children[i].textContent,\n colspan: headers[j].children[i].getAttribute('colspan') || 1,\n };\n cells.push(row);\n }\n nested.push(cells);\n }\n // Get the last row in the thead\n headers = headers[headers.length - 1].children;\n // Go though the headers\n for (let i = 0; i < headers.length; i++) {\n parseHeader(headers[i], i);\n }\n }\n\n // Content\n let rowNumber = 0;\n const mergeCells = {};\n const rows = {};\n const style = {};\n const classes = {};\n\n let content = el.querySelectorAll(':scope > tr, :scope > tbody > tr');\n for (let j = 0; j < content.length; j++) {\n options.data[rowNumber] = [];\n if (options.parseTableFirstRowAsHeader == true && !headers.length && j == 0) {\n for (let i = 0; i < content[j].children.length; i++) {\n parseHeader(content[j].children[i], i);\n }\n } else {\n for (let i = 0; i < content[j].children.length; i++) {\n // WickedGrid formula compatibility\n let value = content[j].children[i].getAttribute('data-formula');\n if (value) {\n if (value.substr(0, 1) != '=') {\n value = '=' + value;\n }\n } else {\n value = content[j].children[i].innerHTML;\n }\n options.data[rowNumber].push(value);\n\n // Key\n const cellName = getColumnNameFromId([i, j]);\n\n // Classes\n const tmp = content[j].children[i].getAttribute('class');\n if (tmp) {\n classes[cellName] = tmp;\n }\n\n // Merged cells\n const mergedColspan = parseInt(content[j].children[i].getAttribute('colspan')) || 0;\n const mergedRowspan = parseInt(content[j].children[i].getAttribute('rowspan')) || 0;\n if (mergedColspan || mergedRowspan) {\n mergeCells[cellName] = [mergedColspan || 1, mergedRowspan || 1];\n }\n\n // Avoid problems with hidden cells\n if (content[j].children[i].style && content[j].children[i].style.display == 'none') {\n content[j].children[i].style.display = '';\n }\n // Get style\n const s = content[j].children[i].getAttribute('style');\n if (s) {\n style[cellName] = s;\n }\n // Bold\n if (content[j].children[i].classList.contains('styleBold')) {\n if (style[cellName]) {\n style[cellName] += '; font-weight:bold;';\n } else {\n style[cellName] = 'font-weight:bold;';\n }\n }\n }\n\n // Row Height\n if (content[j].style && content[j].style.height) {\n rows[j] = { height: content[j].style.height };\n }\n\n // Index\n rowNumber++;\n }\n }\n\n // Nested\n if (Object.keys(nested).length > 0) {\n options.nestedHeaders = nested;\n }\n // Style\n if (Object.keys(style).length > 0) {\n options.style = style;\n }\n // Merged\n if (Object.keys(mergeCells).length > 0) {\n options.mergeCells = mergeCells;\n }\n // Row height\n if (Object.keys(rows).length > 0) {\n options.rows = rows;\n }\n // Classes\n if (Object.keys(classes).length > 0) {\n options.classes = classes;\n }\n\n content = el.querySelectorAll('tfoot tr');\n if (content.length) {\n const footers = [];\n for (let j = 0; j < content.length; j++) {\n let footer = [];\n for (let i = 0; i < content[j].children.length; i++) {\n footer.push(content[j].children[i].textContent);\n }\n footers.push(footer);\n }\n if (Object.keys(footers).length > 0) {\n options.footers = footers;\n }\n }\n // TODO: data-hiddencolumns=\"3,4\"\n\n // I guess in terms the better column type\n if (options.parseTableAutoCellType == true) {\n const pattern = [];\n for (let i = 0; i < options.columns.length; i++) {\n let test = true;\n let testCalendar = true;\n pattern[i] = [];\n for (let j = 0; j < options.data.length; j++) {\n const value = options.data[j][i];\n if (!pattern[i][value]) {\n pattern[i][value] = 0;\n }\n pattern[i][value]++;\n if (value.length > 25) {\n test = false;\n }\n if (value.length == 10) {\n if (!(value.substr(4, 1) == '-' && value.substr(7, 1) == '-')) {\n testCalendar = false;\n }\n } else {\n testCalendar = false;\n }\n }\n\n const keys = Object.keys(pattern[i]).length;\n if (testCalendar) {\n options.columns[i].type = 'calendar';\n } else if (test == true && keys > 1 && keys <= parseInt(options.data.length * 0.1)) {\n options.columns[i].type = 'dropdown';\n options.columns[i].source = Object.keys(pattern[i]);\n }\n }\n }\n\n return options;\n }\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const lib = {\n jspreadsheet: {},\n};\n\nexport default lib;\n","\n\nimport dispatch from './dispatch.js';\nimport { getMask, isFormula, updateCell } from './internal.js';\nimport { setHistory } from './history.js';\nimport { getCellNameFromCoords } from './helpers.js';\n\n/**\n * Open the editor\n *\n * @param object cell\n * @return void\n */\nexport const openEditor = function (cell, empty, e) {\n const obj = this;\n\n // Get cell position\n const y = cell.getAttribute('data-y');\n const x = cell.getAttribute('data-x');\n\n // On edition start\n dispatch.call(obj, 'oneditionstart', obj, cell, parseInt(x), parseInt(y));\n\n // Overflow\n if (x > 0) {\n obj.records[y][x - 1].element.style.overflow = 'hidden';\n }\n\n // Create editor\n const createEditor = function (type) {\n // Cell information\n const info = cell.getBoundingClientRect();\n\n // Create dropdown\n const editor = document.createElement(type);\n editor.style.width = info.width + 'px';\n editor.style.height = info.height - 2 + 'px';\n editor.style.minHeight = info.height - 2 + 'px';\n\n // Edit cell\n cell.classList.add('editor');\n cell.innerHTML = '';\n cell.appendChild(editor);\n\n return editor;\n };\n\n // Readonly\n if (cell.classList.contains('readonly') == true) {\n // Do nothing\n } else {\n // Holder\n obj.edition = [obj.records[y][x].element, obj.records[y][x].element.innerHTML, x, y];\n\n let config = obj.options.columns && obj.options.columns[x];\n const cellName = getCellNameFromCoords(x, y);\n const cells = obj.options.cells;\n if (typeof cells === 'object' && cells[cellName]) {\n config = cells[cellName];\n }\n\n // If there is a custom editor for it\n if (config && typeof config.type === 'object') {\n // Custom editors\n config.type.openEditor(cell, obj.options.data[y][x], parseInt(x), parseInt(y), obj, config, e);\n\n // On edition start\n dispatch.call(obj, 'oncreateeditor', obj, cell, parseInt(x), parseInt(y), null, config);\n } else {\n // Native functions\n if (config && config.type == 'hidden') {\n // Do nothing\n } else if (config && (config.type == 'checkbox' || config.type == 'radio')) {\n // Get value\n const value = cell.children[0].checked ? false : true;\n // Toogle value\n obj.setValue(cell, value);\n // Do not keep edition open\n obj.edition = null;\n } else if (config && config.type == 'dropdown') {\n // Get current value\n let value = obj.options.data[y][x];\n if (config.multiple && !Array.isArray(value)) {\n value = value.split(';');\n }\n\n // Create dropdown\n let source;\n\n if (typeof config.filter == 'function') {\n source = config.filter(obj.element, cell, x, y, config.source);\n } else {\n source = config.source;\n }\n\n // Do not change the original source\n const data = [];\n if (source) {\n for (let j = 0; j < source.length; j++) {\n data.push(source[j]);\n }\n }\n\n // Create editor\n const editor = createEditor('div');\n\n // On edition start\n dispatch.call(obj, 'oncreateeditor', obj, cell, parseInt(x), parseInt(y), null, config);\n\n const options = {\n data: data,\n multiple: config.multiple ? true : false,\n autocomplete: config.autocomplete ? true : false,\n opened: true,\n value: value,\n width: '100%',\n height: editor.style.minHeight,\n position: obj.options.tableOverflow == true || obj.parent.config.fullscreen == true ? true : false,\n onclose: function () {\n closeEditor.call(obj, cell, true);\n },\n };\n if (config.options && config.options.type) {\n options.type = config.options.type;\n }\n jSuites.dropdown(editor, options);\n } else if (config && (config.type == 'calendar' || config.type == 'color')) {\n // Value\n const value = obj.options.data[y][x];\n // Create editor\n const editor = createEditor('input');\n\n dispatch.call(obj, 'oncreateeditor', obj, cell, parseInt(x), parseInt(y), null, config);\n\n editor.value = value;\n\n const options = config.options ? { ...config.options } : {};\n\n if (obj.options.tableOverflow == true || obj.parent.config.fullscreen == true) {\n options.position = true;\n }\n options.value = obj.options.data[y][x];\n options.opened = true;\n options.onclose = function (el, value) {\n closeEditor.call(obj, cell, true);\n };\n // Current value\n if (config.type == 'color') {\n jSuites.color(editor, options);\n\n const rect = cell.getBoundingClientRect();\n\n if (options.position) {\n editor.nextSibling.children[1].style.top = rect.top + rect.height + 'px';\n editor.nextSibling.children[1].style.left = rect.left + 'px';\n }\n } else {\n if (!options.format) {\n options.format = 'YYYY-MM-DD';\n }\n\n jSuites.calendar(editor, options);\n }\n // Focus on editor\n editor.focus();\n } else if (config && config.type == 'html') {\n const value = obj.options.data[y][x];\n // Create editor\n const editor = createEditor('div');\n\n dispatch.call(obj, 'oncreateeditor', obj, cell, parseInt(x), parseInt(y), null, config);\n\n editor.style.position = 'relative';\n const div = document.createElement('div');\n div.classList.add('jss_richtext');\n editor.appendChild(div);\n jSuites.editor(div, {\n focus: true,\n value: value,\n });\n const rect = cell.getBoundingClientRect();\n const rectContent = div.getBoundingClientRect();\n if (window.innerHeight < rect.bottom + rectContent.height) {\n div.style.top = rect.bottom - (rectContent.height + 2) + 'px';\n } else {\n div.style.top = rect.top + 'px';\n }\n\n if (window.innerWidth < rect.left + rectContent.width) {\n div.style.left = rect.right - (rectContent.width + 2) + 'px';\n } else {\n div.style.left = rect.left + 'px';\n }\n } else if (config && config.type == 'image') {\n // Value\n const img = cell.children[0];\n // Create editor\n const editor = createEditor('div');\n\n dispatch.call(obj, 'oncreateeditor', obj, cell, parseInt(x), parseInt(y), null, config);\n\n editor.style.position = 'relative';\n const div = document.createElement('div');\n div.classList.add('jclose');\n if (img && img.src) {\n div.appendChild(img);\n }\n editor.appendChild(div);\n jSuites.image(div, config);\n const rect = cell.getBoundingClientRect();\n const rectContent = div.getBoundingClientRect();\n if (window.innerHeight < rect.bottom + rectContent.height) {\n div.style.top = rect.top - (rectContent.height + 2) + 'px';\n } else {\n div.style.top = rect.top + 'px';\n }\n\n div.style.left = rect.left + 'px';\n } else {\n // Value\n const value = empty == true ? '' : obj.options.data[y][x];\n\n // Basic editor\n let editor;\n\n if ((!config || config.wordWrap != false) && (obj.options.wordWrap == true || (config && config.wordWrap == true))) {\n editor = createEditor('textarea');\n } else {\n editor = createEditor('input');\n }\n\n dispatch.call(obj, 'oncreateeditor', obj, cell, parseInt(x), parseInt(y), null, config);\n\n editor.focus();\n editor.value = value;\n\n // Column options\n const options = config;\n\n // Apply format when is not a formula\n if (!isFormula(value)) {\n if (options) {\n // Format\n const opt = getMask(options);\n\n if (opt) {\n // Masking\n if (!options.disabledMaskOnEdition) {\n if (options.mask) {\n const m = options.mask.split(';');\n editor.setAttribute('data-mask', m[0]);\n } else if (options.locale) {\n editor.setAttribute('data-locale', options.locale);\n }\n }\n // Input\n opt.input = editor;\n // Configuration\n editor.mask = opt;\n // Do not treat the decimals\n jSuites.mask.render(value, opt, false);\n }\n }\n }\n\n editor.onblur = function () {\n closeEditor.call(obj, cell, true);\n };\n editor.scrollLeft = editor.scrollWidth;\n }\n }\n }\n};\n\n/**\n * Close the editor and save the information\n *\n * @param object cell\n * @param boolean save\n * @return void\n */\nexport const closeEditor = function (cell, save) {\n const obj = this;\n\n const x = parseInt(cell.getAttribute('data-x'));\n const y = parseInt(cell.getAttribute('data-y'));\n\n let config = obj.options.columns && obj.options.columns[x];\n const cellName = getCellNameFromCoords(x, y);\n const cells = obj.options.cells;\n if (typeof cells === 'object' && cells[cellName]) {\n config = cells[cellName];\n }\n\n let value;\n\n // Get cell properties\n if (save == true) {\n // If custom editor\n if (config && typeof config.type === 'object') {\n // Custom editor\n value = config.type.closeEditor(cell, save, parseInt(x), parseInt(y), obj, config);\n } else {\n // Native functions\n if (config && (config.type == 'checkbox' || config.type == 'radio' || config.type == 'hidden')) {\n // Do nothing\n } else if (config && config.type == 'dropdown') {\n value = cell.children[0].dropdown.close(true);\n } else if (config && config.type == 'calendar') {\n value = cell.children[0].calendar.close(true);\n } else if (config && config.type == 'color') {\n value = cell.children[0].color.close(true);\n } else if (config && config.type == 'html') {\n value = cell.children[0].children[0].editor.getData();\n } else if (config && config.type == 'image') {\n const img = cell.children[0].children[0].children[0];\n value = img && img.tagName == 'IMG' ? img.src : '';\n } else if (config && config.type == 'numeric') {\n value = cell.children[0].value;\n if (('' + value).substr(0, 1) != '=') {\n if (value == '') {\n value = config.allowEmpty ? '' : 0;\n }\n }\n cell.children[0].onblur = null;\n } else {\n value = cell.children[0].value;\n cell.children[0].onblur = null;\n\n // Column options\n const options = config;\n\n if (options) {\n // Format\n const opt = getMask(options);\n if (opt) {\n // Keep numeric in the raw data\n if (value !== '' && !isFormula(value) && typeof value !== 'number') {\n const t = jSuites.mask.extract(value, opt, true);\n if (t && t.value !== '') {\n value = t.value;\n }\n }\n }\n }\n }\n }\n\n // Ignore changes if the value is the same\n if (obj.options.data[y][x] == value) {\n cell.innerHTML = obj.edition[1];\n } else {\n obj.setValue(cell, value); // update cell\n }\n } else {\n if (config && typeof config.type === 'object') {\n // Custom editor\n config.type.closeEditor(cell, save, parseInt(x), parseInt(y), obj, config);\n } else {\n if (config && config.type == 'dropdown') {\n cell.children[0].dropdown.close(true);\n } else if (config && config.type == 'calendar') {\n cell.children[0].calendar.close(true);\n } else if (config && config.type == 'color') {\n cell.children[0].color.close(true);\n } else {\n cell.children[0].onblur = null;\n }\n }\n\n // Restore value\n cell.innerHTML = obj.edition && obj.edition[1] ? obj.edition[1] : '';\n }\n\n // On edition end\n dispatch.call(obj, 'oneditionend', obj, cell, x, y, value, save);\n\n // Remove editor class\n cell.classList.remove('editor');\n\n // Finish edition\n obj.edition = null;\n};\n\n/**\n * Toogle\n */\nexport const setCheckRadioValue = function () {\n const obj = this;\n\n const records = [];\n const keys = Object.keys(obj.highlighted);\n for (let i = 0; i < keys.length; i++) {\n const x = obj.highlighted[i].element.getAttribute('data-x');\n const y = obj.highlighted[i].element.getAttribute('data-y');\n\n let config = obj.options.columns && obj.options.columns[x];\n const cellName = getCellNameFromCoords(x, y);\n const cells = obj.options.cells;\n if (typeof cells === 'object' && cells[cellName]) {\n config = cells[cellName];\n }\n\n if (config.type == 'checkbox' || config.type == 'radio') {\n // Update cell\n records.push(updateCell.call(obj, x, y, !obj.options.data[y][x]));\n }\n }\n\n if (records.length) {\n // Update history\n setHistory.call(obj, {\n action: 'setValue',\n records: records,\n selection: obj.selectedCell,\n });\n\n // On after changes\n const onafterchangesRecords = records.map(function (record) {\n return {\n x: record.x,\n y: record.y,\n value: record.value,\n oldValue: record.oldValue,\n };\n });\n\n dispatch.call(obj, 'onafterchanges', obj, onafterchangesRecords);\n }\n};\n","import { updateScroll } from './internal.js';\nimport { loadDown, loadPage, loadUp, loadValidation } from './lazyLoading.js';\n\nconst upGet = function (x, y) {\n const obj = this;\n\n x = parseInt(x);\n y = parseInt(y);\n for (let j = y - 1; j >= 0; j--) {\n if (obj.records[j][x].element.style.display != 'none' && obj.rows[j].element.style.display != 'none') {\n if (obj.records[j][x].element.getAttribute('data-merged')) {\n if (obj.records[j][x].element == obj.records[y][x].element) {\n continue;\n }\n }\n y = j;\n break;\n }\n }\n\n return y;\n};\n\nconst upVisible = function (group, direction) {\n const obj = this;\n\n let x, y;\n\n if (group == 0) {\n x = parseInt(obj.selectedCell[0]);\n y = parseInt(obj.selectedCell[1]);\n } else {\n x = parseInt(obj.selectedCell[2]);\n y = parseInt(obj.selectedCell[3]);\n }\n\n if (direction == 0) {\n for (let j = 0; j < y; j++) {\n if (obj.records[j][x].element.style.display != 'none' && obj.rows[j].element.style.display != 'none') {\n y = j;\n break;\n }\n }\n } else {\n y = upGet.call(obj, x, y);\n }\n\n if (group == 0) {\n obj.selectedCell[0] = x;\n obj.selectedCell[1] = y;\n } else {\n obj.selectedCell[2] = x;\n obj.selectedCell[3] = y;\n }\n};\n\nexport const up = function (shiftKey, ctrlKey) {\n const obj = this;\n\n if (shiftKey) {\n if (obj.selectedCell[3] > 0) {\n upVisible.call(obj, 1, ctrlKey ? 0 : 1);\n }\n } else {\n if (obj.selectedCell[1] > 0) {\n upVisible.call(obj, 0, ctrlKey ? 0 : 1);\n }\n obj.selectedCell[2] = obj.selectedCell[0];\n obj.selectedCell[3] = obj.selectedCell[1];\n }\n\n // Update selection\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n\n // Change page\n if (obj.options.lazyLoading == true) {\n if (obj.selectedCell[1] == 0 || obj.selectedCell[3] == 0) {\n loadPage.call(obj, 0);\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n } else {\n if (loadValidation.call(obj)) {\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n } else {\n const item = parseInt(obj.tbody.firstChild.getAttribute('data-y'));\n if (obj.selectedCell[1] - item < 30) {\n loadUp.call(obj);\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n }\n }\n }\n } else if (obj.options.pagination > 0) {\n const pageNumber = obj.whichPage(obj.selectedCell[3]);\n if (pageNumber != obj.pageNumber) {\n obj.page(pageNumber);\n }\n }\n\n updateScroll.call(obj, 1);\n};\n\nexport const rightGet = function (x, y) {\n const obj = this;\n\n x = parseInt(x);\n y = parseInt(y);\n\n for (let i = x + 1; i < obj.headers.length; i++) {\n if (obj.records[y][i].element.style.display != 'none') {\n if (obj.records[y][i].element.getAttribute('data-merged')) {\n if (obj.records[y][i].element == obj.records[y][x].element) {\n continue;\n }\n }\n x = i;\n break;\n }\n }\n\n return x;\n};\n\nconst rightVisible = function (group, direction) {\n const obj = this;\n\n let x, y;\n\n if (group == 0) {\n x = parseInt(obj.selectedCell[0]);\n y = parseInt(obj.selectedCell[1]);\n } else {\n x = parseInt(obj.selectedCell[2]);\n y = parseInt(obj.selectedCell[3]);\n }\n\n if (direction == 0) {\n for (let i = obj.headers.length - 1; i > x; i--) {\n if (obj.records[y][i].element.style.display != 'none') {\n x = i;\n break;\n }\n }\n } else {\n x = rightGet.call(obj, x, y);\n }\n\n if (group == 0) {\n obj.selectedCell[0] = x;\n obj.selectedCell[1] = y;\n } else {\n obj.selectedCell[2] = x;\n obj.selectedCell[3] = y;\n }\n};\n\nexport const right = function (shiftKey, ctrlKey) {\n const obj = this;\n\n if (shiftKey) {\n if (obj.selectedCell[2] < obj.headers.length - 1) {\n rightVisible.call(obj, 1, ctrlKey ? 0 : 1);\n }\n } else {\n if (obj.selectedCell[0] < obj.headers.length - 1) {\n rightVisible.call(obj, 0, ctrlKey ? 0 : 1);\n }\n obj.selectedCell[2] = obj.selectedCell[0];\n obj.selectedCell[3] = obj.selectedCell[1];\n }\n\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n updateScroll.call(obj, 2);\n};\n\nexport const downGet = function (x, y) {\n const obj = this;\n\n x = parseInt(x);\n y = parseInt(y);\n for (let j = y + 1; j < obj.rows.length; j++) {\n if (obj.records[j][x].element.style.display != 'none' && obj.rows[j].element.style.display != 'none') {\n if (obj.records[j][x].element.getAttribute('data-merged')) {\n if (obj.records[j][x].element == obj.records[y][x].element) {\n continue;\n }\n }\n y = j;\n break;\n }\n }\n\n return y;\n};\n\nconst downVisible = function (group, direction) {\n const obj = this;\n\n let x, y;\n\n if (group == 0) {\n x = parseInt(obj.selectedCell[0]);\n y = parseInt(obj.selectedCell[1]);\n } else {\n x = parseInt(obj.selectedCell[2]);\n y = parseInt(obj.selectedCell[3]);\n }\n\n if (direction == 0) {\n for (let j = obj.rows.length - 1; j > y; j--) {\n if (obj.records[j][x].element.style.display != 'none' && obj.rows[j].element.style.display != 'none') {\n y = j;\n break;\n }\n }\n } else {\n y = downGet.call(obj, x, y);\n }\n\n if (group == 0) {\n obj.selectedCell[0] = x;\n obj.selectedCell[1] = y;\n } else {\n obj.selectedCell[2] = x;\n obj.selectedCell[3] = y;\n }\n};\n\nexport const down = function (shiftKey, ctrlKey) {\n const obj = this;\n\n if (shiftKey) {\n if (obj.selectedCell[3] < obj.records.length - 1) {\n downVisible.call(obj, 1, ctrlKey ? 0 : 1);\n }\n } else {\n if (obj.selectedCell[1] < obj.records.length - 1) {\n downVisible.call(obj, 0, ctrlKey ? 0 : 1);\n }\n obj.selectedCell[2] = obj.selectedCell[0];\n obj.selectedCell[3] = obj.selectedCell[1];\n }\n\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n\n // Change page\n if (obj.options.lazyLoading == true) {\n if (obj.selectedCell[1] == obj.records.length - 1 || obj.selectedCell[3] == obj.records.length - 1) {\n loadPage.call(obj, -1);\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n } else {\n if (loadValidation.call(obj)) {\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n } else {\n const item = parseInt(obj.tbody.lastChild.getAttribute('data-y'));\n if (item - obj.selectedCell[3] < 30) {\n loadDown.call(obj);\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n }\n }\n }\n } else if (obj.options.pagination > 0) {\n const pageNumber = obj.whichPage(obj.selectedCell[3]);\n if (pageNumber != obj.pageNumber) {\n obj.page(pageNumber);\n }\n }\n\n updateScroll.call(obj, 3);\n};\n\nconst leftGet = function (x, y) {\n const obj = this;\n\n x = parseInt(x);\n y = parseInt(y);\n for (let i = x - 1; i >= 0; i--) {\n if (obj.records[y][i].element.style.display != 'none') {\n if (obj.records[y][i].element.getAttribute('data-merged')) {\n if (obj.records[y][i].element == obj.records[y][x].element) {\n continue;\n }\n }\n x = i;\n break;\n }\n }\n\n return x;\n};\n\nconst leftVisible = function (group, direction) {\n const obj = this;\n\n let x, y;\n\n if (group == 0) {\n x = parseInt(obj.selectedCell[0]);\n y = parseInt(obj.selectedCell[1]);\n } else {\n x = parseInt(obj.selectedCell[2]);\n y = parseInt(obj.selectedCell[3]);\n }\n\n if (direction == 0) {\n for (let i = 0; i < x; i++) {\n if (obj.records[y][i].element.style.display != 'none') {\n x = i;\n break;\n }\n }\n } else {\n x = leftGet.call(obj, x, y);\n }\n\n if (group == 0) {\n obj.selectedCell[0] = x;\n obj.selectedCell[1] = y;\n } else {\n obj.selectedCell[2] = x;\n obj.selectedCell[3] = y;\n }\n};\n\nexport const left = function (shiftKey, ctrlKey) {\n const obj = this;\n\n if (shiftKey) {\n if (obj.selectedCell[2] > 0) {\n leftVisible.call(obj, 1, ctrlKey ? 0 : 1);\n }\n } else {\n if (obj.selectedCell[0] > 0) {\n leftVisible.call(obj, 0, ctrlKey ? 0 : 1);\n }\n obj.selectedCell[2] = obj.selectedCell[0];\n obj.selectedCell[3] = obj.selectedCell[1];\n }\n\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n updateScroll.call(obj, 0);\n};\n\nexport const first = function (shiftKey, ctrlKey) {\n const obj = this;\n\n if (shiftKey) {\n if (ctrlKey) {\n obj.selectedCell[3] = 0;\n } else {\n leftVisible.call(obj, 1, 0);\n }\n } else {\n if (ctrlKey) {\n obj.selectedCell[1] = 0;\n } else {\n leftVisible.call(obj, 0, 0);\n }\n obj.selectedCell[2] = obj.selectedCell[0];\n obj.selectedCell[3] = obj.selectedCell[1];\n }\n\n // Change page\n if (obj.options.lazyLoading == true && (obj.selectedCell[1] == 0 || obj.selectedCell[3] == 0)) {\n loadPage.call(obj, 0);\n } else if (obj.options.pagination > 0) {\n const pageNumber = obj.whichPage(obj.selectedCell[3]);\n if (pageNumber != obj.pageNumber) {\n obj.page(pageNumber);\n }\n }\n\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n updateScroll.call(obj, 1);\n};\n\nexport const last = function (shiftKey, ctrlKey) {\n const obj = this;\n\n if (shiftKey) {\n if (ctrlKey) {\n obj.selectedCell[3] = obj.records.length - 1;\n } else {\n rightVisible.call(obj, 1, 0);\n }\n } else {\n if (ctrlKey) {\n obj.selectedCell[1] = obj.records.length - 1;\n } else {\n rightVisible.call(obj, 0, 0);\n }\n obj.selectedCell[2] = obj.selectedCell[0];\n obj.selectedCell[3] = obj.selectedCell[1];\n }\n\n // Change page\n if (obj.options.lazyLoading == true && (obj.selectedCell[1] == obj.records.length - 1 || obj.selectedCell[3] == obj.records.length - 1)) {\n loadPage.call(obj, -1);\n } else if (obj.options.pagination > 0) {\n const pageNumber = obj.whichPage(obj.selectedCell[3]);\n if (pageNumber != obj.pageNumber) {\n obj.page(pageNumber);\n }\n }\n\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n updateScroll.call(obj, 3);\n};\n","\n\nimport { parseCSV } from './helpers.js';\nimport dispatch from './dispatch.js';\nimport { setHistory } from './history.js';\nimport { updateCell, updateFormulaChain, updateTable, updateTableReferences } from './internal.js';\nimport { downGet, rightGet } from './keys.js';\nimport { hash, removeCopyingSelection, updateSelectionFromCoords } from './selection.js';\nimport { getColumnNameFromId } from './internalHelpers.js';\n\n/**\n * Copy method\n *\n * @param bool highlighted - Get only highlighted cells\n * @param delimiter - \\t default to keep compatibility with excel\n * @return string value\n */\nexport const copy = function (highlighted, delimiter, returnData, includeHeaders, download, isCut, processed) {\n const obj = this;\n\n if (!delimiter) {\n delimiter = '\\t';\n }\n\n const div = new RegExp(delimiter, 'ig');\n\n // Controls\n const header = [];\n let col = [];\n let colLabel = [];\n const row = [];\n const rowLabel = [];\n const x = obj.options.data[0].length;\n const y = obj.options.data.length;\n let tmp = '';\n let copyHeader = false;\n let headers = '';\n let nestedHeaders = '';\n let numOfCols = 0;\n let numOfRows = 0;\n\n // Partial copy\n let copyX = 0;\n let copyY = 0;\n let isPartialCopy = true;\n // Go through the columns to get the data\n for (let j = 0; j < y; j++) {\n for (let i = 0; i < x; i++) {\n // If cell is highlighted\n if (!highlighted || obj.records[j][i].element.classList.contains('highlight')) {\n if (copyX <= i) {\n copyX = i;\n }\n if (copyY <= j) {\n copyY = j;\n }\n }\n }\n }\n if (x === copyX + 1 && y === copyY + 1) {\n isPartialCopy = false;\n }\n\n if (download && (obj.parent.config.includeHeadersOnDownload == true || includeHeaders)) {\n // Nested headers\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0) {\n tmp = obj.options.nestedHeaders;\n\n for (let j = 0; j < tmp.length; j++) {\n const nested = [];\n for (let i = 0; i < tmp[j].length; i++) {\n const colspan = parseInt(tmp[j][i].colspan);\n nested.push(tmp[j][i].title);\n for (let c = 0; c < colspan - 1; c++) {\n nested.push('');\n }\n }\n nestedHeaders += nested.join(delimiter) + '\\r\\n';\n }\n }\n\n copyHeader = true;\n }\n\n // Reset container\n obj.style = [];\n\n // Go through the columns to get the data\n for (let j = 0; j < y; j++) {\n col = [];\n colLabel = [];\n\n for (let i = 0; i < x; i++) {\n // If cell is highlighted\n if (!highlighted || obj.records[j][i].element.classList.contains('highlight')) {\n if (copyHeader == true) {\n header.push(obj.headers[i].textContent);\n }\n // Values\n let value = obj.options.data[j][i];\n if (value.match && (value.match(div) || value.match(/,/g) || value.match(/\\n/) || value.match(/\"/))) {\n value = value.replace(new RegExp('\"', 'g'), '\"\"');\n value = '\"' + value + '\"';\n }\n col.push(value);\n\n // Labels\n let label;\n\n if (obj.options.columns && obj.options.columns[i] && (obj.options.columns[i].type == 'checkbox' || obj.options.columns[i].type == 'radio')) {\n label = value;\n } else {\n label = obj.records[j][i].element.innerHTML;\n if (label.match && (label.match(div) || label.match(/,/g) || label.match(/\\n/) || label.match(/\"/))) {\n // Scape double quotes\n label = label.replace(new RegExp('\"', 'g'), '\"\"');\n label = '\"' + label + '\"';\n }\n }\n colLabel.push(label);\n\n // Get style\n tmp = obj.records[j][i].element.getAttribute('style');\n tmp = tmp.replace('display: none;', '');\n obj.style.push(tmp ? tmp : '');\n }\n }\n\n if (col.length) {\n if (copyHeader) {\n numOfCols = col.length;\n row.push(header.join(delimiter));\n }\n row.push(col.join(delimiter));\n }\n if (colLabel.length) {\n numOfRows++;\n if (copyHeader) {\n rowLabel.push(header.join(delimiter));\n copyHeader = false;\n }\n rowLabel.push(colLabel.join(delimiter));\n }\n }\n\n if (x == numOfCols && y == numOfRows) {\n headers = nestedHeaders;\n }\n\n // Final string\n const str = headers + row.join('\\r\\n');\n let strLabel = headers + rowLabel.join('\\r\\n');\n\n // Create a hidden textarea to copy the values\n if (!returnData) {\n // Paste event\n const selectedRange = [\n Math.min(obj.selectedCell[0], obj.selectedCell[2]),\n Math.min(obj.selectedCell[1], obj.selectedCell[3]),\n Math.max(obj.selectedCell[0], obj.selectedCell[2]),\n Math.max(obj.selectedCell[1], obj.selectedCell[3]),\n ];\n\n const result = dispatch.call(obj, 'oncopy', obj, selectedRange, strLabel, isCut);\n\n if (result) {\n strLabel = result;\n } else if (result === false) {\n return false;\n }\n\n obj.textarea.value = strLabel;\n obj.textarea.select();\n document.execCommand('copy');\n }\n\n // Keep data\n if (processed == true) {\n obj.data = strLabel;\n } else {\n obj.data = str;\n }\n // Keep non visible information\n obj.hashString = hash.call(obj, obj.data);\n\n // Any exiting border should go\n if (!returnData) {\n removeCopyingSelection.call(obj);\n\n // Border\n if (obj.highlighted) {\n for (let i = 0; i < obj.highlighted.length; i++) {\n obj.highlighted[i].element.classList.add('copying');\n if (obj.highlighted[i].element.classList.contains('highlight-left')) {\n obj.highlighted[i].element.classList.add('copying-left');\n }\n if (obj.highlighted[i].element.classList.contains('highlight-right')) {\n obj.highlighted[i].element.classList.add('copying-right');\n }\n if (obj.highlighted[i].element.classList.contains('highlight-top')) {\n obj.highlighted[i].element.classList.add('copying-top');\n }\n if (obj.highlighted[i].element.classList.contains('highlight-bottom')) {\n obj.highlighted[i].element.classList.add('copying-bottom');\n }\n }\n }\n }\n\n return obj.data;\n};\n\n/**\n * Jspreadsheet paste method\n *\n * @param x target column\n * @param y target row\n * @param data paste data. if data hash is the same as the copied data, apply style from copied cells\n * @return string value\n */\nexport const paste = function (x, y, data) {\n const obj = this;\n\n // Controls\n const dataHash = hash(data);\n let style = dataHash == obj.hashString ? obj.style : null;\n\n // Depending on the behavior\n if (dataHash == obj.hashString) {\n data = obj.data;\n }\n\n // Split new line\n data = parseCSV(data, '\\t');\n\n const ex = obj.selectedCell[2];\n const ey = obj.selectedCell[3];\n\n const w = ex - x + 1;\n const h = ey - y + 1;\n\n // Modify data to allow wor extending paste range in multiples of input range\n const srcW = data[0].length;\n if ((w > 1) & Number.isInteger(w / srcW)) {\n const repeats = w / srcW;\n if (style) {\n const newStyle = [];\n for (let i = 0; i < style.length; i += srcW) {\n const chunk = style.slice(i, i + srcW);\n for (let j = 0; j < repeats; j++) {\n newStyle.push(...chunk);\n }\n }\n style = newStyle;\n }\n\n const arrayB = data.map(function (row, i) {\n const arrayC = Array.apply(null, { length: repeats * row.length }).map(function (e, i) {\n return row[i % row.length];\n });\n return arrayC;\n });\n data = arrayB;\n }\n const srcH = data.length;\n if ((h > 1) & Number.isInteger(h / srcH)) {\n const repeats = h / srcH;\n if (style) {\n const newStyle = [];\n for (let j = 0; j < repeats; j++) {\n newStyle.push(...style);\n }\n style = newStyle;\n }\n const arrayB = Array.apply(null, { length: repeats * srcH }).map(function (e, i) {\n return data[i % srcH];\n });\n data = arrayB;\n }\n\n // Paste filter\n const ret = dispatch.call(\n obj,\n 'onbeforepaste',\n obj,\n data.map(function (row) {\n return row.map(function (item) {\n return { value: item };\n });\n }),\n x,\n y\n );\n\n if (ret === false) {\n return false;\n } else if (ret) {\n data = ret;\n }\n\n if (x != null && y != null && data) {\n // Records\n let i = 0;\n let j = 0;\n const records = [];\n const newStyle = {};\n const oldStyle = {};\n let styleIndex = 0;\n\n // Index\n let colIndex = parseInt(x);\n let rowIndex = parseInt(y);\n let row = null;\n\n const hiddenColCount = obj.headers.slice(colIndex).filter((x) => x.style.display === 'none').length;\n const expandedColCount = colIndex + hiddenColCount + data[0].length;\n const currentColCount = obj.headers.length;\n if (expandedColCount > currentColCount) {\n obj.skipUpdateTableReferences = true;\n obj.insertColumn(expandedColCount - currentColCount);\n }\n const hiddenRowCount = obj.rows.slice(rowIndex).filter((x) => x.element.style.display === 'none').length;\n const expandedRowCount = rowIndex + hiddenRowCount + data.length;\n const currentRowCount = obj.rows.length;\n if (expandedRowCount > currentRowCount) {\n obj.skipUpdateTableReferences = true;\n obj.insertRow(expandedRowCount - currentRowCount);\n }\n\n if (obj.skipUpdateTableReferences) {\n obj.skipUpdateTableReferences = false;\n updateTableReferences.call(obj);\n }\n\n // Go through the columns to get the data\n while ((row = data[j])) {\n i = 0;\n colIndex = parseInt(x);\n\n while (row[i] != null) {\n let value = row[i];\n\n if (obj.options.columns && obj.options.columns[i] && obj.options.columns[i].type == 'calendar') {\n value = jSuites.calendar.extractDateFromString(\n value,\n (obj.options.columns[i].options && obj.options.columns[i].options.format) || 'YYYY-MM-DD'\n );\n }\n\n // Update and keep history\n const record = updateCell.call(obj, colIndex, rowIndex, value);\n // Keep history\n records.push(record);\n // Update all formulas in the chain\n updateFormulaChain.call(obj, colIndex, rowIndex, records);\n // Style\n if (style && style[styleIndex]) {\n const columnName = getColumnNameFromId([colIndex, rowIndex]);\n newStyle[columnName] = style[styleIndex];\n oldStyle[columnName] = obj.getStyle(columnName);\n obj.records[rowIndex][colIndex].element.setAttribute('style', style[styleIndex]);\n styleIndex++;\n }\n i++;\n if (row[i] != null) {\n if (colIndex >= obj.headers.length - 1) {\n // If the pasted column is out of range, create it if possible\n if (obj.options.allowInsertColumn != false) {\n obj.insertColumn();\n // Otherwise skip the pasted data that overflows\n } else {\n break;\n }\n }\n colIndex = rightGet.call(obj, colIndex, rowIndex);\n }\n }\n\n j++;\n if (data[j]) {\n if (rowIndex >= obj.rows.length - 1) {\n // If the pasted row is out of range, create it if possible\n if (obj.options.allowInsertRow != false) {\n obj.insertRow();\n // Otherwise skip the pasted data that overflows\n } else {\n break;\n }\n }\n rowIndex = downGet.call(obj, x, rowIndex);\n }\n }\n\n // Select the new cells\n updateSelectionFromCoords.call(obj, x, y, colIndex, rowIndex);\n\n // Update history\n setHistory.call(obj, {\n action: 'setValue',\n records: records,\n selection: obj.selectedCell,\n newStyle: newStyle,\n oldStyle: oldStyle,\n });\n\n // Update table\n updateTable.call(obj);\n\n // Paste event\n const eventRecords = [];\n\n for (let j = 0; j < data.length; j++) {\n for (let i = 0; i < data[j].length; i++) {\n eventRecords.push({\n x: i + x,\n y: j + y,\n value: data[j][i],\n });\n }\n }\n\n dispatch.call(obj, 'onpaste', obj, eventRecords);\n\n // On after changes\n const onafterchangesRecords = records.map(function (record) {\n return {\n x: record.x,\n y: record.y,\n value: record.value,\n oldValue: record.oldValue,\n };\n });\n\n dispatch.call(obj, 'onafterchanges', obj, onafterchangesRecords);\n }\n\n removeCopyingSelection();\n};\n","\nimport dispatch from './dispatch.js';\nimport { getColumnName } from './helpers.js';\nimport { setHistory } from './history.js';\nimport { isColMerged } from './merges.js';\nimport { createCell, updateTableReferences } from './internal.js';\nimport { conditionalSelectionUpdate, updateCornerPosition } from './selection.js';\nimport { setFooter } from './footer.js';\nimport { getColumnNameFromId, injectArray, getFreezeColumnLeft } from './internalHelpers.js';\n\n/**\n * 获取列数\n * minDimensions > 第一行data长度 > columns长度\n * @returns number numberOfColumns\n */\nexport const getNumberOfColumns = function () {\n const obj = this;\n\n let numberOfColumns = (obj.options.columns && obj.options.columns.length) || 0;\n\n if (obj.options.data && typeof obj.options.data[0] !== 'undefined') {\n // Data keys\n const keys = Object.keys(obj.options.data[0]);\n\n if (keys.length > numberOfColumns) {\n numberOfColumns = keys.length;\n }\n }\n\n if (obj.options.minDimensions && obj.options.minDimensions[0] > numberOfColumns) {\n numberOfColumns = obj.options.minDimensions[0];\n }\n\n return numberOfColumns;\n};\n\nexport const createCellHeader = function (colNumber) {\n const obj = this;\n\n // Create col global control\n const colWidth = (obj.options.columns && obj.options.columns[colNumber] && obj.options.columns[colNumber].width) || obj.options.defaultColWidth || 100;\n const colAlign = (obj.options.columns && obj.options.columns[colNumber] && obj.options.columns[colNumber].align) || obj.options.defaultColAlign || 'center';\n\n // Create header cell\n obj.headers[colNumber] = document.createElement('td');\n obj.headers[colNumber].textContent =\n (obj.options.columns && obj.options.columns[colNumber] && obj.options.columns[colNumber].title) || getColumnName(colNumber);\n\n obj.headers[colNumber].setAttribute('data-x', colNumber);\n obj.headers[colNumber].style.textAlign = colAlign;\n if (obj.options.columns && obj.options.columns[colNumber] && obj.options.columns[colNumber].title) {\n obj.headers[colNumber].setAttribute('title', obj.headers[colNumber].innerText);\n }\n if (obj.options.columns && obj.options.columns[colNumber] && obj.options.columns[colNumber].id) {\n obj.headers[colNumber].setAttribute('id', obj.options.columns[colNumber].id);\n }\n\n // 表头冻结\n if (obj.options.freezeColumns > colNumber) {\n obj.headers[colNumber].classList.add('jss_frozen');\n obj.headers[colNumber].style.left = getFreezeColumnLeft(colNumber, obj.options.columns);\n }\n\n // Width control\n const colElement = document.createElement('col');\n colElement.setAttribute('width', colWidth);\n\n obj.cols[colNumber] = {\n colElement,\n x: colNumber,\n };\n\n // Hidden column\n if (obj.options.columns && obj.options.columns[colNumber] && obj.options.columns[colNumber].type == 'hidden') {\n obj.headers[colNumber].style.display = 'none';\n colElement.style.display = 'none';\n }\n};\n\n/**\n * Insert a new column\n *\n * @param mixed - num of columns to be added or data to be added in one single column\n * @param int columnNumber - number of columns to be created\n * @param bool insertBefore\n * @param object properties - column properties\n * @return void\n */\nexport const insertColumn = function (mixed, columnNumber, insertBefore, properties) {\n const obj = this;\n\n // Configuration\n if (obj.options.allowInsertColumn != false) {\n // Records\n var records = [];\n\n // Data to be insert\n let data = [];\n\n // The insert could be lead by number of rows or the array of data\n let numOfColumns;\n if (!Array.isArray(mixed)) {\n numOfColumns = typeof mixed === 'number' ? mixed : 1;\n } else {\n numOfColumns = 1;\n\n if (mixed) {\n data = mixed;\n }\n }\n\n // Direction\n insertBefore = insertBefore ? true : false;\n\n // Current column number\n const currentNumOfColumns = Math.max(\n obj.options.columns.length,\n ...obj.options.data.map(function (row) {\n return row.length;\n })\n );\n\n const lastColumn = currentNumOfColumns - 1;\n\n // Confirm position\n if (columnNumber == undefined || columnNumber >= parseInt(lastColumn) || columnNumber < 0) {\n columnNumber = lastColumn;\n }\n\n // Create default properties\n if (!properties) {\n properties = [];\n }\n\n for (let i = 0; i < numOfColumns; i++) {\n if (!properties[i]) {\n properties[i] = {};\n }\n }\n\n const columns = [];\n\n if (!Array.isArray(mixed)) {\n for (let i = 0; i < mixed; i++) {\n const column = {\n column: columnNumber + i + (insertBefore ? 0 : 1),\n options: Object.assign({}, properties[i]),\n };\n\n columns.push(column);\n }\n } else {\n const data = [];\n\n for (let i = 0; i < obj.options.data.length; i++) {\n data.push(i < mixed.length ? mixed[i] : '');\n }\n\n const column = {\n column: columnNumber + (insertBefore ? 0 : 1),\n options: Object.assign({}, properties[0]),\n data,\n };\n\n columns.push(column);\n }\n\n // Onbeforeinsertcolumn\n if (dispatch.call(obj, 'onbeforeinsertcolumn', obj, columns) === false) {\n return false;\n }\n\n // Merged cells\n if (obj.options.mergeCells && Object.keys(obj.options.mergeCells).length > 0) {\n if (isColMerged.call(obj, columnNumber, insertBefore).length) {\n if (!confirm(jSuites.translate('This action will destroy any existing merged cells. Are you sure?'))) {\n return false;\n } else {\n obj.destroyMerge();\n }\n }\n }\n\n // Insert before\n const columnIndex = !insertBefore ? columnNumber + 1 : columnNumber;\n obj.options.columns = injectArray(obj.options.columns, columnIndex, properties);\n\n // Open space in the containers\n const currentHeaders = obj.headers.splice(columnIndex);\n const currentColgroup = obj.cols.splice(columnIndex);\n\n // History\n const historyHeaders = [];\n const historyColgroup = [];\n const historyRecords = [];\n const historyData = [];\n const historyFooters = [];\n\n // Add new headers\n for (let col = columnIndex; col < numOfColumns + columnIndex; col++) {\n createCellHeader.call(obj, col);\n obj.headerContainer.insertBefore(obj.headers[col], obj.headerContainer.children[col + 1]);\n obj.colgroupContainer.insertBefore(obj.cols[col].colElement, obj.colgroupContainer.children[col + 1]);\n\n historyHeaders.push(obj.headers[col]);\n historyColgroup.push(obj.cols[col]);\n }\n\n // Add new footer cells\n if (obj.options.footers) {\n for (let j = 0; j < obj.options.footers.length; j++) {\n historyFooters[j] = [];\n for (let i = 0; i < numOfColumns; i++) {\n historyFooters[j].push('');\n }\n obj.options.footers[j].splice(columnIndex, 0, historyFooters[j]);\n }\n }\n\n // Adding visual columns\n for (let row = 0; row < obj.options.data.length; row++) {\n // Keep the current data\n const currentData = obj.options.data[row].splice(columnIndex);\n const currentRecord = obj.records[row].splice(columnIndex);\n\n // History\n historyData[row] = [];\n historyRecords[row] = [];\n\n for (let col = columnIndex; col < numOfColumns + columnIndex; col++) {\n // New value\n const value = data[row] ? data[row] : '';\n obj.options.data[row][col] = value;\n // New cell\n const td = createCell.call(obj, col, row, obj.options.data[row][col]);\n obj.records[row][col] = {\n element: td,\n y: row,\n };\n // Add cell to the row\n if (obj.rows[row]) {\n obj.rows[row].element.insertBefore(td, obj.rows[row].element.children[col + 1]);\n }\n\n if (obj.options.columns && obj.options.columns[col] && typeof obj.options.columns[col].render === 'function') {\n obj.options.columns[col].render(td, value, parseInt(col), parseInt(row), obj, obj.options.columns[col]);\n }\n\n // Record History\n historyData[row].push(value);\n historyRecords[row].push({ element: td, x: col, y: row });\n }\n\n // Copy the data back to the main data\n Array.prototype.push.apply(obj.options.data[row], currentData);\n Array.prototype.push.apply(obj.records[row], currentRecord);\n }\n\n Array.prototype.push.apply(obj.headers, currentHeaders);\n Array.prototype.push.apply(obj.cols, currentColgroup);\n\n for (let i = columnIndex; i < obj.cols.length; i++) {\n obj.cols[i].x = i;\n }\n\n for (let j = 0; j < obj.records.length; j++) {\n for (let i = 0; i < obj.records[j].length; i++) {\n obj.records[j][i].x = i;\n }\n }\n\n // Adjust nested headers\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0 && obj.options.nestedHeaders[0] && obj.options.nestedHeaders[0][0]) {\n for (let j = 0; j < obj.options.nestedHeaders.length; j++) {\n const colspan = parseInt(obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length - 1].colspan) + numOfColumns;\n obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length - 1].colspan = colspan;\n obj.thead.children[j].children[obj.thead.children[j].children.length - 1].setAttribute('colspan', colspan);\n let o = obj.thead.children[j].children[obj.thead.children[j].children.length - 1].getAttribute('data-column');\n o = o.split(',');\n for (let col = columnIndex; col < numOfColumns + columnIndex; col++) {\n o.push(col);\n }\n obj.thead.children[j].children[obj.thead.children[j].children.length - 1].setAttribute('data-column', o);\n }\n }\n\n // Keep history\n setHistory.call(obj, {\n action: 'insertColumn',\n columnNumber: columnNumber,\n numOfColumns: numOfColumns,\n insertBefore: insertBefore,\n columns: properties,\n headers: historyHeaders,\n cols: historyColgroup,\n records: historyRecords,\n footers: historyFooters,\n data: historyData,\n });\n\n // Remove table references\n updateTableReferences.call(obj);\n\n // Events\n dispatch.call(obj, 'oninsertcolumn', obj, columns);\n }\n};\n\n/**\n * Move column\n *\n * @return void\n */\nexport const moveColumn = function (o, d) {\n const obj = this;\n\n if (obj.options.mergeCells && Object.keys(obj.options.mergeCells).length > 0) {\n let insertBefore;\n if (o > d) {\n insertBefore = 1;\n } else {\n insertBefore = 0;\n }\n\n if (isColMerged.call(obj, o).length || isColMerged.call(obj, d, insertBefore).length) {\n if (!confirm(jSuites.translate('This action will destroy any existing merged cells. Are you sure?'))) {\n return false;\n } else {\n obj.destroyMerge();\n }\n }\n }\n\n o = parseInt(o);\n d = parseInt(d);\n\n if (o > d) {\n obj.headerContainer.insertBefore(obj.headers[o], obj.headers[d]);\n obj.colgroupContainer.insertBefore(obj.cols[o].colElement, obj.cols[d].colElement);\n\n for (let j = 0; j < obj.rows.length; j++) {\n obj.rows[j].element.insertBefore(obj.records[j][o].element, obj.records[j][d].element);\n }\n } else {\n obj.headerContainer.insertBefore(obj.headers[o], obj.headers[d].nextSibling);\n obj.colgroupContainer.insertBefore(obj.cols[o].colElement, obj.cols[d].colElement.nextSibling);\n\n for (let j = 0; j < obj.rows.length; j++) {\n obj.rows[j].element.insertBefore(obj.records[j][o].element, obj.records[j][d].element.nextSibling);\n }\n }\n\n obj.options.columns.splice(d, 0, obj.options.columns.splice(o, 1)[0]);\n obj.headers.splice(d, 0, obj.headers.splice(o, 1)[0]);\n obj.cols.splice(d, 0, obj.cols.splice(o, 1)[0]);\n\n const firstAffectedIndex = Math.min(o, d);\n const lastAffectedIndex = Math.max(o, d);\n\n for (let j = 0; j < obj.rows.length; j++) {\n obj.options.data[j].splice(d, 0, obj.options.data[j].splice(o, 1)[0]);\n obj.records[j].splice(d, 0, obj.records[j].splice(o, 1)[0]);\n }\n\n for (let i = firstAffectedIndex; i <= lastAffectedIndex; i++) {\n obj.cols[i].x = i;\n }\n\n for (let j = 0; j < obj.records.length; j++) {\n for (let i = firstAffectedIndex; i <= lastAffectedIndex; i++) {\n obj.records[j][i].x = i;\n }\n }\n\n // Update footers position\n if (obj.options.footers) {\n for (let j = 0; j < obj.options.footers.length; j++) {\n obj.options.footers[j].splice(d, 0, obj.options.footers[j].splice(o, 1)[0]);\n }\n }\n\n // Keeping history of changes\n setHistory.call(obj, {\n action: 'moveColumn',\n oldValue: o,\n newValue: d,\n });\n\n // Update table references\n updateTableReferences.call(obj);\n\n // Events\n dispatch.call(obj, 'onmovecolumn', obj, o, d, 1);\n};\n\n/**\n * Delete a column by number\n *\n * @param integer columnNumber - reference column to be excluded\n * @param integer numOfColumns - number of columns to be excluded from the reference column\n * @return void\n */\nexport const deleteColumn = function (columnNumber, numOfColumns) {\n const obj = this;\n\n // Global Configuration\n if (obj.options.allowDeleteColumn != false) {\n if (obj.headers.length > 1) {\n // Delete column definitions\n if (columnNumber == undefined) {\n const number = obj.getSelectedColumns(true);\n\n if (!number.length) {\n // Remove last column\n columnNumber = obj.headers.length - 1;\n numOfColumns = 1;\n } else {\n // Remove selected\n columnNumber = parseInt(number[0]);\n numOfColumns = parseInt(number.length);\n }\n }\n\n // Lasat column\n const lastColumn = obj.options.data[0].length - 1;\n\n if (columnNumber == undefined || columnNumber > lastColumn || columnNumber < 0) {\n columnNumber = lastColumn;\n }\n\n // Minimum of columns to be delete is 1\n if (!numOfColumns) {\n numOfColumns = 1;\n }\n\n // Can't delete more than the limit of the table\n if (numOfColumns > obj.options.data[0].length - columnNumber) {\n numOfColumns = obj.options.data[0].length - columnNumber;\n }\n\n const removedColumns = [];\n for (let i = 0; i < numOfColumns; i++) {\n removedColumns.push(i + columnNumber);\n }\n\n // onbeforedeletecolumn\n if (dispatch.call(obj, 'onbeforedeletecolumn', obj, removedColumns) === false) {\n return false;\n }\n\n // Can't remove the last column\n if (parseInt(columnNumber) > -1) {\n // Merged cells\n let mergeExists = false;\n if (obj.options.mergeCells && Object.keys(obj.options.mergeCells).length > 0) {\n for (let col = columnNumber; col < columnNumber + numOfColumns; col++) {\n if (isColMerged.call(obj, col, null).length) {\n mergeExists = true;\n }\n }\n }\n if (mergeExists) {\n if (!confirm(jSuites.translate('This action will destroy any existing merged cells. Are you sure?'))) {\n return false;\n } else {\n obj.destroyMerge();\n }\n }\n\n // Delete the column properties\n const columns = obj.options.columns ? obj.options.columns.splice(columnNumber, numOfColumns) : undefined;\n\n for (let col = columnNumber; col < columnNumber + numOfColumns; col++) {\n obj.cols[col].colElement.className = '';\n obj.headers[col].className = '';\n obj.cols[col].colElement.parentNode.removeChild(obj.cols[col].colElement);\n obj.headers[col].parentNode.removeChild(obj.headers[col]);\n }\n\n const historyHeaders = obj.headers.splice(columnNumber, numOfColumns);\n const historyColgroup = obj.cols.splice(columnNumber, numOfColumns);\n const historyRecords = [];\n const historyData = [];\n const historyFooters = [];\n\n for (let row = 0; row < obj.options.data.length; row++) {\n for (let col = columnNumber; col < columnNumber + numOfColumns; col++) {\n obj.records[row][col].element.className = '';\n obj.records[row][col].element.parentNode.removeChild(obj.records[row][col].element);\n }\n }\n\n // Delete headers\n for (let row = 0; row < obj.options.data.length; row++) {\n // History\n historyData[row] = obj.options.data[row].splice(columnNumber, numOfColumns);\n historyRecords[row] = obj.records[row].splice(columnNumber, numOfColumns);\n }\n\n for (let i = columnNumber; i < obj.cols.length; i++) {\n obj.cols[i].x = i;\n }\n\n for (let j = 0; j < obj.records.length; j++) {\n for (let i = columnNumber; i < obj.records[j].length; i++) {\n obj.records[j][i].x = i;\n }\n }\n\n // Delete footers\n if (obj.options.footers) {\n for (let row = 0; row < obj.options.footers.length; row++) {\n historyFooters[row] = obj.options.footers[row].splice(columnNumber, numOfColumns);\n }\n }\n\n // Remove selection\n conditionalSelectionUpdate.call(obj, 0, columnNumber, columnNumber + numOfColumns - 1);\n\n // Adjust nested headers\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0 && obj.options.nestedHeaders[0] && obj.options.nestedHeaders[0][0]) {\n for (let j = 0; j < obj.options.nestedHeaders.length; j++) {\n const colspan = parseInt(obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length - 1].colspan) - numOfColumns;\n obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length - 1].colspan = colspan;\n obj.thead.children[j].children[obj.thead.children[j].children.length - 1].setAttribute('colspan', colspan);\n }\n }\n\n // Keeping history of changes\n setHistory.call(obj, {\n action: 'deleteColumn',\n columnNumber: columnNumber,\n numOfColumns: numOfColumns,\n insertBefore: 1,\n columns: columns,\n headers: historyHeaders,\n cols: historyColgroup,\n records: historyRecords,\n footers: historyFooters,\n data: historyData,\n });\n\n // Update table references\n updateTableReferences.call(obj);\n\n // Delete\n dispatch.call(obj, 'ondeletecolumn', obj, removedColumns);\n }\n } else {\n console.error('Jspreadsheet: It is not possible to delete the last column');\n }\n }\n};\n\n/**\n * Get the column width\n *\n * @param int column column number (first column is: 0)\n * @return int current width\n */\nexport const getWidth = function (column) {\n const obj = this;\n\n let data;\n\n if (typeof column === 'undefined') {\n // Get all headers\n data = [];\n for (let i = 0; i < obj.headers.length; i++) {\n data.push((obj.options.columns && obj.options.columns[i] && obj.options.columns[i].width) || obj.options.defaultColWidth || 100);\n }\n } else {\n data = parseInt(obj.cols[column].colElement.getAttribute('width'));\n }\n\n return data;\n};\n\n/**\n * Set the column width\n *\n * @param int column number (first column is: 0)\n * @param int new column width\n * @param int old column width\n */\nexport const setWidth = function (column, width, oldWidth) {\n const obj = this;\n\n if (width) {\n if (Array.isArray(column)) {\n // Oldwidth\n if (!oldWidth) {\n oldWidth = [];\n }\n // Set width\n for (let i = 0; i < column.length; i++) {\n if (!oldWidth[i]) {\n oldWidth[i] = parseInt(obj.cols[column[i]].colElement.getAttribute('width'));\n }\n const w = Array.isArray(width) && width[i] ? width[i] : width;\n obj.cols[column[i]].colElement.setAttribute('width', w);\n\n if (!obj.options.columns) {\n obj.options.columns = [];\n }\n\n if (!obj.options.columns[column[i]]) {\n obj.options.columns[column[i]] = {};\n }\n\n obj.options.columns[column[i]].width = w;\n }\n } else {\n // Oldwidth\n if (!oldWidth) {\n oldWidth = parseInt(obj.cols[column].colElement.getAttribute('width'));\n }\n // Set width\n obj.cols[column].colElement.setAttribute('width', width);\n\n if (!obj.options.columns) {\n obj.options.columns = [];\n }\n\n if (!obj.options.columns[column]) {\n obj.options.columns[column] = {};\n }\n\n obj.options.columns[column].width = width;\n }\n\n // Keeping history of changes\n setHistory.call(obj, {\n action: 'setWidth',\n column: column,\n oldValue: oldWidth,\n newValue: width,\n });\n\n // On resize column\n dispatch.call(obj, 'onresizecolumn', obj, column, width, oldWidth);\n\n // Update corner position\n updateCornerPosition.call(obj);\n }\n};\n\n/**\n * Show column\n */\nexport const showColumn = function (colNumber) {\n const obj = this;\n\n if (!Array.isArray(colNumber)) {\n colNumber = [colNumber];\n }\n\n for (let i = 0; i < colNumber.length; i++) {\n const columnIndex = colNumber[i];\n\n obj.headers[columnIndex].style.display = '';\n obj.cols[columnIndex].colElement.style.display = '';\n if (obj.filter && obj.filter.children.length > columnIndex + 1) {\n obj.filter.children[columnIndex + 1].style.display = '';\n }\n for (let j = 0; j < obj.options.data.length; j++) {\n obj.records[j][columnIndex].element.style.display = '';\n }\n }\n\n // Update footers\n if (obj.options.footers) {\n setFooter.call(obj);\n }\n\n obj.resetSelection();\n};\n\n/**\n * Hide column\n */\nexport const hideColumn = function (colNumber) {\n const obj = this;\n\n if (!Array.isArray(colNumber)) {\n colNumber = [colNumber];\n }\n\n for (let i = 0; i < colNumber.length; i++) {\n const columnIndex = colNumber[i];\n\n obj.headers[columnIndex].style.display = 'none';\n obj.cols[columnIndex].colElement.style.display = 'none';\n if (obj.filter && obj.filter.children.length > columnIndex + 1) {\n obj.filter.children[columnIndex + 1].style.display = 'none';\n }\n for (let j = 0; j < obj.options.data.length; j++) {\n obj.records[j][columnIndex].element.style.display = 'none';\n }\n }\n\n // Update footers\n if (obj.options.footers) {\n setFooter.call(obj);\n }\n\n obj.resetSelection();\n};\n\n/**\n * Get a column data by columnNumber\n */\nexport const getColumnData = function (columnNumber, processed) {\n const obj = this;\n\n const dataset = [];\n // Go through the rows to get the data\n for (let j = 0; j < obj.options.data.length; j++) {\n if (processed) {\n dataset.push(obj.records[j][columnNumber].element.innerHTML);\n } else {\n dataset.push(obj.options.data[j][columnNumber]);\n }\n }\n return dataset;\n};\n\n/**\n * Set a column data by colNumber\n */\nexport const setColumnData = function (colNumber, data, force) {\n const obj = this;\n\n for (let j = 0; j < obj.rows.length; j++) {\n // Update cell\n const columnName = getColumnNameFromId([colNumber, j]);\n // Set value\n if (data[j] != null) {\n obj.setValue(columnName, data[j], force);\n }\n }\n};\n","\nimport { getNumberOfColumns } from './columns.js';\nimport { createCell, updateTableReferences } from './internal.js';\nimport dispatch from './dispatch.js';\nimport { isRowMerged } from './merges.js';\nimport { conditionalSelectionUpdate, getSelectedRows, updateCornerPosition } from './selection.js';\nimport { setHistory } from './history.js';\nimport { getColumnNameFromId, getFreezeRowTop } from './internalHelpers.js';\n\n/**\n * Create row\n */\nexport const createRow = function (j, data) {\n const obj = this;\n\n // Create container\n if (!obj.records[j]) {\n obj.records[j] = [];\n }\n // Default data\n if (!data) {\n data = obj.options.data[j];\n }\n // New line of data to be append in the table\n const row = {\n element: document.createElement('tr'),\n y: j,\n };\n\n obj.rows[j] = row;\n\n row.element.setAttribute('data-y', j);\n // Index\n let index = null;\n\n // Set default row height\n if (obj.options.defaultRowHeight) {\n row.element.style.height = obj.options.defaultRowHeight + 'px';\n }\n\n // Definitions\n if (obj.options.rows && obj.options.rows[j]) {\n if (obj.options.rows[j].height) {\n row.element.style.height = obj.options.rows[j].height;\n }\n if (obj.options.rows[j].title) {\n index = obj.options.rows[j].title;\n }\n }\n if (!index) {\n index = parseInt(j + 1);\n }\n // Row number label\n const td = document.createElement('td');\n td.innerHTML = index;\n td.setAttribute('data-y', j);\n td.className = 'jss_row';\n\n // freeze rows\n if (obj.options.freezeRows > j) {\n td.classList.add('jss_frozen_row');\n td.style.top = getFreezeRowTop(j, obj.options.rows);\n }\n row.element.appendChild(td);\n\n const numberOfColumns = getNumberOfColumns.call(obj);\n\n // Data columns\n for (let i = 0; i < numberOfColumns; i++) {\n // New column of data to be append in the line\n obj.records[j][i] = {\n element: createCell.call(this, i, j, data[i]),\n x: i,\n y: j,\n };\n // Add column to the row\n row.element.appendChild(obj.records[j][i].element);\n\n if (obj.options.columns && obj.options.columns[i] && typeof obj.options.columns[i].render === 'function') {\n obj.options.columns[i].render(obj.records[j][i].element, data[i], parseInt(i), parseInt(j), obj, obj.options.columns[i]);\n }\n }\n\n // Add row to the table body\n return row;\n};\n\n/**\n * Insert a new row\n *\n * @param mixed - number of blank lines to be insert or a single array with the data of the new row\n * @param rowNumber\n * @param insertBefore\n * @return void\n */\nexport const insertRow = function (mixed, rowNumber, insertBefore) {\n const obj = this;\n\n // Configuration\n if (obj.options.allowInsertRow != false) {\n // Records\n var records = [];\n\n // Data to be insert\n let data = [];\n\n // The insert could be lead by number of rows or the array of data\n let numOfRows;\n\n if (!Array.isArray(mixed)) {\n numOfRows = typeof mixed !== 'undefined' ? mixed : 1;\n } else {\n numOfRows = 1;\n\n if (mixed) {\n data = mixed;\n }\n }\n\n // Direction\n insertBefore = insertBefore ? true : false;\n\n // Current column number\n const lastRow = obj.options.data.length - 1;\n\n if (rowNumber == undefined || rowNumber >= parseInt(lastRow) || rowNumber < 0) {\n rowNumber = lastRow;\n }\n\n const onbeforeinsertrowRecords = [];\n\n for (let row = 0; row < numOfRows; row++) {\n const newRow = [];\n\n for (let col = 0; col < obj.options.columns.length; col++) {\n newRow[col] = data[col] ? data[col] : '';\n }\n\n onbeforeinsertrowRecords.push({\n row: row + rowNumber + (insertBefore ? 0 : 1),\n data: newRow,\n });\n }\n\n // Onbeforeinsertrow\n if (dispatch.call(obj, 'onbeforeinsertrow', obj, onbeforeinsertrowRecords) === false) {\n return false;\n }\n\n // Merged cells\n if (obj.options.mergeCells && Object.keys(obj.options.mergeCells).length > 0) {\n if (isRowMerged.call(obj, rowNumber, insertBefore).length) {\n if (!confirm(jSuites.translate('This action will destroy any existing merged cells. Are you sure?'))) {\n return false;\n } else {\n obj.destroyMerge();\n }\n }\n }\n\n // Clear any search\n if (obj.options.search == true) {\n if (obj.results && obj.results.length != obj.rows.length) {\n if (confirm(jSuites.translate('This action will clear your search results. Are you sure?'))) {\n obj.resetSearch();\n } else {\n return false;\n }\n }\n\n obj.results = null;\n }\n\n // Insertbefore\n const rowIndex = !insertBefore ? rowNumber + 1 : rowNumber;\n\n // Keep the current data\n const currentRecords = obj.records.splice(rowIndex);\n const currentData = obj.options.data.splice(rowIndex);\n const currentRows = obj.rows.splice(rowIndex);\n\n // Adding lines\n const rowRecords = [];\n const rowData = [];\n const rowNode = [];\n\n for (let row = rowIndex; row < numOfRows + rowIndex; row++) {\n // Push data to the data container\n obj.options.data[row] = [];\n for (let col = 0; col < obj.options.columns.length; col++) {\n obj.options.data[row][col] = data[col] ? data[col] : '';\n }\n // Create row\n const newRow = createRow.call(obj, row, obj.options.data[row]);\n // Append node\n if (currentRows[0]) {\n if (Array.prototype.indexOf.call(obj.tbody.children, currentRows[0].element) >= 0) {\n obj.tbody.insertBefore(newRow.element, currentRows[0].element);\n }\n } else {\n if (Array.prototype.indexOf.call(obj.tbody.children, obj.rows[rowNumber].element) >= 0) {\n obj.tbody.appendChild(newRow.element);\n }\n }\n // Record History\n rowRecords.push([...obj.records[row]]);\n rowData.push([...obj.options.data[row]]);\n rowNode.push(newRow);\n }\n\n // Copy the data back to the main data\n Array.prototype.push.apply(obj.records, currentRecords);\n Array.prototype.push.apply(obj.options.data, currentData);\n Array.prototype.push.apply(obj.rows, currentRows);\n\n for (let j = rowIndex; j < obj.rows.length; j++) {\n obj.rows[j].y = j;\n }\n\n for (let j = rowIndex; j < obj.records.length; j++) {\n for (let i = 0; i < obj.records[j].length; i++) {\n obj.records[j][i].y = j;\n }\n }\n\n // Respect pagination\n if (obj.options.pagination > 0) {\n obj.page(obj.pageNumber);\n }\n\n // Keep history\n setHistory.call(obj, {\n action: 'insertRow',\n rowNumber: rowNumber,\n numOfRows: numOfRows,\n insertBefore: insertBefore,\n rowRecords: rowRecords,\n rowData: rowData,\n rowNode: rowNode,\n });\n\n // Remove table references\n updateTableReferences.call(obj);\n\n // Events\n dispatch.call(obj, 'oninsertrow', obj, onbeforeinsertrowRecords);\n }\n};\n\n/**\n * Move row\n *\n * @return void\n */\nexport const moveRow = function (o, d, ignoreDom) {\n const obj = this;\n\n if (obj.options.mergeCells && Object.keys(obj.options.mergeCells).length > 0) {\n let insertBefore;\n\n if (o > d) {\n insertBefore = 1;\n } else {\n insertBefore = 0;\n }\n\n if (isRowMerged.call(obj, o).length || isRowMerged.call(obj, d, insertBefore).length) {\n if (!confirm(jSuites.translate('This action will destroy any existing merged cells. Are you sure?'))) {\n return false;\n } else {\n obj.destroyMerge();\n }\n }\n }\n\n if (obj.options.search == true) {\n if (obj.results && obj.results.length != obj.rows.length) {\n if (confirm(jSuites.translate('This action will clear your search results. Are you sure?'))) {\n obj.resetSearch();\n } else {\n return false;\n }\n }\n\n obj.results = null;\n }\n\n if (!ignoreDom) {\n if (Array.prototype.indexOf.call(obj.tbody.children, obj.rows[d].element) >= 0) {\n if (o > d) {\n obj.tbody.insertBefore(obj.rows[o].element, obj.rows[d].element);\n } else {\n obj.tbody.insertBefore(obj.rows[o].element, obj.rows[d].element.nextSibling);\n }\n } else {\n obj.tbody.removeChild(obj.rows[o].element);\n }\n }\n\n // Place references in the correct position\n obj.rows.splice(d, 0, obj.rows.splice(o, 1)[0]);\n obj.records.splice(d, 0, obj.records.splice(o, 1)[0]);\n obj.options.data.splice(d, 0, obj.options.data.splice(o, 1)[0]);\n\n const firstAffectedIndex = Math.min(o, d);\n const lastAffectedIndex = Math.max(o, d);\n\n for (let j = firstAffectedIndex; j <= lastAffectedIndex; j++) {\n obj.rows[j].y = j;\n }\n\n for (let j = firstAffectedIndex; j <= lastAffectedIndex; j++) {\n for (let i = 0; i < obj.records[j].length; i++) {\n obj.records[j][i].y = j;\n }\n }\n\n // Respect pagination\n if (obj.options.pagination > 0 && obj.tbody.children.length != obj.options.pagination) {\n obj.page(obj.pageNumber);\n }\n\n // Keeping history of changes\n setHistory.call(obj, {\n action: 'moveRow',\n oldValue: o,\n newValue: d,\n });\n\n // Update table references\n updateTableReferences.call(obj);\n\n // Events\n dispatch.call(obj, 'onmoverow', obj, parseInt(o), parseInt(d), 1);\n};\n\n/**\n * Delete a row by number\n *\n * @param integer rowNumber - row number to be excluded\n * @param integer numOfRows - number of lines\n * @return void\n */\nexport const deleteRow = function (rowNumber, numOfRows) {\n const obj = this;\n\n // Global Configuration\n if (obj.options.allowDeleteRow != false) {\n if (obj.options.allowDeletingAllRows == true || obj.options.data.length > 1) {\n // Delete row definitions\n if (rowNumber == undefined) {\n const number = getSelectedRows.call(obj);\n\n if (number.length === 0) {\n rowNumber = obj.options.data.length - 1;\n numOfRows = 1;\n } else {\n rowNumber = number[0];\n numOfRows = number.length;\n }\n }\n\n // Last column\n let lastRow = obj.options.data.length - 1;\n\n if (rowNumber == undefined || rowNumber > lastRow || rowNumber < 0) {\n rowNumber = lastRow;\n }\n\n if (!numOfRows) {\n numOfRows = 1;\n }\n\n // Do not delete more than the number of records\n if (rowNumber + numOfRows >= obj.options.data.length) {\n numOfRows = obj.options.data.length - rowNumber;\n }\n\n // Onbeforedeleterow\n const onbeforedeleterowRecords = [];\n for (let i = 0; i < numOfRows; i++) {\n onbeforedeleterowRecords.push(i + rowNumber);\n }\n\n if (dispatch.call(obj, 'onbeforedeleterow', obj, onbeforedeleterowRecords) === false) {\n return false;\n }\n\n if (parseInt(rowNumber) > -1) {\n // Merged cells\n let mergeExists = false;\n if (obj.options.mergeCells && Object.keys(obj.options.mergeCells).length > 0) {\n for (let row = rowNumber; row < rowNumber + numOfRows; row++) {\n if (isRowMerged.call(obj, row, false).length) {\n mergeExists = true;\n }\n }\n }\n if (mergeExists) {\n if (!confirm(jSuites.translate('This action will destroy any existing merged cells. Are you sure?'))) {\n return false;\n } else {\n obj.destroyMerge();\n }\n }\n\n // Clear any search\n if (obj.options.search == true) {\n if (obj.results && obj.results.length != obj.rows.length) {\n if (confirm(jSuites.translate('This action will clear your search results. Are you sure?'))) {\n obj.resetSearch();\n } else {\n return false;\n }\n }\n\n obj.results = null;\n }\n\n // If delete all rows, and set allowDeletingAllRows false, will stay one row\n if (obj.options.allowDeletingAllRows != true && lastRow + 1 === numOfRows) {\n numOfRows--;\n console.error('Jspreadsheet: It is not possible to delete the last row');\n }\n\n // Remove node\n for (let row = rowNumber; row < rowNumber + numOfRows; row++) {\n if (Array.prototype.indexOf.call(obj.tbody.children, obj.rows[row].element) >= 0) {\n obj.rows[row].element.className = '';\n obj.rows[row].element.parentNode.removeChild(obj.rows[row].element);\n }\n }\n\n // Remove data\n const rowRecords = obj.records.splice(rowNumber, numOfRows);\n const rowData = obj.options.data.splice(rowNumber, numOfRows);\n const rowNode = obj.rows.splice(rowNumber, numOfRows);\n\n for (let j = rowNumber; j < obj.rows.length; j++) {\n obj.rows[j].y = j;\n }\n\n for (let j = rowNumber; j < obj.records.length; j++) {\n for (let i = 0; i < obj.records[j].length; i++) {\n obj.records[j][i].y = j;\n }\n }\n\n // Respect pagination\n if (obj.options.pagination > 0 && obj.tbody.children.length != obj.options.pagination) {\n obj.page(obj.pageNumber);\n }\n\n // Remove selection\n conditionalSelectionUpdate.call(obj, 1, rowNumber, rowNumber + numOfRows - 1);\n\n // Keep history\n setHistory.call(obj, {\n action: 'deleteRow',\n rowNumber: rowNumber,\n numOfRows: numOfRows,\n insertBefore: 1,\n rowRecords: rowRecords,\n rowData: rowData,\n rowNode: rowNode,\n });\n\n // Remove table references\n updateTableReferences.call(obj);\n\n // Events\n dispatch.call(obj, 'ondeleterow', obj, onbeforedeleterowRecords);\n }\n } else {\n console.error('Jspreadsheet: It is not possible to delete the last row');\n }\n }\n};\n\n/**\n * Get the row height\n *\n * @param row - row number (first row is: 0)\n * @return height - current row height\n */\nexport const getHeight = function (row) {\n const obj = this;\n\n let data;\n\n if (typeof row === 'undefined') {\n // Get height of all rows\n data = [];\n for (let j = 0; j < obj.rows.length; j++) {\n const h = obj.rows[j].element.style.height;\n if (h) {\n data[j] = h;\n }\n }\n } else {\n // In case the row is an object\n if (typeof row == 'object') {\n row = row.getAttribute('data-y');\n }\n\n data = obj.rows[row].element.style.height;\n }\n\n return data;\n};\n\n/**\n * Set the row height\n *\n * @param row - row number (first row is: 0)\n * @param height - new row height\n * @param oldHeight - old row height\n */\nexport const setHeight = function (row, height, oldHeight) {\n const obj = this;\n\n if (height > 0) {\n // Oldwidth\n if (!oldHeight) {\n oldHeight = obj.rows[row].element.getAttribute('height');\n\n if (!oldHeight) {\n const rect = obj.rows[row].element.getBoundingClientRect();\n oldHeight = rect.height;\n }\n }\n\n // Integer\n height = parseInt(height);\n\n // Set width\n obj.rows[row].element.style.height = height + 'px';\n\n if (!obj.options.rows) {\n obj.options.rows = [];\n }\n\n // Keep options updated\n if (!obj.options.rows[row]) {\n obj.options.rows[row] = {};\n }\n obj.options.rows[row].height = height;\n\n // Keeping history of changes\n setHistory.call(obj, {\n action: 'setHeight',\n row: row,\n oldValue: oldHeight,\n newValue: height,\n });\n\n // On resize column\n dispatch.call(obj, 'onresizerow', obj, row, height, oldHeight);\n\n // Update corner position\n updateCornerPosition.call(obj);\n }\n};\n\n/**\n * Show row\n */\nexport const showRow = function (rowNumber) {\n const obj = this;\n\n if (!Array.isArray(rowNumber)) {\n rowNumber = [rowNumber];\n }\n\n rowNumber.forEach(function (rowIndex) {\n obj.rows[rowIndex].element.style.display = '';\n });\n};\n\n/**\n * Hide row\n */\nexport const hideRow = function (rowNumber) {\n const obj = this;\n\n if (!Array.isArray(rowNumber)) {\n rowNumber = [rowNumber];\n }\n\n rowNumber.forEach(function (rowIndex) {\n obj.rows[rowIndex].element.style.display = 'none';\n });\n};\n\n/**\n * Get a row data by rowNumber\n */\nexport const getRowData = function (rowNumber, processed) {\n const obj = this;\n\n if (processed) {\n return obj.records[rowNumber].map(function (record) {\n return record.element.innerHTML;\n });\n } else {\n return obj.options.data[rowNumber];\n }\n};\n\n/**\n * Set a row data by rowNumber\n */\nexport const setRowData = function (rowNumber, data, force) {\n const obj = this;\n\n for (let i = 0; i < obj.headers.length; i++) {\n // Update cell\n const columnName = getColumnNameFromId([i, rowNumber]);\n // Set value\n if (data[i] != null) {\n obj.setValue(columnName, data[i], force);\n }\n }\n};\n","// Basic version information\nexport default {\n version: '5.0.0',\n host: 'https://bossanova.uk/jspreadsheet',\n license: 'MIT',\n print: function () {\n return [['Jspreadsheet CE', this.version, this.host, this.license].join('\\r\\n')];\n },\n};\n","\n\nimport { closeEditor, openEditor, setCheckRadioValue } from './editor.js';\nimport libraryBase from './libraryBase.js';\nimport { down, first, last, left, right, up } from './keys.js';\nimport { isColMerged, isRowMerged } from './merges.js';\nimport { copyData, removeCopySelection, resetSelection, selectAll, updateCornerPosition, updateSelectionFromCoords } from './selection.js';\nimport { copy, paste } from './copyPaste.js';\nimport { openFilter } from './filter.js';\nimport { loadDown, loadUp } from './lazyLoading.js';\nimport { setWidth } from './columns.js';\nimport { moveRow, setHeight } from './rows.js';\nimport version from './version.js';\nimport { getCellNameFromCoords } from './helpers.js';\n\nconst getElement = function (element) {\n let jssSection = 0;\n let jssElement = 0;\n\n function path(element) {\n if (element.className) {\n if (element.classList.contains('jss_container')) {\n jssElement = element;\n }\n\n if (element.classList.contains('jss_spreadsheet')) {\n jssElement = element.querySelector(':scope > .jtabs-content > .jtabs-selected');\n }\n }\n\n if (element.tagName == 'THEAD') {\n jssSection = 1;\n } else if (element.tagName == 'TBODY') {\n jssSection = 2;\n }\n\n if (element.parentNode) {\n if (!jssElement) {\n path(element.parentNode);\n }\n }\n }\n\n path(element);\n\n return [jssElement, jssSection];\n};\n\nconst mouseUpControls = function (e) {\n if (libraryBase.jspreadsheet.current) {\n // Update cell size\n if (libraryBase.jspreadsheet.current.resizing) {\n // Columns to be updated\n if (libraryBase.jspreadsheet.current.resizing.column) {\n // New width\n const newWidth = parseInt(\n libraryBase.jspreadsheet.current.cols[libraryBase.jspreadsheet.current.resizing.column].colElement.getAttribute('width')\n );\n // Columns\n const columns = libraryBase.jspreadsheet.current.getSelectedColumns();\n if (columns.length > 1) {\n const currentWidth = [];\n for (let i = 0; i < columns.length; i++) {\n currentWidth.push(parseInt(libraryBase.jspreadsheet.current.cols[columns[i]].colElement.getAttribute('width')));\n }\n // Previous width\n const index = columns.indexOf(parseInt(libraryBase.jspreadsheet.current.resizing.column));\n currentWidth[index] = libraryBase.jspreadsheet.current.resizing.width;\n setWidth.call(libraryBase.jspreadsheet.current, columns, newWidth, currentWidth);\n } else {\n setWidth.call(\n libraryBase.jspreadsheet.current,\n parseInt(libraryBase.jspreadsheet.current.resizing.column),\n newWidth,\n libraryBase.jspreadsheet.current.resizing.width\n );\n }\n // Remove border\n libraryBase.jspreadsheet.current.headers[libraryBase.jspreadsheet.current.resizing.column].classList.remove('resizing');\n for (let j = 0; j < libraryBase.jspreadsheet.current.records.length; j++) {\n if (libraryBase.jspreadsheet.current.records[j][libraryBase.jspreadsheet.current.resizing.column]) {\n libraryBase.jspreadsheet.current.records[j][libraryBase.jspreadsheet.current.resizing.column].element.classList.remove('resizing');\n }\n }\n } else {\n // Remove Class\n libraryBase.jspreadsheet.current.rows[libraryBase.jspreadsheet.current.resizing.row].element.children[0].classList.remove('resizing');\n let newHeight = libraryBase.jspreadsheet.current.rows[libraryBase.jspreadsheet.current.resizing.row].element.getAttribute('height');\n setHeight.call(\n libraryBase.jspreadsheet.current,\n libraryBase.jspreadsheet.current.resizing.row,\n newHeight,\n libraryBase.jspreadsheet.current.resizing.height\n );\n // Remove border\n libraryBase.jspreadsheet.current.resizing.element.classList.remove('resizing');\n }\n // Reset resizing helper\n libraryBase.jspreadsheet.current.resizing = null;\n } else if (libraryBase.jspreadsheet.current.dragging) {\n // Reset dragging helper\n if (libraryBase.jspreadsheet.current.dragging) {\n if (libraryBase.jspreadsheet.current.dragging.column) {\n // Target\n const columnId = e.target.getAttribute('data-x');\n // Remove move style\n libraryBase.jspreadsheet.current.headers[libraryBase.jspreadsheet.current.dragging.column].classList.remove('dragging');\n for (let j = 0; j < libraryBase.jspreadsheet.current.rows.length; j++) {\n if (libraryBase.jspreadsheet.current.records[j][libraryBase.jspreadsheet.current.dragging.column]) {\n libraryBase.jspreadsheet.current.records[j][libraryBase.jspreadsheet.current.dragging.column].element.classList.remove('dragging');\n }\n }\n for (let i = 0; i < libraryBase.jspreadsheet.current.headers.length; i++) {\n libraryBase.jspreadsheet.current.headers[i].classList.remove('dragging-left');\n libraryBase.jspreadsheet.current.headers[i].classList.remove('dragging-right');\n }\n // Update position\n if (columnId) {\n if (libraryBase.jspreadsheet.current.dragging.column != libraryBase.jspreadsheet.current.dragging.destination) {\n libraryBase.jspreadsheet.current.moveColumn(\n libraryBase.jspreadsheet.current.dragging.column,\n libraryBase.jspreadsheet.current.dragging.destination\n );\n }\n }\n } else {\n let position;\n\n if (libraryBase.jspreadsheet.current.dragging.element.nextSibling) {\n position = parseInt(libraryBase.jspreadsheet.current.dragging.element.nextSibling.getAttribute('data-y'));\n if (libraryBase.jspreadsheet.current.dragging.row < position) {\n position -= 1;\n }\n } else {\n position = parseInt(libraryBase.jspreadsheet.current.dragging.element.previousSibling.getAttribute('data-y'));\n }\n if (libraryBase.jspreadsheet.current.dragging.row != libraryBase.jspreadsheet.current.dragging.destination) {\n moveRow.call(libraryBase.jspreadsheet.current, libraryBase.jspreadsheet.current.dragging.row, position, true);\n }\n libraryBase.jspreadsheet.current.dragging.element.classList.remove('dragging');\n }\n libraryBase.jspreadsheet.current.dragging = null;\n }\n } else {\n // Close any corner selection\n if (libraryBase.jspreadsheet.current.selectedCorner) {\n libraryBase.jspreadsheet.current.selectedCorner = false;\n\n // Data to be copied\n if (libraryBase.jspreadsheet.current.selection.length > 0) {\n // Copy data\n copyData.call(\n libraryBase.jspreadsheet.current,\n libraryBase.jspreadsheet.current.selection[0],\n libraryBase.jspreadsheet.current.selection[libraryBase.jspreadsheet.current.selection.length - 1]\n );\n\n // Remove selection\n removeCopySelection.call(libraryBase.jspreadsheet.current);\n }\n }\n }\n }\n\n // Clear any time control\n if (libraryBase.jspreadsheet.timeControl) {\n clearTimeout(libraryBase.jspreadsheet.timeControl);\n libraryBase.jspreadsheet.timeControl = null;\n }\n\n // Mouse up\n libraryBase.jspreadsheet.isMouseAction = false;\n};\n\nconst mouseDownControls = function (e) {\n e = e || window.event;\n\n let mouseButton;\n\n if (e.buttons) {\n mouseButton = e.buttons;\n } else if (e.button) {\n mouseButton = e.button;\n } else {\n mouseButton = e.which;\n }\n\n // Get elements\n const jssTable = getElement(e.target);\n\n if (jssTable[0]) {\n if (libraryBase.jspreadsheet.current != jssTable[0].jssWorksheet) {\n if (libraryBase.jspreadsheet.current) {\n if (libraryBase.jspreadsheet.current.edition) {\n closeEditor.call(libraryBase.jspreadsheet.current, libraryBase.jspreadsheet.current.edition[0], true);\n }\n libraryBase.jspreadsheet.current.resetSelection();\n }\n libraryBase.jspreadsheet.current = jssTable[0].jssWorksheet;\n }\n } else {\n if (libraryBase.jspreadsheet.current) {\n if (libraryBase.jspreadsheet.current.edition) {\n closeEditor.call(libraryBase.jspreadsheet.current, libraryBase.jspreadsheet.current.edition[0], true);\n }\n\n if (!e.target.classList.contains('jss_object')) {\n resetSelection.call(libraryBase.jspreadsheet.current, true);\n libraryBase.jspreadsheet.current = null;\n }\n }\n }\n\n if (libraryBase.jspreadsheet.current && mouseButton == 1) {\n if (e.target.classList.contains('jss_selectall')) {\n if (libraryBase.jspreadsheet.current) {\n selectAll.call(libraryBase.jspreadsheet.current);\n }\n } else if (e.target.classList.contains('jss_corner')) {\n if (libraryBase.jspreadsheet.current.options.editable != false) {\n libraryBase.jspreadsheet.current.selectedCorner = true;\n }\n } else {\n // Header found\n if (jssTable[1] == 1) {\n const columnId = e.target.getAttribute('data-x');\n if (columnId) {\n // Update cursor\n const info = e.target.getBoundingClientRect();\n if (libraryBase.jspreadsheet.current.options.columnResize != false && info.width - e.offsetX < 6) {\n // Resize helper\n libraryBase.jspreadsheet.current.resizing = {\n mousePosition: e.pageX,\n column: columnId,\n width: info.width,\n };\n\n // Border indication\n libraryBase.jspreadsheet.current.headers[columnId].classList.add('resizing');\n for (let j = 0; j < libraryBase.jspreadsheet.current.records.length; j++) {\n if (libraryBase.jspreadsheet.current.records[j][columnId]) {\n libraryBase.jspreadsheet.current.records[j][columnId].element.classList.add('resizing');\n }\n }\n } else if (libraryBase.jspreadsheet.current.options.columnDrag != false && info.height - e.offsetY < 6) {\n if (isColMerged.call(libraryBase.jspreadsheet.current, columnId).length) {\n console.error('Jspreadsheet: This column is part of a merged cell.');\n } else {\n // Reset selection\n libraryBase.jspreadsheet.current.resetSelection();\n // Drag helper\n libraryBase.jspreadsheet.current.dragging = {\n element: e.target,\n column: columnId,\n destination: columnId,\n };\n // Border indication\n libraryBase.jspreadsheet.current.headers[columnId].classList.add('dragging');\n for (let j = 0; j < libraryBase.jspreadsheet.current.records.length; j++) {\n if (libraryBase.jspreadsheet.current.records[j][columnId]) {\n libraryBase.jspreadsheet.current.records[j][columnId].element.classList.add('dragging');\n }\n }\n }\n } else {\n let o, d;\n\n if (libraryBase.jspreadsheet.current.selectedHeader && (e.shiftKey || e.ctrlKey)) {\n o = libraryBase.jspreadsheet.current.selectedHeader;\n d = columnId;\n } else {\n // Press to rename\n if (\n libraryBase.jspreadsheet.current.selectedHeader == columnId &&\n libraryBase.jspreadsheet.current.options.allowRenameColumn != false\n ) {\n libraryBase.jspreadsheet.timeControl = setTimeout(function () {\n libraryBase.jspreadsheet.current.setHeader(columnId);\n }, 800);\n }\n\n // Keep track of which header was selected first\n libraryBase.jspreadsheet.current.selectedHeader = columnId;\n\n // Update selection single column\n o = columnId;\n d = columnId;\n }\n\n // Update selection\n updateSelectionFromCoords.call(libraryBase.jspreadsheet.current, o, 0, d, libraryBase.jspreadsheet.current.options.data.length - 1, e);\n }\n } else {\n if (e.target.parentNode.classList.contains('jss_nested')) {\n let c1, c2;\n\n if (e.target.getAttribute('data-column')) {\n const column = e.target.getAttribute('data-column').split(',');\n c1 = parseInt(column[0]);\n c2 = parseInt(column[column.length - 1]);\n } else {\n c1 = 0;\n c2 = libraryBase.jspreadsheet.current.options.columns.length - 1;\n }\n updateSelectionFromCoords.call(\n libraryBase.jspreadsheet.current,\n c1,\n 0,\n c2,\n libraryBase.jspreadsheet.current.options.data.length - 1,\n e\n );\n }\n }\n } else {\n libraryBase.jspreadsheet.current.selectedHeader = false;\n }\n\n // Body found\n if (jssTable[1] == 2) {\n const rowId = parseInt(e.target.getAttribute('data-y'));\n\n if (e.target.classList.contains('jss_row')) {\n const info = e.target.getBoundingClientRect();\n if (libraryBase.jspreadsheet.current.options.rowResize != false && info.height - e.offsetY < 6) {\n // Resize helper\n libraryBase.jspreadsheet.current.resizing = {\n element: e.target.parentNode,\n mousePosition: e.pageY,\n row: rowId,\n height: info.height,\n };\n // Border indication\n e.target.parentNode.classList.add('resizing');\n } else if (libraryBase.jspreadsheet.current.options.rowDrag != false && info.width - e.offsetX < 6) {\n if (isRowMerged.call(libraryBase.jspreadsheet.current, rowId).length) {\n console.error('Jspreadsheet: This row is part of a merged cell');\n } else if (libraryBase.jspreadsheet.current.options.search == true && libraryBase.jspreadsheet.current.results) {\n console.error('Jspreadsheet: Please clear your search before perform this action');\n } else {\n // Reset selection\n libraryBase.jspreadsheet.current.resetSelection();\n // Drag helper\n libraryBase.jspreadsheet.current.dragging = {\n element: e.target.parentNode,\n row: rowId,\n destination: rowId,\n };\n // Border indication\n e.target.parentNode.classList.add('dragging');\n }\n } else {\n let o, d;\n if (libraryBase.jspreadsheet.current.selectedRow != null && (e.shiftKey || e.ctrlKey)) {\n o = libraryBase.jspreadsheet.current.selectedRow;\n d = rowId;\n } else {\n // Keep track of which header was selected first\n libraryBase.jspreadsheet.current.selectedRow = rowId;\n\n // Update selection single column\n o = rowId;\n d = rowId;\n }\n\n // Update selection\n updateSelectionFromCoords.call(libraryBase.jspreadsheet.current, null, o, null, d, e);\n }\n } else {\n // Jclose\n if (e.target.classList.contains('jclose') && e.target.clientWidth - e.offsetX < 50 && e.offsetY < 50) {\n closeEditor.call(libraryBase.jspreadsheet.current, libraryBase.jspreadsheet.current.edition[0], true);\n } else {\n const getCellCoords = function (element) {\n const x = element.getAttribute('data-x');\n const y = element.getAttribute('data-y');\n if (x && y) {\n return [x, y];\n } else {\n if (element.parentNode) {\n return getCellCoords(element.parentNode);\n }\n }\n };\n\n const position = getCellCoords(e.target);\n if (position) {\n const columnId = position[0];\n const rowId = position[1];\n // Close edition\n if (libraryBase.jspreadsheet.current.edition) {\n if (libraryBase.jspreadsheet.current.edition[2] != columnId || libraryBase.jspreadsheet.current.edition[3] != rowId) {\n closeEditor.call(libraryBase.jspreadsheet.current, libraryBase.jspreadsheet.current.edition[0], true);\n }\n }\n\n if (!libraryBase.jspreadsheet.current.edition) {\n // Update cell selection\n if (e.shiftKey) {\n updateSelectionFromCoords.call(\n libraryBase.jspreadsheet.current,\n libraryBase.jspreadsheet.current.selectedCell[0],\n libraryBase.jspreadsheet.current.selectedCell[1],\n columnId,\n rowId,\n e\n );\n } else {\n updateSelectionFromCoords.call(libraryBase.jspreadsheet.current, columnId, rowId, undefined, undefined, e);\n }\n }\n\n // No full row selected\n libraryBase.jspreadsheet.current.selectedHeader = null;\n libraryBase.jspreadsheet.current.selectedRow = null;\n }\n }\n }\n } else {\n libraryBase.jspreadsheet.current.selectedRow = false;\n }\n\n // Pagination\n if (e.target.classList.contains('jss_page')) {\n if (e.target.textContent == '<') {\n libraryBase.jspreadsheet.current.page(0);\n } else if (e.target.textContent == '>') {\n libraryBase.jspreadsheet.current.page(e.target.getAttribute('title') - 1);\n } else {\n libraryBase.jspreadsheet.current.page(e.target.textContent - 1);\n }\n }\n }\n\n if (libraryBase.jspreadsheet.current.edition) {\n libraryBase.jspreadsheet.isMouseAction = false;\n } else {\n libraryBase.jspreadsheet.isMouseAction = true;\n }\n } else {\n libraryBase.jspreadsheet.isMouseAction = false;\n }\n};\n\n// Mouse move controls\nconst mouseMoveControls = function (e) {\n e = e || window.event;\n\n let mouseButton;\n\n if (e.buttons) {\n mouseButton = e.buttons;\n } else if (e.button) {\n mouseButton = e.button;\n } else {\n mouseButton = e.which;\n }\n\n if (!mouseButton) {\n libraryBase.jspreadsheet.isMouseAction = false;\n }\n\n if (libraryBase.jspreadsheet.current) {\n if (libraryBase.jspreadsheet.isMouseAction == true) {\n // Resizing is ongoing\n if (libraryBase.jspreadsheet.current.resizing) {\n if (libraryBase.jspreadsheet.current.resizing.column) {\n const width = e.pageX - libraryBase.jspreadsheet.current.resizing.mousePosition;\n\n if (libraryBase.jspreadsheet.current.resizing.width + width > 0) {\n const tempWidth = libraryBase.jspreadsheet.current.resizing.width + width;\n libraryBase.jspreadsheet.current.cols[libraryBase.jspreadsheet.current.resizing.column].colElement.setAttribute('width', tempWidth);\n\n updateCornerPosition.call(libraryBase.jspreadsheet.current);\n }\n } else {\n const height = e.pageY - libraryBase.jspreadsheet.current.resizing.mousePosition;\n\n if (libraryBase.jspreadsheet.current.resizing.height + height > 0) {\n const tempHeight = libraryBase.jspreadsheet.current.resizing.height + height;\n libraryBase.jspreadsheet.current.rows[libraryBase.jspreadsheet.current.resizing.row].element.setAttribute('height', tempHeight);\n\n updateCornerPosition.call(libraryBase.jspreadsheet.current);\n }\n }\n } else if (libraryBase.jspreadsheet.current.dragging) {\n if (libraryBase.jspreadsheet.current.dragging.column) {\n const columnId = e.target.getAttribute('data-x');\n if (columnId) {\n if (isColMerged.call(libraryBase.jspreadsheet.current, columnId).length) {\n console.error('Jspreadsheet: This column is part of a merged cell.');\n } else {\n for (let i = 0; i < libraryBase.jspreadsheet.current.headers.length; i++) {\n libraryBase.jspreadsheet.current.headers[i].classList.remove('dragging-left');\n libraryBase.jspreadsheet.current.headers[i].classList.remove('dragging-right');\n }\n\n if (libraryBase.jspreadsheet.current.dragging.column == columnId) {\n libraryBase.jspreadsheet.current.dragging.destination = parseInt(columnId);\n } else {\n if (e.target.clientWidth / 2 > e.offsetX) {\n if (libraryBase.jspreadsheet.current.dragging.column < columnId) {\n libraryBase.jspreadsheet.current.dragging.destination = parseInt(columnId) - 1;\n } else {\n libraryBase.jspreadsheet.current.dragging.destination = parseInt(columnId);\n }\n libraryBase.jspreadsheet.current.headers[columnId].classList.add('dragging-left');\n } else {\n if (libraryBase.jspreadsheet.current.dragging.column < columnId) {\n libraryBase.jspreadsheet.current.dragging.destination = parseInt(columnId);\n } else {\n libraryBase.jspreadsheet.current.dragging.destination = parseInt(columnId) + 1;\n }\n libraryBase.jspreadsheet.current.headers[columnId].classList.add('dragging-right');\n }\n }\n }\n }\n } else {\n const rowId = e.target.getAttribute('data-y');\n if (rowId) {\n if (isRowMerged.call(libraryBase.jspreadsheet.current, rowId).length) {\n console.error('Jspreadsheet: This row is part of a merged cell.');\n } else {\n const target = e.target.clientHeight / 2 > e.offsetY ? e.target.parentNode.nextSibling : e.target.parentNode;\n if (libraryBase.jspreadsheet.current.dragging.element != target) {\n e.target.parentNode.parentNode.insertBefore(libraryBase.jspreadsheet.current.dragging.element, target);\n libraryBase.jspreadsheet.current.dragging.destination = Array.prototype.indexOf.call(\n libraryBase.jspreadsheet.current.dragging.element.parentNode.children,\n libraryBase.jspreadsheet.current.dragging.element\n );\n }\n }\n }\n }\n }\n } else {\n const x = e.target.getAttribute('data-x');\n const y = e.target.getAttribute('data-y');\n const rect = e.target.getBoundingClientRect();\n\n if (libraryBase.jspreadsheet.current.cursor) {\n libraryBase.jspreadsheet.current.cursor.style.cursor = '';\n libraryBase.jspreadsheet.current.cursor = null;\n }\n\n if (e.target.parentNode.parentNode && e.target.parentNode.parentNode.className) {\n if (e.target.parentNode.parentNode.classList.contains('resizable')) {\n if (e.target && x && !y && rect.width - (e.clientX - rect.left) < 6) {\n libraryBase.jspreadsheet.current.cursor = e.target;\n libraryBase.jspreadsheet.current.cursor.style.cursor = 'col-resize';\n } else if (e.target && !x && y && rect.height - (e.clientY - rect.top) < 6) {\n libraryBase.jspreadsheet.current.cursor = e.target;\n libraryBase.jspreadsheet.current.cursor.style.cursor = 'row-resize';\n }\n }\n\n if (e.target.parentNode.parentNode.classList.contains('draggable')) {\n if (e.target && !x && y && rect.width - (e.clientX - rect.left) < 6) {\n libraryBase.jspreadsheet.current.cursor = e.target;\n libraryBase.jspreadsheet.current.cursor.style.cursor = 'move';\n } else if (e.target && x && !y && rect.height - (e.clientY - rect.top) < 6) {\n libraryBase.jspreadsheet.current.cursor = e.target;\n libraryBase.jspreadsheet.current.cursor.style.cursor = 'move';\n }\n }\n }\n }\n }\n};\n\n/**\n * Update copy selection\n *\n * @param int x, y\n * @return void\n */\nconst updateCopySelection = function (x3, y3) {\n const obj = this;\n\n // Remove selection\n removeCopySelection.call(obj);\n\n // Get elements first and last\n const x1 = obj.selectedContainer[0];\n const y1 = obj.selectedContainer[1];\n const x2 = obj.selectedContainer[2];\n const y2 = obj.selectedContainer[3];\n\n if (x3 != null && y3 != null) {\n let px, ux;\n\n if (x3 - x2 > 0) {\n px = parseInt(x2) + 1;\n ux = parseInt(x3);\n } else {\n px = parseInt(x3);\n ux = parseInt(x1) - 1;\n }\n\n let py, uy;\n\n if (y3 - y2 > 0) {\n py = parseInt(y2) + 1;\n uy = parseInt(y3);\n } else {\n py = parseInt(y3);\n uy = parseInt(y1) - 1;\n }\n\n if (ux - px <= uy - py) {\n px = parseInt(x1);\n ux = parseInt(x2);\n } else {\n py = parseInt(y1);\n uy = parseInt(y2);\n }\n\n for (let j = py; j <= uy; j++) {\n for (let i = px; i <= ux; i++) {\n if (obj.records[j][i] && obj.rows[j].element.style.display != 'none' && obj.records[j][i].element.style.display != 'none') {\n obj.records[j][i].element.classList.add('selection');\n obj.records[py][i].element.classList.add('selection-top');\n obj.records[uy][i].element.classList.add('selection-bottom');\n obj.records[j][px].element.classList.add('selection-left');\n obj.records[j][ux].element.classList.add('selection-right');\n\n // Persist selected elements\n obj.selection.push(obj.records[j][i].element);\n }\n }\n }\n }\n};\n\nconst mouseOverControls = function (e) {\n e = e || window.event;\n\n let mouseButton;\n\n if (e.buttons) {\n mouseButton = e.buttons;\n } else if (e.button) {\n mouseButton = e.button;\n } else {\n mouseButton = e.which;\n }\n\n if (!mouseButton) {\n libraryBase.jspreadsheet.isMouseAction = false;\n }\n\n if (libraryBase.jspreadsheet.current && libraryBase.jspreadsheet.isMouseAction == true) {\n // Get elements\n const jssTable = getElement(e.target);\n\n if (jssTable[0]) {\n // Avoid cross reference\n if (libraryBase.jspreadsheet.current != jssTable[0].jssWorksheet) {\n if (libraryBase.jspreadsheet.current) {\n return false;\n }\n }\n\n let columnId = e.target.getAttribute('data-x');\n const rowId = e.target.getAttribute('data-y');\n if (libraryBase.jspreadsheet.current.resizing || libraryBase.jspreadsheet.current.dragging) {\n // ignore\n } else {\n // Header found\n if (jssTable[1] == 1) {\n if (libraryBase.jspreadsheet.current.selectedHeader) {\n columnId = e.target.getAttribute('data-x');\n const o = libraryBase.jspreadsheet.current.selectedHeader;\n const d = columnId;\n // Update selection\n updateSelectionFromCoords.call(libraryBase.jspreadsheet.current, o, 0, d, libraryBase.jspreadsheet.current.options.data.length - 1, e);\n }\n }\n\n // Body found\n if (jssTable[1] == 2) {\n if (e.target.classList.contains('jss_row')) {\n if (libraryBase.jspreadsheet.current.selectedRow != null) {\n const o = libraryBase.jspreadsheet.current.selectedRow;\n const d = rowId;\n // Update selection\n updateSelectionFromCoords.call(\n libraryBase.jspreadsheet.current,\n 0,\n o,\n libraryBase.jspreadsheet.current.options.data[0].length - 1,\n d,\n e\n );\n }\n } else {\n // Do not select edtion is in progress\n if (!libraryBase.jspreadsheet.current.edition) {\n if (columnId && rowId) {\n if (libraryBase.jspreadsheet.current.selectedCorner) {\n updateCopySelection.call(libraryBase.jspreadsheet.current, columnId, rowId);\n } else {\n if (libraryBase.jspreadsheet.current.selectedCell) {\n updateSelectionFromCoords.call(\n libraryBase.jspreadsheet.current,\n libraryBase.jspreadsheet.current.selectedCell[0],\n libraryBase.jspreadsheet.current.selectedCell[1],\n columnId,\n rowId,\n e\n );\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Clear any time control\n if (libraryBase.jspreadsheet.timeControl) {\n clearTimeout(libraryBase.jspreadsheet.timeControl);\n libraryBase.jspreadsheet.timeControl = null;\n }\n};\n\nconst doubleClickControls = function (e) {\n // Jss is selected\n if (libraryBase.jspreadsheet.current) {\n // Corner action\n if (e.target.classList.contains('jss_corner')) {\n // Any selected cells\n if (libraryBase.jspreadsheet.current.highlighted.length > 0) {\n // Copy from this\n const x1 = libraryBase.jspreadsheet.current.highlighted[0].element.getAttribute('data-x');\n const y1 =\n parseInt(\n libraryBase.jspreadsheet.current.highlighted[libraryBase.jspreadsheet.current.highlighted.length - 1].element.getAttribute('data-y')\n ) + 1;\n // Until this\n const x2 = libraryBase.jspreadsheet.current.highlighted[libraryBase.jspreadsheet.current.highlighted.length - 1].element.getAttribute('data-x');\n const y2 = libraryBase.jspreadsheet.current.records.length - 1;\n // Execute copy\n copyData.call(\n libraryBase.jspreadsheet.current,\n libraryBase.jspreadsheet.current.records[y1][x1].element,\n libraryBase.jspreadsheet.current.records[y2][x2].element\n );\n }\n } else if (e.target.classList.contains('jss_column_filter')) {\n // Column\n const columnId = e.target.getAttribute('data-x');\n // Open filter\n openFilter.call(libraryBase.jspreadsheet.current, columnId);\n } else {\n // Get table\n const jssTable = getElement(e.target);\n\n // Double click over header\n if (jssTable[1] == 1 && libraryBase.jspreadsheet.current.options.columnSorting != false) {\n // Check valid column header coords\n const columnId = e.target.getAttribute('data-x');\n if (columnId) {\n libraryBase.jspreadsheet.current.orderBy(parseInt(columnId));\n }\n }\n\n // Double click over body\n if (jssTable[1] == 2 && libraryBase.jspreadsheet.current.options.editable != false) {\n if (!libraryBase.jspreadsheet.current.edition) {\n const getCellCoords = function (element) {\n if (element.parentNode) {\n const x = element.getAttribute('data-x');\n const y = element.getAttribute('data-y');\n if (x && y) {\n return element;\n } else {\n return getCellCoords(element.parentNode);\n }\n }\n };\n const cell = getCellCoords(e.target);\n if (cell && cell.classList.contains('highlight')) {\n openEditor.call(libraryBase.jspreadsheet.current, cell, undefined, e);\n }\n }\n }\n }\n }\n};\n\nconst pasteControls = function (e) {\n if (libraryBase.jspreadsheet.current && libraryBase.jspreadsheet.current.selectedCell) {\n if (!libraryBase.jspreadsheet.current.edition) {\n if (libraryBase.jspreadsheet.current.options.editable != false) {\n if (e && e.clipboardData) {\n paste.call(\n libraryBase.jspreadsheet.current,\n libraryBase.jspreadsheet.current.selectedCell[0],\n libraryBase.jspreadsheet.current.selectedCell[1],\n e.clipboardData.getData('text')\n );\n e.preventDefault();\n } else if (window.clipboardData) {\n paste.call(\n libraryBase.jspreadsheet.current,\n libraryBase.jspreadsheet.current.selectedCell[0],\n libraryBase.jspreadsheet.current.selectedCell[1],\n window.clipboardData.getData('text')\n );\n }\n }\n }\n }\n};\n\nconst getRole = function (element) {\n if (element.classList.contains('jss_selectall')) {\n return 'select-all';\n }\n\n if (element.classList.contains('jss_corner')) {\n return 'fill-handle';\n }\n\n let tempElement = element;\n\n while (!tempElement.classList.contains('jss_spreadsheet')) {\n if (tempElement.classList.contains('jss_row')) {\n return 'row';\n }\n\n if (tempElement.classList.contains('jss_nested')) {\n return 'nested';\n }\n\n if (tempElement.classList.contains('jtabs-headers')) {\n return 'tabs';\n }\n\n if (tempElement.classList.contains('jtoolbar')) {\n return 'toolbar';\n }\n\n if (tempElement.classList.contains('jss_pagination')) {\n return 'pagination';\n }\n\n if (tempElement.tagName === 'TBODY') {\n return 'cell';\n }\n\n if (tempElement.tagName === 'TFOOT') {\n return getElementIndex(element) === 0 ? 'grid' : 'footer';\n }\n\n if (tempElement.tagName === 'THEAD') {\n return 'header';\n }\n\n tempElement = tempElement.parentElement;\n }\n\n return 'applications';\n};\n\nconst defaultContextMenu = function (worksheet, x, y, role) {\n const items = [];\n\n if (role === 'header') {\n // Insert a new column\n if (worksheet.options.allowInsertColumn != false) {\n items.push({\n title: jSuites.translate('Insert a new column before'),\n onclick: function () {\n worksheet.insertColumn(1, parseInt(x), 1);\n },\n });\n }\n\n if (worksheet.options.allowInsertColumn != false) {\n items.push({\n title: jSuites.translate('Insert a new column after'),\n onclick: function () {\n worksheet.insertColumn(1, parseInt(x), 0);\n },\n });\n }\n\n // Delete a column\n if (worksheet.options.allowDeleteColumn != false) {\n items.push({\n title: jSuites.translate('Delete selected columns'),\n onclick: function () {\n worksheet.deleteColumn(worksheet.getSelectedColumns().length ? undefined : parseInt(x));\n },\n });\n }\n\n // Rename column\n if (worksheet.options.allowRenameColumn != false) {\n items.push({\n title: jSuites.translate('Rename this column'),\n onclick: function () {\n const oldValue = worksheet.getHeader(x);\n\n const newValue = prompt(jSuites.translate('Column name'), oldValue);\n\n worksheet.setHeader(x, newValue);\n },\n });\n }\n\n // Sorting\n if (worksheet.options.columnSorting != false) {\n // Line\n items.push({ type: 'line' });\n\n items.push({\n title: jSuites.translate('Order ascending'),\n onclick: function () {\n worksheet.orderBy(x, 0);\n },\n });\n items.push({\n title: jSuites.translate('Order descending'),\n onclick: function () {\n worksheet.orderBy(x, 1);\n },\n });\n }\n }\n\n if (role === 'row' || role === 'cell') {\n // Insert new row\n if (worksheet.options.allowInsertRow != false) {\n items.push({\n title: jSuites.translate('Insert a new row before'),\n onclick: function () {\n worksheet.insertRow(1, parseInt(y), 1);\n },\n });\n\n items.push({\n title: jSuites.translate('Insert a new row after'),\n onclick: function () {\n worksheet.insertRow(1, parseInt(y));\n },\n });\n }\n\n if (worksheet.options.allowDeleteRow != false) {\n items.push({\n title: jSuites.translate('Delete selected rows'),\n onclick: function () {\n worksheet.deleteRow(worksheet.getSelectedRows().length ? undefined : parseInt(y));\n },\n });\n }\n }\n\n if (role === 'cell') {\n if (worksheet.options.allowComments != false) {\n items.push({ type: 'line' });\n\n const title = worksheet.records[y][x].element.getAttribute('title') || '';\n\n items.push({\n title: jSuites.translate(title ? 'Edit comments' : 'Add comments'),\n onclick: function () {\n const comment = prompt(jSuites.translate('Comments'), title);\n if (comment) {\n worksheet.setComments(getCellNameFromCoords(x, y), comment);\n }\n },\n });\n\n if (title) {\n items.push({\n title: jSuites.translate('Clear comments'),\n onclick: function () {\n worksheet.setComments(getCellNameFromCoords(x, y), '');\n },\n });\n }\n }\n }\n\n // Line\n if (items.length !== 0) {\n items.push({ type: 'line' });\n }\n\n // Copy\n if (role === 'header' || role === 'row' || role === 'cell') {\n items.push({\n title: jSuites.translate('Copy') + '...',\n shortcut: 'Ctrl + C',\n onclick: function () {\n copy.call(worksheet, true);\n },\n });\n\n // Paste\n if (navigator && navigator.clipboard) {\n items.push({\n title: jSuites.translate('Paste') + '...',\n shortcut: 'Ctrl + V',\n onclick: function () {\n if (worksheet.selectedCell) {\n navigator.clipboard.readText().then(function (text) {\n if (text) {\n paste.call(worksheet, worksheet.selectedCell[0], worksheet.selectedCell[1], text);\n }\n });\n }\n },\n });\n }\n }\n\n // Save\n if (worksheet.parent.config.allowExport != false) {\n items.push({\n title: jSuites.translate('Save as') + '...',\n shortcut: 'Ctrl + S',\n onclick: function () {\n worksheet.download();\n },\n });\n }\n\n // About\n if (worksheet.parent.config.about != false) {\n items.push({\n title: jSuites.translate('About'),\n onclick: function () {\n if (typeof worksheet.parent.config.about === 'undefined' || worksheet.parent.config.about === true) {\n alert(version.print());\n } else {\n alert(worksheet.parent.config.about);\n }\n },\n });\n }\n\n return items;\n};\n\nconst getElementIndex = function (element) {\n const parentChildren = element.parentElement.children;\n\n for (let i = 0; i < parentChildren.length; i++) {\n const currentElement = parentChildren[i];\n\n if (element === currentElement) {\n return i;\n }\n }\n\n return -1;\n};\n\nconst contextMenuControls = function (e) {\n e = e || window.event;\n\n let mouseButton;\n\n if ('buttons' in e) {\n mouseButton = e.buttons;\n } else {\n mouseButton = e.which || e.button;\n }\n\n if (libraryBase.jspreadsheet.current) {\n const spreadsheet = libraryBase.jspreadsheet.current.parent;\n\n if (libraryBase.jspreadsheet.current.edition) {\n e.preventDefault();\n } else {\n spreadsheet.contextMenu.contextmenu.close();\n\n if (libraryBase.jspreadsheet.current) {\n const role = getRole(e.target);\n\n let x = null,\n y = null;\n\n if (role === 'cell') {\n let cellElement = e.target;\n while (cellElement.tagName !== 'TD') {\n cellElement = cellElement.parentNode;\n }\n\n y = cellElement.getAttribute('data-y');\n x = cellElement.getAttribute('data-x');\n\n if (\n !libraryBase.jspreadsheet.current.selectedCell ||\n x < parseInt(libraryBase.jspreadsheet.current.selectedCell[0]) ||\n x > parseInt(libraryBase.jspreadsheet.current.selectedCell[2]) ||\n y < parseInt(libraryBase.jspreadsheet.current.selectedCell[1]) ||\n y > parseInt(libraryBase.jspreadsheet.current.selectedCell[3])\n ) {\n updateSelectionFromCoords.call(libraryBase.jspreadsheet.current, x, y, x, y, e);\n }\n } else if (role === 'row' || role === 'header') {\n if (role === 'row') {\n y = e.target.getAttribute('data-y');\n } else {\n x = e.target.getAttribute('data-x');\n }\n\n if (\n !libraryBase.jspreadsheet.current.selectedCell ||\n x < parseInt(libraryBase.jspreadsheet.current.selectedCell[0]) ||\n x > parseInt(libraryBase.jspreadsheet.current.selectedCell[2]) ||\n y < parseInt(libraryBase.jspreadsheet.current.selectedCell[1]) ||\n y > parseInt(libraryBase.jspreadsheet.current.selectedCell[3])\n ) {\n updateSelectionFromCoords.call(libraryBase.jspreadsheet.current, x, y, x, y, e);\n }\n } else if (role === 'nested') {\n const columns = e.target.getAttribute('data-column').split(',');\n\n x = getElementIndex(e.target) - 1;\n y = getElementIndex(e.target.parentElement);\n\n if (\n !libraryBase.jspreadsheet.current.selectedCell ||\n columns[0] != parseInt(libraryBase.jspreadsheet.current.selectedCell[0]) ||\n columns[columns.length - 1] != parseInt(libraryBase.jspreadsheet.current.selectedCell[2]) ||\n libraryBase.jspreadsheet.current.selectedCell[1] != null ||\n libraryBase.jspreadsheet.current.selectedCell[3] != null\n ) {\n updateSelectionFromCoords.call(libraryBase.jspreadsheet.current, columns[0], null, columns[columns.length - 1], null, e);\n }\n } else if (role === 'select-all') {\n selectAll.call(libraryBase.jspreadsheet.current);\n } else if (role === 'tabs') {\n x = getElementIndex(e.target);\n } else if (role === 'footer') {\n x = getElementIndex(e.target) - 1;\n y = getElementIndex(e.target.parentElement);\n }\n\n // Table found\n let items = defaultContextMenu(libraryBase.jspreadsheet.current, parseInt(x), parseInt(y), role);\n\n if (typeof spreadsheet.config.contextMenu === 'function') {\n const result = spreadsheet.config.contextMenu(libraryBase.jspreadsheet.current, x, y, e, items, role, x, y);\n\n if (result) {\n items = result;\n } else if (result === false) {\n return;\n }\n }\n\n if (typeof spreadsheet.plugins === 'object') {\n Object.entries(spreadsheet.plugins).forEach(function ([, plugin]) {\n if (typeof plugin.contextMenu === 'function') {\n const result = plugin.contextMenu(\n libraryBase.jspreadsheet.current,\n x !== null ? parseInt(x) : null,\n y !== null ? parseInt(y) : null,\n e,\n items,\n role,\n x !== null ? parseInt(x) : null,\n y !== null ? parseInt(y) : null\n );\n\n if (result) {\n items = result;\n }\n }\n });\n }\n\n // The id is depending on header and body\n spreadsheet.contextMenu.contextmenu.open(e, items);\n // Avoid the real one\n e.preventDefault();\n }\n }\n }\n};\n\nconst touchStartControls = function (e) {\n const jssTable = getElement(e.target);\n\n if (jssTable[0]) {\n if (libraryBase.jspreadsheet.current != jssTable[0].jssWorksheet) {\n if (libraryBase.jspreadsheet.current) {\n libraryBase.jspreadsheet.current.resetSelection();\n }\n libraryBase.jspreadsheet.current = jssTable[0].jssWorksheet;\n }\n } else {\n if (libraryBase.jspreadsheet.current) {\n libraryBase.jspreadsheet.current.resetSelection();\n libraryBase.jspreadsheet.current = null;\n }\n }\n\n if (libraryBase.jspreadsheet.current) {\n if (!libraryBase.jspreadsheet.current.edition) {\n const columnId = e.target.getAttribute('data-x');\n const rowId = e.target.getAttribute('data-y');\n\n if (columnId && rowId) {\n updateSelectionFromCoords.call(libraryBase.jspreadsheet.current, columnId, rowId, undefined, undefined, e);\n\n libraryBase.jspreadsheet.timeControl = setTimeout(function () {\n // Keep temporary reference to the element\n if (libraryBase.jspreadsheet.current.options.columns[columnId].type == 'color') {\n libraryBase.jspreadsheet.tmpElement = null;\n } else {\n libraryBase.jspreadsheet.tmpElement = e.target;\n }\n openEditor.call(libraryBase.jspreadsheet.current, e.target, false, e);\n }, 500);\n }\n }\n }\n};\n\nconst touchEndControls = function (e) {\n // Clear any time control\n if (libraryBase.jspreadsheet.timeControl) {\n clearTimeout(libraryBase.jspreadsheet.timeControl);\n libraryBase.jspreadsheet.timeControl = null;\n // Element\n if (libraryBase.jspreadsheet.tmpElement && libraryBase.jspreadsheet.tmpElement.children[0].tagName == 'INPUT') {\n libraryBase.jspreadsheet.tmpElement.children[0].focus();\n }\n libraryBase.jspreadsheet.tmpElement = null;\n }\n};\n\nexport const cutControls = function (e) {\n if (libraryBase.jspreadsheet.current) {\n if (!libraryBase.jspreadsheet.current.edition) {\n copy.call(libraryBase.jspreadsheet.current, true, undefined, undefined, undefined, undefined, true);\n if (libraryBase.jspreadsheet.current.options.editable != false) {\n libraryBase.jspreadsheet.current.setValue(\n libraryBase.jspreadsheet.current.highlighted.map(function (record) {\n return record.element;\n }),\n ''\n );\n }\n }\n }\n};\n\nconst copyControls = function (e) {\n if (libraryBase.jspreadsheet.current && copyControls.enabled) {\n if (!libraryBase.jspreadsheet.current.edition) {\n copy.call(libraryBase.jspreadsheet.current, true);\n }\n }\n};\n\nconst isMac = function () {\n return navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n};\n\nconst isCtrl = function (e) {\n if (isMac()) {\n return e.metaKey;\n } else {\n return e.ctrlKey;\n }\n};\n\nconst keyDownControls = function (e) {\n if (libraryBase.jspreadsheet.current) {\n if (libraryBase.jspreadsheet.current.edition) {\n if (e.which == 27) {\n // Escape\n if (libraryBase.jspreadsheet.current.edition) {\n // Exit without saving\n closeEditor.call(libraryBase.jspreadsheet.current, libraryBase.jspreadsheet.current.edition[0], false);\n }\n e.preventDefault();\n } else if (e.which == 13) {\n // Enter\n if (\n libraryBase.jspreadsheet.current.options.columns &&\n libraryBase.jspreadsheet.current.options.columns[libraryBase.jspreadsheet.current.edition[2]] &&\n libraryBase.jspreadsheet.current.options.columns[libraryBase.jspreadsheet.current.edition[2]].type == 'calendar'\n ) {\n closeEditor.call(libraryBase.jspreadsheet.current, libraryBase.jspreadsheet.current.edition[0], true);\n } else if (\n libraryBase.jspreadsheet.current.options.columns &&\n libraryBase.jspreadsheet.current.options.columns[libraryBase.jspreadsheet.current.edition[2]] &&\n libraryBase.jspreadsheet.current.options.columns[libraryBase.jspreadsheet.current.edition[2]].type == 'dropdown'\n ) {\n // Do nothing\n } else {\n // Alt enter -> do not close editor\n if (\n (libraryBase.jspreadsheet.current.options.wordWrap == true ||\n (libraryBase.jspreadsheet.current.options.columns &&\n libraryBase.jspreadsheet.current.options.columns[libraryBase.jspreadsheet.current.edition[2]] &&\n libraryBase.jspreadsheet.current.options.columns[libraryBase.jspreadsheet.current.edition[2]].wordWrap == true) ||\n (libraryBase.jspreadsheet.current.options.data[libraryBase.jspreadsheet.current.edition[3]][\n libraryBase.jspreadsheet.current.edition[2]\n ] &&\n libraryBase.jspreadsheet.current.options.data[libraryBase.jspreadsheet.current.edition[3]][\n libraryBase.jspreadsheet.current.edition[2]\n ].length > 200)) &&\n e.altKey\n ) {\n // Add new line to the editor\n const editorTextarea = libraryBase.jspreadsheet.current.edition[0].children[0];\n let editorValue = libraryBase.jspreadsheet.current.edition[0].children[0].value;\n const editorIndexOf = editorTextarea.selectionStart;\n editorValue = editorValue.slice(0, editorIndexOf) + '\\n' + editorValue.slice(editorIndexOf);\n editorTextarea.value = editorValue;\n editorTextarea.focus();\n editorTextarea.selectionStart = editorIndexOf + 1;\n editorTextarea.selectionEnd = editorIndexOf + 1;\n } else {\n libraryBase.jspreadsheet.current.edition[0].children[0].blur();\n }\n }\n } else if (e.which == 9) {\n // Tab\n if (\n libraryBase.jspreadsheet.current.options.columns &&\n libraryBase.jspreadsheet.current.options.columns[libraryBase.jspreadsheet.current.edition[2]] &&\n ['calendar', 'html'].includes(libraryBase.jspreadsheet.current.options.columns[libraryBase.jspreadsheet.current.edition[2]].type)\n ) {\n closeEditor.call(libraryBase.jspreadsheet.current, libraryBase.jspreadsheet.current.edition[0], true);\n } else {\n libraryBase.jspreadsheet.current.edition[0].children[0].blur();\n }\n }\n }\n\n if (!libraryBase.jspreadsheet.current.edition && libraryBase.jspreadsheet.current.selectedCell) {\n // Which key\n if (e.which == 37) {\n left.call(libraryBase.jspreadsheet.current, e.shiftKey, e.ctrlKey);\n e.preventDefault();\n } else if (e.which == 39) {\n right.call(libraryBase.jspreadsheet.current, e.shiftKey, e.ctrlKey);\n e.preventDefault();\n } else if (e.which == 38) {\n up.call(libraryBase.jspreadsheet.current, e.shiftKey, e.ctrlKey);\n e.preventDefault();\n } else if (e.which == 40) {\n down.call(libraryBase.jspreadsheet.current, e.shiftKey, e.ctrlKey);\n e.preventDefault();\n } else if (e.which == 36) {\n first.call(libraryBase.jspreadsheet.current, e.shiftKey, e.ctrlKey);\n e.preventDefault();\n } else if (e.which == 35) {\n last.call(libraryBase.jspreadsheet.current, e.shiftKey, e.ctrlKey);\n e.preventDefault();\n } else if (e.which == 46 || e.which == 8) {\n // Delete\n if (libraryBase.jspreadsheet.current.options.editable != false) {\n if (libraryBase.jspreadsheet.current.selectedRow != null) {\n if (libraryBase.jspreadsheet.current.options.allowDeleteRow != false) {\n if (confirm(jSuites.translate('Are you sure to delete the selected rows?'))) {\n libraryBase.jspreadsheet.current.deleteRow();\n }\n }\n } else if (libraryBase.jspreadsheet.current.selectedHeader) {\n if (libraryBase.jspreadsheet.current.options.allowDeleteColumn != false) {\n if (confirm(jSuites.translate('Are you sure to delete the selected columns?'))) {\n libraryBase.jspreadsheet.current.deleteColumn();\n }\n }\n } else {\n // Change value\n libraryBase.jspreadsheet.current.setValue(\n libraryBase.jspreadsheet.current.highlighted.map(function (record) {\n return record.element;\n }),\n ''\n );\n }\n }\n } else if (e.which == 13) {\n // Move cursor\n if (e.shiftKey) {\n up.call(libraryBase.jspreadsheet.current);\n } else {\n if (libraryBase.jspreadsheet.current.options.allowInsertRow != false) {\n if (libraryBase.jspreadsheet.current.options.allowManualInsertRow != false) {\n if (libraryBase.jspreadsheet.current.selectedCell[1] == libraryBase.jspreadsheet.current.options.data.length - 1) {\n // New record in case selectedCell in the last row\n libraryBase.jspreadsheet.current.insertRow();\n }\n }\n }\n\n down.call(libraryBase.jspreadsheet.current);\n }\n e.preventDefault();\n } else if (e.which == 9) {\n // Tab\n if (e.shiftKey) {\n left.call(libraryBase.jspreadsheet.current);\n } else {\n if (libraryBase.jspreadsheet.current.options.allowInsertColumn != false) {\n if (libraryBase.jspreadsheet.current.options.allowManualInsertColumn != false) {\n if (libraryBase.jspreadsheet.current.selectedCell[0] == libraryBase.jspreadsheet.current.options.data[0].length - 1) {\n // New record in case selectedCell in the last column\n libraryBase.jspreadsheet.current.insertColumn();\n }\n }\n }\n\n right.call(libraryBase.jspreadsheet.current);\n }\n e.preventDefault();\n } else {\n if ((e.ctrlKey || e.metaKey) && !e.shiftKey) {\n if (e.which == 65) {\n // Ctrl + A\n selectAll.call(libraryBase.jspreadsheet.current);\n e.preventDefault();\n } else if (e.which == 83) {\n // Ctrl + S\n libraryBase.jspreadsheet.current.download();\n e.preventDefault();\n } else if (e.which == 89) {\n // Ctrl + Y\n libraryBase.jspreadsheet.current.redo();\n e.preventDefault();\n } else if (e.which == 90) {\n // Ctrl + Z\n libraryBase.jspreadsheet.current.undo();\n e.preventDefault();\n } else if (e.which == 67) {\n // Ctrl + C\n copy.call(libraryBase.jspreadsheet.current, true);\n e.preventDefault();\n } else if (e.which == 88) {\n // Ctrl + X\n if (libraryBase.jspreadsheet.current.options.editable != false) {\n cutControls();\n } else {\n copyControls();\n }\n e.preventDefault();\n } else if (e.which == 86) {\n // Ctrl + V\n pasteControls();\n }\n } else {\n if (libraryBase.jspreadsheet.current.selectedCell) {\n if (libraryBase.jspreadsheet.current.options.editable != false) {\n const rowId = libraryBase.jspreadsheet.current.selectedCell[1];\n const columnId = libraryBase.jspreadsheet.current.selectedCell[0];\n\n // Characters able to start a edition\n if (e.keyCode == 32) {\n // Space\n e.preventDefault();\n if (\n libraryBase.jspreadsheet.current.options.columns[columnId].type == 'checkbox' ||\n libraryBase.jspreadsheet.current.options.columns[columnId].type == 'radio'\n ) {\n setCheckRadioValue.call(libraryBase.jspreadsheet.current);\n } else {\n // Start edition\n openEditor.call(\n libraryBase.jspreadsheet.current,\n libraryBase.jspreadsheet.current.records[rowId][columnId].element,\n true,\n e\n );\n }\n } else if (e.keyCode == 113) {\n // Start edition with current content F2\n openEditor.call(libraryBase.jspreadsheet.current, libraryBase.jspreadsheet.current.records[rowId][columnId].element, false, e);\n } else if ((e.key.length === 1 || e.key === 'Process') && !(e.altKey || isCtrl(e))) {\n // Start edition\n openEditor.call(libraryBase.jspreadsheet.current, libraryBase.jspreadsheet.current.records[rowId][columnId].element, true, e);\n // Prevent entries in the calendar\n if (\n libraryBase.jspreadsheet.current.options.columns &&\n libraryBase.jspreadsheet.current.options.columns[columnId] &&\n libraryBase.jspreadsheet.current.options.columns[columnId].type == 'calendar'\n ) {\n e.preventDefault();\n }\n }\n }\n }\n }\n }\n } else {\n if (e.target.classList.contains('jss_search')) {\n if (libraryBase.jspreadsheet.timeControl) {\n clearTimeout(libraryBase.jspreadsheet.timeControl);\n }\n\n libraryBase.jspreadsheet.timeControl = setTimeout(function () {\n libraryBase.jspreadsheet.current.search(e.target.value);\n }, 200);\n }\n }\n }\n};\n\nexport const wheelControls = function (e) {\n const obj = this;\n\n if (obj.options.lazyLoading == true) {\n if (libraryBase.jspreadsheet.timeControlLoading == null) {\n libraryBase.jspreadsheet.timeControlLoading = setTimeout(function () {\n if (obj.content.scrollTop + obj.content.clientHeight >= obj.content.scrollHeight - 10) {\n if (loadDown.call(obj)) {\n if (obj.content.scrollTop + obj.content.clientHeight > obj.content.scrollHeight - 10) {\n obj.content.scrollTop = obj.content.scrollTop - obj.content.clientHeight;\n }\n updateCornerPosition.call(obj);\n }\n } else if (obj.content.scrollTop <= obj.content.clientHeight) {\n if (loadUp.call(obj)) {\n if (obj.content.scrollTop < 10) {\n obj.content.scrollTop = obj.content.scrollTop + obj.content.clientHeight;\n }\n updateCornerPosition.call(obj);\n }\n }\n\n libraryBase.jspreadsheet.timeControlLoading = null;\n }, 100);\n }\n }\n};\n\nlet scrollLeft = 0;\n\nconst updateFreezePosition = function () {\n const obj = this;\n\n scrollLeft = obj.content.scrollLeft;\n let width = 0;\n if (scrollLeft > 50) {\n for (let i = 0; i < obj.options.freezeColumns; i++) {\n if (i > 0) {\n // Must check if the previous column is hidden or not to determin whether the width shoule be added or not!\n if (!obj.options.columns || !obj.options.columns[i - 1] || obj.options.columns[i - 1].type !== 'hidden') {\n let columnWidth;\n if (obj.options.columns && obj.options.columns[i - 1] && obj.options.columns[i - 1].width !== undefined) {\n columnWidth = parseInt(obj.options.columns[i - 1].width);\n } else {\n columnWidth = obj.options.defaultColWidth !== undefined ? parseInt(obj.options.defaultColWidth) : 100;\n }\n\n width += parseInt(columnWidth);\n }\n }\n obj.headers[i].classList.add('jss_freezed');\n obj.headers[i].style.left = width + 'px';\n for (let j = 0; j < obj.rows.length; j++) {\n if (obj.rows[j] && obj.records[j][i]) {\n const shifted = scrollLeft + (i > 0 ? obj.records[j][i - 1].element.style.width : 0) - 51 + 'px';\n obj.records[j][i].element.classList.add('jss_freezed');\n obj.records[j][i].element.style.left = shifted;\n }\n }\n }\n } else {\n for (let i = 0; i < obj.options.freezeColumns; i++) {\n obj.headers[i].classList.remove('jss_freezed');\n obj.headers[i].style.left = '';\n for (let j = 0; j < obj.rows.length; j++) {\n if (obj.records[j][i]) {\n obj.records[j][i].element.classList.remove('jss_freezed');\n obj.records[j][i].element.style.left = '';\n }\n }\n }\n }\n\n // Place the corner in the correct place\n updateCornerPosition.call(obj);\n};\n\nexport const scrollControls = function (e) {\n const obj = this;\n\n wheelControls.call(obj);\n\n if (obj.options.freezeColumns > 0 && obj.content.scrollLeft != scrollLeft) {\n updateFreezePosition.call(obj);\n }\n\n // Close editor\n if (obj.options.lazyLoading == true || obj.options.tableOverflow == true) {\n if (obj.edition && e.target.className.substr(0, 9) != 'jdropdown') {\n closeEditor.call(obj, obj.edition[0], true);\n }\n }\n};\n\nexport const setEvents = function (root) {\n destroyEvents(root);\n root.addEventListener('mouseup', mouseUpControls);\n root.addEventListener('mousedown', mouseDownControls);\n root.addEventListener('mousemove', mouseMoveControls);\n root.addEventListener('mouseover', mouseOverControls);\n root.addEventListener('dblclick', doubleClickControls);\n root.addEventListener('paste', pasteControls);\n root.addEventListener('contextmenu', contextMenuControls);\n root.addEventListener('touchstart', touchStartControls);\n root.addEventListener('touchend', touchEndControls);\n root.addEventListener('touchcancel', touchEndControls);\n root.addEventListener('touchmove', touchEndControls);\n document.addEventListener('keydown', keyDownControls);\n};\n\nexport const destroyEvents = function (root) {\n root.removeEventListener('mouseup', mouseUpControls);\n root.removeEventListener('mousedown', mouseDownControls);\n root.removeEventListener('mousemove', mouseMoveControls);\n root.removeEventListener('mouseover', mouseOverControls);\n root.removeEventListener('dblclick', doubleClickControls);\n root.removeEventListener('paste', pasteControls);\n root.removeEventListener('contextmenu', contextMenuControls);\n root.removeEventListener('touchstart', touchStartControls);\n root.removeEventListener('touchend', touchEndControls);\n root.removeEventListener('touchcancel', touchEndControls);\n document.removeEventListener('keydown', keyDownControls);\n};\n","import { createRow } from './rows.js';\nimport { updateCell, updateFormulaChain, updateTable } from './internal.js';\nimport { getIdFromColumnName } from './internalHelpers.js';\nimport dispatch from './dispatch.js';\nimport { setHistory } from './history.js';\nimport { updatePagination } from './pagination.js';\nimport { setMerge } from './merges.js';\nimport { getCoordsFromRange } from './helpers.js';\n\nexport const setData = function (data) {\n const obj = this;\n\n // Update data\n if (data) {\n obj.options.data = data;\n }\n\n // Data\n if (!obj.options.data) {\n obj.options.data = [];\n }\n\n // Prepare data\n if (obj.options.data && obj.options.data[0]) {\n // 处理不是二维数组的情况\n if (!Array.isArray(obj.options.data[0])) {\n data = [];\n for (let j = 0; j < obj.options.data.length; j++) {\n const row = [];\n // 根据columns长度设置行数据\n for (let i = 0; i < obj.options.columns.length; i++) {\n row[i] = obj.options.data[j][obj.options.columns[i].name];\n }\n data.push(row);\n }\n\n obj.options.data = data;\n }\n }\n\n // Adjust minimal dimensions\n let j = 0;\n let i = 0;\n const size_i = (obj.options.columns && obj.options.columns.length) || 0;\n const size_j = obj.options.data.length;\n const min_i = obj.options.minDimensions[0];\n const min_j = obj.options.minDimensions[1];\n const max_i = min_i > size_i ? min_i : size_i;\n const max_j = min_j > size_j ? min_j : size_j;\n\n for (j = 0; j < max_j; j++) {\n for (i = 0; i < max_i; i++) {\n if (obj.options.data[j] == undefined) {\n obj.options.data[j] = [];\n }\n\n if (obj.options.data[j][i] == undefined) {\n obj.options.data[j][i] = '';\n }\n }\n }\n\n // Reset containers\n obj.rows = [];\n obj.results = null;\n obj.records = [];\n obj.history = [];\n\n // Reset internal controllers\n obj.historyIndex = -1;\n\n // Reset data\n obj.tbody.innerHTML = '';\n\n let startNumber;\n let finalNumber;\n\n // Lazy loading\n if (obj.options.lazyLoading == true) {\n // Load only 100 records\n startNumber = 0;\n finalNumber = obj.options.data.length < 100 ? obj.options.data.length : 100;\n\n if (obj.options.pagination) {\n obj.options.pagination = false;\n console.error('Jspreadsheet: Pagination will be disable due the lazyLoading');\n }\n } else if (obj.options.pagination) {\n // Pagination\n if (!obj.pageNumber) {\n obj.pageNumber = 0;\n }\n var quantityPerPage = obj.options.pagination;\n startNumber = obj.options.pagination * obj.pageNumber;\n finalNumber = obj.options.pagination * obj.pageNumber + obj.options.pagination;\n\n if (obj.options.data.length < finalNumber) {\n finalNumber = obj.options.data.length;\n }\n } else {\n startNumber = 0;\n finalNumber = obj.options.data.length;\n }\n\n // Append nodes to the HTML\n for (j = 0; j < obj.options.data.length; j++) {\n // Create row\n const row = createRow.call(obj, j, obj.options.data[j]);\n // Append line to the table\n if (j >= startNumber && j < finalNumber) {\n obj.tbody.appendChild(row.element);\n }\n }\n\n if (obj.options.lazyLoading == true) {\n // Do not create pagination with lazyloading activated\n } else if (obj.options.pagination) {\n updatePagination.call(obj);\n }\n\n // Merge cells\n if (obj.options.mergeCells) {\n const keys = Object.keys(obj.options.mergeCells);\n for (let i = 0; i < keys.length; i++) {\n const num = obj.options.mergeCells[keys[i]];\n setMerge.call(obj, keys[i], num[0], num[1], 1);\n }\n }\n\n // Updata table with custom configurations if applicable\n updateTable.call(obj);\n};\n\n/**\n * Get the value from a cell\n *\n * @param object cell\n * @return string value\n */\nexport const getValue = function (cell, processedValue) {\n const obj = this;\n\n let x;\n let y;\n\n if (typeof cell !== 'string') {\n return null;\n }\n\n cell = getIdFromColumnName(cell, true);\n x = cell[0];\n y = cell[1];\n\n let value = null;\n\n if (x != null && y != null) {\n if (obj.records[y] && obj.records[y][x] && processedValue) {\n value = obj.records[y][x].element.innerHTML;\n } else {\n if (obj.options.data[y] && obj.options.data[y][x] != 'undefined') {\n value = obj.options.data[y][x];\n }\n }\n }\n\n return value;\n};\n\n/**\n * Get the value from a coords\n *\n * @param int x\n * @param int y\n * @return string value\n */\nexport const getValueFromCoords = function (x, y, processedValue) {\n const obj = this;\n\n let value = null;\n\n if (x != null && y != null) {\n if (obj.records[y] && obj.records[y][x] && processedValue) {\n value = obj.records[y][x].element.innerHTML;\n } else {\n if (obj.options.data[y] && obj.options.data[y][x] != 'undefined') {\n value = obj.options.data[y][x];\n }\n }\n }\n\n return value;\n};\n\n/**\n * Set a cell value\n *\n * @param mixed cell destination cell\n * @param string value value\n * @return void\n */\nexport const setValue = function (cell, value, force) {\n const obj = this;\n\n const records = [];\n\n if (typeof cell == 'string') {\n const columnId = getIdFromColumnName(cell, true);\n const x = columnId[0];\n const y = columnId[1];\n\n // Update cell\n records.push(updateCell.call(obj, x, y, value, force));\n\n // Update all formulas in the chain\n updateFormulaChain.call(obj, x, y, records);\n } else {\n let x = null;\n let y = null;\n if (cell && cell.getAttribute) {\n x = cell.getAttribute('data-x');\n y = cell.getAttribute('data-y');\n }\n\n // Update cell\n if (x != null && y != null) {\n records.push(updateCell.call(obj, x, y, value, force));\n\n // Update all formulas in the chain\n updateFormulaChain.call(obj, x, y, records);\n } else {\n const keys = Object.keys(cell);\n if (keys.length > 0) {\n for (let i = 0; i < keys.length; i++) {\n let x, y;\n\n if (typeof cell[i] == 'string') {\n const columnId = getIdFromColumnName(cell[i], true);\n x = columnId[0];\n y = columnId[1];\n } else {\n if (cell[i].x != null && cell[i].y != null) {\n x = cell[i].x;\n y = cell[i].y;\n // Flexible setup\n if (cell[i].value != null) {\n value = cell[i].value;\n }\n } else {\n x = cell[i].getAttribute('data-x');\n y = cell[i].getAttribute('data-y');\n }\n }\n\n // Update cell\n if (x != null && y != null) {\n records.push(updateCell.call(obj, x, y, value, force));\n\n // Update all formulas in the chain\n updateFormulaChain.call(obj, x, y, records);\n }\n }\n }\n }\n }\n\n // Update history\n setHistory.call(obj, {\n action: 'setValue',\n records: records,\n selection: obj.selectedCell,\n });\n\n // Update table with custom configurations if applicable\n updateTable.call(obj);\n\n // On after changes\n const onafterchangesRecords = records.map(function (record) {\n return {\n x: record.x,\n y: record.y,\n value: record.value,\n oldValue: record.oldValue,\n };\n });\n\n dispatch.call(obj, 'onafterchanges', obj, onafterchangesRecords);\n};\n\n/**\n * Set a cell value based on coordinates\n *\n * @param int x destination cell\n * @param int y destination cell\n * @param string value\n * @return void\n */\nexport const setValueFromCoords = function (x, y, value, force) {\n const obj = this;\n\n const records = [];\n records.push(updateCell.call(obj, x, y, value, force));\n\n // Update all formulas in the chain\n updateFormulaChain.call(obj, x, y, records);\n\n // Update history\n setHistory.call(obj, {\n action: 'setValue',\n records: records,\n selection: obj.selectedCell,\n });\n\n // Update table with custom configurations if applicable\n updateTable.call(obj);\n\n // On after changes\n const onafterchangesRecords = records.map(function (record) {\n return {\n x: record.x,\n y: record.y,\n value: record.value,\n oldValue: record.oldValue,\n };\n });\n\n dispatch.call(obj, 'onafterchanges', obj, onafterchangesRecords);\n};\n\n/**\n * Get the whole table data\n *\n * @param bool get highlighted cells only\n * @return array data\n */\nexport const getData = function (highlighted, processed, delimiter, asJson) {\n const obj = this;\n\n // Control vars\n const dataset = [];\n let px = 0;\n let py = 0;\n\n // Column and row length\n const x = Math.max(\n ...obj.options.data.map(function (row) {\n return row.length;\n })\n );\n const y = obj.options.data.length;\n\n // Go through the columns to get the data\n for (let j = 0; j < y; j++) {\n px = 0;\n for (let i = 0; i < x; i++) {\n // Cell selected or fullset\n if (!highlighted || obj.records[j][i].element.classList.contains('highlight')) {\n // Get value\n if (!dataset[py]) {\n dataset[py] = [];\n }\n if (processed) {\n dataset[py][px] = obj.records[j][i].element.innerHTML;\n } else {\n dataset[py][px] = obj.options.data[j][i];\n }\n px++;\n }\n }\n if (px > 0) {\n py++;\n }\n }\n\n if (delimiter) {\n return (\n dataset\n .map(function (row) {\n return row.join(delimiter);\n })\n .join('\\r\\n') + '\\r\\n'\n );\n }\n\n if (asJson) {\n return dataset.map(function (row) {\n const resultRow = {};\n\n row.forEach(function (item, index) {\n resultRow[index] = item;\n });\n\n return resultRow;\n });\n }\n\n return dataset;\n};\n\nexport const getDataFromRange = function (range, processed) {\n const obj = this;\n\n const coords = getCoordsFromRange(range);\n\n const dataset = [];\n\n for (let y = coords[1]; y <= coords[3]; y++) {\n dataset.push([]);\n\n for (let x = coords[0]; x <= coords[2]; x++) {\n if (processed) {\n dataset[dataset.length - 1].push(obj.records[y][x].element.innerHTML);\n } else {\n dataset[dataset.length - 1].push(obj.options.data[y][x]);\n }\n }\n }\n\n return dataset;\n};\n","import { resetFilters } from './filter.js';\nimport { getIdFromColumnName } from './internalHelpers.js';\nimport { updateResult } from './internal.js';\nimport { isRowMerged } from './merges.js';\n\n/**\n * Search\n */\nexport const search = function (query) {\n const obj = this;\n\n // Reset any filter\n if (obj.options.filters) {\n resetFilters.call(obj);\n }\n\n // Reset selection\n obj.resetSelection();\n\n // Total of results\n obj.pageNumber = 0;\n obj.results = [];\n\n if (query) {\n if (obj.searchInput.value !== query) {\n obj.searchInput.value = query;\n }\n\n // Search filter\n const search = function (item, query, index) {\n for (let i = 0; i < item.length; i++) {\n if (('' + item[i]).toLowerCase().search(query) >= 0 || ('' + obj.records[index][i].element.innerHTML).toLowerCase().search(query) >= 0) {\n return true;\n }\n }\n return false;\n };\n\n // Result\n const addToResult = function (k) {\n if (obj.results.indexOf(k) == -1) {\n obj.results.push(k);\n }\n };\n\n let parsedQuery = query.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n parsedQuery = new RegExp(parsedQuery, 'i');\n\n // Filter\n obj.options.data.forEach(function (v, k) {\n if (search(v, parsedQuery, k)) {\n // Merged rows found\n const rows = isRowMerged.call(obj, k);\n if (rows.length) {\n for (let i = 0; i < rows.length; i++) {\n const row = getIdFromColumnName(rows[i], true);\n for (let j = 0; j < obj.options.mergeCells[rows[i]][1]; j++) {\n addToResult(row[1] + j);\n }\n }\n } else {\n // Normal row found\n addToResult(k);\n }\n }\n });\n } else {\n obj.results = null;\n }\n\n updateResult.call(obj);\n};\n\n/**\n * Reset search\n */\nexport const resetSearch = function () {\n const obj = this;\n\n obj.searchInput.value = '';\n obj.search('');\n obj.results = null;\n};\n","import { setHistory } from './history.js';\nimport dispatch from './dispatch.js';\nimport { getColumnName } from './helpers.js';\n\n/**\n * Get the column title\n *\n * @param column - column number (first column is: 0)\n * @param title - new column title\n */\nexport const getHeader = function (column) {\n const obj = this;\n\n return obj.headers[column].textContent;\n};\n\n/**\n * Get the headers\n *\n * @param asArray\n * @return mixed\n */\nexport const getHeaders = function (asArray) {\n const obj = this;\n\n const title = [];\n\n for (let i = 0; i < obj.headers.length; i++) {\n title.push(obj.getHeader(i));\n }\n\n return asArray ? title : title.join(obj.options.csvDelimiter);\n};\n\n/**\n * Set the column title\n *\n * @param column - column number (first column is: 0)\n * @param title - new column title\n */\nexport const setHeader = function (column, newValue) {\n const obj = this;\n\n if (obj.headers[column]) {\n const oldValue = obj.headers[column].textContent;\n const onchangeheaderOldValue = (obj.options.columns && obj.options.columns[column] && obj.options.columns[column].title) || '';\n\n if (!newValue) {\n newValue = getColumnName(column);\n }\n\n obj.headers[column].textContent = newValue;\n // Keep the title property\n obj.headers[column].setAttribute('title', newValue);\n // Update title\n if (!obj.options.columns) {\n obj.options.columns = [];\n }\n if (!obj.options.columns[column]) {\n obj.options.columns[column] = {};\n }\n obj.options.columns[column].title = newValue;\n\n setHistory.call(obj, {\n action: 'setHeader',\n column: column,\n oldValue: oldValue,\n newValue: newValue,\n });\n\n // On onchange header\n dispatch.call(obj, 'onchangeheader', obj, parseInt(column), newValue, onchangeheaderOldValue);\n }\n};\n","import dispatch from './dispatch.js';\nimport { getColumnNameFromId, getIdFromColumnName } from './internalHelpers.js';\nimport { setHistory } from './history.js';\n\n/**\n * Get style information from cell(s)\n *\n * @return integer\n */\nexport const getStyle = function (cell, key) {\n const obj = this;\n\n // Cell\n if (!cell) {\n // Control vars\n const data = {};\n\n // Column and row length\n const x = obj.options.data[0].length;\n const y = obj.options.data.length;\n\n // Go through the columns to get the data\n for (let j = 0; j < y; j++) {\n for (let i = 0; i < x; i++) {\n // Value\n const v = key ? obj.records[j][i].element.style[key] : obj.records[j][i].element.getAttribute('style');\n\n // Any meta data for this column?\n if (v) {\n // Column name\n const k = getColumnNameFromId([i, j]);\n // Value\n data[k] = v;\n }\n }\n }\n\n return data;\n } else {\n cell = getIdFromColumnName(cell, true);\n\n return key ? obj.records[cell[1]][cell[0]].element.style[key] : obj.records[cell[1]][cell[0]].element.getAttribute('style');\n }\n};\n\n/**\n * Set meta information to cell(s)\n *\n * @return integer\n */\nexport const setStyle = function (o, k, v, force, ignoreHistoryAndEvents) {\n const obj = this;\n\n const newValue = {};\n const oldValue = {};\n\n // Apply style\n const applyStyle = function (cellId, key, value) {\n // Position\n const cell = getIdFromColumnName(cellId, true);\n\n if (obj.records[cell[1]] && obj.records[cell[1]][cell[0]] && (obj.records[cell[1]][cell[0]].element.classList.contains('readonly') == false || force)) {\n // Current value\n const currentValue = obj.records[cell[1]][cell[0]].element.style[key];\n\n // Change layout\n if (currentValue == value && !force) {\n value = '';\n obj.records[cell[1]][cell[0]].element.style[key] = '';\n } else {\n obj.records[cell[1]][cell[0]].element.style[key] = value;\n }\n\n // History\n if (!oldValue[cellId]) {\n oldValue[cellId] = [];\n }\n if (!newValue[cellId]) {\n newValue[cellId] = [];\n }\n\n oldValue[cellId].push([key + ':' + currentValue]);\n newValue[cellId].push([key + ':' + value]);\n }\n };\n\n if (k && v) {\n // Get object from string\n if (typeof o == 'string') {\n applyStyle(o, k, v);\n }\n } else {\n const keys = Object.keys(o);\n for (let i = 0; i < keys.length; i++) {\n let style = o[keys[i]];\n if (typeof style !== 'string') {\n continue;\n }\n // 遍历样式表\n const styles = style.split(';');\n for (let j = 0; j < styles.length; j++) {\n if (typeof styles[j] !== 'string') {\n continue;\n }\n const [k, v] = styles[j].split(':');\n // Apply value\n if (style[j][0].trim()) {\n applyStyle(keys[i], k.trim(), v);\n }\n }\n }\n }\n\n let keys = Object.keys(oldValue);\n for (let i = 0; i < keys.length; i++) {\n oldValue[keys[i]] = oldValue[keys[i]].join(';');\n }\n keys = Object.keys(newValue);\n for (let i = 0; i < keys.length; i++) {\n newValue[keys[i]] = newValue[keys[i]].join(';');\n }\n\n if (!ignoreHistoryAndEvents) {\n // Keeping history of changes\n setHistory.call(obj, {\n action: 'setStyle',\n oldValue: oldValue,\n newValue: newValue,\n });\n }\n\n dispatch.call(obj, 'onchangestyle', obj, newValue);\n};\n\nexport const resetStyle = function (o, ignoreHistoryAndEvents) {\n const obj = this;\n\n const keys = Object.keys(o);\n for (let i = 0; i < keys.length; i++) {\n // Position\n const cell = getIdFromColumnName(keys[i], true);\n if (obj.records[cell[1]] && obj.records[cell[1]][cell[0]]) {\n obj.records[cell[1]][cell[0]].element.setAttribute('style', '');\n }\n }\n obj.setStyle(o, null, null, null, ignoreHistoryAndEvents);\n};\n","import { copy } from './copyPaste.js';\n\n/**\n * Download CSV table\n *\n * @return null\n */\nexport const download = function (includeHeaders, processed) {\n const obj = this;\n\n if (obj.parent.config.allowExport == false) {\n console.error('Export not allowed');\n } else {\n // Data\n let data = '';\n\n // Get data\n data += copy.call(obj, false, obj.options.csvDelimiter, true, includeHeaders, true, undefined, processed);\n\n // Download element\n const blob = new Blob(['\\uFEFF' + data], { type: 'text/csv;charset=utf-8;' });\n\n // IE Compatibility\n if (window.navigator && window.navigator.msSaveOrOpenBlob) {\n window.navigator.msSaveOrOpenBlob(blob, (obj.options.csvFileName || obj.options.worksheetName) + '.csv');\n } else {\n // Download element\n const pom = document.createElement('a');\n pom.setAttribute('target', '_top');\n const url = URL.createObjectURL(blob);\n pom.href = url;\n pom.setAttribute('download', (obj.options.csvFileName || obj.options.worksheetName) + '.csv');\n document.body.appendChild(pom);\n pom.click();\n pom.parentNode.removeChild(pom);\n }\n }\n};\n","import dispatch from './dispatch.js';\nimport { getCoordsFromCellName } from './helpers.js';\nimport { setHistory } from './history.js';\nimport { getColumnNameFromId, getIdFromColumnName } from './internalHelpers.js';\n\n/**\n * Get cell comments, null cell for all\n */\nexport const getComments = function (cell) {\n const obj = this;\n\n if (cell) {\n if (typeof cell !== 'string') {\n return getComments.call(obj);\n }\n\n cell = getIdFromColumnName(cell, true);\n\n return obj.records[cell[1]][cell[0]].element.getAttribute('title') || '';\n } else {\n const data = {};\n for (let j = 0; j < obj.options.data.length; j++) {\n for (let i = 0; i < obj.options.columns.length; i++) {\n const comments = obj.records[j][i].element.getAttribute('title');\n if (comments) {\n const cell = getColumnNameFromId([i, j]);\n data[cell] = comments;\n }\n }\n }\n return data;\n }\n};\n\n/**\n * Set cell comments\n */\nexport const setComments = function (cellId, comments) {\n const obj = this;\n\n let commentsObj;\n\n if (typeof cellId == 'string') {\n commentsObj = { [cellId]: comments };\n } else {\n commentsObj = cellId;\n }\n\n const oldValue = {};\n\n Object.entries(commentsObj).forEach(function ([cellName, comment]) {\n const cellCoords = getCoordsFromCellName(cellName);\n\n // Keep old value\n oldValue[cellName] = obj.records[cellCoords[1]][cellCoords[0]].element.getAttribute('title');\n\n // Set new values\n obj.records[cellCoords[1]][cellCoords[0]].element.setAttribute('title', comment ? comment : '');\n\n // Remove class if there is no comment\n if (comment) {\n obj.records[cellCoords[1]][cellCoords[0]].element.classList.add('jss_comments');\n\n if (!obj.options.comments) {\n obj.options.comments = {};\n }\n\n obj.options.comments[cellName] = comment;\n } else {\n obj.records[cellCoords[1]][cellCoords[0]].element.classList.remove('jss_comments');\n\n if (obj.options.comments && obj.options.comments[cellName]) {\n delete obj.options.comments[cellName];\n }\n }\n });\n\n // Save history\n setHistory.call(obj, {\n action: 'setComments',\n newValue: commentsObj,\n oldValue: oldValue,\n });\n\n // Set comments\n dispatch.call(obj, 'oncomments', obj, commentsObj, oldValue);\n};\n","/**\n * Get table config information\n */\nexport const getWorksheetConfig = function () {\n const obj = this;\n\n return obj.options;\n};\n\nexport const getSpreadsheetConfig = function () {\n const spreadsheet = this;\n\n return spreadsheet.config;\n};\n\nexport const setConfig = function (config, spreadsheetLevel) {\n const obj = this;\n\n const keys = Object.keys(config);\n\n let spreadsheet;\n\n if (!obj.parent) {\n spreadsheetLevel = true;\n\n spreadsheet = obj;\n } else {\n spreadsheet = obj.parent;\n }\n\n keys.forEach(function (key) {\n if (spreadsheetLevel) {\n spreadsheet.config[key] = config[key];\n\n if (key === 'toolbar') {\n if (config[key] === true) {\n spreadsheet.showToolbar();\n } else if (config[key] === false) {\n spreadsheet.hideToolbar();\n }\n }\n } else {\n obj.options[key] = config[key];\n }\n });\n};\n","import { getCoordsFromCellName } from './helpers.js';\n\nexport const setReadOnly = function (cell, state) {\n const obj = this;\n\n let record;\n\n if (typeof cell === 'string') {\n const coords = getCoordsFromCellName(cell);\n\n record = obj.records[coords[1]][coords[0]];\n } else {\n const x = parseInt(cell.getAttribute('data-x'));\n const y = parseInt(cell.getAttribute('data-y'));\n\n record = obj.records[y][x];\n }\n\n if (state) {\n record.element.classList.add('readonly');\n } else {\n record.element.classList.remove('readonly');\n }\n};\n\nexport const isReadOnly = function (x, y) {\n const obj = this;\n\n if (typeof x === 'string' && typeof y === 'undefined') {\n const coords = getCoordsFromCellName(x);\n\n [x, y] = coords;\n }\n\n return obj.records[y][x].element.classList.contains('readonly');\n};\n","\n\nimport libraryBase from './libraryBase.js';\n\nimport { parseCSV } from './helpers.js';\nimport {\n createCellHeader,\n deleteColumn,\n getColumnData,\n getNumberOfColumns,\n getWidth,\n hideColumn,\n insertColumn,\n moveColumn,\n setColumnData,\n setWidth,\n showColumn,\n} from './columns.js';\nimport { getData, getDataFromRange, getValue, getValueFromCoords, setData, setValue, setValueFromCoords } from './data.js';\nimport { cutControls, scrollControls, wheelControls } from './events.js';\nimport {\n getHighlighted,\n getRange,\n getSelected,\n getSelectedColumns,\n getSelectedRows,\n getSelection,\n isSelected,\n resetSelection,\n selectAll,\n updateSelectionFromCoords,\n} from './selection.js';\nimport { deleteRow, getHeight, getRowData, hideRow, insertRow, moveRow, setHeight, setRowData, showRow } from './rows.js';\nimport { destroyMerge, getMerge, removeMerge, setMerge } from './merges.js';\nimport { resetSearch, search } from './search.js';\nimport { getHeader, getHeaders, setHeader } from './headers.js';\nimport { getStyle, resetStyle, setStyle } from './style.js';\nimport { page, quantiyOfPages, whichPage } from './pagination.js';\nimport { download } from './download.js';\nimport { down, first, last, left, right, up } from './keys.js';\nimport { createNestedHeader, executeFormula, getCell, getCellFromCoords, getLabel, getWorksheetActive, hideIndex, showIndex } from './internal.js';\nimport { getComments, setComments } from './comments.js';\nimport { orderBy } from './orderBy.js';\nimport { getWorksheetConfig, setConfig } from './config.js';\nimport { getMeta, setMeta } from './meta.js';\nimport { closeEditor, openEditor } from './editor.js';\nimport dispatch from './dispatch.js';\nimport { getIdFromColumnName } from './internalHelpers.js';\nimport { copy, paste } from './copyPaste.js';\nimport { isReadOnly, setReadOnly } from './cells.js';\nimport { openFilter, resetFilters } from './filter.js';\nimport { redo, undo } from './history.js';\n\nconst setWorksheetFunctions = function (worksheet) {\n for (let i = 0; i < worksheetPublicMethodsLength; i++) {\n const [methodName, method] = worksheetPublicMethods[i];\n\n worksheet[methodName] = method.bind(worksheet);\n }\n};\n\nconst createTable = function () {\n let obj = this;\n\n setWorksheetFunctions(obj);\n\n // Elements\n obj.table = document.createElement('table');\n obj.thead = document.createElement('thead');\n obj.tbody = document.createElement('tbody');\n\n // Create headers controllers\n obj.headers = [];\n obj.cols = [];\n\n // Create table container\n obj.content = document.createElement('div');\n obj.content.classList.add('jss_content');\n\n // 监听滚动\n obj.content.onscroll = function (e) {\n // scrollControls.call(obj, e);\n };\n obj.content.onwheel = function (e) {\n wheelControls.call(obj, e);\n };\n\n // Search\n const searchContainer = document.createElement('div');\n\n const searchLabel = document.createElement('label');\n searchLabel.innerHTML = jSuites.translate('Search') + ': ';\n searchContainer.appendChild(searchLabel);\n\n obj.searchInput = document.createElement('input');\n obj.searchInput.classList.add('jss_search');\n searchLabel.appendChild(obj.searchInput);\n obj.searchInput.onfocus = function () {\n obj.resetSelection();\n };\n\n // Pagination select option\n const paginationUpdateContainer = document.createElement('div');\n\n if (obj.options.pagination > 0 && obj.options.paginationOptions && obj.options.paginationOptions.length > 0) {\n obj.paginationDropdown = document.createElement('select');\n obj.paginationDropdown.classList.add('jss_pagination_dropdown');\n obj.paginationDropdown.onchange = function () {\n obj.options.pagination = parseInt(this.value);\n obj.page(0);\n };\n\n for (let i = 0; i < obj.options.paginationOptions.length; i++) {\n const temp = document.createElement('option');\n temp.value = obj.options.paginationOptions[i];\n temp.innerHTML = obj.options.paginationOptions[i];\n obj.paginationDropdown.appendChild(temp);\n }\n\n // Set initial pagination value\n obj.paginationDropdown.value = obj.options.pagination;\n\n paginationUpdateContainer.appendChild(document.createTextNode(jSuites.translate('Show ')));\n paginationUpdateContainer.appendChild(obj.paginationDropdown);\n paginationUpdateContainer.appendChild(document.createTextNode(jSuites.translate('entries')));\n }\n\n // Filter and pagination container\n const filter = document.createElement('div');\n filter.classList.add('jss_filter');\n filter.appendChild(paginationUpdateContainer);\n filter.appendChild(searchContainer);\n\n // Colsgroup\n obj.colgroupContainer = document.createElement('colgroup');\n let tempCol = document.createElement('col');\n tempCol.setAttribute('width', '50');\n obj.colgroupContainer.appendChild(tempCol);\n\n // Nested\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0 && obj.options.nestedHeaders[0] && obj.options.nestedHeaders[0][0]) {\n for (let j = 0; j < obj.options.nestedHeaders.length; j++) {\n obj.thead.appendChild(createNestedHeader.call(obj, obj.options.nestedHeaders[j]));\n }\n }\n\n // Row\n obj.headerContainer = document.createElement('tr');\n tempCol = document.createElement('td');\n tempCol.classList.add('jss_selectall');\n obj.headerContainer.appendChild(tempCol);\n\n const numberOfColumns = getNumberOfColumns.call(obj);\n\n for (let i = 0; i < numberOfColumns; i++) {\n // Create header\n createCellHeader.call(obj, i);\n // Append cell to the container\n obj.headerContainer.appendChild(obj.headers[i]);\n obj.colgroupContainer.appendChild(obj.cols[i].colElement);\n }\n\n obj.thead.appendChild(obj.headerContainer);\n\n // Filters\n if (obj.options.filters == true) {\n obj.filter = document.createElement('tr');\n const td = document.createElement('td');\n obj.filter.appendChild(td);\n\n for (let i = 0; i < obj.options.columns.length; i++) {\n const td = document.createElement('td');\n td.innerHTML = ' ';\n td.setAttribute('data-x', i);\n td.className = 'jss_column_filter';\n if (obj.options.columns[i].type == 'hidden') {\n td.style.display = 'none';\n }\n obj.filter.appendChild(td);\n }\n\n obj.thead.appendChild(obj.filter);\n }\n\n // Content table\n obj.table = document.createElement('table');\n obj.table.classList.add('jss_worksheet');\n obj.table.setAttribute('cellpadding', '0');\n obj.table.setAttribute('cellspacing', '0');\n obj.table.setAttribute('unselectable', 'yes');\n //obj.table.setAttribute('onselectstart', 'return false');\n obj.table.appendChild(obj.colgroupContainer);\n obj.table.appendChild(obj.thead);\n obj.table.appendChild(obj.tbody);\n\n if (!obj.options.textOverflow) {\n obj.table.classList.add('jss_overflow');\n }\n\n // Spreadsheet corner\n obj.corner = document.createElement('div');\n obj.corner.className = 'jss_corner';\n obj.corner.setAttribute('unselectable', 'on');\n obj.corner.setAttribute('onselectstart', 'return false');\n\n if (obj.options.selectionCopy == false) {\n obj.corner.style.display = 'none';\n }\n\n // Textarea helper\n obj.textarea = document.createElement('textarea');\n obj.textarea.className = 'jss_textarea';\n obj.textarea.id = 'jss_textarea';\n obj.textarea.tabIndex = '-1';\n obj.textarea.ariaHidden = 'true';\n\n // Powered by Jspreadsheet\n const ads = document.createElement('a');\n ads.setAttribute('href', 'https://bossanova.uk/jspreadsheet/');\n obj.ads = document.createElement('div');\n obj.ads.className = 'jss_about';\n\n const span = document.createElement('span');\n span.innerHTML = 'Jspreadsheet CE';\n ads.appendChild(span);\n obj.ads.appendChild(ads);\n\n // Create table container TODO: frozen columns\n const container = document.createElement('div');\n container.classList.add('jss_table');\n\n // Pagination\n obj.pagination = document.createElement('div');\n obj.pagination.classList.add('jss_pagination');\n const paginationInfo = document.createElement('div');\n const paginationPages = document.createElement('div');\n obj.pagination.appendChild(paginationInfo);\n obj.pagination.appendChild(paginationPages);\n\n // Hide pagination if not in use\n if (!obj.options.pagination) {\n obj.pagination.style.display = 'none';\n }\n\n // Append containers to the table\n if (obj.options.search == true) {\n obj.element.appendChild(filter);\n }\n\n // Elements\n obj.content.appendChild(obj.table);\n obj.content.appendChild(obj.corner);\n obj.content.appendChild(obj.textarea);\n\n obj.element.appendChild(obj.content);\n obj.element.appendChild(obj.pagination);\n obj.element.appendChild(obj.ads);\n obj.element.classList.add('jss_container');\n\n obj.element.jssWorksheet = obj;\n obj.element.jspreadsheet = obj;\n\n // Overflow\n if (obj.options.tableOverflow == true) {\n if (obj.options.tableHeight) {\n obj.content.style['overflow-y'] = 'auto';\n obj.content.style['box-shadow'] = 'rgb(221 221 221) 2px 2px 5px 0.1px';\n obj.content.style.maxHeight = typeof obj.options.tableHeight === 'string' ? obj.options.tableHeight : obj.options.tableHeight + 'px';\n }\n if (obj.options.tableWidth) {\n obj.content.style['overflow-x'] = 'auto';\n obj.content.style.width = typeof obj.options.tableWidth === 'string' ? obj.options.tableWidth : obj.options.tableWidth + 'px';\n }\n }\n\n // With toolbars\n if (obj.options.tableOverflow != true && obj.parent.config.toolbar) {\n obj.element.classList.add('with-toolbar');\n }\n\n // Actions\n if (obj.options.columnDrag != false) {\n obj.thead.classList.add('draggable');\n }\n if (obj.options.columnResize != false) {\n obj.thead.classList.add('resizable');\n }\n if (obj.options.rowDrag != false) {\n obj.tbody.classList.add('draggable');\n }\n if (obj.options.rowResize != false) {\n obj.tbody.classList.add('resizable');\n }\n\n // Load data\n obj.setData.call(obj);\n\n // Style\n if (obj.options.style) {\n obj.setStyle(obj.options.style, null, null, 1, 1);\n\n delete obj.options.style;\n }\n\n Object.defineProperty(obj.options, 'style', {\n enumerable: true,\n configurable: true,\n get() {\n return obj.getStyle();\n },\n });\n\n if (obj.options.comments) {\n obj.setComments(obj.options.comments);\n }\n\n // Classes\n if (obj.options.classes) {\n const k = Object.keys(obj.options.classes);\n for (let i = 0; i < k.length; i++) {\n const cell = getIdFromColumnName(k[i], true);\n obj.records[cell[1]][cell[0]].element.classList.add(obj.options.classes[k[i]]);\n }\n }\n};\n\n/**\n * Prepare the jspreadsheet table\n *\n * @Param config\n */\nconst prepareTable = function () {\n const obj = this;\n\n // Lazy loading\n if (obj.options.lazyLoading == true && obj.options.tableOverflow != true && obj.parent.config.fullscreen != true) {\n console.error('Jspreadsheet: The lazyloading only works when tableOverflow = yes or fullscreen = yes');\n obj.options.lazyLoading = false;\n }\n\n if (!obj.options.columns) {\n obj.options.columns = [];\n }\n\n // Number of columns\n let size = obj.options.columns.length;\n let keys;\n\n if (obj.options.data && typeof obj.options.data[0] !== 'undefined') {\n if (!Array.isArray(obj.options.data[0])) {\n // Data keys\n keys = Object.keys(obj.options.data[0]);\n\n if (keys.length > size) {\n size = keys.length;\n }\n } else {\n const numOfColumns = obj.options.data[0].length;\n\n if (numOfColumns > size) {\n size = numOfColumns;\n }\n }\n }\n\n // Minimal dimensions\n if (!obj.options.minDimensions) {\n obj.options.minDimensions = [0, 0];\n }\n\n if (obj.options.minDimensions[0] > size) {\n size = obj.options.minDimensions[0];\n }\n\n // Requests\n const multiple = [];\n\n // Preparations\n for (let i = 0; i < size; i++) {\n // Default column description\n if (!obj.options.columns[i]) {\n obj.options.columns[i] = {};\n }\n if (!obj.options.columns[i].name && keys && keys[i]) {\n obj.options.columns[i].name = keys[i];\n }\n\n // Pre-load initial source for json dropdown\n if (obj.options.columns[i].type == 'dropdown') {\n // if remote content\n if (obj.options.columns[i].url) {\n multiple.push({\n url: obj.options.columns[i].url,\n index: i,\n method: 'GET',\n dataType: 'json',\n success: function (data) {\n if (!obj.options.columns[this.index].source) {\n obj.options.columns[this.index].source = [];\n }\n\n for (let i = 0; i < data.length; i++) {\n obj.options.columns[this.index].source.push(data[i]);\n }\n },\n });\n }\n }\n }\n\n // Create the table when is ready\n if (!multiple.length) {\n createTable.call(obj);\n } else {\n jSuites.ajax(multiple, function () {\n createTable.call(obj);\n });\n }\n};\n\nexport const getNextDefaultWorksheetName = function (spreadsheet) {\n const defaultWorksheetNameRegex = /^Sheet(\\d+)$/;\n\n let largestWorksheetNumber = 0;\n\n spreadsheet.worksheets.forEach(function (worksheet) {\n const regexResult = defaultWorksheetNameRegex.exec(worksheet.options.worksheetName);\n if (regexResult) {\n largestWorksheetNumber = Math.max(largestWorksheetNumber, parseInt(regexResult[1]));\n }\n });\n\n return 'Sheet' + (largestWorksheetNumber + 1);\n};\n\nexport const buildWorksheet = async function () {\n const obj = this;\n const el = obj.element;\n\n const spreadsheet = obj.parent;\n\n if (typeof spreadsheet.plugins === 'object') {\n Object.entries(spreadsheet.plugins).forEach(function ([, plugin]) {\n if (typeof plugin.beforeinit === 'function') {\n plugin.beforeinit(obj);\n }\n });\n }\n\n libraryBase.jspreadsheet.current = obj;\n\n const promises = [];\n\n // Load the table data based on an CSV file\n if (obj.options.csv) {\n const promise = new Promise((resolve) => {\n // Load CSV file\n jSuites.ajax({\n url: obj.options.csv,\n method: 'GET',\n dataType: 'text',\n success: function (result) {\n // Convert data\n const newData = parseCSV(result, obj.options.csvDelimiter);\n\n // Headers\n if (obj.options.csvHeaders == true && newData.length > 0) {\n const headers = newData.shift();\n\n if (headers.length > 0) {\n if (!obj.options.columns) {\n obj.options.columns = [];\n }\n\n for (let i = 0; i < headers.length; i++) {\n if (!obj.options.columns[i]) {\n obj.options.columns[i] = {};\n }\n // Precedence over pre-configurated titles\n if (typeof obj.options.columns[i].title === 'undefined') {\n obj.options.columns[i].title = headers[i];\n }\n }\n }\n }\n // Data\n obj.options.data = newData;\n // Prepare table\n prepareTable.call(obj);\n\n resolve();\n },\n });\n });\n\n promises.push(promise);\n } else if (obj.options.url) {\n const promise = new Promise((resolve) => {\n jSuites.ajax({\n url: obj.options.url,\n method: 'GET',\n dataType: 'json',\n success: function (result) {\n // Data\n obj.options.data = result.data ? result.data : result;\n // Prepare table\n prepareTable.call(obj);\n\n resolve();\n },\n });\n });\n\n promises.push(promise);\n } else {\n // Prepare table\n prepareTable.call(obj);\n }\n\n await Promise.all(promises);\n\n if (typeof spreadsheet.plugins === 'object') {\n Object.entries(spreadsheet.plugins).forEach(function ([, plugin]) {\n if (typeof plugin.init === 'function') {\n plugin.init(obj);\n }\n });\n }\n};\n\nexport const createWorksheetObj = function (options) {\n const obj = this;\n\n const spreadsheet = obj.parent;\n\n if (!options.worksheetName) {\n options.worksheetName = getNextDefaultWorksheetName(obj.parent);\n }\n\n const newWorksheet = {\n parent: spreadsheet,\n options: options,\n filters: [],\n formula: [],\n history: [],\n selection: [],\n historyIndex: -1,\n };\n\n spreadsheet.config.worksheets.push(newWorksheet.options);\n spreadsheet.worksheets.push(newWorksheet);\n\n return newWorksheet;\n};\n\nexport const createWorksheet = function (options) {\n const obj = this;\n const spreadsheet = obj.parent;\n\n spreadsheet.creationThroughJss = true;\n\n createWorksheetObj.call(obj, options);\n\n spreadsheet.element.tabs.create(options.worksheetName);\n};\n\nexport const openWorksheet = function (position) {\n const obj = this;\n const spreadsheet = obj.parent;\n\n spreadsheet.element.tabs.open(position);\n};\n\nexport const deleteWorksheet = function (position) {\n const obj = this;\n\n obj.parent.element.tabs.remove(position);\n\n const removedWorksheet = obj.parent.worksheets.splice(position, 1)[0];\n\n dispatch.call(obj.parent, 'ondeleteworksheet', removedWorksheet, position);\n};\n\nconst worksheetPublicMethods = [\n ['selectAll', selectAll],\n [\n 'updateSelectionFromCoords',\n function (x1, y1, x2, y2) {\n return updateSelectionFromCoords.call(this, x1, y1, x2, y2);\n },\n ],\n [\n 'resetSelection',\n function () {\n return resetSelection.call(this);\n },\n ],\n ['getSelection', getSelection],\n ['getSelected', getSelected],\n ['getSelectedColumns', getSelectedColumns],\n ['getSelectedRows', getSelectedRows],\n ['getData', getData],\n ['setData', setData],\n ['getValue', getValue],\n ['getValueFromCoords', getValueFromCoords],\n ['setValue', setValue],\n ['setValueFromCoords', setValueFromCoords],\n ['getWidth', getWidth],\n [\n 'setWidth',\n function (column, width) {\n return setWidth.call(this, column, width);\n },\n ],\n ['insertRow', insertRow],\n [\n 'moveRow',\n function (rowNumber, newPositionNumber) {\n return moveRow.call(this, rowNumber, newPositionNumber);\n },\n ],\n ['deleteRow', deleteRow],\n ['hideRow', hideRow],\n ['showRow', showRow],\n ['getRowData', getRowData],\n ['setRowData', setRowData],\n ['getHeight', getHeight],\n [\n 'setHeight',\n function (row, height) {\n return setHeight.call(this, row, height);\n },\n ],\n ['getMerge', getMerge],\n [\n 'setMerge',\n function (cellName, colspan, rowspan) {\n return setMerge.call(this, cellName, colspan, rowspan);\n },\n ],\n [\n 'destroyMerge',\n function () {\n return destroyMerge.call(this);\n },\n ],\n [\n 'removeMerge',\n function (cellName, data) {\n return removeMerge.call(this, cellName, data);\n },\n ],\n ['search', search],\n ['resetSearch', resetSearch],\n ['getHeader', getHeader],\n ['getHeaders', getHeaders],\n ['setHeader', setHeader],\n ['getStyle', getStyle],\n [\n 'setStyle',\n function (cell, property, value, forceOverwrite) {\n return setStyle.call(this, cell, property, value, forceOverwrite);\n },\n ],\n ['resetStyle', resetStyle],\n ['insertColumn', insertColumn],\n ['moveColumn', moveColumn],\n ['deleteColumn', deleteColumn],\n ['getColumnData', getColumnData],\n ['setColumnData', setColumnData],\n ['whichPage', whichPage],\n ['page', page],\n ['download', download],\n ['getComments', getComments],\n ['setComments', setComments],\n ['orderBy', orderBy],\n ['undo', undo],\n ['redo', redo],\n ['getCell', getCell],\n ['getCellFromCoords', getCellFromCoords],\n ['getLabel', getLabel],\n ['getConfig', getWorksheetConfig],\n ['setConfig', setConfig],\n [\n 'getMeta',\n function (cell) {\n return getMeta.call(this, cell);\n },\n ],\n ['setMeta', setMeta],\n ['showColumn', showColumn],\n ['hideColumn', hideColumn],\n ['showIndex', showIndex],\n ['hideIndex', hideIndex],\n ['getWorksheetActive', getWorksheetActive],\n ['openEditor', openEditor],\n ['closeEditor', closeEditor],\n ['createWorksheet', createWorksheet],\n ['openWorksheet', openWorksheet],\n ['deleteWorksheet', deleteWorksheet],\n [\n 'copy',\n function (cut) {\n if (cut) {\n cutControls();\n } else {\n copy.call(this, true);\n }\n },\n ],\n ['paste', paste],\n ['executeFormula', executeFormula],\n ['getDataFromRange', getDataFromRange],\n ['quantiyOfPages', quantiyOfPages],\n ['getRange', getRange],\n ['isSelected', isSelected],\n ['setReadOnly', setReadOnly],\n ['isReadOnly', isReadOnly],\n ['getHighlighted', getHighlighted],\n ['dispatch', dispatch],\n ['down', down],\n ['first', first],\n ['last', last],\n ['left', left],\n ['right', right],\n ['up', up],\n ['openFilter', openFilter],\n ['resetFilters', resetFilters],\n];\n\nconst worksheetPublicMethodsLength = worksheetPublicMethods.length;\n","\n\nimport libraryBase from './libraryBase.js';\nimport { setEvents } from './events.js';\nimport { fullscreen, getWorksheetActive } from './internal.js';\nimport { hideToolbar, showToolbar, updateToolbar } from './toolbar.js';\nimport { buildWorksheet, createWorksheetObj, getNextDefaultWorksheetName } from './worksheets.js';\nimport dispatch from './dispatch.js';\nimport { createFromTable } from './helpers.js';\nimport { getSpreadsheetConfig, setConfig } from './config.js';\n\nconst factory = function () {};\n\nconst createWorksheets = async function (spreadsheet, options, el) {\n // Create worksheets\n let o = options.worksheets;\n if (o) {\n let tabsOptions = {\n animation: true,\n onbeforecreate: function (element, title) {\n if (title) {\n return title;\n } else {\n return getNextDefaultWorksheetName(spreadsheet);\n }\n },\n oncreate: function (element, newTabContent) {\n if (!spreadsheet.creationThroughJss) {\n const worksheetName = element.tabs.headers.children[element.tabs.headers.children.length - 2].innerHTML;\n\n createWorksheetObj.call(spreadsheet.worksheets[0], {\n minDimensions: [10, 15],\n worksheetName: worksheetName,\n });\n } else {\n spreadsheet.creationThroughJss = false;\n }\n\n const newWorksheet = spreadsheet.worksheets[spreadsheet.worksheets.length - 1];\n\n newWorksheet.element = newTabContent;\n\n buildWorksheet.call(newWorksheet).then(function () {\n updateToolbar(newWorksheet);\n\n dispatch.call(newWorksheet, 'oncreateworksheet', newWorksheet, options, spreadsheet.worksheets.length - 1);\n });\n },\n onchange: function (element, instance, tabIndex) {\n if (spreadsheet.worksheets.length != 0 && spreadsheet.worksheets[tabIndex]) {\n updateToolbar(spreadsheet.worksheets[tabIndex]);\n }\n },\n };\n\n if (options.tabs == true) {\n tabsOptions.allowCreate = true;\n } else {\n tabsOptions.hideHeaders = true;\n }\n\n tabsOptions.data = [];\n\n let sheetNumber = 1;\n\n for (let i = 0; i < o.length; i++) {\n if (!o[i].worksheetName) {\n o[i].worksheetName = 'Sheet' + sheetNumber++;\n }\n\n tabsOptions.data.push({\n title: o[i].worksheetName,\n content: '',\n });\n }\n\n el.classList.add('jss_spreadsheet');\n el.tabIndex = 0;\n\n const tabs = jSuites.tabs(el, tabsOptions);\n\n const spreadsheetStyles = options.style;\n delete options.style;\n\n for (let i = 0; i < o.length; i++) {\n if (o[i].style) {\n Object.entries(o[i].style).forEach(function ([cellName, value]) {\n if (typeof value === 'number') {\n o[i].style[cellName] = spreadsheetStyles[value];\n }\n });\n }\n\n spreadsheet.worksheets.push({\n parent: spreadsheet,\n element: tabs.content.children[i],\n options: o[i],\n filters: [],\n formula: [],\n history: [],\n selection: [],\n historyIndex: -1,\n });\n\n await buildWorksheet.call(spreadsheet.worksheets[i]);\n }\n } else {\n throw new Error('JSS: worksheets are not defined');\n }\n};\n\nfactory.spreadsheet = async function (el, options, worksheets) {\n if (el.tagName == 'TABLE') {\n if (!options) {\n options = {};\n }\n\n if (!options.worksheets) {\n options.worksheets = [];\n }\n\n const tableOptions = createFromTable(el, options.worksheets[0]);\n\n options.worksheets[0] = tableOptions;\n\n const div = document.createElement('div');\n el.parentNode.insertBefore(div, el);\n el.remove();\n el = div;\n }\n\n let spreadsheet = {\n worksheets: worksheets,\n config: options,\n element: el,\n el,\n };\n\n // Contextmenu container\n spreadsheet.contextMenu = document.createElement('div');\n spreadsheet.contextMenu.className = 'jss_contextmenu';\n\n spreadsheet.getWorksheetActive = getWorksheetActive.bind(spreadsheet);\n spreadsheet.fullscreen = fullscreen.bind(spreadsheet);\n spreadsheet.showToolbar = showToolbar.bind(spreadsheet);\n spreadsheet.hideToolbar = hideToolbar.bind(spreadsheet);\n spreadsheet.getConfig = getSpreadsheetConfig.bind(spreadsheet);\n spreadsheet.setConfig = setConfig.bind(spreadsheet);\n\n spreadsheet.setPlugins = function (newPlugins) {\n if (!spreadsheet.plugins) {\n spreadsheet.plugins = {};\n }\n\n if (typeof newPlugins == 'object') {\n Object.entries(newPlugins).forEach(function ([pluginName, plugin]) {\n spreadsheet.plugins[pluginName] = plugin.call(libraryBase.jspreadsheet, spreadsheet, {}, spreadsheet.config);\n });\n }\n };\n\n spreadsheet.setPlugins(options.plugins);\n\n // Create as worksheets\n await createWorksheets(spreadsheet, options, el);\n\n spreadsheet.element.appendChild(spreadsheet.contextMenu);\n\n // Create element\n jSuites.contextmenu(spreadsheet.contextMenu, {\n onclick: function () {\n spreadsheet.contextMenu.contextmenu.close(false);\n },\n });\n\n // Fullscreen\n if (spreadsheet.config.fullscreen == true) {\n spreadsheet.element.classList.add('fullscreen');\n }\n\n showToolbar.call(spreadsheet);\n\n // Build handlers\n if (options.root) {\n setEvents(options.root);\n } else {\n setEvents(document);\n }\n\n el.spreadsheet = spreadsheet;\n\n return spreadsheet;\n};\n\nfactory.worksheet = function (spreadsheet, options, position) {\n // Worksheet object\n let w = {\n // Parent of a worksheet is always the spreadsheet\n parent: spreadsheet,\n // Options for this worksheet\n options: {},\n };\n\n // Create the worksheets object\n if (typeof position === 'undefined') {\n spreadsheet.worksheets.push(w);\n } else {\n spreadsheet.worksheets.splice(position, 0, w);\n }\n // Keep configuration used\n Object.assign(w.options, options);\n\n return w;\n};\n\nexport default factory;\n","\n// import './jspreadsheet.css';\n\nimport libraryBase from './utils/libraryBase.js';\n\nimport Factory from './utils/factory.js';\nimport { destroyEvents } from './utils/events.js';\n\nimport * as helpers from './utils/helpers.js';\nimport dispatch from './utils/dispatch.js';\nimport version from './utils/version.js';\n\nlibraryBase.jspreadsheet = function (el, options) {\n try {\n let worksheets = [];\n\n // Create spreadsheet\n Factory.spreadsheet(el, options, worksheets).then((spreadsheet) => {\n libraryBase.jspreadsheet.spreadsheet.push(spreadsheet);\n\n // Global onload event\n dispatch.call(spreadsheet, 'onload', spreadsheet);\n });\n\n return worksheets;\n } catch (e) {\n console.error(e);\n }\n};\n\nlibraryBase.jspreadsheet.getWorksheetInstanceByName = function (worksheetName, namespace) {\n const targetSpreadsheet = libraryBase.jspreadsheet.spreadsheet.find((spreadsheet) => {\n return spreadsheet.config.namespace === namespace;\n });\n\n if (targetSpreadsheet) {\n return {};\n }\n\n if (typeof worksheetName === 'undefined' || worksheetName === null) {\n const namespaceEntries = targetSpreadsheet.worksheets.map((worksheet) => {\n return [worksheet.options.worksheetName, worksheet];\n });\n\n return Object.fromEntries(namespaceEntries);\n }\n\n return targetSpreadsheet.worksheets.find((worksheet) => {\n return worksheet.options.worksheetName === worksheetName;\n });\n};\n\n// Define dictionary\nlibraryBase.jspreadsheet.setDictionary = function (o) {\n jSuites.setDictionary(o);\n};\n\nlibraryBase.jspreadsheet.destroy = function (element, destroyEventHandlers) {\n if (element.spreadsheet) {\n const spreadsheetIndex = libraryBase.jspreadsheet.spreadsheet.indexOf(element.spreadsheet);\n libraryBase.jspreadsheet.spreadsheet.splice(spreadsheetIndex, 1);\n\n const root = element.spreadsheet.config.root || document;\n\n element.spreadsheet = null;\n element.innerHTML = '';\n\n if (destroyEventHandlers) {\n destroyEvents(root);\n }\n }\n};\n\nlibraryBase.jspreadsheet.destroyAll = function () {\n for (let spreadsheetIndex = 0; spreadsheetIndex < libraryBase.jspreadsheet.spreadsheet.length; spreadsheetIndex++) {\n const spreadsheet = libraryBase.jspreadsheet.spreadsheet[spreadsheetIndex];\n\n libraryBase.jspreadsheet.destroy(spreadsheet.element);\n }\n};\n\nlibraryBase.jspreadsheet.current = null;\n\nlibraryBase.jspreadsheet.spreadsheet = [];\n\nlibraryBase.jspreadsheet.helpers = {};\n\nlibraryBase.jspreadsheet.version = function () {\n return version;\n};\n\nObject.entries(helpers).forEach(([key, value]) => {\n libraryBase.jspreadsheet.helpers[key] = value;\n});\n\nexport default libraryBase.jspreadsheet;\n"],"names":[],"ignoreList":[],"sourceRoot":""}
|